AI – Yolo Model Training – 「Darkflow」Train

簡介

經過上一篇環境架設後,相信大家對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的使用。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *