keras的圖像預處理ImageDataGenerator類
一、總結
一句話總結:
【圖片生成器-“喂”一個batch_size大小的樣本數據】:ImageDataGenerator()是keras.preprocessing.image模塊中的圖片生成器,可以每一次給模型“喂”一個batch_size大小的樣本數據
【數據增強等操作】:同時也可以在每一個批次中對這batch_size個樣本數據進行增強,擴充數據集大小,增強模型的泛化能力。比如進行旋轉,變形,歸一化等等。
二、keras的圖像預處理全攻略(二)—— ImageDataGenerator 類
轉自或參考:keras的圖像預處理全攻略(二)—— ImageDataGenerator 類
https://blog.csdn.net/qq_27825451/article/details/90056896
我們在深度學習的時候,當然也可以事先先一張一張將圖片進行預處理,然后再將圖片放入訓練,但是這樣做效率比較低下,而且不是實時的,即圖像的預處理變成了完全的事先操作,和后面的訓練毫無關系。那有沒有效率更加高校一些,在訓練的時候邊訓練邊處理的實時操作方法呢?keras提供了這樣的方法,所有的這些都是通過......\Lib\site-packages\keras_preprocessing\image.py 里面提供了一個 ImageDataGenerator 類,通過這個類來實現,由於這個類較為復雜,我們將從它的定義開始說起,然后看他的一些使用方法。實際上前面定義的那些方法就是為后面的那幾個類提供服務的,一般少有情況去單獨使用這些方法。
一、ImageDataGenerator類的定義以及構造函數的參數詳解
1.1 ImageDataGenerator類的簡單介紹
class ImageDataGenerator(object):
"""Generate batches of tensor image data with real-time data augmentation.
The data will be looped over (in batches).
這個類是做什么用的?通過實時數據增強生成張量圖像數據批次,並且可以循環迭代,我們知道在Keras中,當數據量很多的時候我們需要使用model.fit_generator()方法,該方法接受的第一個參數就是一個生成器。簡單來說就是:ImageDataGenerator()是keras.preprocessing.image模塊中的圖片生成器,可以每一次給模型“喂”一個batch_size大小的樣本數據,同時也可以在每一個批次中對這batch_size個樣本數據進行增強,擴充數據集大小,增強模型的泛化能力。比如進行旋轉,變形,歸一化等等。
總結起來就是兩個點:
(1)圖片生成器,負責生成一個批次一個批次的圖片,以生成器的形式給模型訓練;
(2)對每一個批次的訓練圖片,適時地進行數據增強處理(data augmentation);
1.2 數據增強處理(data augmentation)
數據增強的手段有非常多種,這里指說一些代表性的。
- 旋轉 | 反射變換(Rotation/reflection): 隨機旋轉圖像一定角度; 改變圖像內容的朝向;
- 翻轉變換(flip): 沿着水平或者垂直方向翻轉圖像;
- 縮放變換(zoom): 按照一定的比例放大或者縮小圖像;
- 平移變換(shift): 在圖像平面上對圖像以一定方式進行平移;可以采用隨機或人為定義的方式指定平移范圍和平移步長, 沿水平或豎直方向進行平移. 改變圖像內容的位置;
- 尺度變換(scale): 對圖像按照指定的尺度因子, 進行放大或縮小; 或者參照SIFT特征提取思想, 利用指定的尺度因子對圖像濾波構造尺度空間. 改變圖像內容的大小或模糊程度;
- 對比度變換(contrast): 在圖像的HSV顏色空間,改變飽和度S和V亮度分量,保持色調H不變. 對每個像素的S和V分量進行指數運算(指數因子在0.25到4之間), 增加光照變化;
- 噪聲擾動(noise): 對圖像的每個像素RGB進行隨機擾動, 常用的噪聲模式是椒鹽噪聲和高斯噪聲;
- 錯切變換(shear):效果就是讓所有點的x坐標(或者y坐標)保持不變,而對應的y坐標(或者x坐標)則按比例發生平移,且平移的大小和該點到x軸(或y軸)的垂直距離成正比。
1.3 ImageDataGenerator類的構造函數參數
- featurewise_center: 布爾值。將輸入數據的均值設置為 0,逐特征進行,對輸入的圖片每個通道減去每個通道對應均值。
- samplewise_center: 布爾值。將每個樣本的均值設置為 0,每張圖片減去樣本均值, 使得每個樣本均值為0
- featurewise_std_normalization: Boolean. 布爾值。將每個輸入(即每張圖片)除以數據集(dataset)標准差,逐特征進行。
- samplewise_std_normalization: 布爾值。將每個輸入(即每張圖片)除以其自身(圖片本身)的標准差。
這里需要注意兩個概念,所謂 featurewise指的是逐特征,它針對的是數據集dataset,而samplewise針對的是單個輸入圖片的本身。featurewise是從整個數據集的分布去考慮的,而samplewise只是針對自身圖片 。
- zca_epsilon: ZCA 白化的 epsilon 值,默認為 1e-6。
- zca_whitening: 布爾值。是否應用 ZCA 白化。
- rotation_range: 整數。隨機旋轉的度數范圍。
- width_shift_range: 它的值可以是浮點數、一維數組、整數
- float: 如果 <1,則是除以總寬度的值,或者如果 >=1,則為像素值。
- 1-D 數組: 數組中的隨機元素。
- int: 來自間隔
(-width_shift_range, +width_shift_range)
之間的整數個像素。 width_shift_range=2
時,可能值是整數[-1, 0, +1]
,與width_shift_range=[-1, 0, +1]
相同;而width_shift_range=1.0
時,可能值是[-1.0, +1.0)
之間的浮點數。
- height_shift_range: 浮點數、一維數組或整數(同width_shift_range)
- float: 如果 <1,則是除以總寬度的值,或者如果 >=1,則為像素值。
- 1-D array-like: 數組中的隨機元素。
- int: 來自間隔
(-height_shift_range, +height_shift_range)
之間的整數個像素。 height_shift_range=2
時,可能值是整數[-1, 0, +1]
,與height_shift_range=[-1, 0, +1]
相同;而height_shift_range=1.0
時,可能值是[-1.0, +1.0)
之間的浮點數。
- shear_range: 浮點數。剪切強度(以弧度逆時針方向剪切角度)。
所謂shear_range就是錯切變換,效果就是讓所有點的x坐標(或者y坐標)保持不變,而對應的y坐標(或者x坐標)則按比例發生平移,且平移的大小和該點到x軸(或y軸)的垂直距離成正比。如下圖所示,一個黑色矩形圖案變換為藍色平行四邊形圖案。上一篇文章中也展示了shear變換的效果。
- brightness_range: 兩個浮點數組成的元組或者是列表,像素的亮度會在這個范圍之類隨機確定
- zoom_range: 浮點數 或
[lower, upper]
。隨機縮放范圍。如果是浮點數,[lower, upper] = [1-zoom_range, 1+zoom_range]
。zoom_range參數可以讓圖片在長或寬的方向進行放大,可以理解為某方向的resize,因此這個參數可以是一個數或者是一個list。當給出一個數時,圖片同時在長寬兩個方向進行同等程度的放縮操作;當給出一個list時,則代表[width_zoom_range, height_zoom_range],即分別對長寬進行不同程度的放縮。而參數大於0小於1時,執行的是放大操作,當參數大於1時,執行的是縮小操作。 - channel_shift_range: 浮點數。隨機通道轉換的范圍。channel_shift_range可以理解成改變圖片的顏色,通過對顏色通道的數值偏移,改變圖片的整體的顏色,這意味着是“整張圖”呈現某一種顏色,像是加了一塊有色玻璃在圖片前面一樣,即每一個通道上的每一個像素值都加上某一個數值。
- fill_mode: {"constant", "nearest", "reflect" or "wrap"} 之一。默認為 'nearest'。輸入邊界以外的點根據給定的模式填充:
- 'constant': kkkkkkkk|abcd|kkkkkkkk (當下面的cval=k)
- 'nearest': aaaaaaaa|abcd|dddddddd
- 'reflect': abcddcba|abcd|dcbaabcd
- 'wrap': abcdabcd|abcd|abcdabcd
- cval: 浮點數或整數。用於邊界之外的點的值,當
fill_mode = "constant"
時。 - horizontal_flip: 布爾值。隨機水平翻轉。
- vertical_flip: 布爾值。隨機垂直翻轉。
需要注意的是:既然是每次隨機進行翻轉,隨機對圖片執行水平或者是垂直翻轉操作,意味着不一定對所有圖片都會執行水 平翻轉或垂直翻轉,每次生成均是隨機選取圖片進行翻轉
- rescale: 重縮放因子。默認為 None。如果是 None 或 0,不進行縮放,否則將數據乘以所提供的值(在應用任何其他轉換之前)。
rescale的作用是對圖片的每個像素值均乘上這個放縮因子,這個操作在所有其它變換操作之前執行,在一些模型當中,直接輸入原圖的像素值可能會落入激活函數的“死亡區”,因此設置放縮因子為1/255,把像素值放縮到0和1之間有利於模型的收斂,避免神經元“死亡”。
- preprocessing_function: 這是用戶自定義的函數,應用於每個輸入的函數。這個函數會在任何其他改變之前運行。這個函數需要一個參數:一張圖像(秩為 3 的 Numpy 張量),並且應該輸出一個同尺寸的 Numpy 張量。
- data_format: 圖像數據格式,{"channels_first", "channels_last"} 之一。"channels_last" 模式表示圖像輸入尺寸應該為
(samples, height, width, channels)
,"channels_first" 模式表示輸入尺寸應該為(samples, channels, height, width)
。默認為 在 Keras 配置文件~/.keras/keras.json
中的image_data_format
值。如果你從未設置它,那它就是 "channels_last"。 - validation_split: 浮點數。Float. 保留用於驗證的圖像的比例(嚴格在0和1之間)。
- dtype: 生成數組使用的數據類型。
二、ImageDataGenerator類的一些方法以及處理流程
2.1 ImageDataGenerator的一些方法概覽
def __init__(self,
def flow(self, x,
def flow_from_directory(self, directory,
def flow_from_dataframe(self, dataframe, directory,
def standardize(self, x):
def get_random_transform(self, img_shape, seed=None):
def apply_transform(self, x, transform_parameters):
def random_transform(self, x, seed=None):
def fit(self, x,
2.2 一般的對圖像的處理流程(四步走)
(1)第一步:數據集的划分,得到x_train,y_train,x_test,y_test;
(2)第二步:構造ImageDataGenerator對象,其中要進行某一些操作是通過在構造函數中的參數指定的,
datagen = ImageDataGenerator(......)
(3)第三步:對樣本數據進行data augmentation處理,通過fit方法
注意:這一步並不是必須的,當ImageDataGenerator構造函數中需要使用
- featurewise_center:
- samplewise_center:
- featurewise_std_normalization:
- samplewise_std_normalization:
這幾個參數時才需要使用fit方法,因為需要從fit方法中得到原始圖形的統計信息,比如均值、方差等等,否則是不需要改步驟的。
datagen.fit(x_train) # 使用實時數據增益的批數據對模型進行擬合
(4)第四步:進行訓練,通過flow方法
model.fit_generator(datagen.flow(x_train, y_train, batch_size=32), steps_per_epoch=len(x_train) / 32, epochs=epochs)
上面是一般的處理流程,當然有時候會有更加靈活的處理方式,后面會有例子加以說明
2.3 ImageDataGenerator的所有方法介紹
(1)fit方法
fit(x, augment=False, rounds=1, seed=None)
將數據生成器用於某些樣本數據數據。它基於一組樣本數據,計算與數據轉換相關的內部數據統計。當且僅當 featurewise_center
或 featurewise_std_normalization
或 zca_whitening
設置為 True 時才需要。
參數
- x: 樣本數據。秩應該為 4,即(batch,width,height,channel)的格式。對於灰度數據,通道軸的值應該為 1;對於 RGB 數據,值應該為 3。
- augment: 布爾值(默認為 False)。是否使用隨機樣本擴張。
- rounds: 整數(默認為 1)。如果數據數據增強(augment=True),表明在數據上進行多少次增強。
- seed: 整數(默認 None)。隨機種子。
(2)flow方法
flow(x, y=None, batch_size=32, shuffle=True, sample_weight=None, seed=None, save_to_dir=None, save_prefix='', save_format='png', subset=None)
采集數據和標簽數組,生成批量增強數據。
參數
- x: 輸入數據。秩為 4 的 Numpy 矩陣或元組。如果是元組,第一個元素應該包含圖像,第二個元素是另一個 Numpy 數組或一列 Numpy 數組,它們不經過任何修改就傳遞給輸出。可用於將模型雜項數據與圖像一起輸入。對於灰度數據,圖像數組的通道軸的值應該為 1,而對於 RGB 數據,其值應該為 3。
- y: 標簽。
- batch_size: 整數 (默認為 32)。
- shuffle: 布爾值 (默認為 True)。
- sample_weight: 樣本權重。
- seed: 整數(默認為 None)。
- save_to_dir: None 或 字符串(默認為 None)。這使您可以選擇指定要保存的正在生成的增強圖片的目錄(用於可視化您正在執行的操作)。
- save_prefix: 字符串(默認
''
)。保存圖片的文件名前綴(僅當save_to_dir
設置時可用)。 - save_format: "png", "jpeg" 之一(僅當
save_to_dir
設置時可用)。默認:"png"。 - subset: 數據子集 ("training" 或 "validation"),如果 在
ImageDataGenerator
中設置了validation_split
。
返回
一個生成元組 (x, y)
的 生成器Iterator
,其中 x
是圖像數據的 Numpy 數組(在單張圖像輸入時),或 Numpy 數組列表(在額外多個輸入時),y
是對應的標簽的 Numpy 數組。如果 'sample_weight' 不是 None,生成的元組形式為 (x, y, sample_weight)
。如果 y
是 None, 只有 Numpy 數組 x
被返回。
(3)flow_from_dataframe方法
flow_from_dataframe(dataframe, directory, x_col='filename', y_col='class', has_ext=True, target_size=(256, 256), color_mode='rgb', classes=None, class_mode='categorical', batch_size=32, shuffle=True, seed=None, save_to_dir=None, save_prefix='', save_format='png', subset=None, interpolation='nearest')
輸入 dataframe 和目錄的路徑,並生成批量的增強/標准化的數據。
參數
- dataframe: Pandas dataframe,一列為圖像的文件名,另一列為圖像的類別, 或者是可以作為原始目標數據多個列。
- directory: 字符串,目標目錄的路徑,其中包含在 dataframe 中映射的所有圖像。
- x_col: 字符串,dataframe 中包含目標圖像文件夾的目錄的列。
- y_col: 字符串或字符串列表,dataframe 中將作為目標數據的列。
- has_ext: 布爾值,如果 dataframe[x_col] 中的文件名具有擴展名則為 True,否則為 False。
- target_size: 整數元組
(height, width)
,默認為(256, 256)
。 所有找到的圖都會調整到這個維度。 - color_mode: "grayscale", "rbg" 之一。默認:"rgb"。 圖像是否轉換為 1 個或 3 個顏色通道。
- classes: 可選的類別列表 (例如,
['dogs', 'cats']
)。默認:None。 如未提供,類比列表將自動從 y_col 中推理出來,y_col 將會被映射為類別索引)。 包含從類名到類索引的映射的字典可以通過屬性class_indices
獲得。 - class_mode: "categorical", "binary", "sparse", "input", "other" or None 之一。 默認:"categorical"。決定返回標簽數組的類型:
"categorical"
將是 2D one-hot 編碼標簽,"binary"
將是 1D 二進制標簽,"sparse"
將是 1D 整數標簽,"input"
將是與輸入圖像相同的圖像(主要用於與自動編碼器一起使用),"other"
將是 y_col 數據的 numpy 數組,- None, 不返回任何標簽(生成器只會產生批量的圖像數據,這對使用
model.predict_generator()
,model.evaluate_generator()
等很有用)。
- batch_size: 批量數據的尺寸(默認:32)。
- shuffle: 是否混洗數據(默認:True)
- seed: 可選的混洗和轉換的隨即種子。
- save_to_dir: None 或 str (默認: None). 這允許你可選地指定要保存正在生成的增強圖片的目錄(用於可視化您正在執行的操作)。
- save_prefix: 字符串。保存圖片的文件名前綴(僅當
save_to_dir
設置時可用)。 - save_format: "png", "jpeg" 之一(僅當
save_to_dir
設置時可用)。默認:"png"。 - follow_links: 是否跟隨類子目錄中的符號鏈接(默認:False)。
- subset: 數據子集 (
"training"
或"validation"
),如果在ImageDataGenerator
中設置了validation_split
。 - interpolation: 在目標大小與加載圖像的大小不同時,用於重新采樣圖像的插值方法。 支持的方法有
"nearest"
,"bilinear"
, and"bicubic"
。 如果安裝了 1.1.3 以上版本的 PIL 的話,同樣支持"lanczos"
。 如果安裝了 3.4.0 以上版本的 PIL 的話,同樣支持"box"
和"hamming"
。 默認情況下,使用"nearest"
。
Returns
一個生成 (x, y)
元組的 DataFrameIterator, 其中 x
是一個包含一批尺寸為 (batch_size, *target_size, channels)
的圖像樣本的 numpy 數組,y
是對應的標簽的 numpy 數組。
(4)flow_from_directory
flow_from_directory(directory, target_size=(256, 256), color_mode='rgb', classes=None, class_mode='categorical', batch_size=32, shuffle=True, seed=None, save_to_dir=None, save_prefix='', save_format='png', follow_links=False, subset=None, interpolation='nearest')
參數
- directory: 目標目錄的路徑。每個類應該包含一個子目錄。任何在子目錄樹下的 PNG, JPG, BMP, PPM 或 TIF 圖像,都將被包含在生成器中。
- target_size: 整數元組
(height, width)
,默認:(256, 256)
。所有的圖像將被調整到的尺寸。 - color_mode: "grayscale", "rbg" 之一。默認:"rgb"。圖像是否被轉換成 1 或 3 個顏色通道。
- classes: 可選的類的子目錄列表(例如
['dogs', 'cats']
)。默認:None。如果未提供,類的列表將自動從directory
下的 子目錄名稱/結構 中推斷出來,其中每個子目錄都將被作為不同的類(類名將按字典序映射到標簽的索引)。包含從類名到類索引的映射的字典可以通過class_indices
屬性獲得。 - class_mode: "categorical", "binary", "sparse", "input" 或 None 之一。默認:"categorical"。決定返回的標簽數組的類型:
- "categorical" 將是 2D one-hot 編碼標簽,
- "binary" 將是 1D 二進制標簽,"sparse" 將是 1D 整數標簽,
- "input" 將是與輸入圖像相同的圖像(主要用於自動編碼器)。
- 如果為 None,不返回標簽(生成器將只產生批量的圖像數據,對於
model.predict_generator()
,model.evaluate_generator()
等很有用)。請注意,如果class_mode
為 None,那么數據仍然需要駐留在directory
的子目錄中才能正常工作。
- batch_size: 一批數據的大小(默認 32)。
- shuffle: 是否混洗數據(默認 True)。
- seed: 可選隨機種子,用於混洗和轉換。
- save_to_dir: None 或 字符串(默認 None)。這使你可以最佳地指定正在生成的增強圖片要保存的目錄(用於可視化你在做什么)。
- save_prefix: 字符串。 保存圖片的文件名前綴(僅當
save_to_dir
設置時可用)。 - save_format: "png", "jpeg" 之一(僅當
save_to_dir
設置時可用)。默認:"png"。 - follow_links: 是否跟蹤類子目錄中的符號鏈接(默認為 False)。
- subset: 數據子集 ("training" 或 "validation"),如果 在
ImageDataGenerator
中設置了validation_split
。 - interpolation: 在目標大小與加載圖像的大小不同時,用於重新采樣圖像的插值方法。 支持的方法有
"nearest"
,"bilinear"
, and"bicubic"
。 如果安裝了 1.1.3 以上版本的 PIL 的話,同樣支持"lanczos"
。 如果安裝了 3.4.0 以上版本的 PIL 的話,同樣支持"box"
和"hamming"
。 默認情況下,使用"nearest"
。
返回
一個生成 (x, y)
元組的 DirectoryIterator
,其中 x
是一個包含一批尺寸為 (batch_size, *target_size, channels)
的圖像的 Numpy 數組,y
是對應標簽的 Numpy 數組。
(5)get_random_transform
get_random_transform(img_shape, seed=None)
為轉換生成隨機參數。什么意思呢?因為變換的種類很多,實際上就是堆一批圖片到底進行了那些變換操作呢?可以通過這個方法獲得。
參數
- seed: 隨機種子
- img_shape: 整數元組。被轉換的圖像的尺寸。
返回
包含隨機選擇的描述變換的參數的字典。返回的字典如下面的形式:哪些變換使用了,就在字典中添加即可。
transform_parameters = {'theta': theta,
'tx': tx,
'ty': ty,
'shear': shear,
'zx': zx,
'zy': zy,
'flip_horizontal': flip_horizontal,
'flip_vertical': flip_vertical,
'channel_shift_intensity': channel_shift_intensity,
'brightness': brightness}
return transform_parameters
(6)random_transform
random_transform(x, seed=None)
將隨機變換應用於圖像。由於變換的種類很多,這里是隨機使用某一種變換在圖像上面
參數
- x: 3D 張量,單張圖像。(注意,這里是單張圖片哦!)
- seed: 隨機種子。
返回
輸入的隨機轉換之后的版本(相同形狀)。
(7)standardize方法
standardize(x)
將標准化配置應用於一批輸入。
參數
- x: 需要標准化的一批輸入。
返回
標准化后的輸入。
(8)apply_transform()方法
apply_transform(x, transform_parameters)
參數:
- x: 3D tensor, single image.這里也是針對單張圖片的
- transform_parameters:它是一個字典形式的參數,表示要使用哪些變換,字典的鍵如下所示:
- `'theta'`: Float. Rotation angle in degrees.
- `'tx'`: Float. Shift in the x direction.
- `'ty'`: Float. Shift in the y direction.
- `'shear'`: Float. Shear angle in degrees.
- `'zx'`: Float. Zoom in the x direction.
- `'zy'`: Float. Zoom in the y direction.
- `'flip_horizontal'`: Boolean. Horizontal flip.
- `'flip_vertical'`: Boolean. Vertical flip.
- `'channel_shift_intencity'`: Float. Channel shift intensity.
- `'brightness'`: Float. Brightness shift intensity.
返回值
變換之后的數組,形狀和輸入的圖片形狀是一樣的 (same shape).