写点什么

数据增强 (一):imgaug

  • 2022 年 5 月 09 日
  • 本文字数:1714 字

    阅读完需:约 6 分钟

背景

深度学习训练过程中如果遇到过拟合或者在测试集中泛化能力不足的问题的时候,你可能会想到更多的新数据添加正则项等,数据增强也是其中一种,特别是对于机器视觉的任务,数据增强技术尤为重要。


为什么需要数据增强呢? 深度学习虽然是公认的人工智能中一个里程碑式的工具, 但是并不是我们想象中的那么智能;深度学习模型只是用大量的参数去拟合训练数据中对于不同类别的区分,模型性能强依赖于训练数据的多样性;有时候找到区分不同类别的关键特征并不是我们想象的事物的本质特征,而只是训练数据中的特征。举一个极端的例子,我们要识别不同品牌的汽车 A 和 B,如果训练数据集中品牌 A 都是黑色,品牌 B 都是红色,模型拟合结果可能只是识别颜色,如果测试集中有一辆红色品牌 A 的车,就会出现误识的情况。为了正确的识别车的品牌,我们可以增加不同颜色,不同状态等各种各样的车的图片,直观上让模型可以通过比较,摒弃不重要的特征,真正找到区分事物的本质特征。


所谓数据增强就是在现有数据基础上通过,通过一些方式扩大数据集的方式。本文的数据增强技术主要指图像处理方面的。


数据增强的作用:


  • 增加数据量,增强模型的泛化能力

  • 引入一些数据噪声,增强模型鲁棒性


数据增强的种类:


  • 离线增强:在训练前对数据集进行处理,喂入模型的训练集是源数据的若干倍;比较适合小数据集

  • 在线增强:如果是比较大的数据集,如果直接扩大数据集,训练的资源使用就会变大和效率就会降低。在线增强是指在训练的时候对数据进行变化,一般是以 batch 为单位进行增强操作。

内容

常用的数据增强操作:imgaug 库

imgaug 介绍

imgaug 是提供了各种图像增强操作的 python 库https://github.com/aleju/imgaug



imgaug 几乎包含了所有主流的数据增强的图像处理操作, 增强方法详见 github


  • 通道混淆

  • 添加噪声

  • 模糊:高斯、中值、运动模糊

  • 遮罩 cutout,dropout

  • 颜色和亮度、对比度、饱和度变换

  • 图像卷积操作:锐化,边缘检测等

  • 左右翻转 flip

  • 几何变换:仿射变换

  • 大小变换:resize、裁剪 crop


imgaug 还提供这些图像处理方法的随机组合方式。

imgaug API 使用

安装


pip install imgaug
复制代码


执行流程


  • 定义增强方法 sequential: 图片增强方法的集合, 通过random_order来控制是否按顺序执行集合中的操作

  • 读取图片

  • 执行增强操作


from imgaug import augmenters as iaaimport matplotlib.pyplot as pltimport cv2
# 定义增强操作的序列seq = iaa.Sequential([ iaa.CoarseDropout(0.05, size_percent=(0.02, 0.05)), ], random_order=False)
# 读取图片file = 'test.jpg'image = cv2.cvtColor(cv2.imread(str(file)), cv2.COLOR_BGR2RGB)
# 执行增强操作aug_imgs = seq.augment_images([image])
# 测试展示plt.imshow(image)seq.show_grid(image, cols=10, rows=3)
复制代码


对于每一个增强操作,imgaug提供执行的概率Sometimes和个数SomeOfOneOf等选择, 选择操作是可嵌套


#  50%的概率执行这个Crop裁剪操作 iaa.Sometimes(0.5, iaa.Crop(percent=(0.1, 0.05)))
# SomeOf 执行其中的若干个(0和5之间的随机数); # OneOf 执行其中的一个iaa.SomeOf((0, 5), [ iaa.OneOf([ iaa.GaussianBlur((0, 2.0)), iaa.AverageBlur(k=(2, 5)), iaa.MedianBlur(k=(3, 7)), ]), ## 模糊处理
复制代码


自定义增强操作:Lambda增强器


# images 为img列表def img_func(images, random_state, parents, hooks):    for img in images:        img[::4] = 0    return images
def keypoint_func(keypoints_on_images, random_state, parents, hooks): return keypoints_on_images
seq = iaa.Sequential([ iaa.Lambda(img_func, keypoint_func), iaa.CoarseDropout(0.05, size_percent=(0.02, 0.05)), ], random_order=False)
复制代码


tensorflow 中使用数据增强tf.py_func


# py_func可以支持tensor输入,tensor输出,而执行的函数中可以使用非tensor的操作 images = tf.py_func(seq.augment_images, [images], Tout=tf.uint8)
复制代码


https://imgaug.readthedocs.io/en/latest/

结语

本实验和大家描述了数据增强的几种方法:


  • imgaug 库


希望对大家有帮助。




发布于: 刚刚阅读数: 2
用户头像

公众号:人工智能微客(weker) 2019.11.21 加入

人工智能微客(weker)长期跟踪和分享人工智能前沿技术、应用、领域知识,不定期的发布相关产品和应用,欢迎关注和转发

评论

发布
暂无评论
数据增强(一):imgaug_人工智能_AIWeker-人工智能微客_InfoQ写作社区