深入浅出Yolox之自有数据集训练超详细教程

2021-08-25 11:28:09 浏览数 (1)

随着旷视科技发布Yolox的论文和代码后,Yolox得到了广泛的关注。但由于训练代码和之前的Yolov3、Yolov4、Yolov5的代码都不相同。且代码中的训练案例,以COCO和VOC格式为基准,和平时大家标注的文件,并不是完全相同的格式。而且训练自有数据的讲解流程,很多人不太熟悉。

因此大白以自有标注的人头数据集为案例,一步步和大家一起学习,整体的训练和测试全流程。

PS:大白将代码文件、网络权重、数据集划分代码和人头数据集,都整理汇总,可点击最下方,阅读原文查看下载。

文章目录

1 深入浅出Yolo核心基础完整讲解 2 Yolox代码环境搭建 2.1 下载Yolox代码 2.2 搭建测试环境 2.3 代码测试:Demo效果测试 3 Yolox自有数据集训练 3.1 数据集准备:标注数据 3.2 数据集准备:训练&验证集划分 3.3 训练准备:修改训练配置参数 3.4 Yolox训练及常见问题 3.5 训练效果测试 4 相关推荐:更多数据集下载

1 深入浅出Yolo核心基础完整讲解

当然了解训练和测试流程,我们还需要了解其相关的原理。

大白这里列出之前写的Yolo相关的文章,可以对应查看了解:

① Yolov3相关资料

【视频】:深入浅出Yolov3(上)、深入浅出Yolov3(下)

② Yolov4相关资料

【视频】:深入浅出Yolov4(上)、深入浅出Yolov4(下)

【文章】:《深入浅出Yolo系列之Yolov3&4核心基础知识完整讲解》

③ Yolov5相关资料

【文章】:《深入浅出Yolo系列之Yolov5核心基础知识完整讲解》

注意:因无法直接放文章或视频外链,可点击最下方,阅读原文进行查看。

2 Yolox代码环境搭建

在Yolox代码训练之前,我们先下载Yolox代码,将测试环境搭建起来。

测试的Demo跑通了,训练的环境也就没问题了。

2.1 下载Yolox代码

Yolox代码链接:https://github.com/Megvii-BaseDetection/YOLOX

2.2 搭建测试环境

大白的电脑系统为Ubuntu 16.04版本。

而Yolox测试环境的搭建,其实在代码中的,README.md中“Quick Start”这部分。

为了大家更简单入手,下面大白一步步演示一下:

首先为了测试环境更加独立,大白以conda为例,新建一个Yolox环境。

(1)新建一个Conda环境

输入命令:conda create -n Yolox_3.7 python=3.7

Python为3.7版本,名字为Yolox_3.7的Conda环境,新建完成。

(2)进入Conda环境

输入命令:conda activate Yolox_3.7,进入Conda环境中,并到下载好的YOLOX文件夹下。

(3)安装代码依赖的库文件

输入命令:pip3 install -U pip && pip3 install -r requirements.txt

即可下载好,代码所依赖的一些库文件。

(4)通过setup.py安装一些库文件

输入命令:python3 setup.py develop

(5)下载apex文件

输入命令:git clone https://github.com/NVIDIA/apex

可以将apex所有文件下载到YOLOX文件夹中,不过大白网络原因,一直无法下载,所以大白先直接下载好apex文件,解压放到YOLOX中。

大白这里也将apex放到数据集的网盘中,大家也点击最下方阅读原文,进行下载。

(6)安装apex文件

输入命令:cd apex

sudo pip3 install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./

(7)下载pycocotools

输入命令:pip3 install cython

再输入命令:

pip3 install 'git https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'

2.3 代码测试:Demo效果测试

2.3.1 下载Yolox_s.pth文件

搭建好环境后,就可以下载官方的预训练模型,对图片进行测试了。

预训练权重的下载链接,在官方代码的说明中。

我们先下载Yolox_s.pth文件,尝试测试效果。

下载好yolox_s.pth.tar后,放到YOLOX代码的文件夹下:

2.3.2 Demo测试

使用代码中自带的图片,进行Demo测试。

在YOLOX文件夹的终端页面输入:

python3 tools/demo.py image -n yolox-s -c yolox_s.pth.tar --path assets/dog.jpg --conf 0.3 --nms 0.5 --tsize 640 --save_result --device [gpu]

YOLOX的代码中,会新建一个YOLOX_outputs文件夹,在其中的yolox_s/vis_res/,可以看到带有检测效果的图片。

到此Yolox的测试环境,以及测试效果都实现了,下面我们再进行Yolox的自有数据集训练。

3 Yolox自有数据集训练

3.1 数据集准备:标注数据

在数据集中,大白采用教室场景下的一个人头数据集,和大家一起尝试整个流程。

① 标注的工具:采用Labelimg标注软件

② 标注的图片:3000张人头图片

③ 标签的类别:head。

④ 下载链接:点击最下方阅读原文,进行下载

3.2 数据集准备:训练&验证集划分

3.2.1 数据集介绍

当下载好人头数据集后,可以看到head的数据集文件夹,数据集只有一个标签:head(人头)。

进入head文件夹中,其中包含两个文件夹:

① JPEGImages文件夹:数据集的图片

② Annotations文件夹:与图片对应的所有xml文件。

将文件夹的结构展开,即下图这样的排布:

我们前面说明,总共有3000张图片,即有对应的3000个xml文件。

3.2.2 模仿VOC格式排布

Yolox的代码中有VOC、和COCO两个数据集加载的格式,这里大白主要演示VOC加载的方式。

那么我们首先看一下VOC格式的分布:

在VOC这些文件夹中,我们主要用到:

① JPEGImages文件夹:数据集图片

② Annotations文件夹:与图片对应的xml文件

③ ImageSets/Main文件夹:将数据集分为训练集和验证集,因此产生的train.txt和val.txt。

从Voc的文件夹排布,和head的文件夹排布,可以看出:还缺少一个ImageSets/Main文件夹。

因此在head文件夹中,新建一个ImageSets文件集,再在其中新建一个Main子文件夹。

即得到下图这样的文件夹结构:

3.2.3 划分训练集和验证集

因为自有标注好的图片数据,都是放在一起的。

而训练过程中,需要划分为训练集和验证集。

因此还需要编写脚本,将数据集分为训练集和验证集,并且生成对应的train.txt,和val.txt,放在Main文件夹中。

这里大白贴上写的划分数据集的代码,当然,代码文件也在上面的数据集下载处,点击最下方阅读原文,进行下载。

下载好代码后,将脚本文件train_val_data_split.py放在JPEGImages同路径下:

并进行运行后,在ImageSets/Main文件夹下,就会生成对应的train.txt和val.txt。

主要注意的是:代码中,训练集和验证集的比例,为9:1,大家也可以自行调整。

3.3 训练准备:修改训练配置参数

3.3.1 修改类别标签和数量

① 修改类别标签

因此前面自有的数据集只有一个类别,head。

将yolox/data/datasets/voc_classes.py中的标签信息,进行修改。

注意:类别后面都要加逗号,例如“head”后面加了一个逗号“,”。

② 修改类别数量

(1)修改exps/example/yolox_voc/yolox_voc_s.py中的self.num_classes

因为只有head一种,所以self.num_classes=1。

(2)修改yolox/exp/yolox_base.py中的self.num_classes

将self.num_classes=80修改为1。

3.3.2 修改训练集信息

(1)修改exps/example/yolox_voc/yolox_voc_s.py中的VOCDection。

因为是自己的数据集,所以修改为:

data_dir是前面3.2节中head的绝对路径,images_sets修改为train。

此外,max_labels,表示图片最多的目标数量,这里大白因为使用的是人头,数量较多,所以改为100。

(2)修改yolox/data/datasets/voc.py中,VOCDection函数中的读取txt文件。

因为自有的数据集,没有year年代的信息,所以修改为:

3.3.3 修改验证集信息

修改exps/example/yolox_voc/yolox_voc_s.py中的get_eval_loader函数。

因为是自己的验证数据集,所以修改为:

data_dir是前面3.2节中head的绝对路径,images_sets修改为val。

3.3.4 修改不同的网络结构

Yolox_s网络为例,比如在exps/default/yolox_s.py中,self.depth=0.33,self.width=0.5。和Yolov5中的不同网络调用方式一样。

为了统一不同的网络结构,继续修改exps/example/yolox_voc/yolox_voc_s.py中的,self.depth和self.width。

再修改yolox/exp/yolox_base.py中的,self.depth和self.width。

3.3.5 修改其他相关

(1)删除year等信息

因为自有数据集中,没有year信息,所以需要删除。

即修改yolox/data/datasets/voc.py中,_get_voc_results_file_template函数。

所以将第三行的year等删除,如下图所示:

在训练过程中,在原始的head数据集中,会生成一个results的文件夹,保存历史信息。

(2)修改验证epoch的数量

目前代码中是训练迭代10个epoch,再对验证集做1次验证,但大白想每迭代1个epoch,即做一个验证,及时看到效果。

参数在yolox/exp/yolox_base.py的class Exp中:

修改为

设置为每迭代一个epoch,即使用验证集验证一次。

(3)修改验证时的相关信息

主要对读取验证信息的相关代码进行调整,代码在yolox/data/datasets/voc.py中_do_python_eval函数中。

① 因为自有数据集没有year信息,所以将其中的rootpath和name:

修改为:

② 因为没有year信息,所以将其中的cachedir:

修改为:

在训练过程中,在原始的head数据集中,会生成一个annotations_cache的文件夹,保存历史信息。

③ 因为没有year信息,所以修改use_07_metric的信息。

修改为:

3.4 Yolox训练及常见问题

3.4.1 开始训练

(1)终端训练

将下载好的yolox_s.pth.tar放到YOLOX文件夹中,打开终端,在终端中输入:

python3 tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 0 -b 64 -c yolox_s.pth.tar

(2)Pycharm训练

代码运行时,常常需要Debug的方式,进行调试执行。

所以可以修改train.py的几个配置参数,采用Debug或者Run的方式进行执行。

主要需要修改以下参数:

① batch-size

根据自己机器的配置,设置batch-size的参数,比如大白这里设置的64。

② devices参数

如果GPU服务器只有1张卡,将devices的default修改为0。

③ exp_file参数

将exp_file的default修改为yolox_voc_s.py的路径(如代码版本更新,可重置路径)。

④ ckpt参数

如果使用预训练权重,将ckpt的default修改为模型权重的路径。

3.4.2 常见问题

在运行tools/train.py时,可能会出现以下问题,如没有可以跳过:

问题1:apex路径报错

因为YOLOX内的apex文件夹,还有一个apex文件夹,所以引用路径有点问题。

解决方法:

这时在每个调用apex的地方,添加一个apex.即可。

修改为:

需要注意的是,不少的地方,需要添加apex.,大概有10处左右,修改完之后,错误即可解决。

问题2:probubuf报错

解决方法:

(1)pip3 uninsall probobuf

(2)pip3 install google

(3)pip3 install protobuf

3.5 训练效果测试

在上面训练好模型后,我们可以得到一个精度测试最优的网络模型:

① best_ckpt.pth.tar:在tools/YOLOX_outputs/yolox_voc_s文件夹中。

② 为了方便测试,再挑选一张人头测试图片,放到assets文件夹中。

在YOLOX文件夹的终端页面输入:

python3 tools/demo.py image -n yolox-s -c tools/YOLOX_outputs/yolox_voc_s/best_ckpt.pth.tar --path assets/head.jpg --conf 0.3 --nms 0.5 --tsize 640 --save_result --device [gpu]

在YOLOX_outputs/yolox_s/vis_res,根据时间新建的文件夹下,可以看到检测出的效果图片。

注意:如最后的类别都显示person,将coco_classes.py中的类别,也修改为“head”。

4 相关推荐:更多数据集下载

除了上面人头的数据集,大白还汇总收集了数百个不同类别的数据集。

并将数据集,按照不同的种类,分门别类,大家也可以对应挑选下载尝试。

0 人点赞