ImageDataGenerator是一個非常好用的工具,尤其在樣本數量很少的時候,可以利用它來微調圖片內容,進而產生新的樣本

本次主題會用CNN作為影像辨識基礎,比較加入ImageDataGenerator前後的辨識效果,另外就是flow_from_directory經常與ImageDataGenerator搭配來快速產生樣本圖形,本次一併說明。

 

一、flow_from_directory 圖片資料流
flow_from_directory通常會與ImageDataGenerator一起使用,以往我們做建模時,會把檔案轉成數字陣列後,全部存入記憶體內,例如MNIST就是60000張x28長x28寬x1(灰階)的記憶體大小,但是未來我們的圖片會越來越大,樣本也會越來越多,舉例來說一個10000張x224長x224寬x3(RGB)的樣本,所耗費的記憶體就是MNIST的32倍,而flow_from_directory可以大幅減少記憶體用量,避免OOM產生,以下列出flow_from_directory的三大功能。

1. 依照資料夾讀取為Y變數:當我們在做分類器學習時,採用的是監督式學習,也就是說除了樣本之外,還需要指定一個Y變數,而flow_from_directory會直接把資料夾名稱當作Y變數,我們就可以省去設定Y變數,先將要辨識的類別新增為資料夾,並將樣本圖片放到該資料夾內。例如本例我們要辨識的一共有5類,分別為C:Cat、D:Dog、L:Lacoste、N:尚未放置商品、P:Pudding布丁狗,因此建好此5類的資料夾,並把收集到的照片放入即可。

image

2. 自動轉陣列:以往將圖片讀入類神經時,要先轉換成數值陣列,而flow_from_directory可以直接進行轉換,此部份不須另外寫程式處理。

3. 一次只讀取一批次量的圖片:避免一次把樣本圖片全部讀入記憶體造成記憶體不足,使用flow_from_directory一次僅須讀入一個batchSize批次量,該批次訓練完畢後,再到資料夾內讀取一個批次量,因此可以大幅降低記憶體的用量。
 

二、ImageDataGenerator 圖片產生器

圖片產生器是位在tf.keras.preprocessing.image.ImageDataGenerator下,主要功能是對原始樣本圖片進行微調改變,進而產生出新的訓練樣本,當原始樣本不足訓練時就非常有幫助,而訓練出來的模型也可以用來面對實際使用時不同的環境所造成的影響,舉例來說,當我們製作商品辨識器,使用者可能不會把商品就放在鏡頭畫面的正中央,也可能有點歪斜,甚至可能因為太陽光線不同造成的顏色變化等等,都可以透過這功能來解決。這裡選幾個我在影片範例中所採用的圖片微調功能來說明

1. rotation_range(x):隨機旋轉X度(範圍0-360)
此功能就是將樣本圖片隨機旋轉X度,這裡的隨機意思是當我們設定X度,則產生器會隨機旋轉[-X:+X]度之間,而不是固定X度,因此一張樣本圖片就可以產生出多張不同角度的樣本,而這樣就可以避免未來物件放置在鏡頭下角度不對時,而辨識不了的問題。

下圖可以說明使用rotation_range(30)後的結果,有的順時針,有的可能逆時針,有的也可能剛好沒變

image

2. width( or height)_shift_range=x:隨機水平或垂直平移x
此處的x有兩種值,若x<1,則代表位移比例,例如0.3代表位移量是[-30:+30]「百分比」,另一個狀況若是x>1,例如x=30,則代表位移量是[-30:30]個「畫素」,一般選用x<1的百分比較為常用,此處要注意選擇的偏移量若太大,可能會造成要辨識的物件幾乎完全消失,成為無效樣本。

讀者會有疑問的是,當物件偏移後,剩餘的空間要填入什麼內容,這部份則是由另外一個參數fill_mode來設定(下面第6點會說明),根據keras預設fill_mode的選項則是'nearest',意思是最邊邊那個像素來填滿多出來的空間。這個功能的可以解決物件如果沒有剛好放在中間時,而辨識不了的問題。

image

3. shear_range=x:平行錯位 x%
平行錯位就是左右向外拉長x%的意思,可以參考下面的示意圖。

image

實務中物件可能會因為拍攝角度不同,或者物件差異所造成的影響,例如貓狗動物有的比較大隻,有的比較小隻等等,這個功能對於工業化大量生產的產品比較沒有需要,但是對於自然界生物則有很大的幫助。下圖可以看得出來,左邊原圖與右邊微調後的圖片,有一些角度上的些微差異。

image

4. zoom_range=x:放大或縮小x%
將樣本圖片放大或縮小x%,x也分成<1代表縮放[-x:+x]比例之間,例如0.3代表放大比例是[-30:+30]「百分比」,一樣的此處要注意選擇的偏移量若太大,可能會造成要辨識的物件幾乎完全消失,成為無效樣本。

image

5. channel_shift_range=x:隨機顏色濾鏡(RGB偏移)
如果未來使用的場域可能採用的燈光不相同時,那建議你使用這個功能,有點像是在照片上片套一層隨機顏色的玻璃紙,而x代表的是顏色的強度,顏色則是隨機的,可能是各種顏色的組成,下圖為x=10及x=100的差異,可以看出來x=10時的變化非常微弱。

image

6. fill_mode='nearest':填入模式
當圖片產生器使用放大縮小位移功能時,勢必會在邊緣產生原本沒有的空間,此時這些空間內的像素要填入什麼內容則由本選項決定,預設為'nearest',代表位移前的最後一個像素來填滿,這也是最常用的,因為填入其他的都感覺不太合適,剩下的選項如下
‘constant’:填滿固定顏色
‘nearest’:填滿最後一個畫素顏色,此為預設值也最常用
‘reflect’:採用類似ABAB貼磚法填滿
‘wrap’:採用類似AAAA貼磚法填滿

image

7. horizontal_flip=True:水平鏡像、vertical_flip=True:垂直翻轉
可以隨機針對圖片進行翻轉,例如商品有可能垂直完全相反,但是商品不可能水平鏡像,因此本例筆者只選擇開啟垂直翻轉,這裡要注意如果您正在做類似文字數字的辨識,則建議不要開啟這個功能,因為文字或數字垂直或水平翻轉可能就變成另外一個字,例如6->9。

image

8. rescale= 1.0 /255:重新比例
這裡通常會將顏色範圍從0-255之間轉換成0-1之間。

以上就是我常用的ImageDataGenerator的說明,以ImageDataGenerator產生出更多的樣本,就可讓我們的模型能避免光源、位置、方向等等的變化,因而做出更實用、更能適應不同場域的辨識模型出來。


 

程式碼:https://github.com/youjunjer/CNN_ImageDataGenerator/

參考資料:

Tensorflow:https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator
參考範例網址:https://www.twblogs.net/a/5b84c5142b71775d1cd1c566

arrow
arrow

    夜市 小霸王 發表在 痞客邦 留言(1) 人氣()