随着旷视科技发布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 相关推荐:更多数据集下载
除了上面人头的数据集,大白还汇总收集了数百个不同类别的数据集。
并将数据集,按照不同的种类,分门别类,大家也可以对应挑选下载尝试。