一、前言
上一期分享了如何安装和配置Yolov4,还有安装编译Opencv-3.4.10,Cuda等,若没安装的欢迎点击下面这篇进行参考。本文主要介绍如何基于自己的数据集进行训练,并获取自己的权重因子,用于自己的项目,只要有自己标注的数据集,那么基本检测什么都行,注意这里最好的迁移结果数据集放到2000张左右,如果没有那么多,100多张也勉强够用。追逐雅克比:Yolov4配置-Ubuntu18.04-opencv3.4.10-Cuda10.1-(非ROS)zhuanlan.zhihu.com
二、标注自己的数据集
(1)标注格式:
这里主要介绍如何使用LabelImg进行标注,标注后的格式使用VOC2007数据集的格式,标注后的格式如下:
├── VOCdevkit
│ └── VOC2007
│ ├── Annotations
│ ├── ImageSets
│ │ └── Main
│ ├── JPEGImages
│ └── labels
(2)准备数据集:
这里你可以去使用公共数据集,也可以使用自己拍照获取的数据集,我这里提供两个测试数据集,一个是来源网上,一个是我自己拍照获取的数据集。第一个数据集是一个检测足球的数据集,第二个数据集是检测礼品盒的数据集,下载链接如下:MLDataset.zip-深度学习文档类资源-CSDN下载download.csdn.net
(4)Yolov4数据集格式分析:
首先分析:PASCAL VOC格式的数据格式,标注完毕是一系列xml的格式,下面是一个示例:
mydataset
gift-case-3147970.jpg
/home/yue/Desktop/mydataset/gift-case-3147970.jpg
Unknown
768
1024
3
0
gift case
Unspecified
0
0
364
283
596
481
gift case
Unspecified
0
0
305
665
477
911
下面是一个图像示例,相信看看图片就明白了。图1 VOC数据集标注后保存格式示意
Yovo 数据格式分析:转换完毕的数据格式如下:
class_id x y w h
0 0.4935185185185185 0.38680555555555557 0.44074074074074077 0.30972222222222223
计算方式如下:
x: 目标的中心点x坐标/图片总宽度
y: 目标的中心的y坐标/图片总高度
w: 目标框的宽带/图片总宽度
h: 目标框的高度/图片总高度
x:[(Xmin+XMax)/2]/width
x:[(Ymin+YMax)/2]/height
w:(Xmax-Xmin)/width
h:(Ymax-Ymin)/Height
(5)安装labelImg
1.下载labelImg代码
git clone https://github.com/tzutalin/labelImg
2.安装(Based:Py3+Qt5)
cd ~/labelImg
sudo apt-get install pyqt5-dev-tools
sudo pip install lxml
make qt5py3
python3 labelImg.py
这里也可以直接使用如下命令进行安装:
sudo pip3 install -r requirements/requirements-linux-python3.txt
python3 labelImg.py
打开后如下图所示:图2 礼品盒 labelImg标注
(6)标注
首先打开自己数据集的文件夹,点击键盘w键即可进行框选,点击所感兴趣的位置即可。注意需要在数据集目录下进行创建一个label这样的文件夹方便后面进行拷贝,标注过程如图2.
注意在标注之前需要更改如下文件:
cd data
vim predefined_classes.txt
三、开始训练自己的数据集
终于到了可以训练自己的数据集的步骤。
步骤一,按照如下文件夹在darknet根目录下存放数据:
├── VOCdevkit
│ └── VOC2007
│ ├── Annotations
│ ├── JPEGImages
存放完毕后的darknet根目录如下所示:
├── 3rdparty
│ ├── pthreads
│ │ ├── bin
│ │ ├── include
│ │ └── lib
│ └── stb
│ └── include
├── backup
├── build
│ └── darknet
│ └── x64
│ ├── backup
│ ├── cfg
│ ├── data
│ │ ├── labels
│ │ └── voc
│ └── results
├── cfg
│ └── yolov1
├── cmake
│ └── Modules
├── data
│ └── labels
├── include
├── obj
├── results
├── scripts
│ ├── log_parser
│ └── windows
├── src
├── testfiles
├── VOCdevkit
│ └── VOC2007
│ ├── Annotations
│ ├── ImageSets
│ │ └── Main
│ ├── JPEGImages
│ └── labels
└── weights
步骤二:使用如下脚本进行VOC格式转换为Yolov4格式Yolov4-Resource.zip-机器学习文档类资源-CSDN下载download.csdn.net
注意里面需要更改class类型,每个人不同的类型需要不同的列表。
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
import random
classes=["gift case"]
def clear_hidden_files(path):
dir_list = os.listdir(path)
for i in dir_list:
abspath = os.path.join(os.path.abspath(path), i)
if os.path.isfile(abspath):
if i.startswith("._"):
os.remove(abspath)
else:
clear_hidden_files(abspath)
上述更改完毕后:
python gen_file.py 即可运行
更改完毕后直接运行,会在darknet根目录下生成两个文件:
2007_train.txt 训练图片文件的文件路径
2007_test.txt 测试图片文件的文件路径
步骤三:更改darknet的配置文件
[1]配置文件一:新建data/voc.names,这里重命名为voc-gift-case.names,可以直接拷贝
voc.names更改即可就是把类名放入:
# cat voc-gift-case.names
gift case
[2]配置文件二:新建cfg/yolov4-voc.cfg,这里我重命名为yolov4-voc-gift-case.cfg
注意这个文件需要更改大概需要更改如下:
batch=16
subdivisions=8
max_batches = 4000
选择4000即可
policy=steps
steps=3200,3600
Yolov4是三层网络,我们还需要把三层网络的filters和classes(由于我们只有一个类)进行更改,以用于我们 自定义的数据集。下面提供一个更改后的范本。
注意filters计算方式:filters=(类数目+5)*3,这里可以去参考Yolov4的论文。
[convolutional]
size=1
stride=1
pad=1
filters=18
activation=linear
[yolo]
mask = 6,7,8
anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401
classes=1
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1
scale_x_y = 1.05
iou_thresh=0.213
cls_normalizer=1.0
iou_normalizer=0.07
iou_loss=ciou
nms_kind=greedynms
beta_nms=0.6
max_delta=5
[3]配置文件三:cfg/voc.data,这里我改为voc-gift-case.data
classes= 1
train = /data/ros/darknet/2007_train.txt
valid = /data/ros/darknet/2007_test.txt
names = data/voc-gift-case.names
backup = backup
步骤三:开始训练
这里训练的时间根据数据集的大小和显卡的能力,我这里只有一张1080TI大概需要花费接近3个小时训练。
./darknet detector train cfg/voc-gift-case.data cfg/yolov4-voc-gift-case.cfg ./weights/yolov4.conv.137
训练结束后的图像如下图所示,可以看到快速收敛,且map精度也很高:图三,IOU loss 图像
四、测试自己的数据集(图像和Video)
[1]测试图片:
./darknet detector test cfg/voc-gift-case.data cfg/yolov4-voc-gift-case-test.cfg ./backup/yolov4-voc-gift-case_final.weights testfiles/test.jpeg
结果如下:图4 礼品盒的测试结果
[2]测试视频:
命令:
./darknet detector demo cfg/voc-gift-case.data cfg/yolov4-voc-gift-case-test.cfg ./backup/yolov4-voc-gift-case_last.weights testfiles/test.mp4知乎视频www.zhihu.com
[3]统计mAP和画出PR曲线用于报告或者其他用途
a.统计mApIou=0.5
./darknet detector map cfg/voc-gift-case.data cfg/yolov4-voc-gift-case-test.cfg backup/yolov4-voc-gift-case_final.weights
输出:(可以看到准确率达到了98%以上,我只用了160多张图片)
calculation mAP (mean average precision)...
48
detections_count = 234, unique_truth_count = 207
class_id = 0, name = gift case, ap = 98.93% (TP = 206, FP = 7)
for conf_thresh = 0.25, precision = 0.97, recall = 1.00, F1-score = 0.98
for conf_thresh = 0.25, TP = 206, FP = 7, FN = 1, average IoU = 88.04 %
IoU threshold = 50 %, used Area-Under-Curve for each unique Recall
mean average precision (mAP@0.50) = 0.989287, or 98.93 %
Total Detection Time: 1 Seconds
Set -points flag:
`-points 101` for MS COCO
`-points 11` for PascalVOC 2007 (uncomment `difficult` in voc.data)
`-points 0` (AUC) for ImageNet, PascalVOC 2010-2012, your custom dataset
b.统计mApIou=0.75
./darknet detector map cfg/voc-gift-case.data cfg/yolov4-voc-gift-case-test.cfg backup/yolov4-voc-gift-case_final.weights -iou_thresh 0.75
输出:Iou0.75的精度有所下降大概87%左右
calculation mAP (mean average precision)...
48
detections_count = 234, unique_truth_count = 207
class_id = 0, name = gift case, ap = 97.41% (TP = 203, FP = 10)
for conf_thresh = 0.25, precision = 0.95, recall = 0.98, F1-score = 0.97
for conf_thresh = 0.25, TP = 203, FP = 10, FN = 4, average IoU = 87.12 %
IoU threshold = 75 %, used Area-Under-Curve for each unique Recall
mean average precision (mAP@0.75) = 0.974149, or 97.41 %
Total Detection Time: 1 Seconds
Set -points flag:
`-points 101` for MS COCO
`-points 11` for PascalVOC 2007 (uncomment `difficult` in voc.data)
`-points 0` (AUC) for ImageNet, PascalVOC 2010-2012, your custom dataset
方式二:
python3 reval_voc.py --voc_dir VOCdevkit/ --year 2007 --image_set test --classes data/voc-gift-case.names testgiftcase
输出:
Reading annotation for 1/48
Saving cached annotations to VOCdevkit/annotations_cache/annots.pkl
AP for gift case = 0.9941
Mean AP = 0.9941
~~~~~~~~
Results:
0.994
0.994
~~~~~~~~
--------------------------------------------------------------
Results computed with the **unofficial** Python eval code.
Results should be very close to the official MATLAB eval code.
-- Thanks, The Management
输出PR曲线如下,可以看到不管是Recall还是Precision曲线都很好,不得不说Yolo真强大:图5 PR曲线
五、总结
最后终于写完了,文中基本把如何根据Yolov4训练自己的数据阐述完毕,后面不管多少个类,都可以自己根据上述的配置文件进行更好,大家有问题欢迎留言。