mask-rcnn 学习笔记(图像预处理--图像增强)

  论文:http://cn.arxiv.org/pdf/1703.06870v3
  介绍时所采用的Mask-RCNN源码(python版本)来源于GitHub:https://github.com/matterport/Mask_RCNN

1.图像增强概念

  上一篇博客讲述了如何进行图像缩放,本篇主要讲解常用的一些数据增强的方法及适用场景。
  深度学习是基于大数据的一种方法,数据规模越大,质量越高,模型的泛化能力越强。当数据集比较小时,除了通过收集更多数据,还可以利用图像增强的方法来扩充数据集。
  数据增强,就是对原始图像进行一定的图像处理。一方面在一定程度上提升模型的泛化能力;另一方面还可以达到提升模型鲁棒性的效果,比如增加噪声数据。

2.图像增强分类

  • 离线增强:
      在训练过程前对数据集m进行处理,数据数目变为原数据的n倍。模型学习的样本变为m*n。该方法适用于数据集比较小时,扩充后的数据需要占用一定的存储空间。
  • 在线增强 :
      在训练过程中对数据集m进行处理,获得一个 batch 的数据之后,然后对这个 batch 的数据进行增强,最后再输入网络进行学习。模型学习的样本为m*epochs,随着epochs的增大,该方式学习的样本数量要远比离线方式多。这种方式常用于大数据集以及图像处理用时较短时。很多机器学习框架已经支持了这种数据增强方式,并且可以使用 GPU 优化计算。

3.mask-rcnn图像增强方式

  作者在源码中使用imgaug库进行图像增强,imgaug是一个封装好的用来进行图像增强的python库,官方文档:https://imgaug.readthedocs.io/en/latest/。其使用方法非常简单:

  • 定义一个图像增强序列,
    augment_seq = imgaug.augmenters.Sequential( [增强1, 增强2, ...])
  • 调用模型的train方法时,传递给参数augmentation。
    model.train(augmentation=augment_seq)

4.常用图像增强方法

(1) 翻转

  • 水平翻转:imgaug.augmenters.Fliplr()
  • 垂直翻转:imgaug.augmenters.Flipud()
    mask-rcnn 学习笔记(图像预处理--图像增强)_第1张图片
    图1.1 图像翻转
  • 说明
    • 翻转是一种镜像操作,与旋转180°不同;
    • 如果图像含有左右或上下属性,不适用此方法。如图1.2,原图的标签为右手,水平翻转后则变为左手。此时图像与标签不匹配,不能使用该数据。
      mask-rcnn 学习笔记(图像预处理--图像增强)_第2张图片
      图1.2 “手”的水平翻转

(2)仿射变换

  • 缩放:imgaug.augmenters.Affine(scale=缩放系数)
  • 旋转:imgaug.augmenters.Affine(rotate=旋转角度)
  • 平移:imgaug.augmenters.Affine(translate_=平移像素)
       imgaug.augmenters.Affine(translate_percent=平移比例)
  • 错切:imgaug.augmenters.Affine(shear=错切系数)
图2.1 仿射变换
  • 说明
    • 仿射变换通常会产生一些新的像素点,这些点的像素值需要我们根据实际情况进行设置,可以填充为固定值,也可以根据图像边缘像素进行填充,如图2.2。设置方法为,
      imgaug.augmenters.Affine(mode=填充模式, cval=填充值)
    • 在进行仿射变换时注意变换系数的取值,避免变换后的图像成为无效数据。如图2.3,原图为一张狗的图像,第2张放大后,仅通过毛发和眼睛并不能确定为狗;第3张平移距离过大,狗的整体部分基本被移出图像外;第4张错切角度过大,现实中不存在这种畸变严重的图像。
      mask-rcnn 学习笔记(图像预处理--图像增强)_第3张图片
图2.2 像素填充

mask-rcnn 学习笔记(图像预处理--图像增强)_第4张图片

图2.3 不合适的图像仿射变换

(3) 增加噪声

  • 高斯噪声:imgaug.augmenters.AdditiveGaussianNoise()
  • 随机去除,即把一些像素点变成0:imgaug.augmenters.Dropout()
    mask-rcnn 学习笔记(图像预处理--图像增强)_第5张图片
    图3.1 增加噪声
  • 说明
    • 数字信号在传输过程中很可能会发生丢失或者受到干扰,有的是成像设备或者环境本身导致成像质量不稳定,反映到图像上就是图像的亮度与颜色呈现某种程度的不一致性。比如高斯噪声、椒盐噪声、均匀分布噪声等。适当的在训练集中添加噪声,可提升模型的鲁棒性。
    • 传统图像处理任务多为先对图像去噪,再进行其他计算。我曾在一个语义分割的项目中尝试过用去噪后的图像进行训练,训练后的模型对边缘部分的分割还比较准确。但当一批新数据中存在噪声比较严重的图像时,模型分割效果不理想。如果使用加噪声的数据进行训练可能会避免这样的问题,仍需进一步验证(欢迎有经验的朋友一起探讨这个问题)。

(4) 模糊

  • 高斯模糊:imgaug.augmenters.GaussianBlur()
  • 均值模糊:imgaug.augmenters.AverageBlur()
  • 中值模糊:imgaug.augmenters.MedianBlur()

mask-rcnn 学习笔记(图像预处理--图像增强)_第6张图片

图4.1 增加噪声

(5) 颜色、亮度变换

  • 每个像素点加上一个值:imgaug.augmenters.Add()
  • 每个像素点乘上一个值:imgaug.augmenters.Multiply()
  • 选取一个通道进行变换:imgaug.augmenters.WithChannels()
  • 随机排列图像的通道顺序:imgaug.augmenters.ChannelShuffle()
    图5.1 颜色、亮度变换
  • 说明
    • 光照变化是自然环境中常见的一种情况,光照的改变可能会影响物体的亮度、颜色等特征,此时会给模型识别带来困难。通过对图像进行全局或局部处理,改变图像的亮度和颜色,模拟目标在不同光照条件下的情形,可以增加模型的泛化能力。
    • 改变像素值的过程中注意溢出值的处理,数据类型为unit8时,若变化后像素值大于255,赋值时像素值会变为0。

(6) 其他方法

  imgaug中数据增强的方法有很多,感兴趣的朋友可详细阅读官方文档,或者参考另一篇博文中更多的函数及参数说明

5.总结

  (1)增加变换方法的多样性。在进行图像增强过程中可以采用多种变换方法。例如一张图像不仅平移,平移之后再进行旋转;
  (2)保持变换过程的随机性。例如,有些图像进行翻转,有些图像不进行翻转;第一张图像放大2倍,第二张放大1.5倍;
  (3)确保变换结果的有效性。若变化后改变了图像的含义、造成目标丢失,需调整图像处理方法或相应系数。

你可能感兴趣的:(深度学习)