Article / 文章中心

YOLOX目标检测之入门实战-win10+cpu运行YOLOX

发布时间:2022-10-20 点击数:427

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

  7f654c17ec08012d44a572019fdd2bab.png

 前言:  不少开发者对 YOLOX 很感兴趣 , 希望在自己的笔记本安装测试,哪怕速度慢一些,  但笔记本一般都没有配置带CUDA 核心的GPU 

  YOLOX 在CPU 环境中碰到的问题及解决方法 , 总结了一下,  大部分是缺少判断GPU 导致的cuda 类的错误 !

一、 配置基础环境

本机的环境:

操作系统 Win10
Python版本 3.8.10
Pytorch版本 1.12+cpu
Cuda版本 None

 

1.1 下载源码

 

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

 

然后执行下面的命令,

 

1)  安装所有的依赖包。

 

pip install -r requirements.txt

 

 

 

错误提示 :   error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsof
t C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/

 

 

选择合适的版本,  (注意, 如果是 windows7 ,则需要找到对应的老版本,  如 :vs_BuildTools_2019)  

 

 

完成安装后,再执行 

 

pip install -r requirements.txt

 

 

 

2) 执行安装 yolox setp  命令

   python setup.py install

 

二、 验证预测环境

下载预训练模型,本文选用的是YOLOX-s,下载地址:https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.pth。

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

然后验证环境,执行:

python tools/demo.py image -f exps/default/yolox_s.py -c ./yolox_s.pth --path assets/dog.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result --device cpu

 

打开提示中的图片文件

/YOLOX_outputs\yolox_s\vis_res\2022_10_20_17_36_48\dog.jpg

 

看到上图说明预测的环境没有问题了。(训练的环境更复杂)

三、 配置训练所需环境

2.1  准备数据 

         下载地址 :http://www.newxtc.com/download.php?id=10

        将下载的 VOCdevkit.zip  解压缩到  yolox根目录\yolox\data\

 

2.2 修改类别

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

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

3)  修改一个BUG: 打开yolox/data/datasets/voc.py文件,找到  _do_python_eval 方法

  修改前 :  annopath = os.path.join(rootpath, "Annotations", "{:s}.xml")

  问题导致,目录被截断,  始终输出   {:s}.xml

  修改后: annopath = os.path.join(rootpath, "Annotations") + "\{:s}.xml"

4)

2.3 修改数据集目录

文件路径:exps/example/yolox_voc/yolox_voc_s.py,

找到  wait_for_the_master 方法

data_dir修改为“D:\YOLOX-main\yolox\data\VOCdevkit”,

image_sets删除2012的,最终结果如下:

接着往下翻,找到  get_eval_loader ,如下图:

2.4 修改tools/train.py cpu 参数

执行训练脚本:

python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 1 -b 4 --fp16  -c yolox_s.pth

torch 报错

在tools/train.py中修改 1 个地方,

 

2.5 修改 yolox/core/train.py cpu 参数

打开 yolox/core/trainer.py 文件

1)找到  train_one_iter方法,

 

 

 

执行训练脚本:

python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 1 -b 4 --fp16  -c yolox_s.pth

数据预加载部分报错

 

2)找到  train_one_iter方法,根据显卡设备数判断是否加载预加载方法

 

 

 

3) 找到  after_iter  方法,  根据显卡设备数判断是否执行 random resizing 方法 :

 

 

2.6 修改 voc_evaluator.py cpu 参数

打开YOLOX/evaluators/voc_evaluator.py 文件

1) 找到  evaluate 方法, 判断 是否为 GPU ,将 tensor_type = torch.cuda.FloatTensor 

     修改为  tensor_type = torch.FloatTensor

2) 同方法中, 往下翻页, 判断 是否为 GPU , 将statistics = torch.cuda.FloatTensor(xxx)

      修改为statistics = torch.FloatTensor(xxx)

四、 训练数据及验证结果

 

1  开始训练数据(CPU速度慢,2天左右)

执行训练脚本:

python tools/train.py -f exps/example/yolox_voc/yolox_voc_s.py -d 1 -b 4 --fp16  -c yolox_s.pth


CPU 版本根据机器配置不同速度不同,本例中跑一个 epoch 大概为 10分钟,  300个 epoch 为 50个小时

 

2  验证结果

执行 demo 脚本

 

python tools/demo_air.py image -f  exps/example/yolox_voc/yolox_voc_s.py -c ./yolox_air.pth --path assets/aircraft_107.jpg --conf 0.8 --nms 0.65 --tsize 640 --save_result


python tools/demo_air.py image -f  exps/example/yolox_voc/yolox_voc_s.py -c ./yolox_air.pth --path assets/oiltank_406.jpg --conf 0.8 --nms 0.65 --tsize 640 --save_result

 

查看输出结果 YOLOX_outputs\yolox_voc_s\vis_res\xxxx_xx_xx\*.jpg