深度学习之数据增强库imgaug使用方法

参考:https://www.jianshu.com/p/99450dbdadcf

在深度学习项目中,寻找数据花费了相当多的时间。但在很多实际的项目中,我们难以找到充足的数据来完成任务。为了要保证完美地完成项目,有两件事情需要做好:1、寻找更多的数据;2、数据增强。本篇主要描述数据增强。

有很多现成的可以做数据增强的库,比如可以用OpenCV、PIL、TensorFlow、Augmentor等等,下面介绍的第一第二大类方法都是通过调用imgaug库操作实现的,这个库功能全面,且有丰富的文档支持,能满足我们大多数的数据增强的需求。

1 介绍

imgaug是一个用于机器学习实验中图像增强的python库,支持python2.7和3.4以上的版本。 它支持多种增强技术,允许轻松组合这些技术,具有简单但功能强大的随机界面,可以在这些界面上增加图像和关键点/界标,并在后台进程中提供增强功能以提高性能。

相关文档:快速开始函数示例API介绍github

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)。仿设变换通常会产生一些新的像素点,我们需要指定这些新的像素点的生成方法,这种指定通过设置cvalmode两个参数来实现。参数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大致生成类似云的模式。
  • 24
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
下面是一个使用 `imgaug` 实现数据集增强扩充的示例代码: ```python import cv2 import imgaug.augmenters as iaa def augment_data(image, mask): # 定义数据增强的转换函数 seq = iaa.Sequential([ iaa.Fliplr(0.5), iaa.Flipud(0.5), iaa.Rotate((-45, 45)), iaa.ElasticTransformation(alpha=50, sigma=5), iaa.PiecewiseAffine(scale=(0.01, 0.05)), iaa.Sometimes(0.2, iaa.Superpixels(p_replace=(0, 0.5), n_segments=(20, 200))), iaa.OneOf([ iaa.Multiply((0.8, 1.2)), iaa.GammaContrast((0.8, 1.2)), iaa.LinearContrast((0.8, 1.2)), ]) ], random_order=True) augmented_image, augmented_mask = seq(image=image, segmentation_maps=[mask]) # 将数据增强后的掩码转换为二值图像 augmented_mask = augmented_mask.draw()[0][:, :, 0] return augmented_image, augmented_mask # 示例用法 image = cv2.imread('image.jpg') mask = cv2.imread('mask.png', 0) augmented_image, augmented_mask = augment_data(image, mask) # 显示增强后的图像和掩码 cv2.imshow('Augmented Image', augmented_image) cv2.imshow('Augmented Mask', augmented_mask) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例中,我们使用 `imgaug` 来实现数据增强。通过创建一个 `Sequential` 对象,并添加一系列的增强操作,可以定义数据增强的转换函数。你可以根据需要自定义增强操作,并在 `augment_data` 函数中添加或删除对应的增强操作。最后,使用 `seq` 对象对图像和掩码进行增强,并将增强后的结果返回。注意,为了将掩码也进行相应的增强,我们将其作为 `segmentation_maps` 参数传递给 `seq` 对象。最后,将增强后的图像和掩码用于训练语义分割模型。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宗而研之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值