2019年6月14日 星期五

訓練自己的偵測物件--YOLO


  YOLO的訓練模型框架

1.安裝Darkflow
2.先使用prebuild YOLO模型
3.訓練新的YOLO模型
  • 準備訓練資料 (圖片與xml檔): 利用LabelImg 工具框選物件及標注label
  • 修改YOLO模型參數,如class數量, filter數目
  • 開始訓練,相關命令列參數: model , load , gpu,…
  • 儲存模型(weight .pb & metafile .meta), 相關命令列參數: --savepb
  • 載入儲存的模型(.pb & .meta)
  • 利用python 測試YOLO模型


1.安裝Darkflow

git clone https://github.com/thtrieu/darkflow.git

python setup.py build_ext --inplace

在windows上要先安裝MS visual studio才能編譯安裝

Flowing the graph using flow

python flow --help  => 若能執行,表示己順利安裝

2.先使用prebuild YOLO模型


#測試YOLO darkflow

python flow --imgdir sample_img/ --model cfg/tiny-yolo-voc.cfg --load bin/tiny-yolo-voc.weights

--imgdir: 指定要倒入YOLO模型的圖檔目錄
--model : 指定網路結構
--load: 載入權重檔; 若為-1 則從ckpt/ 從上一次記錄的權重檔繼續train

3.訓練新的YOLO模型

# Fine tuning tiny-yolo-voc from the original one

python flow  --model cfg/tiny-yolo-voc-orchid.cfg --load bin/tiny-yolo-voc.weights  --train --annotation train/orchid/annotations --dataset train/orchid/images


--train : 表示要進行training
--model : 指定網路結構
--load: 載入權重檔; 若為-1 則從ckpt/ 從上一次記錄的權重檔繼續train
--dataset : 指出training data
--annotation: 框選object 的資訊 (.xml)
--labels: labels.txt 分類名稱. 每一行代表分類名稱

一個xml檔記錄著一個對應的圖檔.. xml中有20個,則圖檔就會至少冇20個被對應 












通常你會使用fine tune方式, 即使用既有的yolo network model (.cfg) 與weight (.weights)作為你訓練新模型的基本架構, 然後再修改成你想要偵測的類別項目

用既有的yolo network model (.cfg) ==> 所以你會從cfg/ copy 一份新的cfg並稍微修改一下檔名.  新的cfg檔, 在修改網路的最後2層, 主要有兩個2個地方, 一個分類數classes和filter的數量
   
  
...

[convolutional]  
size=1
stride=1
pad=1
filters=40     #在倒數第2個 [convolutional], 修改filters 數量
activation=linear

[region]
anchors = 1.08,1.19,  3.42,4.41,  6.63,11.38,  9.42,5.11,  16.62,10.52
bias_match=1
classes=3   #偵測的物件有3類
coords=4
num=5  # anchors  box的數量 (一個anchors會有confidence、座標、在每個類別的機率)
softmax=1


...
       
filters =num*(classes+5) , 若classes=3 , num(自訂)=5, filter=40


2.)  --load  tiny-yolo-voc.weights ==> 會載入tiny-yolo-voc.weights 做為你的初始權重, 因此得去找找到對應的tiny-yolo-voc.cfg 如此才能知道如何將權重載入到網路中, 而你所自訂的tiny-yolo-voc-xxxx.weights  和原本tiny-yolo-voc.cfg 基本上前面都相同, 只有後面2層不同,所以後面的2層不會載入權重. 

原文說明如下

When darkflow sees you are loading tiny-yolo-voc.weights it will look for tiny-yolo-voc.cfg in your cfg/ folder and compare that configuration file to the new one you have set with --model cfg/tiny-yolo-voc-3c.cfg. In this case, every layer will have the same exact number of weights except for the last two, so it will load the weights into all layers up to the last two because they now contain different number of weights.



3.) 修改 darkflow/labels.txt,  行數要和class數量一樣
(名字不要用其他符號, -,_@,...)
  

redline
red
white



在你訓練過程中, darkflow會將此時的weight存在 ckpt/目錄中, 所以你可以隨時從最後一次記錄的權重檔繼續train下去 (--load -1 )

python flow  --model cfg/tiny-yolo-voc-orchid.cfg --load -1 --train --annotation train/orchid/annotations --dataset  train/orchid/images

5. 將最後的權重檔儲存為tensorflow格式 .pb & meta file 

#Saving the lastest checkpoint to protobuf file
python flow --model cfg/tiny-yolo-voc-orchid.cfg --load -1 --savepb

在built_graph/輸出2個檔案
tiny-yolo-voc-orchid.pb
tiny-yolo-voc-orchid.meta

4. 測試模型,

#測試訓練好的模型
## Forward images in sample_img for predictions based on protobuf file

python flow --pbLoad built_graph/tiny-yolo-voc-orchid.pb --metaLoad built_graph/tiny-yolo-voc-orchid.meta --imgdir train/orchid/images






5. 利用python 測試YOLO模型









References:

https://github.com/thtrieu/darkflow
LabelImg 用來產生label 及框選Object


沒有留言 :

張貼留言