keras的圖像預處理ImageDataGenerator類


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_centerfeaturewise_std_normalizationzca_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).

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM