YOLOv3是当前计算机视觉中最为流行的实时目标检测算法之一。
昨天LearnOpenCV网站博主又发福利,post了一个清晰明了的教程,一步一步示例,如何使用快速实时的YOLOv3算法,训练某种特定类别目标的检测器。
作者收集了将近1000张雪人的图片,训练了一个雪人检测器,先来看看效果吧
全部代码可在文末下载。
该教程主要步骤如下:
1. 准备数据
作者在网络上收集了雪人的图像并将每幅图像链接存储在snowmanDataLinks.cvs。
1.1 下载数据
在代码文件夹里使用下述命令即可自动下载作者收集的雪人图片:
python3 downloadSnowmanData.py
作者总共收集了922幅图像,如果因为网络原因你只能下载到700幅图像也能训练出mAP达到0.9的检测器。
作者提供了这些图像的包围框标签,存放于labels文件夹下。
下载结束后要检查一下文件,保证把那些没有成功下载的错误文件删除。
1.2 训练集测试集数据切分
调用splitTrainAndTest.py脚本会自动把数据集按照训练集比测试集合9:1的比例切分,并生成snowman_train.txt和snowman_test.txt两个文件。
2. 准备Darknet
2.1 下载与编译Darknet
cd ~
git clone https://github.com/pjreddie/darknet
cd darknet
make
2.2 修改代码使得正常保存模型
为了更好的监控训练过程,打开文件examples/detector.c,将第135行
if(i%10000==0 || (i < 1000 && i%100 == 0)){
改为
if(i%1000==0 || (i < 2000 && i%200 == 0)){
并再次make编译。
3. 数据标注
下载的数据已经提供了雪人的标注,每个标注的格式如下:
<object-class-id> <center-x> <center-y> <width> <height>
object-class-id是类别id,这里只有雪人一类,故这里统一为1,
center-x是目标的中心x坐标并除以图像宽度归一化了,
center-y是目标的中心y坐标并除以图像高度归一化了,
width为目标的宽度并除以图像宽度归一化了,
height为目标的宽度并除以图像高度归一化了。
4. 下载预训练模型
为了使训练过程网络能更快收敛,使用ImageNet数据集上的预训练模型。
使用以下命令下载:
cd ~/darknet
wget https://pjreddie.com/media/files/darknet53.conv.74 -O ~/darknet/darknet53.conv.74
5. 指定训练所需数据文件路径
在darknet.data文件中指定classes类别数1,
训练集路径train指向snowman_train.txt、
验证集路径valid指向snowman_test.txt、
包含类名‘snowman’的类名文件classes.names、
权重文件存储路径backup。
6. YOLOv3参数配置
6.1 batch size:每次训练加载一批数据的个数
batch=64
6.2 subdivisions:当GPU内存不能训练一批数据时,将一批数据平均分成几部分
subdivisions=16
6.3 width,height,channels:训练图像要归一化为的宽高和通道数。
width=416
height=416
channels=3
6.4 momentum,decay:防止权重更新过程中过拟合的参数,一般不要改动。
momentum=0.9
decay=0.0005
6.5 learning rate,steps,scales,burn in:训练中控制学习率变化的参数。
learning_rate=0.001
policy=steps
steps=3800
scales=.1
burn_in=400
6.6 data augmentation:对训练数据进行多种变换。
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
6.7 number of iterations:迭代次数
max_batches=5200
7. 训练YOLOv3
cd ~/darknet
./darknet detector train /path/to/snowman/darknet.data /path/to/snowman/darknet-yolov3.cfg ./darknet53.conv.74 > /path/to/snowman/train.log
7.1 何时停止训练?
我们可以根据随着batch次数增多loss下降到某一阈值而停止训练,下图为训练过程中loss变换。
经过5200次迭代,最终得到的模型文件darknet-yolov3_final.weights达到90.91%的mAP。
8. 测试模型
调用object_detection_yolo.py测试模型。
python3 object_detection_yolo.py --image=snowmanImage.jpg
原博文地址
https://www.learnopencv.com/training-yolov3-deep-learning-based-custom-object-detector/
代码下载
在“我爱计算机视觉”微信公众号对话界面回复“YOLO训练”,即可收到该工程代码的下载地址。