知乎:https://www.zhihu.com/people/red_stone_wl
公众号:AI有道(redstonewill)
YOLOv3是比较常见和常用的深度学习目标检测(Object Dection)算法。今天给大家介绍一下如何一步一步使用YOLOv3训练自己的数据集。
一、标注数据集
首先我们需要使用 labelimg 工具来标注图片数据集,例如图片是 .jpg 格式的,用矩形框标注图片中的目标位置,得到 .xml 文件。这里 labelimg 的使用方法就不作介绍了,读者自行查阅。
例如 100 张图片对应得到 100 个 .xml 文件:
得到 .jpg 和 .xml 文件之后,我们还需要把数据集整理成 VOC2007 规定的格式,方便我们使用 YOLOv3 进行训练。
方法很简单,建立如下目录层级:
然后将 100 张 .jpg 图片放入到 VOCdevkit/VOC2007/JPEGImages 目录下,将 100 个 .xml 文件放入到 VOCdevkit/VOC2007/Annotations 目录下。
至此,数据集准备完毕!
二、下载 YOLOv3 源码
在我们的 Ubuntu 系统或者服务器上,使用 git 命令直接下载 YOLOv3 的源码工程:
下载完成之后,进入 darknet 目录,会发现如下:
YOLOv3 使用的是开源的神经网络框架 Darknet53,有 CPU 和 GPU 两种模式。默认使用的是 CPU 模式,如果我们使用 GPU 的话,需要修改 darknet 目录下的 Makefile 文件:
修改的几点如下:
修改的地方有 4 处。其中,第 1 处 GPU=1
,CUDNN=1
,表示使用 GPU 和 CUDNN,若使用 CPU 的话,置为 0 即可;第 2 处将 NVCC
设为本地安装 nvcc 的实际目录;第 3 处将 COMMON+
设为本地 cuda 的头文件目录;第 4 处将 LDFLAGS+
设为 cuda 的库目录。
Makeflie 文件修改完成之后,保存退出。
三、准备数据
将我们之前准备好的包含 100 张 .jpg 图片和 100 个 .xml 文件的 VOCdevkit 文件夹拷贝到 darknet 目录下,替换原来的 VOCdevkit 文件夹。
进入到 darknet/VOCdevkit/VOC2007/ 目录下,新建 test.py 脚本,脚本内容如下:
该 test.py 脚本的作用就是对 100 个样本进行训练集和测试集的划分,trainval_percent = 0.8
表示划分 80% 的样本作为训练集,20% 的样本作为测试集。
在当前目录,运行该脚本:
运行完之后,在 /ImageSets/Main/ 目录下会生成 4 个文件:test.txt、train.txt、trainval.txt、val.txt。其中,trainval.txt 存放的是 80 个训练集的样本名,test.txt 存放的是 20 个测试集的样本名。
返回到 drknet 目录下,新建 voc_label.py
脚本,也可以使用下面命令下载:
voc_label.py
脚本内容如下:
该文件需要修改两个地方,分别是 sets 和 classes,classes 根据实际的类别进行修改。
修改完成之后,保存退出。在 darknet 目录下,运行该脚本:
运行之后,在当前目录下生成 3 个文件:2007_train.txt, 2007_val.txt, 2007_test.txt,存放的是训练集、测试集图片的路径。
运行下面的命令:
这样,train.txt 即为真正的训练集图片路径,2007_test.txt 即为真正的测试集图片路径。
同时,在 VOCdevkit/VOC2007 目录下也会多生成一个 labels 文件夹,labels 文件夹里存放的就是训练集每个图片包含的类别、矩形框四个坐标信息。这时候数据集正式完成。
四、修改配置文件
1. 修改 voc.data 文件
在 drknet 目录下,打开 cfg/voc.data 文件,根据实际情况作如下修改:
其中,class
是类别,train
和 valid
是之前运行 voc_label.py
得到的 train.txt
和 2007_test.txt
。names
改为自己的实际路径,backup
为模型存放的路径。
2. 修改 voc.names 和 coco.names
在 darknet 目录下,打开 data/voc.names 和 data/coco.names 文件,修改成自己的类别:
保存退出!
3. 修改 yolov3-voc.cfg
下面需要修改配置文件,打开 cfg/yolov3-voc.cfg,搜索 yolo, 总共会搜出 3 个含有 yolo 的地方。
每个地方都必须要改 2 处:
参数 filters 由下式计算:3*(5+classes),例如本例中 classs=4,则filters=27;
参数 class 改为实际的类别个数;
yolov3-voc.cfg 文件中修改 filters 和 classes 的地方一共有 3 处,注意别遗漏了。
在 yolov3-voc.cfg 文件的开头处,修改训练的一些参数
一般根据具体情况作适当修改即可,注意,训练的时候,Testing
的 batch
和 subdivisions
需要注释掉,learning_rate
是学习率,max_batches
是最大迭代训练次数,可根据训练集大小自行修改。
关于 yolov3-voc.cfg 中更详细的参数解释,可自行查阅。
五、编译
刚才我们修改了 Makefile文件,并修改了各个配置文件,下面就对该工程进行编译,在 darknet 目录下输入下面的命令:
编译完成之后,生成 darknet 可执行程序。
六、训练
在 darknet 目录下,
首先下载 YOLOv3 的预训练模型:
然后直接输入下面的命令进行训练:
其中,-gpus 0,1
表示使用 2 块 gpu 进行训练,编号是 0 和 1。根据你可使用的 gpu 个数进行调整。
当看到上面的打印内容,基本就表示训练开始了,慢慢等待吧~
关于 YOLOv3 详细的训练步骤就介绍到这里,下一篇我将带大家来学习一下使用 YOLOv3 训练好的模型进行实际的图片测试还有如何进行批量测试~