背景
有朋友在进行yolo的训练过程中遇到了数量量不够的情况,毕竟标注数据是实在太困难,另外真实场景的数据也不是那么容易获得。那么该如何缓解这种窘境呢?答案就是数据增强。
数据增强方案
- 合成增强,假如你想识别的是一个死的物体,比如煤气罐。。而你又不想自己在各种场景下去拍照制作训练数据,那么进行数据合成算是一个思路。如果是猫狗这种动物的话,最后还是老老实实的收集数据
- 图像变换,利用keras,对图片的角度、颜色通道、透明度等进行图像变化 也能产生不同的样本。
数据增强的核心目标就是减少过拟合,使模型更容易收敛。
合成增强
合成增强可以直接使用python的PIL模块,先安装
pip install pillow
准备一下背景:
准备一下一个贴图:
# coding: utf-8
from PIL import Image
def paste(img1, img2):
base_img = Image.open(img1)
paste_img = Image.open(img2)
top = 200
left = 300
base_img.save('image/merge1.png') # 保存图片
paste_img = paste_img.convert('RGBA')
print('保存图片1')
base_img.paste(paste_img, (top, left, top + paste_img.width, left + paste_img.height))
print('保存图片2')
base_img.save('image/merge2.png') # 保存图片
paste('image/background.png', 'image/dog.png')
图像变换
# coding: utf-8
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
datagen = ImageDataGenerator(
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
img = load_img('image/dog.png') # 这是一个PIL图像
x = img_to_array(img) # 把PIL图像转换成一个numpy数组,形状为(3, 150, 150)
x = x.reshape((1,) + x.shape) # 这是一个numpy数组,形状为 (1, 3, 150, 150)
# 下面是生产图片的代码
# 生产的所有图片保存在 `preview/` 目录下
i = 0
for batch in datagen.flow(x, batch_size=1, save_to_dir='preview'):
i += 1
if i > 10:
break # 否则生成器会退出循环
参数说明:
featurewise_center=False # 将输入全部数据的均值设置为 0。一般不用
samplewise_center=False # 将每个样本的均值设置为 0。一般不用
featurewise_std_normalization=False # 将输入除以全部数据标准差。一般不用
samplewise_std_normalization=False # 将输入除以其标准差。一般不用
zca_whitening=False # 是否应用 ZCA 白化
zca_epsilon=1e-6 # ZCA 白化的 epsilon 值。常用
rotation_range=0 # 整数。随机旋转的度数范围。常用
width_shift_range=0. # 浮点数,水平平移百分比,不宜太大一般0.1,0.2
height_shift_range=0. # 浮点数,垂直平移百分比,不宜太大一般0.1,0.2
brightness_range=None # 浮点数,亮度调整
shear_range=0. # 浮点数,错切变换角度
zoom_range=0.0 # 浮点数[0,1],随机缩放。[llow,upp]:随机缩放范围。
channel_shift_range=0., # 浮点数[0.0,255.0],图像上色
fill_mode=‘nearest’ # 边界填充,一般默认
cval=0. # 一般不用
horizontal_flip=False # 水平翻转,常用
vertical_flip=False # 垂直翻转,看应用场景使用
rescale=None # 数据缩放,常用:1/255.0
preprocessing_function=None,
data_format=None,
validation_split=0.0 # 验证集划分。常用
dtype=None
注:每次变化都是随机的,暂时没有发现能返回变化参数信息
参考:https://www.jianshu.com/p/4c7795af350b
重点是ImageDataGenerator的方法:
- flow
- flow_from_directory
- flow_from_dataframe
- 等
方法的使用实战未完待续