欢迎光临散文网 会员登陆 & 注册

图像数据增强(一)

2023-08-30 22:10 作者:0x435959  | 我要投稿

1. 加载和显示图片

由于imgaug只处理增强而不是图像输入/输出,我们需要另一个库来加载图像。在Python中,常见的选择是imageio和CV2。然而,CV2.imread()以BGR颜色空间返回图像,而不是RGB,需要重新排序通道轴。后一种方法的缺点是所有可视化函数(例如下面的imgaug.imshow())仍然需要输入RGB格式。

观察imshow源码后发现,imshow只能输入RGB格式,如果采用imageio读取不用转换通道格式,而使用CV2的话,需要转成RGB格式。其实当使用CV2的时候,ia.imshow()内部还是调用了CV2.imshow(),只不过又把RGB转成了BGR……所以感觉这个ia.imshow()相当鸡肋。

ia.imshow()源码

2. 图像增强

imgaug的增强技术是从Augmenter父类派生的。要使用一种增强技术,我们需要用一组参数实例化增强对象。

2.1 仿射变换

Augmenter to apply affine transformations to images.

Affine类是对图片进行仿射变化的增强类,包括平移旋转缩放

如果不传入参数,该类会自动赋值一些变换参数,内部实现如下

几个主要的参数如下:

  • scale=None

    缩放因子,1.0表示无变化,0.5表示缩小50%,还支持其他类型的参数以对不同轴做不同变化。

  • translate_percent=None

    其中0表示无变化,0.5表示平移图片大小的一半。常用的方式如下:

    x轴随机平移左右平移0~0.1比例,y轴同理上下平移

  • translate_px=None

    以像素单位平移,和上面相同。

  • rotate=None

    旋转取值范围在[-360,360],如果是元组,例如(30,60),会在范围内随机均匀采样。如果是列表,随机取列表中的某个值。

  • shear=None

  • 错切角度在[-360,360],但是合适的范围在[-45,45]

  • order=1

    插值方法,0表示最近邻,1表示双线性,常用的是这两个,还有其他方法。

  • cval=0

    mode="constant"时要填充的常数值,输入元组代表范围取值,列表代表随机取值。

  • mode="constant"

    填充新创建的像素时要使用的模式,默认用常数填充。

  • fit_output=False

    经过一些仿射变化后,图像的一些边缘可能就会丢失,如果将该参数设置为True,那么整张图片会完整的显示出来,但是此时图像大小会发生改变。如果不想图像大小发生变化,用ia.augmenters.size.KeepSizeByResize包裹增强对象即可。

以上输入的参数类型大致分为三类,数字,元组,列表,字典。其中数字就是对应的值,元组就是在这个范围内部均匀随机采样,列表就是随机采样列表值,字典可以针对x轴和y轴做不同变化,字典key对应的value可以是数字,元组,列表类型。此外,还有一种随机数类型,这里不做介绍。

2.2 批量增强

imgaug支持批量图片的增强,如果这批图片的大小不一,那么只能使用数组,如果图片大小相同例如一批图片为[B,H,W,C],可以使用numpy张量格式,速度上会更快一些。

注意这里传入的参数是images。

2.3 同时使用多种增强

我们可以使用Sequential来整合一系列增强对象,这和pytorch里面的nn.Sequential有异曲同工之妙。如果希望增强不是按照定义的顺序而是随机,可以设置random_order=True。

其他的类似方法还有:

  • SomeOf表示选取给定增强中的某些增强;

  • OneOf表示只应用所有给定增强中的一个;

  • Sometimes按概率随机增强;


图像数据增强(一)的评论 (共 条)

分享到微博请遵守国家法律