ImageDataGenerator是一個非常好用的工具,尤其在樣本數量很少的時候,可以利用它來微調圖片內容,進而產生新的樣本
本次主題會用CNN作為影像辨識基礎,比較加入ImageDataGenerator前後的辨識效果,另外就是flow_from_directory經常與ImageDataGenerator搭配來快速產生樣本圖形,本次一併說明。
VIDEO
一、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類的資料夾,並把收集到的照片放入即可。
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)後的結果,有的順時針,有的可能逆時針,有的也可能剛好沒變
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',意思是最邊邊那個像素來填滿多出來的空間。這個功能的可以解決物件如果沒有剛好放在中間時,而辨識不了的問題。