在一些cv算法模型训练过程中,常常会出现样本数据量不足,训练出的模型在目标域上的效果不好,泛化性能差的现象。举个例子来说:https://arxiv.org/abs/1902.07296,这篇论文中,作者关注的是目标检测算法对小目标物体的检测性能不够好的问题,并总结出了两个原因:(1) 只有少数图像包含小物体,以及 (2) 即使在包含它们的每张图像中,小物体也未能出现足够多的次数。因此作者采用数据增强的方法(Data Augmentation)的方法,增加图像中的小目标数目,从而提升了算法的性能。这就是为什么要进行数据增强。
python中的Augmentator是一个能够方便实现对图像的各种增强并进行组合的Pipeline工具包,Augmentor在git上的项目地址为:https://github.com/mdbloice/Augmentor.git
1、安装Augmentor模块
打开anaconda teminal,切换到目标环境,输入命令pip install Augmentor进行安装。anaconda中不包含此模块,如果使用conda命令,会报PackagesNotFoundError。
显示安装成功。
2、Augmentor使用
样例图像:
导入Augmentor模块,指定图像数据文件夹地址(文件夹中只包含要处理的图像),创建Pipeline实例p
import Augmentor
img_path = '' # image directory
p = Augmentor.Pipeline(img_path)
(1)旋转(rotate)
probability指定进行操作的概率大小,max_left_rotation, max_right_rotation指定向左向右最大旋转角度,最大值为25。sample表示从给定图像中生成指定数量的增强图像,可指定多个。
p.rotate(probability=1, max_left_rotation=25, max_right_rotation=25)
p.sample(1)
执行后的输出图像存储在原图像文件夹的output文件夹中。
rotate操作默认在对原图像进行旋转之后进行裁剪,输出与原图像同样大小的增强图像。
(2)缩放(scale),但貌似只能等比放大
scale_factor表示缩放比例,只能大于1,且为等比放大。
p.scale(probability=1, scale_factor=1.3)
可修改源码,随机生成一定范围xy轴不同的缩放因子,实现不等比缩放。部分代码如下
scale_factor_h = np.random.uniform(min_scale_factor, max_scale_factor)
scale_factor_w = np.sign(np.random.randint(-3, 3))*np.random.uniform(0, delta) + scale_factor_h
new_h = int(h * scale_factor_h)
new_w = int(w * scale_factor_w)
(3)随机亮度增强/减弱(random_brightness)
min_factor, max_factor为变化因子,决定亮度变化的程度,可根据效果指定。
p.random_brightness(probability=1, min_factor=0.7, max_factor=1.2)
同理还有随机颜色/对比度增强/减弱
p.random_color(probability=1, min_factor=0.0, max_factor=1)
p.random_contrast(probability=1, min_factor=0.7, max_factor=1.2)
(4)随机透视变形(skew)
magnitude表示变形程度。隐藏参数skew_type,值为``TILT``, ``TILT_TOP_BOTTOM``, ``TILT_LEFT_RIGHT``, ``CORNER``,展开源码才可以看到。源码中采用randomly的方式从四种参数中选择,不需指定。
其中,``TILT_TOP_BOTTOM``表示只在顶部底部方向进行透视变形。
``TILT_LEFT_RIGHT``表示只在左右方向进行透视变形。
``CORNER``表示只在四角方向进行透视变形。
``TILT``包含上述方向的集合,即上下左右和四角的八个方向。
p.skew(probability=1, magnitude=0.8)
(5)随机剪切(shear)
剪切变换,max_shear_left,max_shear_right为剪切变换角度
p.shear(probability=1, max_shear_left=15, max_shear_right=15)
(6)随机裁剪(random_crop)
percentage_area表示裁剪面积占原图像面积的比例,centre指定是否从图片中间裁剪,randomise_percentage_area指定是否随机生成裁剪面积比。
p.crop_random(probability=1, percentage_area=0.8, centre=False, randomise_percentage_area=True)
(7)随机翻转(flip_random)
随机进行上下左右方向的翻转
p.flip_random(probability=1)
(8)随机擦除/遮挡(random_erasing)
rectangle_area指定随机擦除面积的百分比。当然这个指定的是擦除面积的上限。
p.random_erasing(probability=1, rectangle_area=0.5)
完整代码:
import os
import Augmentor
def img_augment_pipline(img_path):
num = len(os.listdir(img_path))
p = Augmentor.Pipeline(img_path)
p.rotate(probability=1, max_left_rotation=30, max_right_rotation=30)
p.scale(probability=1, min_scale_factor=0.8, max_scale_factor=1.2, delta=0.1)
p.random_brightness(probability=1, min_factor=0.8, max_factor=1.2)
p.random_color(probability=1, min_factor=0.0, max_factor=1)
p.random_contrast(probability=0.7, min_factor=0.8, max_factor=1.2)
# skew 随机向8个方向进行透视变形
p.skew(probability=0.6, magnitude=0.8)
# shearing 随机剪切变化
p.shear(probability=0.6, max_shear_left=15, max_shear_right=15)
# 随机裁剪
p.crop_random(probability=1, percentage_area=0.8, randomise_percentage_area=True)
# flip
p.flip_random(probability=0.9)
# random erase
p.random_erasing(probability=1, rectangle_area=0.5)
p.sample(num*2)
组合增强效果:
Pipeline的思想,处理千张级的图像也是很快的。