前言

前两篇博文分别讨论了YOLOv5检测算法的两种加速思路:采用多进程或批量检测,不过效果均收效甚微。本问将讨论使用TensorRT加速以及半精度推理/模型量化等优化策略对检测加速的实际影响。

测试环境

测试图片分辨率:13400x9528 GPU:RTX4090 Cuda:11.7 YOLOv5版本:最新版(v7.0+) 检测策略:将整张图片直接设置img_size为(1280x1280)进行检测(忽略精度,只注重速度)

环境搭建

关于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