Python--imgaug图片数据增强

数据增强2.0版

imgaug是一个专门用于机器学习图片数据增强的库,功能十分强大,除了普通的旋转、翻转等增强方式,还有超像素增强、锐化、浮雕等等等高端增强方法!另外它还支持按照指定概率仅对输入图片中部分图片进行增强,这就使得同一类图片里每张图片会有不同的增强方式,后续模型训练会学习到不同特征。除了数据增强,它还有绘制热图、关键点、边框……更多功能请看imgaug github
这个网址也有详细介绍。

安装方法:

pip install imgaug

一个简单的使用示例

这里只输入了一张图,示范一下。你可以遍历文件夹,使用cv.imread读取了之后,共同放入一个list里,然后传到变换序列seq里。seq里是你想要的数据增强的方式,可以加入很多方式。

import numpy as np
import imgaug as ia
from imgaug import augmenters as iaa
import cv2
import glob
from imgaug import augmenters as iaa #引入数据增强的包
import matplotlib.pyplot as plt
import os
import shutil
from PIL import Image

seq = iaa.Sequential([
    #iaa.PiecewiseAffine(scale=(0.01, 0.05)),  #仿射
    #iaa.CoarseDropout((0.03, 0.15), size_percent=(0.02, 0.05),per_channel=0.2),
    #iaa.DirectedEdgeDetect(alpha=(0, 0.7), direction=(0.0, 1.0)),
    #iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)),
    #iaa.Superpixels(p_replace=(0, 1.0),n_segments=(20, 200)),  #超像素
    #iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)),  #锐化
    iaa.Crop(px=(1, 16), keep_size=False),   #裁剪
    iaa.Fliplr(0.5),   #翻转
    iaa.GaussianBlur(sigma=(0, 3.0))  #高斯模糊
])

img=[]
img1 = cv2.imread('./13_.jpg') #举例一张图片
img.append(img1[...,::-1])  #opencv读取图片格式是bgr,需要转换成rgb格式
images_aug = seq.augment_images(images=img)  #返回数据增强后的图片,一个list 
train_on_images(images_aug)  #自定义,进行你后续操作,可以保存到本地、绘制啥的

升级版

加入sometimes,对batch中的一部分图片应用一部分Augmenters,剩下的图片应用另外的Augmenters。0.5就是占比。

sometimes = lambda aug: iaa.Sometimes(0.5, aug)

主体部分。

seq = iaa.Sequential(
    [
        iaa.Fliplr(0.5),  # 对50%的图像进行镜像翻转
        iaa.Flipud(0.2),  # 对20%的图像做左右翻转

        sometimes(iaa.Crop(percent=(0, 0.1))),
        # 这里沿袭我们上面提到的sometimes,对随机的一部分图像做crop操作
        # crop的幅度为0到10%

        sometimes(iaa.Affine(  # 对一部分图像做仿射变换
            scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},  # 图像缩放为80%到120%之间
            translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)},  # 平移±20%之间
            rotate=(-45, 45),  # 旋转±45度之间
            shear=(-16, 16),  # 剪切变换±16度,(矩形变平行四边形)
            order=[0, 1],  # 使用最邻近差值或者双线性差值
            cval=(0, 255),  # 全白全黑填充
            mode=ia.ALL  # 定义填充图像外区域的方法
        )),

        # 使用下面的0个到5个之间的方法去增强图像。注意SomeOf的用法
        iaa.SomeOf((0, 5),
                   [
                       # 将部分图像进行超像素的表示。o(╥﹏╥)o用超像素增强作者还是第一次见,比较孤陋寡闻
                       sometimes(
                           iaa.Superpixels(
                               p_replace=(0, 1.0),
                               n_segments=(20, 200)
                           )
                       ),

                       # 用高斯模糊,均值模糊,中值模糊中的一种增强。注意OneOf的用法
                       iaa.OneOf([
                           iaa.GaussianBlur((0, 3.0)),
                           iaa.AverageBlur(k=(2, 7)),  # 核大小2~7之间,k=((5, 7), (1, 3))时,核高度5~7,宽度1~3
                           iaa.MedianBlur(k=(3, 11)),
                       ]),

                       # 锐化处理
                       iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)),

                       # 浮雕效果
                       iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)),

                       # 边缘检测,将检测到的赋值0或者255然后叠在原图上
                       sometimes(iaa.OneOf([
                           iaa.EdgeDetect(alpha=(0, 0.7)),
                           iaa.DirectedEdgeDetect(
                               alpha=(0, 0.7), direction=(0.0, 1.0)
                           ),
                       ])),

                       # 加入高斯噪声
                       iaa.AdditiveGaussianNoise(
                           loc=0, scale=(0.0, 0.05 * 255), per_channel=0.5
                       ),

                       # 将1%到10%的像素设置为黑色
                       # 或者将3%到15%的像素用原图大小2%到5%的黑色方块覆盖
                       iaa.OneOf([
                           iaa.Dropout((0.01, 0.1), per_channel=0.5),
                           iaa.CoarseDropout(
                               (0.03, 0.15), size_percent=(0.02, 0.05),
                               per_channel=0.2
                           ),
                       ]),

                       # 5%的概率反转像素的强度,即原来的强度为v那么现在的就是255-v
                       iaa.Invert(0.05, per_channel=True),

                       # 每个像素随机加减-10到10之间的数
                       iaa.Add((-10, 10), per_channel=0.5),

                       # 像素乘上0.5或者1.5之间的数字.
                       # iaa.Multiply((0.5, 1.5), per_channel=0.5),

                       # 将整个图像的对比度变为原来的一半或者二倍
                       iaa.contrast.LinearContrast((0.5, 2.0), per_channel=0.5),

                       # 将RGB变成灰度图然后乘alpha加在原图上
                       iaa.Grayscale(alpha=(0.0, 1.0)),

                       # 把像素移动到周围的地方。这个方法在mnist数据集增强中有见到
                       sometimes(
                           iaa.ElasticTransformation(alpha=(0.5, 3.5), sigma=0.25)
                       ),

                       # 扭曲图像的局部区域
                       sometimes(iaa.PiecewiseAffine(scale=(0.01, 0.05)))
                   ],

                   random_order=True  # 随机的顺序把这些操作用在图像上
                   )
    ],
    random_order=True  # 随机的顺序把这些操作用在图像上
)

完整代码见my github
本篇链接:
https://blog.csdn.net/weixin_42385606/article/details/105958290

你可能感兴趣的:(python,opencv)