圖像數(shù)據(jù)增強(qiáng)(一)
1. 加載和顯示圖片
由于imgaug只處理增強(qiáng)而不是圖像輸入/輸出,我們需要另一個庫來加載圖像。在Python中,常見的選擇是imageio和CV2。然而,CV2.imread()以BGR顏色空間返回圖像,而不是RGB,需要重新排序通道軸。后一種方法的缺點是所有可視化函數(shù)(例如下面的imgaug.imshow())仍然需要輸入RGB格式。
觀察imshow源碼后發(fā)現(xiàn),imshow只能輸入RGB格式,如果采用imageio讀取不用轉(zhuǎn)換通道格式,而使用CV2的話,需要轉(zhuǎn)成RGB格式。其實當(dāng)使用CV2的時候,ia.imshow()內(nèi)部還是調(diào)用了CV2.imshow(),只不過又把RGB轉(zhuǎn)成了BGR……所以感覺這個ia.imshow()相當(dāng)雞肋。

2. 圖像增強(qiáng)
imgaug的增強(qiáng)技術(shù)是從Augmenter父類派生的。要使用一種增強(qiáng)技術(shù),我們需要用一組參數(shù)實例化增強(qiáng)對象。
2.1 仿射變換
Augmenter to apply affine transformations to images.
Affine類是對圖片進(jìn)行仿射變化的增強(qiáng)類,包括平移,旋轉(zhuǎn),縮放,錯切。
如果不傳入?yún)?shù),該類會自動賦值一些變換參數(shù),內(nèi)部實現(xiàn)如下

幾個主要的參數(shù)如下:
scale=None
縮放因子,1.0表示無變化,0.5表示縮小50%,還支持其他類型的參數(shù)以對不同軸做不同變化。
translate_percent=None
其中0表示無變化,0.5表示平移圖片大小的一半。常用的方式如下:
x軸隨機(jī)平移左右平移0~0.1比例,y軸同理上下平移
translate_px=None
以像素單位平移,和上面相同。
rotate=None
旋轉(zhuǎn)取值范圍在[-360,360],如果是元組,例如(30,60),會在范圍內(nèi)隨機(jī)均勻采樣。如果是列表,隨機(jī)取列表中的某個值。
shear=None
錯切角度在[-360,360],但是合適的范圍在[-45,45]
order=1
插值方法,0表示最近鄰,1表示雙線性,常用的是這兩個,還有其他方法。
cval=0
mode="constant"時要填充的常數(shù)值,輸入元組代表范圍取值,列表代表隨機(jī)取值。
mode="constant"
填充新創(chuàng)建的像素時要使用的模式,默認(rèn)用常數(shù)填充。
fit_output=False
經(jīng)過一些仿射變化后,圖像的一些邊緣可能就會丟失,如果將該參數(shù)設(shè)置為True,那么整張圖片會完整的顯示出來,但是此時圖像大小會發(fā)生改變。如果不想圖像大小發(fā)生變化,用ia.augmenters.size.KeepSizeByResize包裹增強(qiáng)對象即可。
以上輸入的參數(shù)類型大致分為三類,數(shù)字,元組,列表,字典。其中數(shù)字就是對應(yīng)的值,元組就是在這個范圍內(nèi)部均勻隨機(jī)采樣,列表就是隨機(jī)采樣列表值,字典可以針對x軸和y軸做不同變化,字典key對應(yīng)的value可以是數(shù)字,元組,列表類型。此外,還有一種隨機(jī)數(shù)類型,這里不做介紹。
2.2?批量增強(qiáng)
imgaug支持批量圖片的增強(qiáng),如果這批圖片的大小不一,那么只能使用數(shù)組,如果圖片大小相同例如一批圖片為[B,H,W,C],可以使用numpy張量格式,速度上會更快一些。
注意這里傳入的參數(shù)是images。
2.3?同時使用多種增強(qiáng)
我們可以使用Sequential來整合一系列增強(qiáng)對象,這和pytorch里面的nn.Sequential有異曲同工之妙。如果希望增強(qiáng)不是按照定義的順序而是隨機(jī),可以設(shè)置random_order=True。
其他的類似方法還有:
SomeOf表示選取給定增強(qiáng)中的某些增強(qiáng);
OneOf表示只應(yīng)用所有給定增強(qiáng)中的一個;
Sometimes按概率隨機(jī)增強(qiáng);