YOLO3+WIN10+Keras+自己的训练集

@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 即为保存地址
图中的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中修改即可。
**

此文章参考了许多博客的内容,感谢各位,若此文对你的训练有帮助,不胜荣幸。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值