1. 程式人生 > >darknet訓練yolo_v3

darknet訓練yolo_v3

使用官方darknet來訓練YOLO-v3

官方darknet地址:https://github.com/pjreddie/darknet

1.基本環境的配置及安裝:opencv、cuda、nvidia驅動、cudnn、darknet

   參考教程:https://blog.csdn.net/gzj_1101/article/details/78651650

   官方教程:https://pjreddie.com/darknet/install/

2.使用darknet訓練voc2007和voc2012

   2.1下載voc2007和voc2012資料集,下載三個檔案:

              VOCtest_06-Nov-2007.tar

              VOCtrainval_06-Nov-2007.tar

              VOCtrainval_11-May-2012.tar

   2.2生成標籤資料檔案。這個地方主要生成兩個檔案,darknet提供了一個python指令碼,執行這個指令碼,將會生成圖片路徑的位置txt檔案和資料標籤txt檔案這兩個檔案。

     生成的資料標籤是這樣的形式:<object-class> <x> <y> <width> <height>,其中<object-class>是一個0-19的數字代表obeject類別,<x> <y> 代表object的歸一化中心座標,<width> <height>代表object的框的歸一化寬和高。歸一化指的是object的中心座標和框的寬和高都除以圖片的寬和高,從而控制<x> <y> <width> <height>四個值都在0到1這個範圍內。

        這個地方需要注意的是,需要把VOCtrainval_06-Nov-2007和VOCtest_06-Nov-2007兩個檔案合併在一個voc2007檔案中,最後voc2007和voc2012需要在同一個資料夾下VOCdevkit,在VOCdevkit這個當前路徑下執行python指令碼,才會處理所有的檔案,生成所有需要的檔案,不會因為路徑報錯。

                          圖一  生成的圖片路徑TXT檔案

比如開啟2007_train.txt,內容如下:

                             圖二   生成的檔案路徑格式

生成的標籤檔案分別在VOCdevkit/VOC2007/labels和VOCdevkit/VOC2012/labels這兩個路徑下,所有的標籤檔案都是以圖片名命名的TXT檔案,比如開啟000010.txt:

12 0.484463276836 0.54375 0.483050847458 0.6875

14 0.531073446328 0.36875 0.316384180791 0.441666666667

其中12和14代表000010這張圖片中有兩個不同物體(object),後面四個歸一化的值代表的object的位置。

2.3 修改原始碼下data/voc.data,設定自己訓練集和測試集的路徑

2.4 修改原始碼下cfg/yolov3-voc.cfg檔案下訓練的batch和subdivisions
2.5 下載darknet-53的模型檔案,作為yolo_v3的預訓練檔案。終端中執行:
 ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg weights/darknet53.conv.74 

訓練記錄如下

                            圖三   yolo_v3的訓練記錄

從訓練記錄中可以看到在網路的82層、94層、106層進行了檢測。IOU代表的是交併比,指的是模型預測的框和標籤檔案中的框(ground truth)重合程度,重合程度越大,預測的越準。Class代表的預測物體的置信度。Obj和No obj代表的是object還是背景。.5R和075R代表的是召回率(也有的喜歡叫查全率,recall)。

這裡需要注意的是:

  1. 為了充分使用顯示卡記憶體,適當調整batch和subdivisions,原始碼中是這樣計算的:

int subdivs = option_find_int(options, "subdivisions",1);

    net->time_steps = option_find_int_quiet(options, "time_steps",1);

net->batch /= subdivs;

net->batch *= net->time_steps;

因此net的batch為cfg中的batch/subdivisions*time_steps,預設time_steps為1。

  2.視訊記憶體不是很大的情況,可以把yolov3-voc.cfg中的random設定為0