簡介
經過上一篇環境架設後,相信大家對Command line來驅動Yolo產生一點點興趣了吧,而且可以透過webcam來辨識物件,是不是覺得很酷,近來很紅的人臉辨識也可以透過Yolo Training來實現之,那我們要怎樣來訓練自己的模型呢。我們就開始實作吧。
準備好自己的DataSet
想要訓練自己的模型當然要準備好想要辨識的圖片與Labeling Data,這邊的圖片我們是用Jpg,Labelng Data用的是xml格式。你可以使用前一篇AI Labeling來做自己的DataSet。
而你可以把自己的DataSet新建一個資料夾(從網路下載來的darkflow中有一個資料夾是提供給使用者來放置自己的DataSet,叫做「test」,但我們還是自己創一個資料夾比較乾淨一點。
新增完資料夾後,在其中繼續新增兩個資料夾,一個是放要訓練的圖片,另一個是要放xml檔案。
<annotation>
<folder>Images</folder>
<filename>1.jpg</filename>
<source>
<database>Unknown</database>
</source>
<size>
<width>1920</width>
<height>1080</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>Green</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1056</xmin>
<ymin>490</ymin>
<xmax>1105</xmax>
<ymax>545</ymax>
</bndbox>
</object>
</annotation>
在訓練前你要檢查每一張圖所對應xml檔案,都要相匹配,例如上述的xml檔案,我這裡對應的圖片資料夾位置、圖片名稱、圖片大小、標註物件的基本資訊。如此一來就已經將要訓練的檔案都安置好了。
修改標註檔案
要修改的檔案有三個必要改與一個不一定要改的,先講講必要改的,第一個是「label.txt」,打開後原本裡面有20種標註名稱,這邊把此檔案的標註名稱改成你DataSet中所有有用到標註名稱,且每一行只能輸入一種標籤,改好後記得存檔。
第二個必要修改的就是要透過cfg來訓練的檔案,你可以選定一個檔案來改,要記得是.cfg檔案,你可以把這類型的檔案想成一種訓練的規則或框架,每次訓練都要透過這規則來訓練。檔案位置是放在darkflow→cfg中。
這邊我是選「tiny-yolo-4c.cfg」這個檔案,打開後看到最下面的「convolutional」項目下的「filter」與「classes」,這邊我DataSet中用了四個類別,所以「classes」這邊改成4(原先是根據label.txt所標示的總數做設定,原先是20種)。再來「filter」要依照你的(class + 5 ) * 5 = 45,假如你之後要訓練的類別有10種,那就是要改成 (10 + 5 ) * 5 = 75。
而我在訓練的時候都會遇到無法訓練的情況,而且找了網路很多文章都沒有講到這點,而且這也是必要改的,就是要改coco.names這個檔案,一樣是放在cfg檔案下,並且把類別鍵入該檔案中(跟label.txt要輸入的一樣)。
最後講一個不一定要修改的檔案,就是放在darkflow→darkflow中的「defaults.py」這個檔案,這也是訓練的規則,但是是針對整個darkflow的全局設定,而主要可能需要改的是你的訓練「epoch」以及儲存訓練sub-model「save」兩行,跟改這設定會影響到你的訓練結果。
開始訓練
python flow — model [model.cfg] —load [model.wieghts] — train — dataset [image path] — annotation [annotation path] — labels [labels path] — epoch [number of epoches] — gpu [0–1] — lr [learning rate] — batch [batch size]
萬事俱備只欠東風,就是你要輸入命令碼來起風,上面的字元就是來驅動訓練的鑰匙,我們一一介紹一下:
1. — model : 是選擇你要使用來訓練的cfg檔案 (必備) 。
2. — load : 是已經訓練好的model你想要在增強該model的精準度,接續訓練(選用)。
3. — train : 開始訓練主要指令 (必備)。
4. — dataset : 你要訓練的圖片的路徑 (必備)。
5. — annotation : 你要訓練的xml路徑(必備)。
6. — label : label.txt檔案路徑,假如你有自己在新增其他的label.txt檔案,這指令就派得上用場 (選用)。
7. — epoch : 剛剛在defaults.py設定的檔案,這邊可以直接Key數字(選用)。
8. — gpu : 假如有安裝gpu版本可以使用 輸入數字是選擇你的裝置(選用)。
9. — lr 與 — batch : 這也是透過輸入數字更改defaults.py檔案,更改這數值也會影響訓練結果(選用)。
python flow --model cfg/tiny-yolo-4c.cfg --train --dataset eggytest/images --annotation eggytest/annotations
以上的字串是我所輸入的訓練文字,而成功的話就會出現下圖的樣子。
Command line會將你指定的路徑圖檔與xml檔案讀取(第一個箭頭),讀取完成後就會呈現每一個Step的狀態與loss,通常loss趨近於1的話,大致上就是訓練完成了。
小結
以上就是整個完整地透過darkflow來訓練的全貌,而訓練完成後別忘了驗證。
python flow --model cfg/tiny-yolo-4c.cfg --load -1 --imgdir eggyditect_img/
如上述的字串,這邊要load model我們選擇「-1」,意思是讀取剛剛訓練完的model,因為darkflow是輕量化的訓練工具,所以無法生成model檔案,要使用darknet,他訓練好的資料會放在「ckpt」資料夾中。綜合前幾篇就是一整個完整的輕量化Yolo Training,為了補足darkflow無法產生model檔案,之後會介紹darknet + GPU的使用。