从零开始,教你如何在Darknet 框架下用yolo训练自己的数据集

这一部分主要参考yolo作者介绍的关于yolo如何训练VOC数据集

以自己采集的数据集为例:

一、数据集准备

1)建立数据集文件夹,模仿voc的文件结构

在这里插入图片描述

然后就是用摄像头采集图片的工作了,这里我用的ImageCap.py或者Video2Img.py采集成voc要求的格式,采集时候两点要求:

  • 图要正
  • 相机位置要低

2)标注工具

推荐使用labelImageBBox-Label-Tool可以直接得到训练要的.txt文件,不需要格式转换,但是操作性不是很友好。

6.png

有个小细节注意下:标注之前,先ctrl+r,change default saved Annotation dir为上一步建立的Annotation文件夹路径。

标注完后,可以看到生成的一系列与图片名对应的xml文件。

3)label文件夹的建立以及train.txt,val.txt的生成

ImageSet里面的Main文件夹,这里面存放的是一些文本文件,通常为train.txt、test.txt等,该文本文件里面的内容是需要用来训练或测试的图像的名字,这里我用的ImageSetsMain.py;然后用voc_label.py生成label文件夹以及train.txt, val.txt。

至此,数据集准备工作完成。

二、训练需要用的文件准备

训练需要用到的文件:

1).data文件

该文件包含一些基本的配置信息,具体为训练的总类别数训练数据和验证数据的路径类别名称模型存放路径

例如obj.data

classes=1
train = train.txt
valid = test.txt
names = obj.names     //改为自己训练的类名
backup = backup/
复制代码

需要用到训练数据train.txt和验证数据test.txt。

其中,这两个文件内容为训练/验证图片的路径,每一行为一张图像的路径。部分内容如下:

/home/xxx/code/darknet/data/images/000164.jpg
/home/xxx/code/darknet/data/images/000192.jpg
/home/xxx/code/darknet/data/images/000283.jpg
复制代码

上面的为训练/验证图片数据的路径,每一张图片对应的标签,即每张图片中包含物体的bbox信息存放在txt文件中,txt文件名与图片的文件名一致。标注txt文件内容如下:

44 0.3704921875 0.6309484777517563 0.06092187500000001 0.13524590163934427
67 0.2723671875 0.781311475409836 0.5416093750000001 0.4373770491803278
1 0.6927578125 0.4888290398126464 0.170953125 0.6501639344262296
49 0.229265625 0.6178571428571429 0.034875 0.06742388758782202
51 0.10209375000000001 0.8534309133489462 0.10643750000000002 0.09562060889929742
51 0.1526015625 0.7213348946135831 0.11885937499999999 0.09672131147540983
79 0.15256250000000002 0.5000351288056206 0.300875 0.23037470725995318
复制代码

其中,每一行表示图片中一个object的类别号和bbox信息。Bbox保存的形式为(x,y,w,h)

分别表示object归一化后中心点坐标,宽度和高度。

2).cfg文件

主要包含训练的一些配置信息,如输入图像大小学习率数据增强以及训练的网络结构等。

  • 把cfg文夹中的yolov3-voc.cfg复制到自己项目目录下,并修改:
[net]
# Testing
# batch=1
# subdivisions=1    #训练时候把上面Testing的参数注释
# Training
batch=64
subdivisions=32     #这个参数根据自己GPU的显存进行修改,显存不够就改大一些
...                 #因为训练时每批的数量 = batch/subdivisions
...
...
learning_rate=0.001  #根据自己的需求还有训练速度学习率可以调整一下
burn_in=1000
max_batches = 30000  #根据自己的需求还有训练速度max_batches可以调整一下
policy=steps
steps=10000,20000    #跟着max_batches做相应调整
...
...
...
[convolutional]
size=1
stride=1
pad=1
filters=30         #filters = num*(classes + 5)
activation=linear

[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=5          #修改类别数
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1           #显存小的话 =0

#这个文件的最下面有3个YOLO层,这里我才放上来了一个,这三个地方的classes做相应修改
#每个YOLO层的上一层的convolutional层的filters也要修改
复制代码
  • 下载预训练模型(权重)

在项目目录下打开终端,运行命令:

wget https://pjreddie.com/media/files/darknet53.conv.74
复制代码

三、训练

到此,训练所需的文件就准备好了,可以尝试着开始训练,在darknet目录下执行:

./darknet detector train cfg/obj.data cfg/obj.cfg darknet53.conv.74 
复制代码

出现这样的画面,代表你开始训练了。。。 在这里插入图片描述

四、注意细节:

1)在读入训练数据时,只给程序输入了图片所在路径,而标签数据的路径并没有直接给,是通过对图片路径进行修改得到的,比如在训练voc数据时,输入的train.txt文件中只包含所有图片的具体路径,如:

/home/xxx/code/darknet/data/images/000164.jpg
复制代码

而000164.jpg的标签并没有给程序,是通过该函数替换掉图片路径中的images为labels,并替换掉后缀.jpg为.txt得到的,最终得到:

/home/xxx/code/darknet/data/images/000164.txt
复制代码

这种替换的前提是,标签数据文件夹labels与图片数据文件夹images具有相同的父目录。另外,直接把txt标签文件放在与图片同一路径下也没问题。

详细信息可以查看源码src/data.c文件中find_replace函数。

2)训练时候关注的参数: 在这里插入图片描述


推荐阅读:

【1】YOLO: Real-Time Object Detection

【2】YOLOv3训练以及ROS封装

【3】How to train YOLOv2 to detect custom objects

猜你喜欢

转载自juejin.im/post/7107863856285745183
今日推荐