yolov3数据集下载训练_如何用自己的数据训练YOLOv3

1. 引言

YOLO自诞生以来,每个版本都会引起学术界和工业界的极大关注。在工业界,即使精度稍差,YOLO往往也会比一些Two-Stage的目标检测器更受青睐,因为它是真的很快,完全能满足实时性的应用要求。YOLO最新的版本是YOLOv3,主要改进是提升了小目标检测的效果。YOLOv3官方的权重是在COCO数据集上训练的,总共有80类目标,但是在实际应用中,我们往往需要检测特定的目标。比如在自动驾驶应用中,我们需要检测的目标有汽车、行人、自行车、交通灯、交通标志等。为了检测这些目标,我们就需要用自己的数据集来训练目标检测器。本文将介绍如何用一个猫狗数据集训练YOLOv3来检测图片中的猫和狗。

2. 数据集

本文使用的猫狗数据集来源与数据集Open Images Dataset V4,该数据集总共包含600类目标,我们从中其中的Cat和Dog类中分别取出4000张图像用来训练YOLOv3。

Darknet需要的标注信息格式为

其含义如下:

object-class-id: 类别序号。x: 目标中心点的横坐标,相对于图像的宽度做归一化处理。y: 目标中心点的纵坐标,相对于图像的高度做归一化处理。width: 目标的宽度,相对于图像的宽度做归一化处理。height: 目标的高度,相对于图像的高度做归一化处理。

如果数据集的标注信息不是这种格式,可以写一个python脚本来做转换,这个比较简单,可以参考scripts/目录下的voc_label.py脚本来实现。转换后的标注文件为txt格式,与图像放在同一目录下,每张图像对应一个标注文件。

准备好图像和标注文件后,我们还要生成训练集和验证集的文件列表。训练集和验证集按9:1的比例划分,生成的文件列表文件分别为train.list和val.list。

yolov3数据集下载训练_如何用自己的数据训练YOLOv3_第1张图片

文件列表中的每一行都对应一张图片的路径(最好用绝对路径),训练的时候程序会根据这个路径去读取图片。文件列表中的格式类似于:

/home/anyu/datasets/cat_dog/dog/144fda747fc5bda8.jpg/home/anyu/datasets/cat_dog/cat/03c22fcbc7ce0312.jpg

3. 训练

YOLOv3的作者自己用C语言写了一个深度学习框架Darknet,所以我们要训练YOLOv3的话需要先从github上下载Darknet:

git clone https://github.com/pjreddie/darknet

下载完成后,先修改Makefile文件。如果我们的机器有英伟达显卡,并安装了CUDA,cuDNN和OpenCV,可以按下面的修改:

GPU=1CUDNN=1OPENCV=1

这样就能用GPU进行加速。如果还需要CPU优化,可以设置OPENMP=1。

修改完成后,执行make命令进行编译,如果没有错误的话,会在当前目录下生产可执行文件"darknet"。

在进行训练之前,我们还需要准备几个文件(下面这些文件放在哪个目录都可以,只要对应上就好了)。

  • YOLOv3模型配置文件

首先把cfg/目录下的yolov3.cfg文件复制一份,重命名为cat_and_dog_yolov3.cfg,然后设置里面的内容。

[net]#设置batchsizebatch=64subdivisions=16#输入图像的分辨率width=608height=608channels=3#momentum参数momentum=0.9decay=0.0005#数据增强参数angle=0saturation = 1.5exposure = 1.5hue=.1#最大训练次数max_batches =20000#学习率及调整策略learning_rate=0.001burn_in=1000policy=stepssteps=15000scales=.1

然后修改yolo层的参数,把类别数量classes改为2。另外还要把yolo层上面convolutional层中filters的参数改为21,该参数的计算方法为(classes+5)*3,在本文中是(2+5)*3=21。如果是用COCO数据集训练,该参数就是(80+5)*3=255,在实际应用中注意根据实际情况进行修改。

[convolutional]size=1stride=1pad=1filters=21activation=linear[yolo]mask = 6,7,8anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326classes=2num=9jitter=.3ignore_thresh = .7truth_thresh = 1random=1

注意:YOLOv3有3个yolo层,都需要进行上述修改。

  • 类别名称文件

在data/目录下新建一个文件cat_and_dog.names用来保存类别的名称,文件内容为:

catdog
  • 配置文件

在cfg/目录下新建一个文件cat_and_dog.data,内容如下:

#类别数量classes= 2#训练集文件列表的路径train = /path/to/train.list#验证集文件列表的路径valid = /path/to/val.list#类别名称文件names = data/cat_and_dog.names#训练过程中权重文件的保存目录backup =backup/
  • 预训练权重文件

用下面的命令下载预训练的权重文件:

wget https://pjreddie.com/media/files/darknet53.conv.74

此文件是YOLOv3的骨干网络darknet53在ImageNet上训练得到的权重文件,可以加速训练过程,因为ImageNet里是有猫和狗的。当然,这个文件不是必须的,不用也是可以的。

准备好这些文件后,我们就可以执行以下命令开始训练了:

./darknet detector train cfg/cat_and_dog.data cfg/cat_and_dog_yolov3.cfg darknet53.conv.74

4. 结果

训练完成后,在backup/目录下会得到权重文件cat_and_dog_yolov3_final.weights。首先把cat_and_dog_yolov3.cfg文件中batch和subdivisions都设置为1,然后运行下面的命令就可以进行测试了:

./darknet detector train cfg/cat_and_dog.data cfg/cat_and_dog_yolov3.cfg backup/cat_and_dog_yolov3_final.weights data/dog.jpg

其中data/dog.jpg是要检测的图片。以下是我的一些检测结果:

yolov3数据集下载训练_如何用自己的数据训练YOLOv3_第2张图片
yolov3数据集下载训练_如何用自己的数据训练YOLOv3_第3张图片
yolov3数据集下载训练_如何用自己的数据训练YOLOv3_第4张图片

来看几张难度大一点的:

yolov3数据集下载训练_如何用自己的数据训练YOLOv3_第5张图片

这张图有一定的迷惑性,不过还是检出来了

yolov3数据集下载训练_如何用自己的数据训练YOLOv3_第6张图片

自带伪装效果的小猫咪还是被发现了

yolov3数据集下载训练_如何用自己的数据训练YOLOv3_第7张图片

这个没检出来,我第一眼看也以为是只鸟

5. 总结

本文以猫狗数据集为例,详细介绍了如何在Darknet框架下用自己的数据集训练YOLOv3的过程,希望本文能对不熟悉Darknet和YOLOv3的朋友有所帮助。

你可能感兴趣的:(yolov3数据集下载训练,yolov3训练自己的数据,yolov5训练自己的数据集)