栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Tensorflow2.x + pycharm,基于猫狗分类的数据增强的一个小案例 [1]

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Tensorflow2.x + pycharm,基于猫狗分类的数据增强的一个小案例 [1]

Tensorflow2.x + pycharm,基于猫狗分类的数据增强的一个小案例 [1]

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
    • Tensorflow2.x + pycharm,基于猫狗分类的数据增强的一个小案例 [1]
  • 前言
  • 一、数据增强是什么?
  • 二、操作步骤
    • 1.准备数据集
    • 2.书写程序
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

近几年来研究深度学习的人越来越多,使得各个领域得到了飞速地发展,特别是图像处理领域。图像处理主要包括图像的分类,图像中目标物体的检测, 以及目标物体中更为精细的区域分割。本文介绍了一个数据增强的小实例,帮助我们更好地了解数据增强,方便之后的模型训练。


提示:以下是本篇文章正文内容,下面案例可供参考

一、数据增强是什么?

数据增强具体指的是对数据集中的数据进行增强,增加了数据集的包容性和稳定性。数据集一般是由很多的图片组成,我们既可以对其单个图片采取数据增强的操作,也可以对整个数据集进行数据增强,来扩大数据集的容量。

  1. 如果本身数据集太小,通过数据增强可以扩充数据集的尺寸,丰富数据集的内容。
  2. 数据增强对数据集中的原始图片经过缩放,水平翻转,裁剪,随机旋转一定的角度等操作增强为几十甚至成百上千张图片。提高了卷积神经网络的学习能力(一张图片从各个角度改变),进而提升了模型训练的准确率。

下面我就以数据集中的一张照片为例,将其从各个角度进行数据增强到20张(数量可以自己设定)。这些图片也是猫狗分类任务里面的数据集,为了后续分类任务的学习,使用这个数据集中的某一张图片。

cat.0.jpg


二、操作步骤 1.准备数据集

数据集的选取,从Kaggle官网下载猫狗识别的数据集。我们用来作猫和狗的二分类任务(数据集包括训练集12500张猫,12500张狗;图片标号:cat.0.jpg, dog.0.jpg,)只用训练集就行。

从猫的图片选取标号0-499,狗的图片也是0-499,总共1000张作为训练集。
选取猫的500-699,狗的500-699,总共400张作为测试集。
其中文件夹树状图分布如下:


注意分类任务一般一个类别放在一个文件夹里面,猫和狗分别创建自己的类别文件夹,便于分类。

 
2.书写程序 

IDE:pycharm
框架:tensorflow2.x
使用的方法介绍:

  1. tensorflow中的keras模块preprocessing.image中集成了image_to_array,load_img,ImageDataGenerator等方法,只需调用,掌握里面参数书写。
  2. flow----可以随机生成图片(注意里面的save_to_dir=‘path’, path我理解为绝对路径)
 flow
flow(x, y=None, batch_size=32, shuffle=True, sample_weight=None, seed=None, save_to_dir=None, save_prefix=='', save_format='png', subset=None)
采集数据和标签数组,生成批量增强数据。

参数

x: 输入数据。秩为 4 的 Numpy 矩阵或元组。如果是元组,第一个元素应该包含图像,第二个元素是另一个 Numpy 数组或一列 Numpy 数组,它们不经过任何修改就传递给输出。可用于将模型杂项数据与图像一起输入。对于灰度数据,图像数组的通道轴的值应该为 1,而对于 RGB 数据,其值应该为 3。
y: 标签。
batch_size: 整数 (默认为 32)。
shuffle: 布尔值 (默认为 True)。
sample_weight: 样本权重。
seed: 整数(默认为 None)。
save_to_dir: None 或 字符串(默认为 None)。这使您可以选择指定要保存的正在生成的增强图片的目录(用于可视化您正在执行的操作)。
save_prefix: 字符串(默认 '')。保存图片的文件名前缀(仅当 save_to_dir 设置时可用)。
save_format: "png", "jpeg" 之一(仅当 save_to_dir 设置时可用)。默认:"png"。
subset: 数据子集 ("training" 或 "validation"),如果 在 ImageDataGenerator 中设置了 validation_split。

**返回**

一个生成元组 (x, y) 的 Iterator,其中 x 是图像数据的 Numpy 数组(在单张图像输入时),或 Numpy 数组列表(在额外多个输入时),y 是对应的标签的 Numpy 数组。如果 'sample_weight' 不是 None,生成的元组形式为 (x, y, sample_weight)。如果 y 是 None, 只有 Numpy 数组 x 被返回。
  1. 数据集里面是彩色图片转为三维array数组,而数据增强的输入必须是四维,需要对数组进行升维!

由一张照片增强为20张的代码如下:

from tensorflow.keras.preprocessing.image import img_to_array,load_img,ImageDataGenerator



# 进行数据增强
data_gen = ImageDataGenerator(rescale=1./255,  # 原像素0-255归至0-1
                              rotation_range=45,  # 随即旋转45度
                              width_shift_range=0.2,  # 随机宽度偏移[-0.2,0.2]
                              height_shift_range=0.2,  # 随机高度偏移[-0.2,0.2]
                              shear_range=0.2,  # 随机裁剪
                              zoom_range=0.2,  # 随即缩放[1-0.5, 1-0.5]
                              fill_mode='nearest'  # 填充方式
                              
                              )

# 载入图片
img = load_img('data/train/cat/cat.1.jpg')
x = img_to_array(img)
print(x.shape)  # (280, 300, 3)
x = x.reshape((1,) + x.shape)
print(x.shape)   # (1, 280, 300, 3)  1---代表的是批次,一张图片批次为1

# 生成20张数据增强后的照片, flow-随机生成图片
i = 0
for batch in data_gen.flow(x, batch_size=1,
                           save_to_dir='data/temp/',   # 一定是绝对路径,不然出错
                           save_prefix='cat',
                           save_format='jpg'):
    i += 1
    if i > 20:
        break

程序运行结果:


进行了一个升维操作。


temp文件夹里面生成了cat.0.jpg数据增强后的20张不同的图片,如下图两张:


从各个角度进行图像增强

4.训练集里面的每张图片都进行数据增强

# 数据增强方式
datagen = ImageDataGenerator(rescale=1./255,  # 像素缩放到0-1之间
                             rotation_range=40,   # 随即旋转40度
                             width_shift_range=0.2,  # 宽度偏移
                             height_shift_range=0.2,  # 高度偏移
                             zoom_range=0.2,  # 缩放范围
                             shear_range=0.2,  # 随即裁剪
                            fill_mode='nearest')  # 填充方式


# train_path = './data/train/cat' ,再加一个循环
# for i in os.listdir('./data/train/dog'):
#    img = load_img('./data/train/dog/' + i)
#     x = img_to_array(img)
#     x = x.reshape((1,) + x.shape)   # (280, 300, 3)
#     j = 0
#     for batch in datagen.flow(x, batch_size=1,
#                               save_to_dir='./data/temp/dog',
#                               save_prefix='cat',
#                               save_format='jpg'):
#         j += 1
#         if j > 9:
#             break

数据集里面的每一张增强为9张,扩充数据集。

总结

本文通过一个小实例理解数据增强,尤其记得数据增强的输入一定要将维度生成4维。也许还有更多增强的方法,还需要更加深入地学习。
我想把自己跑通的代码放在博客上面方便自己日后查找,复习,一个个文件夹的找我经常忘记,而且还要重新打开,通常也就是看几行重要的代码。
day day up。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/965332.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号