基於深度學習Keras框架的訓練數據增強方法(轉)

徐海蛟教學


在深度學習中,當數據量不夠大時候,常常採用下面4中方法:


1. 人工增加訓練集的大小. 通過平移, 翻轉, 加噪聲等方法從已有數據中創造出一批"新"的數據.也就是Data Augmentation

2. Regularization. 數據量比較小會導致模型過擬合, 使得訓練誤差很小而測試誤差特別大. 通過在Loss Function 後面加上正則項可以抑制過擬合的產生. 缺點是引入了一個需要手動調整的hyper-parameter. 詳見

3. Dropout. 這也是一種正則化手段. 不過跟以上不同的是它通過隨機將部分神經元的輸出置零來實現. 詳見

4. Unsupervised Pre-training. 用Auto-Encoder或者RBM的卷積形式一層一層地做無監督預訓練, 最後加上分類層做有監督的Fine-Tuning. 參考 

 

不同的任務背景下, 我們可以通過圖像的幾何變換, 使用以下一種或多種組合數據增強變換來增加輸入數據的量. 這裏具體的方法都來自數字圖像處理的內容, 相關的知識點介紹, 網上都有, 就不一一介紹了.

  • 旋轉 | 反射變換(Rotation/reflection): 隨機旋轉圖像一定角度; 改變圖像內容的朝向;

  • 翻轉變換(flip): 沿着水平或者垂直方向翻轉圖像;

  • 縮放變換(zoom): 按照一定的比例放大或者縮小圖像;

  • 平移變換(shift): 在圖像平面上對圖像以一定方式進行平移; 
    可以採用隨機或人爲定義的方式指定平移範圍和平移步長, 沿水平或豎直方向進行平移. 改變圖像內容的位置;

  • 尺度變換(scale): 對圖像按照指定的尺度因子, 進行放大或縮小; 或者參照SIFT特徵提取思想, 利用指定的尺度因子對圖像濾波構造尺度空間. 改變圖像內容的大小或模糊程度;

  • 對比度變換(contrast): 在圖像的HSV顏色空間,改變飽和度S和V亮度分量,保持色調H不變. 對每個像素的S和V分量進行指數運算(指數因子在0.25到4之間), 增加光照變化;

  • 噪聲擾動(noise): 對圖像的每個像素RGB進行隨機擾動, 常用的噪聲模式是椒鹽噪聲和高斯噪聲;

  • 顏色變換(color): 在訓練集像素值的RGB顏色空間進行PCA, 得到RGB空間的3個主方向向量,3個特徵值, p1, p2, p3, λ1, λ2, λ3. 對每幅圖像的每個像素Ixy=[IRxy,IGxy,IBxy]T進行加上如下的變化:

                                        [p1,p2,p3][α1λ1,α2λ2,α3λ3]T

      :αi滿0,0.1.

代碼實現

作爲實現部分, 這裏介紹一下在python 環境下, 利用已有的開源代碼庫Keras作爲實踐:

複製代碼

 1 # -*- coding: utf-8 -*- 2 __author__ = 'Administrator' 3  4 # import packages 5 from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img 6  7 datagen = ImageDataGenerator( 8         rotation_range=0.2, 9         width_shift_range=0.2,10         height_shift_range=0.2,11         shear_range=0.2,12         zoom_range=0.2,13         horizontal_flip=True,14         fill_mode='nearest')15 16 img = load_img('C:\Users\Administrator\Desktop\dataA\lena.jpg')  # this is a PIL image, please replace to your own file path17 x = img_to_array(img)  # this is a Numpy array with shape (3, 150, 150)18 x = x.reshape((1,) + x.shape)  # this is a Numpy array with shape (1, 3, 150, 150)19 20 # the .flow() command below generates batches of randomly transformed images21 # and saves the results to the `preview/` directory22 23 i = 024 for batch in datagen.flow(x,25                           batch_size=1,26                           save_to_dir='C:\Users\Administrator\Desktop\dataA\pre',#生成後的圖像保存路徑27                           save_prefix='lena',28                           save_format='jpg'):29     i += 130     if i > 20:31         break  # otherwise the generator would loop indefinitely

複製代碼

 

主要函數:ImageDataGenerator 實現了大多數上文中提到的圖像幾何變換方法.

  • rotation_range: 旋轉範圍, 隨機旋轉(0-180)度;

  • width_shift and height_shift: 隨機沿着水平或者垂直方向,以圖像的長寬小部分百分比爲變化範圍進行平移;

  • rescale: 對圖像按照指定的尺度因子, 進行放大或縮小, 設置值在0 - 1之間,通常爲1 / 255;

  • shear_range: 水平或垂直投影變換, 參考這裏 https://keras.io/preprocessing/image/

  • zoom_range: 按比例隨機縮放圖像尺寸;

  • horizontal_flip: 水平翻轉圖像;

  • fill_mode: 填充像素, 出現在旋轉或平移之後.

效果如下圖所示:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章