目录
前言
本篇文章记录了在centos7(Linux)上使用YOLOv3训练自己数据的操作步骤,YOLOv3使用AlexeyAB大神改进的darknet(Github地址),内容也主要参考自其中,使用其它系统或框架的同学可以酌情参考或直接阅读Github。
题外话:第一次写博客,可能存在诸多问题和遗漏,欢迎大家指出更正。
编译安装
1. 环境要求
由于环境的准备工作不是本篇文章的重点,这里只做简单叙述。
根据Github上的要求:
- CMake >= 3.8
- CUDA 10.0
- cuDNN >= 7.0 for CUDA 10.0 (注意要和CUDA版本对应)
- OpenCV >= 2.4
- GPU with CC >= 3.0
- GCC
2. 下载及编译
darknet源码下载地址:https://github.com/AlexeyAB/darknet
下载解压后进入darknet根目录,根据机器情况修改Makefile文件:
GPU=1 # 是否使用GPU
CUDNN=1 # 是否使用CUDNN
CUDNN_HALF=1 # 是否为Tensor核心加速,
Titan V / Tesla V100 / DGX-2及更高版本显卡可以使用
OPENCV=1 # 是否使用OPENCV
OPENMP=0 # 是否使用OPENMP
修改后进行编译,在darknet根目录执行:
make
训练
1. 准备数据
1.1 使用yolo_mark对图片进行标注
yolo_mark下载地址:https://github.com/AlexeyAB/Yolo_mark
对于每个图片,yolo_mark输出一个txt文件,每一行代表一个bounding box,格式如下:
<类别> <x_center> <y_center> <width> <height>
设该bounding box中心的绝对坐标为(<absolute_x>,<absolute_y>)
,
该bounding box在绝对坐标下宽高为(<absolute_width>,<absolute_height>)
,
图片的宽高为(<image_width>,<image_height>)
,
则每个参数的含义如下:
参数 | 含义 |
---|---|
<类别> |
该bounding box内物体的类别,为[0, class-1]之间整数 |
<x_center> |
<absolute_x> / <image_width>,为[0,1]之间浮点数 |
<y_center> |
<absolute_y> / <image_height>,为[0, 1]之间浮点数 |
<width> |
<absolute_width> / <image_width>,为[0, 1]之间浮点数 |
<height> |
<absolute_height> / <image_height>,为[0, 1]之间浮点数 |
例:1 0.609766 0.660417 0.388281 0.215278
1.2 将图片保存到data目录
图片的存放位置可以自行决定,但建议存放在darknet根目录下的data目录下,方便管理。
进入data目录,创建用于存放数据的文件夹,命名为obj (目录名可以根据自己需求更改):
cd data
mkdir obj
将图片文件和对应的txt标注文件一起存放进data/obj/
目录下。
注意:图片文件和对应的txt标注文件的文件名要保持一致。
2. 修改配置文件
2.1 train文件
作用:训练数据集路径。
在data目录下创建train文件train.txt (文件名可以自行更改,但要保持前后一致),文件内容为用作训练数据的图片路径。如:
我要使用data/obj/
目录下的如下文件进行