YOLOv3-Darknet 训练手册

本文档主要介绍如何使用 YOLOv3 进行目标检测训练,以陶瓷片裂痕为例。

一、下载并编译 Darknet

1. 下载 Darknet

1
2
git clone https://github.com/pjreddie/darknet  
cd darknet

2. 配置 Makefile

编辑 Makefile

1
2
3
4
5
GPU=1         # 使用GPU为1,CPU为0  
CUDNN=1 # 使用CUDNN为1
OPENCV=0 # 若使用摄像头或OpenCV相关操作,设置为1
OPENMP=0 # 使用OpenMP并行处理设置为1
DEBUG=0 # 调试信息设置为1

3. 编译 Darknet

1
make

4. 下载 YOLOv3 预训练权重

1
wget https://pjreddie.com/media/files/yolov3.weights

二、准备数据集

使用 VoTT 工具进行标注,保存格式选择为 YOLO,即可自动生成对应的 *.txt 文件。

示意图如下:

VoTT标注示意图


三、配置模型文件

1. 修改配置文件

复制 YOLOv3-tiny 的默认配置:

1
2
cp cfg/yolov3-tiny.cfg cfg/my_yolov3-tiny.cfg
vim cfg/my_yolov3-tiny.cfg

编辑两个 [yolo] 层:

  • classes=1:表示陶瓷裂痕为一个类别

  • filters=18:使用公式 filters = 3 × (5 + classes)

  • anchors=39,39:如使用统一方形框

  • random=0:原来是1,如果显存不足可设置为0。(是否要多尺度输出)

yolo层参数示意图

2. 修改网络输入参数

[net] 部分将训练部分启用,注释掉测试部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[net]
# Testing### 测试模式
# batch=1
# subdivisions=1
# Training ### 训练模式,每次前向的图片数目 = batch/subdivisions
batch=64
subdivisions=16
width=416### 网络的输入宽、高、通道数
height=416
channels=3
momentum=0.9 ### 动量
decay=0.0005 ### 权重衰减
angle=0
saturation = 1.5 ### 饱和度
exposure = 1.5 ### 曝光度
hue=.1 ### 色调
learning_rate=0.001 ### 学习率
burn_in=1000 ### 学习率控制的参数
max_batches = 50200 ### 迭代次数
policy=steps ### 学习率策略
steps=40000,45000### 学习率变动步长

四、开始训练

1
./darknet detector train cfg/my_data.data cfg/my_yolov3-tiny.cfg yolov3-tiny.conv.15 -gpus 2,3

说明:

  • my_data.data:包含类别路径、训练集、验证集、备份路径等

  • yolov3-tiny.conv.15:用于微调的预训练模型

  • -gpus 2,3:指定使用第 2 和第 3 个 GPU

训练日志示意:

训练日志

日志字段说明:

1
2
Region 16 Avg IOU: 
Region 23 Avg IOU:
  • 这是两个尺度下的目标检测预测框的平均 IOU(交并比);

  • YOLOv3-tiny 使用两个不同的检测尺度来预测不同大小的目标框:

    • Region 23:对应网络中的第 23 层卷积,是最大的预测尺度,使用较大的 anchor mask,但能预测出较小的物体;

    • Region 16:对应网络中的第 16 层卷积,是最小的预测尺度,使用较小的 anchor mask,适合预测较大的物体;

  • 如果某个尺度频繁出现 nan,说明该尺度检测效果不佳,可以忽略。

对于训练日志中最后一行的输出信息,如下所示(由 detector.c 生成):

1
25667: 0.035626, 0.044029 avg, 0.000100 rate, 11.142451 seconds, 6570752 images

各字段含义如下:

  • 25667:当前训练迭代次数;

  • 0.035626:本次迭代的 Loss(总损失);

  • 0.044029 avg:当前的平均 Loss(越小越好,表明模型稳定性提升);

  • 0.000100 rate:当前的学习率,该值由 .cfg 文件中的策略控制;

  • 11.142451 seconds:当前 batch(一个 mini-batch)训练所用的时间(单位:秒);

  • 6570752 images:到目前为止累计参与训练的图片数量,计算方式为迭代次数 × batch 大小。


五、模型测试

1. 单张图片测试

单张图片测试命令:

1
./darknet detector test cfg/my_data.data cfg/my_yolov3-tiny.cfg backup/my_yolov3-tiny_60000.weights /path/to/image.png

结果示意图:

测试结果


六、常用命令汇总

权重转换(提取前15层)

1
./darknet partial cfg/my_yolov3-tiny.cfg backup/tiny-yolo.backup yolov3-tiny.conv.15 15

训练命令

1
2
3
4
5
# 从头训练(带预训练权重)
./darknet detector train data/obj.data cfg/my_yolov3-tiny.cfg yolov3-tiny.conv.15 -gpus 1,2

# 断点续训
./darknet detector train data/obj.data cfg/my_yolov3-tiny.cfg backup/my_yolov3-tiny_60000.weights -gpus 1,2

测试命令

单张图片检测

1
./darknet detector test cfg/my_data.data cfg/my_yolov3-tiny.cfg backup/my_yolov3-tiny_60000.weights 59.png

批量检测并输出结果为 TXT

1
./darknet detector valid cfg/my_data.data cfg/my_yolov3-tiny.cfg backup/my_yolov3-tiny_60000.weights ./results

或者通用格式:

1
./darknet detector valid <data_cfg> <test_cfg> <weights> <output_dir>

Windows 示例(yolo_console_dll.exe)

1
.\yolo_console_dll.exe data/obj.names cfg/yolov3.cfg yolov3.weights C:\Users\Administrator\Desktop\nl\NL

YOLOv4 支持命令

单张预测

1
./darknet detector test data/obj.data cfg/my_yolov4-tiny.cfg my_yolov4-tiny_final.weights 127.png

训练命令

1
./darknet detector train data/obj.data cfg/my_yolov4-tiny.cfg backup/my_yolov4-tiny_2000.weights -gpus 0 -dont_show

七、CUDA 环境变量配置(GPU 报错时)

若出现如下报错:

1
./darknet: error while loading shared libraries: libcudart.so.10.0

请设置 CUDA 环境变量:

1
2
3
4
export PATH=$PATH:/usr/local/cuda-10.0/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.0/lib64
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/cuda-10.0/lib64
source /etc/profile