3—YOLO:訓練自己的數據

YOLO: Real-Time Object Detection:https://pjreddie.com/darknet/yolo/

YOLO模型訓練可視化訓練過程中的中間參數:http://blog.csdn.net/yudiemiaomiao/article/details/72469135

——————————————————————

一.製作數據集

1.數據集準備
(1)將數據集VOCdevkit2007拷貝到darknet\scripts下 (2)VOCdevkit2007修改名稱爲VOCdevkit

2.修改darknet\scripts\voc_label.py
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]  
classes = ["comp"] 

#os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")
#os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")

3.終端進入darknet\scripts,執行:
    python voc_label.py  
此後可以看到:
VOCdevkit\VOC2007裏多了一個labels文件夾(如下)
darknet\scripts下多了2007_train.txt、2007_val.txt和2007_test.txt三個文件

二.修改配置文件

1)修改data/voc.names文件:comp

(2)修改cfg/voc.data文件。
classes= 1 //類別數
train  = /home/gjw/darknet/scripts/train.txt  //訓練集
valid  = /home/gjw/darknet/scripts/2007_test.txt  //測試集
names = data/voc.names
backup = backup  //在darknet新建一個backup目錄,存儲.weight3) 修改×××.cfg(以yolo-voc.cfg爲例),修改2個參數(filters,class),見下:
① 【region】層中 classes 改成1。
② 【region】層上方第一個【convolution】層,其中的filters值要進行
修改,改成(classes+ coords+ 1)* (NUM) ,我的情況中:(1+4+1)* 5=30
③ learning_rate:學習率
④ max_batches:最大迭代次數

這裏寫圖片描述

三.下載預訓練模型

    下載好的預訓練模型保存在/darknet/目錄下

PS:經過以上的修改,記得重新make一下darknet

四.訓練

在darknet/目錄下新建backup目錄用於存放訓練生成的模型
官網上下載預訓練的模型,訓練命令:
    ./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23

     ./darknet detector train cfg/voc.data cfg/yolo-voc.cfg  yolo-voc.weights

【結果】訓練完畢就可以生成weights文件
Saving weights to backup/yolo-voc.backup
Saving weights to backup/yolo-voc_100.weights
Saving weights to backup/yolo-voc_final.weights

五.評估性能http://blog.csdn.net/hysteric314/article/details/54093734

    經過漫長的訓練過程,model終於訓練好了,爲了評估性能,可以使用以下指令 
./darknet detector recall cfg/voc.data cfg/yolo_voc.cfg backup/yolo_voc_final.weights

需要注意的是,在使用這個指令之前,我先修改一下src/detector.c 這一函數
(1)位置第375行改成:list *plist = get_paths(“/home/yolo_v2_tinydarknet/darknet/infrared/infrared_val.txt”);//改成infrared_val.txt的完整路徑
(2)運行上面的指令會調用validate_detector_recall函數,
這個函數中有個參數thresh(閾值),默認的值是.001,這個默認
值設的很小,會讓系統識別出更多的框來,導致proposals值激增,
還會讓recall值變高,達到98.5%。最終我改成了 .25。
(3)上面的函數只會顯示出recall值,沒有precision值,precision的
值計算方法是:識別爲正確的個數/畫了多少個框,所以我修改了代碼。
我把第447行顯示結果的代碼修改爲 :
fprintf(stderr, "ID:%5d Correct:%5d Total:%5d\tRPs/Img: %.2f\tIOU: %.2f%%\tRecall:%.2f%%\t", i, correct, total, (float)proposals/(i+1), avg_iou*100/total, 100.*correct/total);
fprintf(stderr, "proposals:%5d\tPrecision:%.2f%%\n",proposals,100.*correct/(float)proposals); 

運行後顯示的結果是: 
Correct :可以理解爲正確地畫了多少個框,遍歷每張圖片的Ground Truth,網絡會預測出很多的框,對每一Groud Truth框與所有預測出的框計算IoU,在所有IoU中找一個最大值,如果最大值超過一個預設的閾值,則correct加一。

Total:一共有多少個Groud Truth框。

Rps/img:p 代表proposals, r 代表region。 意思就是平均下來每個圖片會有預測出多少個框。預測框的決定條件是,預測某一類的概率大於閾值。在validation_yolo_recall函數中,默認的這一個閾值是0.001,這一閾值設置的比較低,這就會導致會預測出很多個框,但是這樣做是可以提升recall的值,一般yolo用於畫框的默認值是.25,使用這個閾值會讓畫出來的框比較準確。而validation_yolo_recall使用的閾值改成。25的時候,Rps/img 值會降低,recall的值會降低,所以validation_yolo_recall默認使用一個較低的閾值,有可能作者的目的就是爲了提高recall值,想在某種程度上體現網絡的識別精度比較高。

IoU、Recall、Precision:解釋起來比較麻煩,請看博客有詳細說明: 
http://blog.csdn.net/hysteric314/article/details/54093734

六.測試單張圖像

    ./darknet detector test cfg/voc.data cfg/yolo-voc.cfg backup/yolo-voc_final.weights data/000020.jpg

[擴展]
    可以通過-thresh 0設置所有檢測的閾值爲0,同理,也可以通
過設置不同的閾值進行檢測。
    ./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg -thresh 0

七.測試攝像頭/視頻

./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights

./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights <video file>

http://blog.csdn.net/burning_keyboard/article/details/71056164

http://blog.csdn.net/xjz18298268521/article/details/61922405

http://blog.csdn.net/sinat_30071459/article/details/53100791

http://blog.csdn.net/sinat_30071459/article/details/53161113

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章