YOLO3+WIN10+Keras+自己的训练集
作者:互联网
YOLO3+WIN10+Keras+自己的训练集
在深度学习的目标检测领域也已经有一段时间了,从之前的学习基础知识到读别人的代码,中间读了很多的博客,这里写下自己的一些经验。
训练集的准备
训练集我尝试过两种格式,一种是xml格式,一种是json格式,两种格式都可以进行训练,只不过需要修改一下转换脚本。
首先先从GitHub上面下载文件,并解压
[link]https://github.com/qqwweee/keras-yolo3
然后基本的操作可以参看博客windows+python+yolov3训练自己的数据集
这些基本操作完成后,我们现在拥有了,代码,训练集文件夹,训练图片(JPEGimage下),和标注文件(Annotations),同时在VOC2007文件夹下,运行一个脚本文件(如下),该脚本会根据训练集文件夹内的文件,自动在ImageSets>Main文件夹下生成训练集,训练验证集,验证集,测试集四个txt文件,如图
test.py
import os
import random
trainval_percent = 0.1
train_percent = 0.9
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()
生成四个文件过后,准备工作已经完成一半。
下面的基本操作和上文中的博客中所说的基本一致,修改voc_annotations.py里面的class名称和个数,若你使用的是xml格式的标注文件,则和该博客的正好相符合。修改完成后运行voc_annotaions
文件,会得到三个txt文件,按照该博客所述,删掉前面的2007_,则得到test,train,val,三个txt文件。然后修改yolov3.cfg里面的内容,修改方法仍然和该博客一致。再次贴上该博客链接[windows+python+yolov3训练自己的数据集]
(https://blog.csdn.net/maweifei/article/details/81204702)
后续的,修改voc_class里面的种类,改为自己要训练的种类,根据自己的需求修改train.py里面的epoch,batch_size。重要的一点,修改生成的权重文件保存地址,我个人是直接改为如下所示
图中的log_dir即为权重文件保存路径。anchors_path为kmeans生成的文件的路径,名称可以自行修改,但是路径一定要正确。(下方有kmeans说明)
这里有个说明:若你训练的东西和作者训练的voc里的类别一致,建议直接使用作者的权重。若不一致,则还需要进行kmean操作,k-means主要是用于生成锚框anchor,作者预设的anchor是基于voc训练集而生成的,所以我们要根据我们自己的训练集生成新的大小的锚框anchor。打开kmeans.py文件。修改导入的文件名:
我们需要修改的就是self.filename = " "引号中的内容,改为之前voc_annotation生成的train.txt文件。这样,我们就可以读取train里面的内容进行kmeans聚类了。注意:可以先行查看train.txt文件
其中格式应该如下所示:
D:\yolo3train\keras-yolo3-master\keras-yolo3-master/VOCdevkit/VOC2007/JPEGImages/20180920141040.jpg
2064,1406,2544,1539,3 970,1480,1988,1639,3 11,1623,821,1800,3
格式应该为,路径,图片名称,坐标(前四个数字)类别id(属于第几类,从0开始)如上面坐标为(2064,1406)(2544,1539)代表标注的box的xmin,ymin,xmax,ymax,其后的3代表第三类
kmeans.py运行后会得到一个名称为yolo_anchors.txt的文件,这就是要导入到train.py里面的anchor文件。
因为我们没有直接使用作者的权重文件,所以convert.py和coco_annotations并未用到。大体的修改已经完成。
我们运行train.py文件,若出现显存溢出,则调小batch_size,等到loss下降到足够小,我们会得到一个h5格式的权重文件。这个就是我们训练的结果。
后面我们进行检测,我们先进入yolo.py文件进行相应的修改:
图中model_path即为我们训练得到的权重的路径,score和iou为设定的值,若无法检测出框,则可以进行适当的减小,为了测试效果时,可以设置的尽量低一些。同时,注意在测试视频文件时,修改代码,找到下图对应的函数 。如下:
。yolo.py并非测试所用文件,yolo_video.py才是,但是直接从pycharm运行时会出现错误。我们选择使用anaconda prompt 或者命令行来执行语句,先cd到目标文件夹下,然后使用指令,python yolo_video.py --image来检测图片。
检测效果如图。若要使用中文,记得修改字体。
以上均是使用的xml文件格式的annotations,若使用的是json格式的标注,则需要对voc_annotation
进行修改。具体修改如下:
将上面的函数修改为下图所示(笔者在自己测试时发现生成的train文件中的图片名称多出一个.(点)所以将voc_annotation中的.(文件名中的点)删去了,亲测可行,若生成的train文件正常,则不需要去掉该.(文件名中的点),具体为什么会多出一个点,笔者猜测可能是标注的json文件本身所造成的),上述的改为:
即可生成我们所需要的train ,test,val三个文件。其余的步骤基本于xml格式相同。
总结一下:
1.首先创建voc文件夹,将图片和标注放入对应的文件夹,运行voc文件夹下的脚本生成四个txt文件。
2.然后修改voc_class,yolov3.cfg,运行voc_annotation文件(根据需要修改),得到相应的3个txt文件,并进行改名。
3.随后进行kmeans聚类,得到我们自己所要的anchor大小。
4.然后修改train.py里保存权重的路径,和相应的导入路径,根据显存大小修改batch_size,根据需求修改epoch,然后开始训练。
5.最后根据训练的得到的权重文件,修改yolo.py文件,并在命令行或者 anaconda prompt里面(首先cd到对应文件夹)输入指令python yolo_video.py --image进行检测,看到请输入图片时输入图片名称即可。
注:若想使用中文的标注,需要修改显示的字体,在yolo.py中修改即可。
此文章参考了许多博客的内容,感谢各位前辈的指导,若此文对你的训练有帮助,不胜荣幸。
标签:文件,txt,训练,Keras,py,修改,train,WIN10,YOLO3 来源: https://blog.csdn.net/qq_43088746/article/details/88975738