[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.
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
wget https://pjreddie.com/media/files/yolov3.weights
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
这里我用的是Github的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文件可以用于其他类型目标检测算法
JPEGImages [将所有标记数据集 .jpg 文件放在这个目录下]
Annotations [将所有标记后生成的 .xml 文件放在这个目录下]
[labeled .xml file2 .txt file]
python3 voc_label.py
将生成的 .xml 文件转换成 .txt 文件,本步骤同下 2.a&b 写入训练数据集绝对路径同时进行,具体可见参 voc_label.py
labels [将转换的 .txt 文件放入本文件夹]
├── 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
train.txt:写入用于训练图片的名字,每行一个名字(不带后缀.jpg)。
val.txt:写入用于验证图片的名字,每行一个名字(不带后缀.jpg)。
t1_video_00003_00050
t1_video_00005_00115
本步骤与 .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
.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文件]
wget https://pjreddie.com/media/files/darknet53.conv.74
./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训练
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(损失)
./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
./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 记得留下小星星