图像数据增强之python模块Augmentor的使用

在一些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的思想,处理千张级的图像也是很快的。

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值