仅需一步将人脸检测算法从30FPS提升到120FPS

news/2024/11/23 5:41:06/

仅需一步将人脸检测算法从30FPS提升到120FPS

    • 算法加速瓶颈
    • 可行性验证
    • 模型手术
    • 推理速度及实验结果
    • 下一步计划

在这里插入图片描述


算法加速瓶颈

  目前,各种卷积神经网络算法在Tensorrt的加速下,inference时间已大幅度的缩短,但后处理部分依然需要在CPU端进行,特别是用于剔除冗余检测框的NMS计算,后处理的耗时往往是inference部分的10倍甚至更多。为了加快算法的整体运算速度,尝试将后处理操作同样迁移至GPU处理。在加速算法的同时,这样做还有一个额外的好处,如果需要在设备上部署系统(算法只是其中一部分),CPU使用率及内存占用的降低可以使系统运行的更流畅。


可行性验证

  1. Nv的官方博客Creating an Object Detection Pipeline for GPUs介绍了如何使用C++完成RetinaNet的训练与加速,其中包含了DALI(GPU端图像预处理)、Automatic Mixed Precision on Tensor Cores(混合精度训练)、TensorRT加速与添加NMS_TRT插件等。

  2. 上述方式只支持c++, 官方论坛python添加nms插件中的回答,验证了使用python在ONNX模型添加NMS插件的可能性。

 得益于python的便捷性,选择技术路线2对ONNX模型进行修改。完成.trt引擎构建后,考虑到c++与python的运算速度差异,使用C++编写引擎部署代码。由于推理以及后处理操作已经被包含至trt引擎中,GPU的计算结果即所需的算法输出,这使得引擎部署代码十分简单。
 TensorRT完美的Python、C++接口支持,使得Python修改模型,C++部署引擎这一检测流程最大化的提升了效率,充分利用设备资源。


模型手术

  感谢ShiqiYu大佬开源的人脸检测代码并提供源码及ONNX文件。再此基础上,本实验使用onnx graphsurgeon对原始onnx模型进行修改并添加NMS插件以使得inference以及后处理部分在GPU端被计算。完整的技术路线可以被分为模型手术、引擎构建、算法部署三个部分。

  1. 模型手术

      确定ShiqiYu大佬所提供模型的opset版本后,依据后处理代码并查看onnx支持的op对ONNX模型的计算图进行修改,即使用onnx graphsurgeon添加相应的节点以及NMS插件等。完成模型手术后,使用Netron可视化网络结构,关键结构图如下图所示:

构建的ONNX模型结构

  1. 引擎构建
    构建的.trt引擎视部署设备的不同而不同,不能将不同设备的引擎文件迁移至其他设备使用。本实验所使用的Jetson NX已经默认安装了TensorRT,可以使用trtexec完成引擎的构建,有几个经常使用的参数:

    1. --explicitBatch 在构建引擎时使用明确的batchsize
    2. --workspace   以兆字节为单位设置工作区大小,根据模型大小及设备资源设置
    3. --fp16     使用FP16精度以提升推理速度
    4. --best     自动选择性能最好的精度(FP32,FP16,int8)以提升性能,有坑需谨慎
    5. --verbose    引擎转换过程中输出详细的log,不知道报错原因时特别好用!
    6. --batch=    如果硬件支持的话,batchsize为32的倍数对于FP16和INT8推断往往具有最佳性能,因为可以使用Tensor Core。
  2. 算法部署

    该步骤需要注意的是:由于使用了trt插件,读取引擎前需要提前导入,避免找不到插件而报错。

    trt.init_libnvinfer_plugins(TRT_LOGGER, '')
    

推理速度及实验结果

实验1:Jetson NX启用15W-6Core模式并开启 jetson_clocks

modelFPH(0.75*W)Winference_timetotal_time备注描述
YuFaceDetectNet_3203224032015.1ms30.0msopencv_dnnGPU使用率低
YuFaceDetectNet_3203224032015.0ms29.5msopencv_dnnonnx-simplifier精简网络结构
YuFaceDetectNet_320-trt322403203.4ms14.6mspython仅推理部分使用trt加速

  注:-trt 表示 onnx-slim2tensorrt


实验2:YuFaceDetectNet_320算法的推理及后处理(包含NMS)全部在GPU端进行。

平台FPH(0.75*W)Winference_timetotal_time
Jetson NXFP322403203.5ms8.2ms
Jetson NanoFP322403209.8ms

  注:total_time包含了图像预处理及绘制detections到原图的过程

下一步计划

YOLOv3,YOLOv5的模型转换在路上,未来会逐步分享模型加速实验


http://www.ppmy.cn/news/785370.html

相关文章

JS计算帧率

使用JS获取画布帧率 首先获取每一帧响应时间(ms): window.frameList []; let lastFrame 0 function getFrame() {const now performance.now();const frame now - lastFrame;if (lastFrame ! 0) {console.log("frame", frame…

在python中调整非定帧摄像头的帧率

关于在python中调整非定帧摄像头的帧率问题 买了一个可调节帧率的工业摄像头,摄像头在商家给定的软件中可自由改变帧率进行视频保存,但是在python中拍摄视频时却默认以最低帧率拍摄,使用OpenCV中自带的设置帧率的方法将摄像头调整为60fps后&…

【图像处理】如何获取30FPS的1080P视频流

使用Logitech摄像头进行视频数据采集,发现在OpenCV中只能获取到5FPS的1080P数据。如果设置为30FPS,所获取到的分辨率会自动修改为640*480。原因在于摄像头默认的编码方式。 1.获取当前设备 $ lsusb $ ls /dev/video* 下载luvcview,安装 s…

ISP 图像信号处理器数字IP实现

ZynqMP-ISP Demo基于KV260(ARMFPGA)平台,设计实现了CIS(AR1335接在IAS1口)配置,MIPI接收,ISP处理,DP显示。3MP-RAW1030FPS。Demo软件基于Vitis裸机环境开发,实现简单的2A控制。Linux软件请见ZynqMP-ISP 图像信号处理器…

60帧/秒摄像头 视频帧数最佳选择!

随着网络的普及,作为电脑外设产品的摄像头也迅速进入千家万户。这一重大商机也给摄像头行业的发展带来一片繁荣景象。在这个进入门槛低、公模横行的行业,摄像头产品在外观设计、用户应用范围、新功能技术指标等方面做尽文章,就在摄像头高像素…

Android 计算视频的fps

监控 游戏 fps 调研 adb shell dumpsys gfxinfo 这种方式反回的数据太大,还监控不到游戏的pfs.,是必须是 Android M 版本以上才支持,而且需要拖动屏幕产生的数据才比较准确 dumpsys是一款运行在设备上的Android工具,将 gfxinfo命…

纯视觉30FPS!Focal-PETR:高效多目3D目标检测

点击下方卡片,关注“自动驾驶之心”公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心【3D目标检测】技术交流群 后台回复【FocalPETR】获取论文!! 1摘要 主要的多摄像机3D检测范式基于显式3D特征构建,这需要通过3…

Sensor setting 用的是30fps ,但最后输出是15fps,是怎么回事儿 ?

1、问题背景: 按项目需求调试 sc5239 这款 sensor,申请的 sensor setting 是30fps,但最后输出帧率却只有 15fps。实际项目调试过程中遇到帧率输出不满帧的情况很多,本文主要总结下 Sensor 驱动部分导致的帧率输出异常的排查过程。…