實現批量數據加強 | keras ImageDataGenerator使用

微信公衆號:AI算法與圖像處理
關注和置頂公衆號可第一時間瞭解公衆號最新諮詢
若是你以爲推文對你有幫助,歡迎分享和轉載,轉載請註明出處和公衆號二維碼python

內容目錄(由[TOC]自動生成)

什麼是數據不均衡問題這裏簡單說明一下,重點是操做和應用:一、數據不均衡問題二、常見的解決方法函數說明準備工做功能說明參數說明參數完整代碼效果展現總結git

什麼是數據不均衡問題

詳細說明,請參考:https://blog.csdn.net/Yaphat/article/details/60348946github

這裏簡單說明一下,重點是操做和應用:

一、數據不均衡問題

在大部分狀況下,咱們認爲不一樣類別的數據是均勻分佈的,不少算法也是基於這個假設,可是在真實的狀況下,每每都不是如此的。例如,機器發送故障的狀況是咱們想要預測的,但實際上故障的機率是很低的,因此致使故障的樣本量不多,即便你將全部的預測結果都設置爲正常,準確率依然很高,但這個模型是一個沒有用的模型,這種相似的例子是很是常見的。面試

二、常見的解決方法

解決的方案不少,主要從兩個方面考慮(面試的時候可能會問)
1)數據層面
2)算法層面算法

在項目中,咱們可能沒那麼多時間去思考從算法方面去解決,更多的時候想的是能用就行,可是網上不少的例子不少是基於內置的數據,這是很是讓人難受的,或者是基於一張圖片進行數據加強,很痛苦。更通常的狀況是,對訓練集下的某一個文件夾的全部圖片進行數據加強,這就是我寫這個的理由。
這部分的理論,能夠參考:https://blog.csdn.net/mieleizhi0522/article/details/82191331微信

函數說明

準備工做

所使用的環境
Python3.六、tensorflow-gpu 1.5.0、keras2.2.4app

功能說明

1)ImageDataGenerator 圖片生成器
2)flow_from_directory 以文件夾路徑爲參數,生成通過數據提高/歸一化後的數據,在一個無限循環中無限產生batch數據dom

參數說明

備註:對於單張圖片的數據加強,能夠參看ImageDataGenerator和flow的使用說明:https://blog.csdn.net/hnu2012/article/details/54017564
1)ImageDataGenerator 圖片生成器函數

from keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest'
        cval=0,
        channel_shift_range=0,
        horizontal_flip=False,
        vertical_flip=False,
        rescale=None)
複製代碼
參數

rotation_range:整數,數據提高時圖片隨機轉動的角度
width_shift_range:浮點數,圖片寬度的某個比例,數據提高時圖片水平偏移的幅度
height_shift_range:浮點數,圖片高度的某個比例,數據提高時圖片豎直偏移的幅度
rescale: 重放縮因子,默認爲None. 若是爲None或0則不進行放縮,不然會將該數值乘到數據上(在應用其餘變換以前)
shear_range:浮點數,剪切強度(逆時針方向的剪切變換角度)
zoom_range:浮點數或形如[lower,upper]的列表,隨機縮放的幅度,若爲浮點數,則至關於[lower,upper] = [1 - zoom_range, 1+zoom_range]
fill_mode:‘constant’‘nearest’,‘reflect’或‘wrap’之一,當進行變換時超出邊界的點將根據本參數給定的方法進行處理
cval:浮點數或整數,當fill_mode=constant時,指定要向超出邊界的點填充的值
channel_shift_range: Float. Range for random channel shifts.
horizontal_flip:布爾值,進行隨機水平翻轉
vertical_flip:布爾值,進行隨機豎直翻轉
rescale: 重放縮因子,默認爲None. 若是爲None或0則不進行放縮,不然會將該數值乘到數據上(在應用其餘變換以前spa

2)flow_from_directory

gen = datagen.flow_from_directory(
                           path,
                           target_size=(224224),
                           batch_size=15,
                           save_to_dir=dst_path,#生成後的圖像保存路徑
                           save_prefix='xx',
                           save_format='jpg')

for i in range(6):
    gen.next()
"""
path:文件讀入的路徑,必須是子文件夾的上一級(這裏是個坑,不過試一哈就懂了)
target_size:圖片resize成的尺寸,不設置會默認設置爲(256.256)
batch_size:每次輸入的圖片的數量,例如batch_size=32,一次進行加強的數量爲32,
我的經驗:batch_size的大小最好是應該和文件的數量是能夠整除的關係
save_to_dir:加強後圖片的保存位置
save_prefix:文件名加前綴,方便查看
save_format:保存圖片的數據格式
產生的圖片總數:batch_size*6(即range中的數字)
"""

複製代碼

完整代碼

from keras.preprocessing.image import ImageDataGenerator

path = 'E:/C3D_Data/train' # 類別子文件夾的上一級
dst_path = 'E:/C3D_Data/train_result'
#  圖片生成器
datagen = ImageDataGenerator(

    rotation_range=5,
    width_shift_range=0.02,
    height_shift_range=0.02,
    shear_range=0.02,
    horizontal_flip=True,
    vertical_flip=True
)

gen = datagen.flow_from_directory(
                           path,
                           target_size=(224224),
                           batch_size=15,
                           save_to_dir=dst_path,#生成後的圖像保存路徑
                           save_prefix='xx',
                           save_format='jpg')

for i in range(6):
    gen.next()
複製代碼

效果展現

總結

一、能基本實現咱們須要的數據加強的要求
二、可是實際上數據加強的手段不止這些(有興趣能夠繼續探索)

這裏須要強調一點,ImageDataGenerator裏面應該是每一張圖片進去都會隨機有可能受到全部的操做(例如裁剪,旋轉等)的做用

但願每一篇用心寫的推文都能幫助到你,可能你已是大神了,這些對你沒啥用,可是這倒是新手一開始都會遇到的難題,不想你們由於一點小小的挫折就放棄,因此推文一方面是記錄本身真實遇到的坑,另外一面也但願可以提高本身的表達能力。

代碼已經更新到:github.com/SCUTPZW/AI_…

但願可以獲得大家一顆真心的star(還沒被點過)

相關文章
相關標籤/搜索