天天看点

detectron2训练自己的数据集_Yolov4-训练自己的数据集(非ROS)

detectron2训练自己的数据集_Yolov4-训练自己的数据集(非ROS)

一、前言

上一期分享了如何安装和配置Yolov4,还有安装编译Opencv-3.4.10,Cuda等,若没安装的欢迎点击下面这篇进行参考。本文主要介绍如何基于自己的数据集进行训练,并获取自己的权重因子,用于自己的项目,只要有自己标注的数据集,那么基本检测什么都行,注意这里最好的迁移结果数据集放到2000张左右,如果没有那么多,100多张也勉强够用。

追逐雅克比:Yolov4配置-Ubuntu18.04-opencv3.4.10-Cuda10.1-(非ROS)​zhuanlan.zhihu.com

detectron2训练自己的数据集_Yolov4-训练自己的数据集(非ROS)

二、标注自己的数据集

(1)标注格式:

这里主要介绍如何使用LabelImg进行标注,标注后的格式使用VOC2007数据集的格式,标注后的格式如下:

├── 
           
(2)准备数据集:

这里你可以去使用公共数据集,也可以使用自己拍照获取的数据集,我这里提供两个测试数据集,一个是来源网上,一个是我自己拍照获取的数据集。第一个数据集是一个检测足球的数据集,第二个数据集是检测礼品盒的数据集,下载链接如下:

MLDataset.zip-深度学习文档类资源-CSDN下载​download.csdn.net

detectron2训练自己的数据集_Yolov4-训练自己的数据集(非ROS)
(4)Yolov4数据集格式分析:

首先分析:PASCAL VOC格式的数据格式,标注完毕是一系列xml的格式,下面是一个示例:

<
           

下面是一个图像示例,相信看看图片就明白了。

detectron2训练自己的数据集_Yolov4-训练自己的数据集(非ROS)

图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
打开后如下图所示:
           
detectron2训练自己的数据集_Yolov4-训练自己的数据集(非ROS)

图2 礼品盒 labelImg标注

(6)标注

首先打开自己数据集的文件夹,点击键盘w键即可进行框选,点击所感兴趣的位置即可。注意需要在数据集目录下进行创建一个label这样的文件夹方便后面进行拷贝,标注过程如图2.

注意

在标注之前需要更改如下文件:

cd data
vim predefined_classes.txt <----这个文件需要更改成自己的类型
           

三、开始训练自己的数据集

终于到了可以训练自己的数据集的步骤。

步骤一,按照如下文件夹在darknet根目录下存放数据:

├── VOCdevkit
│   └── VOC2007
│       ├── Annotations <----存放xml文件
│       ├── 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

detectron2训练自己的数据集_Yolov4-训练自己的数据集(非ROS)

注意里面需要更改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,看自己的需求,太大容易过饱和,这里由于图像比较少
选择4000即可
policy=steps
steps=3200,3600 <----这里前者是80%,90% max_batches
           

Yolov4是三层网络,我们还需要把三层网络的filters和classes(由于我们只有一个类)进行更改,以用于我们 自定义的数据集。下面提供一个更改后的范本。

注意filters计算方式:filters=(类数目+5)*3,这里可以去参考Yolov4的论文。

[convolutional]
size=1
stride=1
pad=1
filters=18  <---这里,注意只有出现linear 这个地方的filters才需要改
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精度也很高:

detectron2训练自己的数据集_Yolov4-训练自己的数据集(非ROS)

图三,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
           

结果如下:

detectron2训练自己的数据集_Yolov4-训练自己的数据集(非ROS)

图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

detectron2训练自己的数据集_Yolov4-训练自己的数据集(非ROS)

[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 ([email protected]) = 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 ([email protected]) = 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真强大:

detectron2训练自己的数据集_Yolov4-训练自己的数据集(非ROS)

图5 PR曲线

五、总结

最后终于写完了,文中基本把如何根据Yolov4训练自己的数据阐述完毕,后面不管多少个类,都可以自己根据上述的配置文件进行更好,大家有问题欢迎留言。

继续阅读