目标检测之YOLOv3模型训练
[Github 原文档] @Bobby Chen 记得留下小星星
You only look once (YOLO) is a state-of-the-art, real-time object detection system. YOLOv3 On a Titan X it processes images at 40-90 FPS and has a mAP on VOC 2007 of 78.6% and a mAP of 48.1% on COCO test-dev. YOLOv3 On a Pascal Titan X it processes images at 30 FPS and has a mAP of 57.9% on COCO test-dev.
YOLOv3 训练模型测试
官方模型测试
1. 下载Darknet源码
git clone https://github.com/pjreddie/darknet
cd darknet
vim Makefile
...
GPU=1 #GPU数量
CUDNN=1
NVCC=/usr/local/cuda-9.0/bin/nvcc
OPENCV=1
make
2. 下载预训练模型
wget https://pjreddie.com/media/files/yolov3.weights
3. 训练模型测试
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
用自己的数据进行训练
1. 数据集物体标记
这里我用的是Github的LabelImg进行数据集物体标记,具体使用方法可见下方链接
LabelImg is a graphical image annotation tool - labelImg
Ubuntu Linux
Python 3 + Qt5
git clone https://github.com/tzutalin/labelImg.git
sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
make qt5py3
cd labelImg
python3 labelImg.py
python3 labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
标记后的图片将生成对应的 .xml 文件或 .txt (labelImg界面可选), YOLO默认使用 .txt文件, 也可将生成的 .xml文件转换成 .txt 文件后用在YOLO使用,建议生成 .xml 文件后转换 .txt 文件,.xml文件可以用于其他类型目标检测算法
a. 主要文件目录结构
-
JPEGImages [将所有标记数据集 .jpg 文件放在这个目录下]
-
Annotations [将所有标记后生成的 .xml 文件放在这个目录下]
[labeled .xml file2 .txt file] python3 voc_label.py
将生成的 .xml 文件转换成 .txt 文件,本步骤同下 2.a&b 写入训练数据集绝对路径同时进行,具体可见参 voc_label.py
-
labels [将转换的 .txt 文件放入本文件夹]
b. 各文件夹目录结构
├── JPEGImages
│ ├── object_00001.jpg
│ ├── object_00001.txt
│ ├── object_00002.jpg
│ └── object_00002.txt
│ …
├── Annotations
│ ├── object_00001.xml
│ └── object_00002.xml
│ …
├── backup
│ ├── yolov3-voc-object.backup
│ └── yolov3-voc-object_20000.weights
│ …
├── cfg
│ ├── yolo3_object.data
│ └── yolov3-voc-object.cfg
└── test
2. 训练准备
a. 遍历训练数据集文件名
-
train.txt:写入用于训练图片的名字,每行一个名字(不带后缀.jpg)。
-
val.txt:写入用于验证图片的名字,每行一个名字(不带后缀.jpg)。
t1_video_00003_00050
t1_video_00005_00115
b. 写入训练数据集绝对路径
本步骤与 .txt 转换使用的 voc_label.py 相同, 可提前进行上个步骤后同一转换或自行更改代码
-
object_train.txt:写入用于训练图片的绝对路径,每行一个路径。
-
object_val.txt:写入用于验证图片的绝对路径,每行一个路径。
/home/cai/Desktop/yolo_dataset/objectdetection/JPEGImages/t1_video_00005_00115.jpg
/home/cai/Desktop/yolo_dataset/objectdetection/JPEGImages/t1_video_00002_00196.jpg
c. 制作 .names .cgf 和 .data 训练需要文件
-
.names [本文件里存放数据类别,如下一共有6类目标检测,可根据自己检测类型更改]
data folder voc.namespeople fire_extinguisher fireplug car bicycle motorcycle
-
.data [本文件里存放 object_train.txt ,object_val.txt, yolo3_object.names 和 backup 的绝对路径]
cfg folder voc.dataclasses= 6 #类别数 train = /home/cai/Desktop/yolo_dataset/objectdetection/object_train.txt #obj_train.txt路径 valid = /home/cai/Desktop/yolo_dataset/objectdetection/object_val.txt #obj_val.txt路径 names = /home/cai/Desktop/yolo_dataset/objectdetection/yolo3_object.names #obj_voc.names路径 backup = /home/cai/Desktop/yolo_dataset/objectdetection/backup/ #建一个backup文件夹用于存放weights结果
-
.cfg [本文件根据自己训练数据和使用硬件进行适当更改]
cfg folder yolov3-voc.cfg - example.cfg[convolutional] ... filters = 3*(classes + 5) #修改filters数量,classes为数据集类别数量 [yolo] ... classes=6 #修改类别数 [具体参数修改可见cfg文件]
3. 下载预训练权重
wget https://pjreddie.com/media/files/darknet53.conv.74
4. 开始训练
./darknet detector train obj_detect/cfg/obj_voc.data obj_detect/cfg/yolov3-voc.cfg darknet53.conv.74
# visualization 训练过程可视化
./darknet detector train obj_detect/cfg/obj_voc.data obj_detect/cfg/yolov3-voc.cfg darknet53.conv.74 2>1 | tee visualization/train_yolov3.log
训练完成后权重保存在 backup 文件夹内,依据训练情况可手动停止训练
-gpu 0可指定 GPU 训练, -gpus 0,1,2,3 可指定多 GPU训练
训练过程 train_yolov3.log 可视化
python3 extract_log.py
python3 visualization_loss.py
python3 visualization_iou.py
训练参数详解
Avg IOU:当前迭代中,预测的box与标注的box的平均交并比,越大越好,期望数值为1;
Class: 标注物体的分类准确率,越大越好,期望数值为1;
obj: 越大越好,期望数值为1;
No obj: 越小越好;
.5R: 以IOU=0.5为阈值时候的recall; recall = 检出的正样本/实际的正样本
0.75R: 以IOU=0.75为阈值时候的recall;
count:正样本数目。
1: 1452.927612, 1452.927612 avg, 0.000000 rate, 1.877576 seconds, 32 images
第几批次,总损失,平均损失,当前学习率,当前批次训练时间,目前为止参与训练的图片总数
1: 指示当前训练的迭代次数
1452.927612: 是总体的Loss(损失)
5. 测试
ImgTesting
./darknet detector test ./obj_detect/cfg/obj_voc.data ./obj_detect/cfg/yolov3-voc.cfg ./obj_detect/backup/yolov3-voc_30000.weights ./obj_detect/test/test_img.jpg
VideoTesting
./darknet detector demo ../obj_detect/cfg/obj_voc.data ./obj_detect/cfg/yolov3-voc.cfg ./obj_detect/backup/yolov3-voc_30000.weights ./obj_detect/test/obj_test.mp4
测试数据:[YOLOv3 在小目标检测上比先前版本提升挺多,总体性能还算不错,训练难易度:简单]
YOLO系列论文笔记可访问 [Github 原文档] @Bobby Chen
目标检测类 one-stage & two stage Detectors 相关笔记可访问 [Github 原文档] @Bobby Chen 记得留下小星星