訓練YOLO模型

摘自https://github.com/AlexeyAB/darknet

如何訓練自己的數據模型

1、創建自己的yolo-obj.cfg文件:在同一目錄下,複製yolo-voc.2.cfg的內容到yolo-obj.cfg。更改如下內容:

    batch = 64

    subdivision = 8   ,如果在訓練過程中出現out of memory錯誤,將subdivision設置爲更高,比如16\32

    【region】下的classes = 類型的數量,根據實際需求

    【region】的前一個filters = (classes+5)×5

2、在darknet/data目錄下創建obj.names文件,文件每一行爲每個類的類名稱。

3、在darknet/data目錄下創建obj.data文件,內容爲:

classes= 類的數量
train  = data/train.txt
valid  = data/test.txt
names = data/obj.names
backup = backup/

其中,train.txt、valid.txt內的每一行,分別爲訓練集、驗證集的每一張圖片的路徑+圖片名,比如

/home/ruwei/yolo_releated_data/庫位data/yolo_data/train/TR00000000.jpg

4、新建文件夾存放訓練集數據,放入圖片的同時,爲每個圖片創建同名的.txt文件,內容爲

<class> <x> <y> <width> <height>

class:該物體屬於哪一類,數字形式,從0開始。

剩下4個均爲歸一化的數值,從0.0-1.0

x= absolute_x/image_width.    height = absolute_height/image_height

0 0.687109 0.379167 0.255469 0.158333

5、下載pre_trained weights文件,放入darknet/下

6、輸入命令,開始訓練。


訓練到何時停止

1、隨着訓練的進行,avg(平均誤差)不再降低。avg越小越好。

2、選擇最合適的weights文件。

    訓練會產生多個weights文件,爲了防止overfitting(過擬合),要選取其中最合適的一個。

    過擬合:對訓練集的效果很好,對之外的輸入預測結果很差。

    爲達到效果,需要做的有:

    2-1、訓練時要設置驗證集(validation set),如果沒有數據,就用練集代替。

    2-2、對每一個weights文件進行對比

            darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-oby_7000.weights

            darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-oby_8000.weights

            darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-oby_9000.weights

           比較最後一行的輸出,選擇IoU(intersect of union)和mAP(mean average precision)最大的那個。


           


如何提高目標檢測效果

訓練前:

1、設置配置文件(.cfg)中的 random =1(是否隨機確定最後一個預測框),可以提高訓練精度。

2、提高配置文件中network resolution(分辨率),height = 608,width = 608或者任意32的倍數。

3、確保數據集中每個類都帶有標籤。

4、重新計算數據集中寬、高的anchors。

5、保證訓練數據足夠多,每個類至少有200張圖片。確保圖片有多種角度、亮度、背景、比例等。

6、確保訓練數據中含有不帶標籤的不想被檢測到的物體圖片,即負樣本。

7、如果每張圖片中檢測的物體數量較多,設置.cfg文件中最後一層【region】中的參數max=200或更大。

8、檢測小物體時,設置【route】下layers =-1,11,【upsample】下stride =4。

9、爲了加速訓練,做微調,而不是遷移學習。設置stopbackward=1。

訓練後:

Increase network-resolution by set in your .cfg-file (height=608 and width=608) or (height=832 and width=832) or (any value multiple of 32) - this increases the precision and makes it possible to detect small objects: link

  • you do not need to train the network again, just use .weights-file already trained for 416x416 resolution
  • if error Out of memory occurs then in .cfg-file you should increase subdivisions=16, 32 or 64


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章