摘自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 increasesubdivisions=16
, 32 or 64