YOLOX 是旷视开源的高性能检测器。旷视的研究者将解耦头、数据增强、无锚点以及标签分类等目标检测领域的优秀进展与 YOLO 进行了巧妙的集成组合,提出了 YOLOX,不仅实现了超越 YOLOv3、YOLOv4 和 YOLOv5 的 AP,而且取得了极具竞争力的推理速度。
前言: 不少开发者对 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": Microsoft C++ Build Tools - Visual Studio
选择合适的版本, (注意, 如果是 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
看到上图说明预测的环境没有问题了。(训练的环境更复杂)
下载地址 :http://www.newxtc.com/download.php?id=10
将下载的 VOCdevkit.zip 解压缩到 yolox根目录\yolox\data\
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)
文件路径: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 ,如下图:
执行训练脚本:
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 个地方,
打开 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 方法 :
打开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)
执行训练脚本:
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个小时
查看输出结果 YOLOX_outputs\yolox_voc_s\vis_res\xxxx_xx_xx\*.jpg