文章目录


使用 YOLOX 进行物体检测(附数据集)

YOLOX: Exceeding YOLO Series in 2021

・代码:https://github.com/Megvii-BaseDetection/YOLOX

・论文:https://arxiv.org/abs/2107.08430

YOLOX 是旷视开源的高性能检测器。旷视的研究者将解耦头、数据增强、无锚点以及标签分类等目标检测领域的优秀进展与 YOLO 进行了巧妙的集成组合,提出了 YOLOX,不仅实现了超越 YOLOv3、YOLOv4 和 YOLOv5 的 AP,而且取得了极具竞争力的推理速度。如下图:

其中 YOLOX-L 版本以 68.9 FPS 的速度在 COCO 上实现了 50.0% AP,比 YOLOv5-L 高出 1.8% AP!还提供了支持 ONNX、TensorRT、NCNN 和 Openvino 的部署版本,本文将详细介绍如何使用 YOLOX 进行物体检测。

一、 配置环境

本机的环境:

1.1 下载源码

GitHub 地址:https://github.com/Megvii-BaseDetection/YOLOX,下载完成后放到 D 盘根目录,然后用 PyCharm 打开。

1.2 安装依赖包

点击 “Terminal”, 如下图,

然后执行下面的命令,安装所有的依赖包。

1.3 安装 yolox
图片

看到如下信息,则说明安装完成了

图片
1.4 安装 apex

APEX 是英伟达开源的,完美支持 PyTorch 框架,用于改变数据格式来减小模型显存占用的工具。其中最有价值的是 amp(Automatic Mixed Precision),将模型的大部分操作都用 Float16 数据类型测试,一些特别操作仍然使用 Float32。并且用户仅仅通过三行代码即可完美将自己的训练代码迁移到该模型。实验证明,使用 Float16 作为大部分操作的数据类型,并没有降低参数,在一些实验中,反而由于可以增大 Batch size,带来精度上的提升,以及训练速度上的提升。

安装步骤:

  1. 到官网下载 apex,地址:mirrors /nvidia/apex・CODE CHINA (csdn.net)[1]

  2. 下载完成后,解压后,在 Shell 里,进入到 apex-master 中。

  3. 执行安装命令

看到如下 log,则表明安装成功。

图片
1.5 安装 pycocotools
1.6 验证环境

下载预训练模型,本文选用的是 YOLOX-s,

下载地址:https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.pth。

下载完成后,将预训练模型放到工程的根目录,如下图:

图片

然后验证环境,执行:

参数说明

查看运行结果:

图片

看到上图说明环境没有问题了。

二、 制作数据集

数据集我们采用 VOC 数据集,原始数据集是 Labelme 标注的数据集。

下载地址:https://pan.baidu.com/s/1kj-diqEK2VNVqd2n4ROa5g (提取码 rrnz)

新建 labelme2voc.py 文件

运行上面的代码就可以得到 VOC2007 数据集。如下图所示:

图片

VOC 的目录如下,所以要新建 data/VOCdevkit 目录,然后将上面的结果复制进去

图片

到这里,数据集制作完成。

三、 修改数据配置文件
3.1 修改类别

文件路径:exps/example/yolox_voc/yolox_voc_s.py,本次使用的类别有 2 类,所以将 num_classes 修改为 2。

图片

打开 yolox/data/datasets/voc_classes.py 文件,修改为自己的类别名:

3.2 修改数据集目录

文件路径:exps/example/yolox_voc/yolox_voc_s.py,data_dir 修改为 “./data/VOCdevkit”,image_sets 删除 2012 的,最终结果如下:

图片

接着往下翻,修改 test 的路径,如下图:

打开 yolox/data/datasets/voc.py, 这里面有个错误。画框位置,将大括号的 “% s” 去掉,否则验证的时候一直报找不到文件的错误。

修改完成后,执行

重新编译 yolox。

四、 训练

推荐使用命令行的方式训练。

执行命令:

就可以开始训练了。如果不喜欢使用命令行的方式,想直接运行 train.py,那就需要就如 train.py 修改参数了。首先把 train.py 从 tools 里面复制一份到工程的根目录(建议这样做,否则需要修改的路径比较多,新手容易犯错误),如图:

图片

打开,修改里面的参数。需要修改的参数如下:

按照上面的参数配置就可以运行了,如下图:

如果训练了一段时间,再想接着以前的模型再训练,应该如何做呢?修改 train.py 的参数即可,需要修改的参数如下:

命令行:

再次训练,你发现 epoch 不是从 0 开始了。

五、 测试

修改 yolox/data/datasets/_init_.py,导入 “VOC_CLASSES”,如下图:

修改 tools/demo.py 中代码,将 “COCO_CLASSES”,改为 “VOC_CLASSES”。

将 “295” 行的 Predictor 类初始化传入的 “COCO_CLASSES” 改为 “VOC_CLASSES”,如下图:

5.1 单张图片预测

使用训练好的模型进行测试。测试调用 tools/demo.py, 先用命令行的方式演示:

运行结果:

图片

如果不想使用命令行,将 demo.py 复制一份放到工程的根目录,然后修改里面的参数。

然后直接运行 demo.py, 运行结果如下图:

图片

5.2 批量预测

批量预测很简单,将 path 参数由文件路径改为图片的文件夹路径就可以。例:

这样就可以预测 assets 文件夹下面所有的图片了。

六、 保存测试结果

demo.py 只有将结果画到图片上,没有保存结果,所以要增加这部分的功能。

在 demo.py 的 178 行增加获取结果,并返回上层方法,如下图:

然后在 182,修改 image_demo 函数,增加获取结果,保存结果的逻辑,具体代码如下:

然后运行 demo.py, 就可以将结果保存到 txt 中。

图片
七、遇到的错误

1、RuntimeError: DataLoader worker (pid(s) 9368, 12520, 6392, 7384) exited unexpectedly

打开 yolox/exp/yolox_base.py, 将 data_num_workers 设置为 0,如下图:

图片

将 num_workers 设置为 0,程序报错,并提示设置环境变量 KMP_DUPLICATE_LIB_OK=TRUE 那你可以在设置环境变量 KMP_DUPLICATE_LIB_OK=TRUE 或者使用临时环境变量:(在代码开始处添加这行代码)

图片

2、RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR

执行命令

报的错误,把 -“-o” 去掉后就正常了

× 请我吃糖~
打赏二维码