1 准备工作

1.1 clone官方仓库

        以下工作建立在已经掌握了使用anaconda搭建环境的基础上!

        然后克隆下来yolox的官方仓库,如下:

git clone git@github.com:Megvii-BaseDetection/YOLOX.git

        如果无法直接clone,也不用慌,直接下载就行了,和克隆下来一样,只不过后期官方更新了的话,需要自己重新下载更新就是了!

1.2 搭建环境

cd YOLOX   
pip3 install -U pip && pip3 install -r requirements.txt
pip3 install -v -e .  # or  python3 setup.py develop

        依次执行上述三条指令;笔者在执行第三条指令的时候出错了,出现如下警告:

 Your compiler (g++ 4.8.5) may be ABI-incompatible with PyTorch!

然后尝试去升级我的g++版本,不过因为是在组里的服务器上,也没这个权限,检索了一圈,才知道还可以用conda在新建环境中直接安装一个更高版本的;最终安装成功使用的指令如下:

conda install -c omgarcia gcc-6

参考博客链接如下:

https://www.zhihu.com/question/56272908

https://blog.csdn.net/qq_35752161/article/details/111345572?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control

https://blog.csdn.net/weixin_43913042/article/details/118214566?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

关于pip install指令如果又不了解的,可以参考如下链接:

https://pip.pypa.io/en/stable/cli/pip_install/#local-project-installs

完成以上工作后,环境配置已经完成,下面就可以直接先用官方给的权重文件,先进行demo的测试了!

2 Demo测试

测试前,需要去官方仓库下载相应模型的权重文件,然后上传到自己的Yolox文件夹下,建议建立一个weights文件夹用来存放用到的模型权重文件。

测试指令如下:

图片测试
python tools/demo.py image -n yolox-s -c weights/yolox_s.pth --path assets/dog.jpg --conf 0.25 --nms 0.45 --tsize 640 --save_result --device gpu

视频测试

python tools/demo.py video -n yolox-l -c weights/yolox_l.pth --path assets/003.mp4 --conf 0.3 --nms 0.65 --tsize 640 --save_result --device gpu

3 训练

3.1 开始训练

训练基于MS COCO数据集进行,采用yolox_s模型进行训练;在确定准备好相应的数据集文件后,执行以下指令:

python tools/train.py -f exps/default/yolox_s.py -d 2 -b 64 --fp16 [-o --cache]

训练用了两块V100,所以-d = 2,batchsize设置的可以稍微大写,原本按照官方推荐用的16,速度较慢,GPU的利用率也很低!

中括号里面的两个可选参数,我一开始训练的时候用了,发现不仅没加快我的训练,反而导致整个组里的服务器都变得极卡,所以赶紧给听了;原因也正如官方所解释的,它会将更多的训练用图片加载到cache中,用来加速训练过程;但是在公用服务器上,还是建议大家不要这么干!

3.2 训练结果

Average forward time: 2.52 ms, Average NMS time: 13.72 ms, Average inference time: 16.24 ms
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.398
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.583
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.433
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.237
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.443
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.529
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.319
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.514
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.545
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.347
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.600
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.697

最终的输出结果如上,可见yolox_s的前向时间似乎变长了,这主要是因为我在前向相关的脚本中加了很多的print指令,用来打印一些相关信息,关于速度测试后面会详细将;

可以看到,最终的mAP值是达到官方所说的效果了,特别是在输出文件夹中,还替我们保存了最佳测试结果时的权重文件,所以后面前向推理用的都将是该权重文件,其mAP值达到了40.3%。

3.3 训练可视化

在另一个终端窗口输入如下指令:

tensorboard --logdir=YOLOX_outputs/ --bind_all

呈现的效果如下:

 可以看到,设置的在最后15个epoch关掉数据增强,训练效果非常明显!

前面的一段训练曲线这么乱,可能是因为我前面训练了一段时间,被我中断之后,我又重新执行了训练,所以导致绘制出来的曲线有些乱!

4 效果评估

进行一次速度测试即可,指令如下:

python tools/eval.py -n  yolox-s -c YOLOX_o;utputs/yolox_s/best_ckpt.pth -b 1 -d 1 --conf 0.001 --fp16 --fuse
Average forward time: 7.69 ms, Average NMS time: 1.30 ms, Average inference time: 8.99 ms
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.403
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.590
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.439
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.236
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.448
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.535
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.324
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.532
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.574
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.389
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.633
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.720

测试结果如上,可见其前向的时间确实达到了官方所说的效果!

        关于yolox的代码解析,因为目前只看了整个前向过程的代码,等后面全部看完再选取部分觉得较有意义的放到博客上来!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐