目标检测之如何训练YOLOv3模型

目标检测之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 训练模型测试

目标检测之如何训练YOLOv3模型_第1张图片

官方模型测试

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.names

    people 
    fire_extinguisher
    fireplug
    car
    bicycle
    motorcycle  
    
  • .data [本文件里存放 object_train.txt ,object_val.txt, yolo3_object.names 和 backup 的绝对路径]
    cfg folder voc.data

    classes= 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 在小目标检测上比先前版本提升挺多,总体性能还算不错,训练难易度:简单]
目标检测之如何训练YOLOv3模型_第2张图片
YOLO系列论文笔记可访问 [Github 原文档] @Bobby Chen
目标检测类 one-stage & two stage Detectors 相关笔记可访问 [Github 原文档] @Bobby Chen 记得留下小星星

你可能感兴趣的:(深度学习,gpu,yolo,目标检测)