CNN入門-圖像增強
上一章為大家介紹了CNN的基本原理,然而一般我們在將圖片送入神經網絡之前,通常還會經過『資料增強(Augmentation)』的步驟,今天就帶大家來認識一下Image Augmentation是如何在Python中實現的。
為什麼需要 Image Augmentation?
Image augmentation 兩個主要的功能包含『彌補資料不足』以及『避免Overfitting』
彌補資料不足
通常我們想要訓練一個準確性高、泛化性好的CNN圖像辨識器,除了模型本身的架構外,最關鍵的就是我們所擁有的資料,資料量越大、越完整,那想必不用太過於複雜的架構也能獲得不錯的效果!但一般來說,圖像資料的收集往往是我們最大的痛點,而在資料有限的狀況下,我們又該如何自己創造新的資料呢?沒錯!最簡單的方式就是透過Image augmentation,我們藉由旋轉、裁切、增加噪點、白化等技術,將原本的圖片做了一些『加強』,如此一來,我們就硬生生地增加了許多的資料。
避免Overfitting
在訓練一個分類器時,大家應該很容易遇到Overfitting的狀況,也就是對Training Data過於完美的擬合,此時,透過適當的圖像增強,也能降低Overfitting 的可能性。
Keras ImageDataGenerator
我們先來介紹Keras 的 ImageDataGenerator,ImageDataGenerator可以做到許多的圖像增強,以下列出幾項常見的項目為大家介紹:
featurewise_center:Boolean,以每一張feature map為單位將平均值設為0
featurewise_std_normalization: Boolean,以每一張feature map為單位將數值除以其標準差(上述兩步驟就是我們常見的Standardization)
zca_whitening: Boolean,透過ZCA取出重要特徵(詳見:ZCA介紹)
rotation_range:整數值,控制隨機旋轉角度
width_shift_range:「浮點、整數、一維數」,圖像寬度上隨機偏移值
height_shift_range:「浮點、整數、一維數」,圖像高度上隨機偏移值
shear_range:浮點數,裁切強度
zoom_range:浮點數或範圍,控制隨機縮放比例
horizontal_flip: Boolean,隨機水平翻轉
vertical_flip:Boolean,隨機垂直翻轉
rescale: 數值,縮放比例
dtype:輸出資料型態
看一下輸入與輸出照片,最左邊是輸入照片:
下面程式碼示範如何在Keras中將Generator輸出資料給Model:
Imgaug
這裡額外向大家介紹一個好用的library叫做 Imgaug(Github連結),可以點進Github內看細節介紹,安裝方式最簡單的話使用pip install imgaug,下面我們示範用Imgaug做Image augmentation:
看一下輸入與輸出照片,最左邊是輸入照片:
上面的程式代碼中,我們示範了如何運用Imgaug library做簡單的圖像增強,大家應該已經有一些概念,下方程式碼示範如何將多種增強效果包裝起來:
看一下三組輸入與輸出照片,每次都是隨機增強,最左邊是輸入照片:
結論
Image Augmentation 是常見的影像前處理,然而也要避免一些錯誤的使用情境,如訓練數字模型時使用垂直翻轉,這樣會造成6、9之間的訓練問題,又如輸入影像為小尺寸(ex. 32*32),結果隨機裁切16個像素,如此幾乎所有的內容都被裁切導致模型無法學到有用資訊。
適當的運用Image Augmentation技巧相信能提升模型的表現!