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

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

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

仅需一步将人脸检测算法从30FPS提升到120FPS_第1张图片


算法加速瓶颈

  目前,各种卷积神经网络算法在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可视化网络结构,关键结构图如下图所示:

仅需一步将人脸检测算法从30FPS提升到120FPS_第2张图片

  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

model FP H(0.75*W) W inference_time total_time 备注 描述
YuFaceDetectNet_320 32 240 320 15.1ms 30.0ms opencv_dnn GPU使用率低
YuFaceDetectNet_320 32 240 320 15.0ms 29.5ms opencv_dnn onnx-simplifier精简网络结构
YuFaceDetectNet_320-trt 32 240 320 3.4ms 14.6ms python 仅推理部分使用trt加速

  注:-trt 表示 onnx-slim2tensorrt


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

平台 FP H(0.75*W) W inference_time total_time
Jetson NX FP32 240 320 3.5ms 8.2ms
Jetson Nano FP32 240 320 9.8ms

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

下一步计划

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

你可能感兴趣的:(图像处理,人脸识别,深度学习,卷积神经网络)