實踐四:使用yolo-v3訓練自己的資料集
darknet安裝
官網安裝:https://pjreddie.com/darknet/install/
Darknet安裝相對caffe來說非常簡單。
Opencv和cuda作為選裝的部分,可以不安裝。推薦安裝這兩個,只有安裝的cuda才能使用gpu。只有安裝了opencv才能呼叫攝像頭進行實時檢測。
Opencv和cuda的安裝方法參考安裝caffe時的安裝方法:
http://blog.csdn.net/vvyuervv/article/details/60755653
Darknet的安裝簡單來說就三個步驟:下載安裝包,修改Makefile檔案,編譯
下載安裝包:
使用命令列下載的命令:
git clone https://github.com/pjreddie/darknet.git
當然也可以直接輸入網址進行下載:
https://github.com/pjreddie/darknet.git
下載之後開啟資料夾裡的Makefile檔案,如果你安裝的opencv和cuda,則將Makefile檔案中的GPU和OPENCV修改成1 。 即:
GPU=1
OPENCV=1
CUDNN=1
...
NVCC=/usr/local/cuda-8.0/bin/nvcc
如果沒有安裝opencv和cuda就不需要進行修改
git clone https://github.com/pjreddie/darknet
cd darknet
make
這樣就可以了,沒有安裝opencv和cuda的情況下編譯很快,安裝了的編譯時要等一會,時間也不是很長。
測試已訓練好的權重
接著下載了yolo v3的weight:
wget https://pjreddie.com/media/files/yolov3.weights
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
得到了網路架構和識別結果
當前目錄多出一張識別結果圖片,開啟圖片!
當然我們也可以這樣來跑一段Video
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>
darknet訓練中遇到的問題
1、 在.data檔案中,每行的後面不能有空格。程式在執行時會有字串的拼接,查詢地址,如果有空格,會出現找不到檔案的錯誤。
2、進行finetuning時,不能直接只用已訓練好的權重,需要經過
./darknet partial cfg/darknet19_448.cfg darknet19_448.weights darknet19_448.conv.23 23
命令的轉換,使用darknet19_448.conv.23進行微調
3、 測試召回率recall的命令
./darknet detector recall data/our.data cfg/yolo.cfg backup/yolo_final.weights
需要在data資料夾內建立一個coco_val_5k.list檔案,裡面存放需要測試的圖片的路徑和名稱。
4、 測試時是每張圖片都會顯示資訊
833 204 282 RPs/Img:760.41 IOU: 57.22% Recall:72.34%
ID 833 預測正確的框的個數204 總共282個框
5、 將測試的所有資料放入TXT文件中
./darknet detector recall data/oil_data/960x480/our.data data/oil_data/960x480/tiny-yolo.cfg data/oil_data/960x480/backup/tiny-yolo_final.weights 2>> iou.txt
只有NAN在平均數十次迭代中發生平均損失時,訓練才會出錯。
Nan為什麼會出現:https://github.com/AlexeyAB/darknet/issues/636#issuecomment-381400954
darknet 執行已有資料
Darknet 官網給出了使用已經訓練好的網路結構yolo去進行實時的檢測的教程
連結:https://pjreddie.com/darknet/yolo/
。。。。。。。
第二步:生成TXT檔案
標記完後會生成每張圖片對應的xml檔案,也就是每張圖片的label檔案,我們需要提取其中的一些boundingbox的資訊。
在darknet的scripts資料夾下有一個voc_label.py的檔案,這個是針對voc圖片集的xml生成對應圖片TXT檔案的指令碼,根據自己的情況進行修改,生成自己的影象資料的TXT檔案資料。TXT檔案的內容每行都是 這種形式,且座標和長寬都應該是歸一化後的數值。
在執行voc_label.py 指令碼時還會生成一個train.txt檔案,改檔案裡存放的是每張圖片的絕對路徑。Train.txt是訓練時需要的檔案。
生成txt檔案後,記得將原影象和txt檔案放到同一個資料夾下。
利用scripts/kitti_label.py生成scripts/train.txt和scripts/train.all.txt檔案
第三步:在data資料夾裡面建立一個kitti.names檔案
檔案命名任意,檔案裡存放的是型別的名稱,每一類另起一行。
Pedestrian
Car
第四步:修改kitti.data檔案
之後我們修改darknet下cfg檔案中的voc.data檔案,當然我們也可以自己建立一個kitti.data檔案。
classes= 20 #訓練資料的類別數目,我這裡只有一類,所以這裡是20
train = <path-to-voc>/train.txt #上面1.2步驟生成的train檔案路徑
valid = <path-to-voc>test.txt #上面1.2步驟生成的val檔案路徑
names = data/voc.names #上面2.1步驟建立的names檔案路徑
backup = backup #這是訓練得到的model的存放目錄,建議自己修改。
根據我們實際的檔案路徑和類別等相關資訊,對kitti.data檔案進行修改。cfg/kitti.data
classes= 2
train = /home/whsyxt/Desktop/zhuzhao/yolo/darknet/scripts/train.txt
valid =/home/whsyxt/Desktop/zhuzhao/yolo/darknet/scripts/kitti_list_file/test.txt
names = data/kitti.names
backup = /home/whsyxt/Desktop/zhuzhao/yolo/darknet/backup
同時設定data/kitti.names
Pedestrian
Car
第五步:修改.cfg檔案[???????]
複製yolo3.cfg檔案改名為yolov3-kitti.cfg檔案cfg/yolov3-kitti.cfg
假設我們使用yolo_voc.cfg網路來進行訓練,我們需要到darknet/cfg/資料夾下找到yolo_voc.cfg檔案進行修改。當然,使用不同的網路,要修改對應的.cfg檔案。
A.filters數目是怎麼計算的:3x(classes數目+5),和聚類數目分佈有關,論文中有說明;
B.如果想修改預設anchors數值,使用k-means即可;
C.如果視訊記憶體很小,將random設定為0,關閉多尺度訓練;
D.其他引數如何調整,有空再補;
E.前100次迭代loss較大,後面會很快收斂;
其它
learning_rate=0.001 ### 學習率
burn_in=1000 ### 學習率控制的引數
max_batches = 50200 ### 迭代次數
policy=steps ### 學習率策略
steps=40000,45000 ### 學習率變動步長
scales=.1,.1 ### 學習率變動因子
訓練
下載權重:wget https://pjreddie.com/media/files/darknet53.conv.74
./darknet detector train cfg/kitti.data cfg/yolov3-kitti.cfg darknet53.conv.74
# 多個gpu
./darknet detector train cfg/kitti.data cfg/yolov3-kitti.cfg darknet53.conv.74 -gpus 0,1,2,3
# If you want to stop and restart training from a checkpoint:
./darknet detector train cfg/kitti.data cfg/yolov3-kitti.cfg backup/yolov3.backup -gpus 0,1,2,3
輸出得到:
(3)bounding box正確,標籤錯亂,這裡提供兩種方案供選擇。
A.不改原始碼,不用重新編譯
修改coco.names中內容,為自己的檢測目標類別
B.改原始碼,需要重新編譯[ 先 make clean ,然後再 make]
原因是作者在程式碼中設定了預設,所以修改 examples/darknet.c檔案,將箭頭指示的檔案替換成自己的。然後重新編譯即可。
優點:速度快,精度提升,小目標檢測有改善;
不足:中大目標有一定程度的削弱,遮擋漏檢,速度稍慢於V2。