前言

前两篇博文分别讨论了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.pt2.279
yolov5n.engine2.199
yolov5s.pt2.368
yolov5s.engine2.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.engine1.586
yolov5s.engine1.607

总结

本实验结果汇总如下表:

模型名称单帧检测时间单秒检测帧数
yolov5n.pt1.1400.878
yolov5n.engine1.1000.910
yolov5n.engine(量化后)0.7931.261
yolov5s.pt1.1840.845
yolov5s.engine1.1160.896
yolov5s.engine(量化后)0.8041.245

To do

在实验过程中发现了一个奇怪的现象,按理论来说,模型量化之后,模型体积估计会小不少,然而使用本文方法导出的TensorRT模型体积反而更大,有相关博文指出,使用本方法导出的TensorRT模型和使用Cmake编译形成的TensorRT模型存在效果差异,之后有时间会进一步进行探索(先挖个坑)。

参考资料

常规方法转TensorrRT:https://github.com/wang-xinyu/tensorrtx/tree/master/yolov5