Tensorflow2 常見的數據加強方法及其實現彙總

在CV方向得模型搭建中,咱們經常須要對輸入得圖片進行數據加強,這將會減小模型對數據的過擬合從兒提高模型的性能。在實際工程中。如工業缺陷、醫療圖像等場景,咱們得到的數據畢竟有限,經過數據加強來提高模型的性能是很是有用的。此時只可以依靠圖像加強的方法來創建訓練所須要的數據集。python


數據加強主要分爲監督的數據加強無監督的數據加強方法。其中有監督的數據加強又能夠分爲單樣本數據加強多樣本數據加強方法,無監督的數據加強分爲生成新的數據學習加強策略兩個方向。算法

這裏咱們介紹一種比較強大的數據加強工具,全部你能想到的加強方法都有——imgaugimgaug是用於機器學習實驗中圖像加強的庫。它支持普遍的擴充技術,能夠輕鬆地組合它們並以隨機順序或在多個CPU內核上執行它們,具備簡單而強大的隨機界面,不只能夠擴充圖像,還能夠擴充關鍵點/地標,邊界框,熱圖和分段圖。網絡

 imgaug安裝命令:dom

pip install imgaug

這裏先介紹經常使用的數據加強方法,後續介紹如何在Tensorflow2中應用這些加強方法。機器學習

具體使用方法,以下:函數

import cv2
import imgaug.augmenters as iaa

seq = iaa.Sequential([ 
    iaa.Fliplr(0.5), # horizontally flip 50% of the images
])

img=cv2.imread("D:\\PycharmProjects\\my_project\\GHIM-20\\GHIM-20\\19\\19_9597.jpg")
[img_seq,]=seq(images=[img])
cv2.imshow("test",img_seq)
cv2.waitKey(0)

 顯示結果:工具

1、監督的數據加強

1.一、單樣本數據加強

1.1.一、 幾何空間變換性能

幾何變換類即對圖像進行幾何變換,包括翻轉,旋轉,裁剪,變形,縮放等各種操做。學習

  • 翻轉

翻轉包括水平翻轉和垂直翻轉。spa

iaa.Fliplr(0.5) # 左右翻轉
iaa.Flipud(1) #上下翻轉
  •  剪切

裁剪圖片的感興趣區域(ROI),一般在訓練的時候,會採用隨機裁剪的方法。

剪切和padding

iaa.CropAndPad(px=None,
               percent=None,
               pad_mode='constant',
               pad_cval=0,
               keep_size=True,
               sample_independently=True,
               name=None,
               deterministic=False,
               random_state=None)

參數:

  • px: 想要crop(negative values)的或者pad(positive values)的像素點。注意與percent不能同時存在。若是是None, pixel級別的crop不會被使用。int或者int list與上面相同。若是是一個4個元素的tuple,那麼4個元素分別表明(top, right, bottom, left),每一個元素能夠是int或者int tuple或者int list。
  • percent:按比例來crop或者pad, 與px相同。可是二者不能同時存在。
  • pad_mode: 填充方式。能夠是All, string, string list。可選的填充方式有: constant, edge, linear_ramp, maximum, median, minimum, reflect, symmetric, wrap。具體含義可查numpy文檔。
  • pad_cval: float、int、float tuple、int tuple、float list、int list。當pad_mode=constant的時候選擇填充的值。
  • keep_size: bool類型。通過crop後,圖像大小會改變。若是該值設置爲1,則在crop或者pad後再縮放成原來的大小。
  • sample_independently : bool類型。若是設置爲False,則每次從px或者percent中選出來的值會做用在四個方位。

剪切

iaa.Crop((0,0,100,100))

  •  仿射類

同時對圖片作裁剪、旋轉、轉換、模式調整等多重操做。例如,這裏對圖像作-30~30度之間旋轉操做。

iaa.Affine(rotate=(-30, 30))

  •  縮放變形

隨機選取圖像的一部分,而後將其縮放到原圖像尺度。例如,將每一個圖像的大小調整爲高度=100和寬度=100:

iaa.Resize({"height": 100, "width": 100})

1.1.二、像素顏色變換類

  • 噪聲類

隨機噪聲是在原來的圖片的基礎上,隨機疊加一些噪聲。

#高斯噪聲(又稱白噪聲)。
#將高斯噪聲添加到圖像中,每一個像素從正態分佈N(0,s)採樣一次,其中s對每一個圖像採樣並在0和0.05 * 255之#間變化:
iaa.AdditiveGaussianNoise(scale=(0, 0.05 * 255))

#矩形丟棄加強器
#在面積大小可選定、位置隨機的矩形區域上丟失信息實現轉換,全部通道的信息丟失產生黑色矩形塊,部分通道
#的信息丟失產生彩色噪聲。
#經過將全部像素轉換爲黑色像素來丟棄2%,可是在具備原始大小的50%的圖像的較低分辨率版本上執行此操做,#丟棄2x2的正方形:
iaa.CoarseDropout(0.02, size_percent=0.5)
#丟棄2%的圖像,可是在具備原始大小的50%的圖像的較低分辨率版本上執行此操做,丟棄2x2個正方形。 此
#外,在50%的圖像通道中執行此操做,以便僅將某些通道的信息設置爲0,而其餘通道保持不變:
iaa.CoarseDropout(0.02, size_percent=0.5, per_channel=0.5)

  • 模糊類

減小各像素點值的差別實現圖片模糊,實現像素的平滑化。

#使用高斯內核模糊圖像的加強器。用高斯內核模糊每一個圖像,sigma爲3.0:
iaa.GaussianBlur(sigma=(0.0, 3.0))

#像素位移加強器
#經過使用位移字段在本地移動像素來轉換圖像。
#經過在強度爲0.25的失真場後移動單個像素來局部扭曲圖像。 每一個像素的移動強度範圍爲0到5.0:
iaa.ElasticTransformation(alpha=(0, 5.0), sigma=0.25)

  • HSV對比度變換

經過向HSV空間中的每一個像素添加或減小V值,修改色調和飽和度實現對比度轉換。

iaa.WithColorspace(
        to_colorspace="HSV",
        from_colorspace="RGB",
        children=iaa.WithChannels(0, iaa.Add((10, 50)))

  • RGB顏色擾動

將圖片從RGB顏色空間轉換到另外一顏色空間,增長或減小顏色參數後返回RGB顏色空間。

#每一個圖像轉換成一個彩色空間與亮度相關的信道,提取該頻道,之間加-30和30並轉換回原始的色彩空間。
iaa.AddToBrightness((-30, 30))

#從離散的均勻範圍中採樣隨機值[-50..50],將其轉換爲角度表示形式,並將其添加到色相(即色空間中的H通
#道)中HSV。
iaa.AddToHue((-50, 50))

#經過隨機值增長或減小色相和飽和度。
#加強器首先將圖像轉換爲HSV色彩空間,而後向H和S通道添加隨機值,而後轉換回RGB。
#在色相和飽和度之間添加隨機值(對於每一個通道獨立添加-100,100對於該通道內的全部像素均添加相同的
#值)。
iaa.AddToHueAndSaturation((-100, 100), per_channel=True)

#將隨機值添加到圖像的飽和度。
#加強器首先將圖像轉換爲HSV色彩空間,而後將隨機值添加到S通道,而後轉換回RGB。
#若是要同時更改色相和飽和度,建議使用AddToHueAndSaturation,不然圖像將被兩次轉換爲HSV並返RGB。
#從離散的均勻範圍內採樣隨機值[-50..50],並將其添加到飽和度,即添加到 色彩空間中的S通道HSV。
iaa.AddToSaturation((-50, 50))

  • 超像素法(Superpixels)

在最大分辨率處生成圖像的若干個超像素,並將其調整到原始大小,再將原始圖像中全部超像素區域按必定比例替換爲超像素,其餘區域不改變。

#徹底或部分地將圖像變換爲其超像素表示。
#每一個圖像生成大約64個超像素。 用平均像素顏色替換每一個機率爲50%。
iaa.Superpixels(p_replace=0.5, n_segments=64)

  • 銳化(sharpen)與浮雕(emboss)

對圖像執行某一程度的銳化或浮雕操做,經過某一通道將結果與圖像融合。

#銳化圖像,而後使用0.0到1.0之間的alpha將結果與原始圖像重疊:
iaa.Sharpen(alpha=(0.0, 1.0), lightness=(0.75, 2.0))

#浮雕圖像,而後使用0.0到1.0之間的alpha將結果與原始圖像疊加:
iaa.Emboss(alpha=(0.0, 1.0), strength=(0.5, 1.5))

1.二、多樣本合成類

 1.2.一、 SMOTE

SMOTE,Synthetic Minority Over-sampling Technique,經過人工合成新樣原本處理樣本不平衡問題,提高分類器性能。

SMOTE原理:

  1. 選一個少數樣本

  2. 對每個小樣本類樣本(x,y),按歐氏距離找K個最近鄰樣本

  3. 從K個最近鄰樣本中隨機選取一個樣本點,假設選擇的近鄰點爲(xn,yn)。在小樣本類樣本(x,y)與最近鄰樣本點(xn,yn)的連線段上隨機選取一點做爲新樣本點,知足如下公式:(x_{new},y_{new})=(x,y)+rand(0-1)((x_{n}-x),(y_{n}-y))

  4. 重複選取取樣,直到大、小樣本數量平衡。

在python中,SMOTE算法已經封裝到了imbalanced-learn庫中,以下圖爲算法實現的數據加強的實例,左圖爲原始數據特徵空間圖,右圖爲SMOTE算法處理後的特徵空間圖。

參考連接:

SMOTE__簡單原理圖示_算法實現及R和Python調包簡單實現

 1.2.二、SamplePairing
SamplePairing方法的處理流程以下圖所示,從訓練集中隨機抽取兩張圖片分別通過基礎數據加強操做(如隨機翻轉等)處理後經像素取平均值的形式疊加合成一個新的樣本,標籤爲原樣本標籤中的一種。

經SamplePairing處理後可以使訓練集的規模從N擴增到N*N,在CPU上也能完成處理。
訓練過程是交替禁用與使用SamplePairing處理操做的結合:
(1)使用傳統的數據加強訓練網絡,不使用SamplePairing 數據加強訓練。
(2)在ILSVRC數據集上完成一個epoch或在其餘數據集上完成100個epoch後,加入SamplePairing 數據加強訓練。
(3)間歇性禁用 SamplePairing。對於 ILSVRC 數據集,爲其中的300000 個圖像啓用SamplePairing,而後在接下來的100000個圖像中禁用它。對於其餘數據集,在開始的8個epoch中啓用,在接下來的2個epoch中禁止。
(4)在訓練損失函數和精度穩定後進行微調,禁用SamplePairing。
實驗結果代表,因SamplePairing數據加強操做可能引入不一樣標籤的訓練樣本,致使在各數據集上使用SamplePairing訓練的偏差明顯增長,而在檢測偏差方面使用SamplePairing訓練的驗證偏差有較大幅度下降。儘管SamplePairing思路簡單,性能上提高效果可觀,符合奧卡姆剃刀原理,遺憾的是的可解釋性不強,目前尚缺理論支撐。目前僅有圖片數據的實驗,還需下一步的實驗與解讀。





1.2.三、 mixup
mixup是基於鄰域風險最小化(VRM)原則的數據加強方法,使用線性插值獲得新樣本數據。
在鄰域風險最小化原則下,根據特徵向量線性插值將致使相關目標線性插值的先驗知識,可得出簡單且與數據無關的mixup公式:

其中(xn,yn)是插值生成的新數據,(xi,yi) 和 (xj,yj)是訓練集中隨機選取的兩個數據,λ的取值知足貝塔分佈,取值範圍介於0到1,超參數α控制特徵目標之間的插值強度。
mixup的實驗豐富,實驗結果代表能夠改進深度學習模型在ImageNet數據集、CIFAR數據集、語音數據集和表格數據集中的泛化偏差,下降模型對已損壞標籤的記憶,加強模型對對抗樣本的魯棒性和訓練對抗生成網絡的穩定性。
mixup處理實現了邊界模糊化,提供平滑的預測效果,加強模型在訓練數據範圍以外的預測能力。
隨着超參數α增大,實際數據的訓練偏差就會增長,而泛化偏差會減小。說明mixup隱式地控制着模型的複雜性。隨着模型容量與超參數的增長,訓練偏差隨之下降。
儘管有着可觀的效果改進,但mixup在誤差—方差平衡方面還沒有有較好的解釋。在其餘類型的有監督學習、無監督、半監督和強化學習中,mixup還有很大的發展空間。

小結:mixup、SMOTE、SamplePairing三者思路上有相同之處,都是試圖將離散樣本點連續化來擬合真實樣本分佈,但所增長的樣本點在特徵空間中仍位於已知小樣本點所圍成的區域內。但在特徵空間中,小樣本數據的真實分佈可能並不限於該區域中,在給定範圍以外適當插值,也許能實現更好的數據加強效果。





2、無監督的數據加強

包括兩類:

(1)經過模型學習數據的分佈,隨機生成與訓練數據集分佈一致的圖片,表明方法,GAN。

(2)經過模型,學習出適合當前任務的數據加強方法,表明方法,AutoAugment。

2.一、GAN

generative adversarial networks,譯名生成對抗網絡 ,它包含兩個網絡,一個是生成網絡,一個是對抗網絡,基本原理以下:

(1)G是一個生成圖片的網絡,它接收隨機的噪聲z,經過噪聲生成圖片,記作G(z) 。

(2)D是一個判別網絡,判別一張圖片是否是「真實的」,便是真實的圖片,仍是由G生成的圖片。

2.二、AutoAugment

雖然這是一篇論文,可是也能夠看做一個研究方向。

它的基本思路:使用加強學習從數據自己尋找最佳圖像變換策略,對於不一樣的任務學習不一樣的加強方法。

基本原理:

1:準備16個數據加強操做。

2 : 從16箇中選擇5個操做,隨機產生使用該操做的機率和幅度,將其稱爲一個sub-policy,一共產生5個sub-polices。

3:每個batch中的圖片,隨機採用5個sub-polices操做中的一種。

4:經過childmodel在驗證集上的泛化能力來反饋,使用加強學習方法。

5:通過80~100個epoch後開始有效果,能學習到sub-policies。

6:串接這5個sub-policies,而後再進行最後的訓練。

參考連接:

【技術綜述】深度學習中的數據加強方法都有哪些?

Python—imgaug圖像數據加強,Pythonimgaug,圖片

imgaug數據加強神器:加強器一覽

相關文章
相關標籤/搜索