利用YOLOv2训练数据

在实习期间,需要利用YOLOv2训练自己的一批数据,在网上找了各种博客,其中的方法总是有一些问题。

用了很久的时间来解决这些问题,并将解决问题的方法记录下来,希望对大家有所帮助。


1.下载YOLO

yolo的官网:https://pjreddie.com/darknet/yolo/

大概是这样的画风:

利用YOLOv2训练数据

按照步骤下载并进行图片验证即可。


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训练自己的数据集