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

a24925a8055a58eee665075aa0bb3961.png

一、前言

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

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

二、标注自己的数据集

(1)标注格式:

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

├── 

(2)准备数据集:

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

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

(4)Yolov4数据集格式分析:

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

<

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

e5a2e44f43f0d98727107d8b7cc19d47.png
图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
打开后如下图所示:

650fef203a942e8d57b943d9e1aa4d68.png
图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
fcc12cdf8ea4f1891803b00726dbb7fc.png

注意里面需要更改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精度也很高:

2330062833c76d981269da6ac76b930b.png
图三,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

结果如下:

861bc33ca1e9f4995e9eb1fd72e1860e.png
图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真强大:

5c381884f970f368d1a0c6898acd3733.png
图5 PR曲线

五、总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值