1. 程式人生 > >深度學習之資料增強庫imgaug使用方法

深度學習之資料增強庫imgaug使用方法

上一篇文章中,介紹了常用的資料增強的方法,並提到了實現這些方法的一個庫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 效果預覽

4 測試程式

整體流程為:定義變換序列(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

5 函式介紹

在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大致生成類似雲的模式。