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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章