前言
前两篇博文分别讨论了YOLOv5检测算法的两种加速思路:采用多进程或批量检测,不过效果均收效甚微。本问将讨论使用TensorRT加速以及半精度推理/模型量化等优化策略对检测加速的实际影响。
测试环境
测试图片分辨率:13400×9528
GPU:RTX4090
Cuda:11.7
YOLOv5版本:最新版(v7.0+)
检测策略:将整张图片直接设置img_size为(1280×1280)进行检测(忽略精度,只注重速度)
环境搭建
关于TensorRT的安装在之前博文【目标检测】使用TensorRT加速YOLOv5中已经写过,这里不作赘述。
Tensort模型转换
运行export.py
即可将pt模型转换成Tensort(.engine)格式,主要需要改两个参数:
--imgsz : default=[1280, 1280]--include :engine--device : 0
实验结论
下面是选用两张13400x9528
进行检测,下表是检测结果:
模型名称 | 检测时间(s) |
---|---|
yolov5n.pt | 2.279 |
yolov5n.engine | 2.199 |
yolov5s.pt | 2.368 |
yolov5s.engine | 2.232 |
可以发现,检测速度是有一定提升的,不过似乎并不明显。
YOLOv5最新版本可以将检测前后三个步骤(预处理、推理、非极大化抑制)分别统计时间,yolov5s.pt和yolov5s.engine的时间如下:
yolov5s.pt
Speed: 1.0ms pre-process, 19.5ms inference, 1.5ms NMS per image at shape (1, 3, 1280, 1280)
yolov5s.engine
Speed: 270.5ms pre-process, 3.0ms inference, 2.0ms NMS per image at shape (1, 3, 1280, 1280)
可以看到,转成TensorRT之后,推理(inference)时间确实如某些资料所述,加速了五倍以上,但预处理时间却慢了不少。这背后的原因有待探究。
在转TensorRT模型过程中,有一些其它参数可供选择,比如,可以使用半精度推理和模型量化策略。
半精度推理即FP32->FP16,模型量化策略(int8)较复杂,具体原理可参考部署系列——神经网络INT8量化教程第一讲!
在模型转换过程中,设置参数--half
和--int8
为True,即可使用这两个策略,相应会增加转换的时间,yolov5n模型转换大概耗时312.8s。
使用该策略后,提升效果还是比较明显的,速度较之前又肉眼可见得变快了。
模型名称 | 检测时间(s) |
---|---|
yolov5n.engine | 1.586 |
yolov5s.engine | 1.607 |
总结
本实验结果汇总如下表:
模型名称 | 单帧检测时间 | 单秒检测帧数 |
---|---|---|
yolov5n.pt | 1.140 | 0.878 |
yolov5n.engine | 1.100 | 0.910 |
yolov5n.engine(量化后) | 0.793 | 1.261 |
yolov5s.pt | 1.184 | 0.845 |
yolov5s.engine | 1.116 | 0.896 |
yolov5s.engine(量化后) | 0.804 | 1.245 |
To do
在实验过程中发现了一个奇怪的现象,按理论来说,模型量化之后,模型体积估计会小不少,然而使用本文方法导出的TensorRT模型体积反而更大,有相关博文指出,使用本方法导出的TensorRT模型和使用Cmake编译形成的TensorRT模型存在效果差异,之后有时间会进一步进行探索(先挖个坑)。
参考资料
常规方法转TensorrRT:https://github.com/wang-xinyu/tensorrtx/tree/master/yolov5