數據增強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