1. 程式人生 > >3—YOLO:訓練自己的資料

3—YOLO:訓練自己的資料

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

一.製作資料集

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
    經過漫長的訓練過程,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>