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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM