3—YOLO:訓練自己的資料
阿新 • • 發佈:2019-01-02
——————————————————————
一.製作資料集
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目錄,儲存.weight
(3) 修改×××.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>