参考:https://www.jianshu.com/p/99450dbdadcf
在深度学习项目中,寻找数据花费了相当多的时间。但在很多实际的项目中,我们难以找到充足的数据来完成任务。为了要保证完美地完成项目,有两件事情需要做好:1、寻找更多的数据;2、数据增强。本篇主要描述数据增强。
有很多现成的可以做数据增强的库,比如可以用OpenCV、PIL、TensorFlow、Augmentor等等,下面介绍的第一第二大类方法都是通过调用imgaug库操作实现的,这个库功能全面,且有丰富的文档支持,能满足我们大多数的数据增强的需求。
1 介绍
imgaug是一个用于机器学习实验中图像增强的python库,支持python2.7和3.4以上的版本。 它支持多种增强技术,允许轻松组合这些技术,具有简单但功能强大的随机界面,可以在这些界面上增加图像和关键点/界标,并在后台进程中提供增强功能以提高性能。
2 安装方法
首先安装依赖
pip install six numpy scipy matplotlib scikit-image opencv-python imageio
pip install imgaug
如果想安装最新版本的imgaug,可直接在github上下载源码进行安装,方法如下
pip install git+https://github.com/aleju/imgaug
或者
git clone https://github.com/aleju/imgaug
cd imgaug
python setup.py install
3 测试程序
整体流程为:定义变换序列(Sequential)→读入图片(imread)→执行变换(augment_images)→保存图片(imwrite)
#!usr/bin/python
# -*- coding: utf-8 -*-
import cv2
from imgaug import augmenters as iaa
#imgaug test
seq = iaa.Sequential([
iaa.Crop(px=(0, 16)), # 从每侧裁剪图像0到16px(随机选择)
iaa.Fliplr(0.5), # 水平翻转图像
iaa.GaussianBlur(sigma=(0, 3.0)) # 使用0到3.0的sigma模糊图像
])
imglist=[]
img = cv2.imread('kobe.jpg')
imglist.append(img)
images_aug = seq.augment_images(imglist)
cv2.imwrite("imgaug.jpg",images_aug[0])
原图kobe.jpg
结果imgaug.jpg
4 函数介绍
在API里边,我们可以看到有很多函数可以实现数据增强,接下来对这些函数的功能进行介绍,参数的具体含义请参考另一篇博文或者函数说明
函数 | 描述 |
---|---|
Sequential(C, R) | 选取一系列子增强器C作用于每张图片,第二个参数表示是否对每个batch的图片应用不同顺序的Augmenter list。当设置为True时,不同batch之间图片的处理顺序都会不一样,但是同一个batch内顺序相同 |
SomeOf(N, C, R) | 将Augmenter中的部分变换应用在图片处理上,而不是应用所有的Augmenter。例如:可以定义20种变换,但每次只选择其中的5个。但是不支持固定选择某一个Augmenter。 |
OneOf(C) | 每次从一系列Augmenters中选择一个来变换。. |
Sometimes(P, C, D) | 对batch中的一部分图片应用一部分Augmenters,剩下的图片应用另外的Augmenters。 |
WithColorspace(T, F, C) | 在某个特定的颜色空间对图像进行变换。即:先将图片从一个颜色空间变换到另一个颜色空间,然后在另一个颜色空间中对图像进行变换,最后再变换回原来的颜色空间。 |
WithChannels(H, C) | 从图片中挑选出一个Channel来进行变换,变换完了之后再将该channel merge回去 |
Noop() | 不进行任何变换。某些情况下只想使用一个Augmenter作为占位符,这样可以继续调用augment_image()函数,但实际不作变换。 |
Lambda(I, K) | 自定义一些变换函数 |
AssertLambda(I, K) | assert要变换的图片和keypoint的shape。如果不满足就抛出异常。 |
AssertShape(S) | 如果输入的图像大小不是S,则抛出异常 |
Scale(S, I) | 将图像缩放到固定大小。 |
CropAndPad(PX, PC, PM, PCV, KS) | 截取(crop)或者填充(pad),填充时,被填充区域为黑色。 |
Pad(PX, PC, PM, PCV, KS) | 与CropAndPad()相同,只接受positive values。 |
Crop(PX, PC, KS) | 与CropAndPad()相同,只接受negative values。 |
Fliplr(P) | 水平镜面翻转。 |
Flipud(P) | 上下镜面翻转。 |
Superpixels(P, N, M) | 以(最大)分辨率M生成图像的N个超像素,并调整回原始大小。 然后原始图像中所有超像素区域的P百分比被超像素替换,(1-P)百分比保持不变。 |
ChangeColorspace(T, F, A) | 改变图像空间 |
Grayscale(A, F) | 变成灰度图。 |
GaussianBlur(S) | 高斯扰动。 |
AverageBlur(K) | 从最邻近像素中取均值来扰动。 |
MedianBlur(K) | 通过最近邻中位数来扰动 |
BilateralBlur(D, SC, SS) | 使用距离为D的双边滤波器(如内核大小)模糊图像。 SC是颜色空间中(影响)距离的西格玛,SS是空间距离的西格玛。 |
Convolve(M) | 对图像使用卷积。 |
Sharpen(A, L) | 锐化 |
Emboss(A, S) | 浮雕效果 |
EdgeDetect(A) | 边缘检测 |
DirectedEdgeDetect(A, D) | 特定方向的边缘检测 |
Add(V, PCH) | 随机加上一个值 |
AddElementwise(V, PCH) | 按像素加 |
AddToHueAndSaturation(V, PCH, F, C) | 将值V添加到HSV空间中的每个像素(即修改色调和饱和度)。 |
AdditiveGaussianNoise(L, S, PCH) | 以像素为单位向图像添加高斯白噪声。 |
Multiply(V, PCH) | 给图像中的每个像素点乘一个值使得图片更亮或者更暗。 |
MultiplyElementwise(V, PCH) | 按像素值乘。 |
Dropout(P, PCH) | 随机去掉一些像素点, 即把这些像素点变成0。 |
CoarseDropout(P, SPX, SPC, PCH) | 将矩形框的值设置为0。 |
Invert(P, PCH) | 翻转,将每个像素值p变成255-p。 |
ContrastNormalization(S, PCH) | 改变图像的对比度。 |
Affine(S, TPX, TPC, R, SH, O, M, CVAL) | 仿射变换。包含:平移(Translation)、旋转(Rotation)、放缩(zoom)、错切(shear)。仿设变换通常会产生一些新的像素点,我们需要指定这些新的像素点的生成方法,这种指定通过设置cval 和mode 两个参数来实现。参数order 用来设置插值方法。 |
PiecewiseAffine(S, R, C, O, M, CVAL) | 随机放置一些规则的网格点然后移动这些点的周围的像素。这回导致局部的扭曲。 |
PerspectiveTransform(S, KS) | 对图像应用随机四点透视变换(有点像高级裁剪形式)。 |
ElasticTransformation(S, SM) | 通过移动局部像素来变换。 |
Alpha(F, A, B, PCH) | 使用增强器A和B独立增强图像,然后使用Alpha F覆盖结果。如果未提供,A和B默认不执行任何操作。 例如, 使用Alpha(0.9,A)通过A增强图像,然后混合结果,保留原始图像的10%(在A之前)。 如果PCH设置为真,则该过程在通道方面发生,可能具有不同的F(每个图像计算一次A和B)。 |
AlphaElementwise(F, A, B, PCH) | 与Alpha相同,但使用从F采样的连续掩码(值0.0到1.0)逐像素地执行混合。如果PCH设置为true,则过程以像素和通道两种方式发生。 |
SimplexNoiseAlpha(A, B, PCH, SM, UP, I, AGG, SIG, SIGT) | 与Alpha类似,但使用遮罩来混合来自增强器A和B的结果。遮罩是从单纯形噪声中采样的,单层噪声往往是blobby。 掩模在Iiterations中收集(默认为1-3),每次迭代使用聚合方法AGG(默认最大值,即每个像素的所有迭代的最大值)进行组合。 每个掩模在低分辨率空间中采样,最大分辨率为SM(默认为2到16px),并使用方法UP(默认:线性或立方或最近邻居上采样)放大到图像大小。 如果SIG为真,则将sigmoid应用于具有阈值SIGT的掩码,这使得blob具有接近0.0或1.0的值。 |
FrequencyNoiseAlpha(E, A, B, PCH, SM, UP, I, AGG, SIG, SIGT) | 与SimplexNoiseAlpha类似,但会从频域生成噪声掩码。 指数E用于增加/减少频率分量。 高值导致更明显的高频分量。 使用-4到4范围内的值,-2大致生成类似云的模式。 |