文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- Tensorflow2.x + pycharm,基于猫狗分类的数据增强的一个小案例 [1]
- 前言
- 一、数据增强是什么?
- 二、操作步骤
- 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
使用的方法介绍:
- tensorflow中的keras模块preprocessing.image中集成了image_to_array,load_img,ImageDataGenerator等方法,只需调用,掌握里面参数书写。
- 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 被返回。
- 数据集里面是彩色图片转为三维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。


![Tensorflow2.x + pycharm,基于猫狗分类的数据增强的一个小案例 [1] Tensorflow2.x + pycharm,基于猫狗分类的数据增强的一个小案例 [1]](http://www.mshxw.com/aiimages/31/965332.png)
