在实习期间,需要利用YOLOv2训练自己的一批数据,在网上找了各种博客,其中的方法总是有一些问题。
用了很久的时间来解决这些问题,并将解决问题的方法记录下来,希望对大家有所帮助。
1.下载YOLO
yolo的官网:https://pjreddie.com/darknet/yolo/
大概是这样的画风:
按照步骤下载并进行图片验证即可。
2.数据预处理(该处理方法与参考博客中的方法相同)
该阶段建立的文件夹的名称最好与该文档中的相同,否则需要改动图片处理等python脚本中的文件名。
a.建立文件夹"Image",并在其下存放所有图片样本(jpg、png均可)
b.利用labelImg工具进行标注
c.与Image文件件同级建立"xml"文件夹,存放利用labelImg标注后得到的所有图片的xml文件
d.下载脚本,放在Image、xml文件夹的同级
脚本下载地址:http://pan.baidu.com/s/1hs22I7U
密码:wdv0
(该下载地址在参考博客中有提供,十分感谢原作者的帮助)
在运行脚本之前,先做几处改动:
a.
将traindata.py中大概在65行和71行的:
shutil.copy(xmlolddir, newdir1);
shutil.copy(xmlolddir, newdir2);
两句删掉(或前面加‘#’)
否则在训练过程中报类似这样的error:
“Cannot load image "/home/ts/tensorflow/objectRecognition/Augmentation/KNIFE/Getdata/trainImage/000018.png"
STB Reason: unknown image type”
b.
若之前建立文件夹时文件夹名称并非Image和xml,那么在traindata.py中的对应文件夹名称处将其改为自己的文件夹名称
改动之后,运行脚本
运行traindata.py:生成trainImage文件夹,存放训练图片;生成trainImageXML文件夹,存放训练图片xml标签;生成validateImage文件夹,存放验证集图片;生成validateImageXML文件夹,存放验证集图片的xml标签;生成trainImageId.txt、validateImageId.txt,存放训练、验证集图片索引(一般为文件名)。
运行trans.py,生成trainImageLabelTxt文件夹,存放训练图片通过xml标签转化得到的txt文件(若在训练过程提示txt文件找不到,则把此文件夹下的txt文件夹移动到trainImage文件夹);生成validateImageLabelTxt文件夹,道理一样。
另外,得到的trainImagePath.txt和validateImagePath.txt存放着训练图片和验证图片的路径。
此后,将生成的validateImageLabelTxt文件夹中的所有txt文件复制到validateImage文件夹中;同理,将trainImageLabelTxt文件夹中的所有txt文件复制到trainImage文件夹中。
否则会在训练过程中报类似这样的error:
“cannot open file xxxxxx.txt”
3.修改配置文件
a.
cfg/voc.data文件中:
classes= 3
train = /home/ts/tensorflow/objectRecognition/YOLOv2/YOLOtraining/trainImagePath.txt
valid = /home/ts/tensorflow/objectRecognition/YOLOv2/YOLOtraining/validateImagePath.txt
names = data/knifes.names
backup = backup
classes存放类别总数(这里有knife、swissknife、jackknife三种,根据使用者不同的需要进行改动),train 和valid 中存的是训练图片集和验证图片集的路径;
在data文件夹中新建文件knifes.names,存放的是方框注释,本例中有三行(根据使用者不同的需要进行改动):
knife
swissknife
jackknife
b.
yolo-voc.cfg文件中:
将[region]中的classes改为3(这里有knife、swissknife、jackknife三类,根据使用者不同的需要进行改动);
将最后一个[convolutional](紧挨着[region]的前一个)中的filter改为40(filter的公式filters=(classes+coords+1)*(NUM),这里是(3+4+1)*5=30,根据使用者不同的需要进行改动)。
c.
knifes.names:
具体见a
4.下载预训练文件cfg/darknet19_448.conv.23
以在其他数据集上pretrain的模型做为初值。
下载地址:http://pan.baidu.com/s/1dFgUk4x
密码:ynhg
(该下载地址为参考博客原文作者提供,再次感谢原作者的帮助)
下载之后将其放在darknet文件夹下。
在训练之前,要先在darknet文件夹下新建backup文件夹,在backup文件夹中新建一个以yolo-voc.backup为文件名的文件,以保存训练参数。
否则将在训练过程中报类似这样的error:
“cannot open backup/yolo-voc.backup”
5.训练
在darknet文件夹路径下运行命令:
./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23
系统默认会迭代45000次batch,如果需要修改训练次数,进入cfg/yolo_voc.cfg修改max_batches的值。
6.测试
训练完成后,模型成功保存,输入命令测试模型:
./darknet detector test cfg/voc.data cfg/yolo-voc.cfg backup/yolo-voc_final.weights testpicture/001.jpg
在该步骤中,将最后一个参数 testpicture/001.jpg 改为自己想要测试的图片路径;
若提前终止训练,则将倒数第二个参数 backup/yolo-voc_final.weights 改为backup文件夹下的最新权重备份文件名称,例如:
我提前终止后,最新权重备份文件为 backup/yolo-voc_900.weights。
否则将提示error:
“Couldn't open file: backup/yolo-voc_final.weights”
参考原文中训练类别为1,本文中的训练类别为3,相互比较之下可以知道所有类别的情况下配置文件应该如何改动。
另外,本文可能无法将配置、训练过程中的所有问题囊括进来,如有大神发现本文解决问题的方法有失妥当或发现配置、训练过程中其他类型的问题,欢迎交流,感激不尽。
参考:YOLO训练自己的数据集