一、前言

上一期分享了如何安装和配置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训练自己的数据阐述完毕,后面不管多少个类,都可以自己根据上述的配置文件进行更好,大家有问题欢迎留言。