3.0 前言

        本文是YOLOv3系列第3篇,記錄YOLOv3如何訓練自己的模型。


        參考的網頁:

3.1 配置cfg檔案

        3.1.1 複製yolov3.cfg(...\darknet-master\cfg目錄下)檔案並重命名為yolo-obj.cfg(或者其他名字,只要各處對應即可),複製到darknet.exe相同目錄下(或者其他目錄,輸入命令時對應即可)。

        3.1.2 修改batch=64,subdivisions=8。

        3.1.3 修改classes和filters,共三處。如果檢測兩類物體,則classes=2,

                    filters=(classess+5)*3=(2+5)*3=21。

        3.1.4 上述修改具體行數參考github即可。

3.2 配置obj.name檔案和obj.data檔案(命名也可以為其他,只要對應即可)

        新建obj.names檔案和obj.data檔案,放在目錄...\darknet-master\build\darknet\x64\data下。

        obj.names內容(每行一個類的名字,名字隨便寫,隨時可以改)

        

        obj.data內容(valid是為了訓練完成後測試模型效果)

        

3.3 準備圖片和對應的標籤檔案

        每張圖片對應一個同名txt檔案,txt檔案儲存的是類的座標資訊(詳見github),可以在官網上下載專用的軟體yolo_mark標記,放在目錄...\darknet-master\build\darknet\x64\data\obj下。
        

        txt檔案內容

        

        標記標籤的軟體介面:

        

3.4 準備儲存圖片路徑的檔案

      新建train.txt檔案(名字要和obj.data中對應)放在目錄...\darknet-master\build\darknet\x64\data下(命名和路徑與obj.data中對應)儲存的資料為訓練的圖片相對於darknet.exe的位置,每行一條資料。
                

3.5 準備預訓練的模型

        在github下載darknet53.conv.74後放在目錄...\darknet-master\build\darknet\x64下即可。

        

3.6 訓練過程

       3.6.1  訓練命令(需要首先進入darknet.exe同一目錄):

    darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74
        預設顯示avg loss的影象,新增-dont_show則不顯示
    darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 -dont_show

        命令解釋:

        darknet.exe detector train:表示訓練(train改為test為測試)
        data/obj.data:data檔案的路徑
        yolo-obj.cfg:cfg檔案的路徑
        darknet53.conv.74:使用的預模型路徑

        3.6.2 可能出現的錯誤情況:

        可能出現記憶體不足的情況,解決:
        修改cfg檔案:
        修改subdivisions為16或32或64;
        如果依舊不足,修改三個[yolo](修改classes的那個地方)下的random,修改為0(含義 :關閉多尺度訓練)

        3.6.3 訓練介面

        

        3.6.4 訓練歷程與部分引數解釋

        每迭代100次會儲存一個模型,avg loss是一個錯誤率的指標,越低越好,剛開始會很大,下降也很快,最終降到0.***,每個類一般迭代2000次,所以實訓專案需要4000次。使用GTX 950m,大約每100次迭代耗時70分鐘。

        Region xx: cfg檔案中yolo-layer的索引;
        Avg IOU:當前迭代中,預測的box與標註的box的平均交併比,越大越好,期望數值為1;
        Class: 標註物體的分類準確率,越大越好,期望數值為1;
        obj: 越大越好,期望數值為1;
        No obj: 越小越好;
        .5R: 以IOU=0.5為閾值時候的recall; recall = 檢出的正樣本/實際的正樣本
        0.75R: 以IOU=0.75為閾值時候的recall;

        count:正樣本數目。

        3.6.5 直觀地檢視訓練結果(輸出圖片)

    darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights
        yolo-obj_8000.weights:檢視的模型的路徑。

輸入後會提示輸入圖片路徑,輸入即可。

 3.6.6 中斷後在之前的基礎上繼續訓練:

   darknet.exe detector train data/obj.data yolo-obj.cfg yolo-obj_2000.weights

        yolo-obj_2000.weights:之前的模型路徑。

        3.6.7 檢視模型精確效果(輸出資料)

        按照準備訓練資料的方法準備測試資料(圖片與對應標籤,儲存圖片路徑的檔案);
        修改data檔案的valid;
        使用如下命令測試:

    darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights
        backup\yolo-obj_7000.weights:測試的模型的路徑(相對於darknet.exe)。

        介面:

        

        由於可能出現過擬合的情況,所以最好的模型不一定在後邊,

        可以多測試幾組,選擇一個性能較好的模型。

        3.6.8 訓練結果展示

        迭代100次、400次、800次效果

        

        迭代1200次、1600次、2300次效果