上一篇文章介紹了數(shù)據(jù)集的制作砚哗,本篇文章將介紹yolo訓(xùn)練的流程及參數(shù)設(shè)置缸濒。
劃分訓(xùn)練集
在ImageSets/Main下生成train.txt锅知、test.txt妇拯、trainval.txt幻馁、val.txt。本質(zhì)是根據(jù)xml的文件名劃分訓(xùn)練集越锈、驗(yàn)證集仗嗦、測試集,參考代碼如下甘凭。
import os
import random
trainval_percent = 0.2
train_percent = 0.8
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')
for i in list:
??? name = total_xml[i][:-4] +'\n'
??? if i in trainval:
??????? ftrainval.write(name)
??????? if i in train:
??????????? ftest.write(name)
??????? else:
??????????? fval.write(name)
??? else:
??????? ftrain.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
若Annotations中的文件如下圖
則train.txt的內(nèi)容會(huì)是以下的形式
轉(zhuǎn)換標(biāo)注文件
將標(biāo)注文件由xml格式轉(zhuǎn)化為訓(xùn)練所需的txt格式稀拐,txt格式的標(biāo)注文件如下
一幅圖中有多少個(gè)目標(biāo)就會(huì)有多少行,第一個(gè)數(shù)字代表類別丹弱,后四個(gè)數(shù)分別為歸一化后的中心點(diǎn)X坐標(biāo)德撬、Y坐標(biāo)铲咨、寬度、高度砰逻。
將scripts文件夾下的voc_label.py放在與VOCdevkit文件夾相同的位置鸣驱,根據(jù)實(shí)際情況修改py文件,主要修改以下幾處:
運(yùn)行voc_label.py蝠咆,會(huì)在與py文件同級的位置生成一個(gè)包含轉(zhuǎn)化成txt文件的標(biāo)注文件的名為label的文件夾。
(若對于python比較熟練文件夾可以用其他名稱)
修改訓(xùn)練參數(shù)
這一部分主要需要修改3個(gè)文件:cfg北滥、names刚操、data。cfg文件描述不同網(wǎng)絡(luò)的結(jié)構(gòu)與參數(shù)再芋,names文件記錄模型的標(biāo)簽菊霜,data文件保存訓(xùn)練的總體信息。(以下內(nèi)容以訓(xùn)練一個(gè)yolov3的模型為例)
cfg文件
1济赎、在cfg文件夾下新建yolo-obj.cfg鉴逞,內(nèi)容與yolov3.cfg(在cfg文件夾下)相同
2、將width司训、height設(shè)置為32的倍數(shù)构捡,且width==height,一般設(shè)置為608
3壳猜、max_batches設(shè)置為類別數(shù)*2000
4勾徽、steps設(shè)置為max_batches*0.8和max_batches*0.9
5、yolo標(biāo)簽的前一個(gè)filters修改為(類別數(shù)+5)*3统扳,假設(shè)有6類則修改為33
6喘帚、重新計(jì)算yolo標(biāo)簽下的anchors(不重新計(jì)算則使用的是其他的數(shù)據(jù)集的anchor,可以訓(xùn)練咒钟,但會(huì)降低訓(xùn)練的模型的精度)吹由,原版需自己計(jì)算,alexey版提供了計(jì)算anchors的工具:
./darknet detector calc_anchors data/obj.data-num_of_clusters 9 -width 416 -height 416
7朱嘴、修改classes的值為實(shí)際的類別數(shù)
8倾鲫、若顯存不夠可將random置為0
9、共有3處yolo標(biāo)簽腕够,重復(fù)4-7
names文件
在data文件夾下新建obj.names文件级乍,保存類別名稱,格式可參考data文件夾下的voc.names
data文件
在data文件夾下新建obj.data文件帚湘,可參考cfg文件夾下的voc.data
下載預(yù)訓(xùn)練權(quán)重
根據(jù)實(shí)際情況選擇預(yù)訓(xùn)練權(quán)重玫荣,具體版本對應(yīng)參考官網(wǎng)或readme文件,yolov3對應(yīng)的預(yù)訓(xùn)練權(quán)重為darknet53.conv.74大诸。
開始訓(xùn)練
在darknet下輸入命令:
./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74
Alexey版使用-map指令可以實(shí)時(shí)顯示loss與accuracy曲線:
./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74-map
當(dāng)發(fā)現(xiàn)loss不再下降時(shí)可提前停止訓(xùn)練捅厂,loss最終的取值范圍為0.05-3.0
最終生成的weights文件就是我們訓(xùn)練得到的模型贯卦。