1. 程式人生 > >YOLOv3訓練過程筆記

YOLOv3訓練過程筆記

本人使用的是linux平臺,按照YOLO網頁0https://pjreddie.com/darknet/yolo/的步驟操作進行下載darkenet程式包以及編譯,之後可嘗試用VOC2007的資料集測試一下。

下載好的darknet程式包如下圖所示:

 

注:上圖摘自一篇部落格上的,https://blog.csdn.net/runner668/article/details/80579063

 

那麼現在有了大佬給我們提供的強大工具,我們下一步該如何用起來呢?

 

第一部分:製作自己的資料集。

如果自己手頭上有資料集,人手又夠(自己標註也可以,就是枯燥點),那麼就花一兩天時間進行自己的檢測物件標註,本人使用的標註工具是:labelimg資料集標註工具--此工具僅限於使用矩形框標註物件,如果需要其他形狀的可使用labelme標註工具--該工具可以使用圓、線段、點、矩形等進行標註,工具網上都有自己搜尋一下吧~!

有了工具那就進行標註吧,看著電影的功夫就可以標註個兩三百張進行自己的小實驗了。標註完之後,一個資料夾一個放圖片,一個放標註好的.XML檔案,後續還需要把.xml檔案轉為.txt格式。

2、使用py小程式進行xml to txt的轉換,生成的txt格式的標註資訊待用。

3、使用VOC_label.py檔案進行txt標註資訊的轉換。

VOC_label.py的作用

它將為每個.jpg影象檔案建立.txt檔案 - 在同一目錄中並使用相同的名稱,但使用.txt-extension,並將檔案放入:物件編號和物件座標,

對於每個物件在新行中:<object-class> <x> <y> <width> <height>

<object-class> - 從0到(classes-1)的整數物件編號

<x_center> <y_center> <width> <height> - 浮動值相對於影象的寬度和高度,它可以等於(0.0到1.0)

例如:<x> = <absolute_x> / <image_width>或<height> = <absolute_height> / <image_height>

注意:<x_center> <y_center> - 是矩形的中心(不是左上角)

例如,對於img1.jpg,您將建立包含以下內容的img1.txt:

 

1 0.716797 0.395833 0.216406 0.147222
0 0.687109 0.379167 0.255469 0.158333
1 0.420312 0.395833 0.140625 0.166667

 

將VOC_label.py中的classes按照自己的物件類別進行修改,然後把三處路徑改好,需要修改的如下圖所示:

def convert_annotation(year, image_id):
in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%( image_id))
out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(image_id), 'w')

修改好以後生成的新TXT檔案和圖片放到一個資料夾裡,這樣才能跑起來,原因未知。

第二部分:修改配置檔案Cfg和.data檔案,建立自己的類別名稱檔案.names。

1、使用與yolov3.cfg相同的內容建立檔案yolo-obj.cfg(或將yolov3.cfg複製到yolo-obj.cfg)。

change line batch to batch=64

change line subdivisions to subdivisions=8

使用 contrl+F 搜尋YOLO,你會看到有三個YOLO標頭得部分配置,需要改得是:

在[yolo]圖層之前的3個[卷積]中將[filters = 255]更改為filters =(classes + 5)x3。

例如 classes=1 then should be filters=18. If classes=2 then write filters=21.

filters =(classes + 5)x3),一般來說,filter的值取決於類別,座標和masks的數量。即filters=(classes + coords + 1)*<number of mask>,那麼其中這個mask值是錨點的索引,如果mask值不存在,那麼filters=(classes + coords + 1)*num.因此,例如,對於2個物件,您的檔案yolo-obj.cfg應該與3個[yolo] -layers中的每一箇中的yolov3.cfg不同:

2、在自己的data目錄建立一個obj.names的文字檔案:把自己類別的名字寫進去。

3、接著建立一個obj.data:

classes= 2

train = data/train.txt # 訓練圖片的檔名路徑集合.txt的路徑

valid = data/test.txt #test.txt 檔案的路徑

names = data/obj.names #.names 檔案的路徑

backup = backup/ #back up 的路徑

第三部分:開始訓練並獲取權重

1、下載卷積層的預先訓練的權重(154 MB):https://pjreddie.com/media/files/darknet53.conv.74並放到目錄darknet \ 

2、使用命令列開始培訓: ./darknet detector train data/obj.data yolo-obj.cfg darknet53.conv.74

3、訓練結束後 - 從路徑構建\ darknet \ x64 \ backup \獲取結果yolo-obj_final.weights

在每100次迭代後,您可以停止並稍後從此開始訓練。 例如,在2000次迭代後,您可以停止訓練,稍後只需將yolo-obj_2000.weights從build \ darknet \ x64 \ backup \複製到build \ darknet \ x64 \並使用:darknet.exe探測器訓練資料/ obj開始訓練。 資料yolo-obj.cfg yolo-obj_2000.weights

注:detector.c檔案中可以修改權重檔案儲存的間隔。

注:如果在訓練期間你看到avg(損失)欄位的nan值 - 那麼訓練就出錯了,如果僅僅出現少部分nan,訓練可以照常進行。

注:如果在cfg檔案中更改了width =或height =,則新的寬度和高度必須可被32整除。

注:訓練後使用此類命令進行檢測:darknet.exe檢測器測試資料/ obj.data yolo-obj.cfg yolo-obj_8000.weights

注:如果出現錯誤記憶體不足,那麼在.cfg檔案中你應該嘗試改變batch和subdivisions的值。

 

 

內容為自己編寫和參考的一些部落格:

1、https://blog.csdn.net/qq_38214193/article/details/81132053

2、https://blog.csdn.net/runner668/article/details/80579063