C++ TensorRT实现Mask_RCNN 语义分割

  • Mask_RCNN:用于object detection 和 instance segmentation,基于RGB图检测实例并生成其bounding box和二维mask。
  • 实验环境:ubuntu18.04 + cuda10.0 + cudnn7.4.1

1. python实现

  • 源码matterport/Mask_RCNN
  • 环境配置
  • 测试结果:基于官网给出的在COCO数据集上预训练的权重mask_rcnn_coco.h5模型,实现实例级语义分割,预测的语义类别有80类。针对每张图像,输出检测到的实例语义类别、boundingbox和mask。用室内场景数据测试的实例分割结果如下。

2. C++实现

  • Mask_RCNN + OpenCV:C++使用时需要模型部署,h5模型是由keras训练保存的,转为tensorflow的pb模型可被OpenCV4.0调用。OpenCV4.0已经支持mask rcnn的调用,只需要.pb文件和.pbtxt文件即可进行推理。(注:编译tensorflow C++ API也是可以,然后利用api调用模型,但是会比较麻烦。而且tensorflow的c++接口很少,pytorch对c++的支持更好。)
  • 参考python训练mask rcnn模型&&C++调用训练好的模型–基于opencv4.0keras训练的h5模型转换为pb模型
  • 测试:使用c++进行单帧实例分割耗时:一张640*480图像约200~300ms

3. TensorRT加速

  • TensorRT简介:Nvidia推出的高性能深度学习引擎。TensorRT可以自动对网络模型进行网络模型的合并、参数的量化,目前支持caffe、uff和onnx三种格式的网络模型。因此可以使用TensorRT对MaskRCNN进行神经元合并和量化权重操作来进行加速。

  • 模型部署:对于使用神经网络训好的模型,首先需根据tensorrt教程,把maskrcnn h5格式的模型转成tensorrt的 uff格式,然后读取uff后根据平台做序列化,把序列化后的对象以二进制格式 .bin 保存下来,供C++代码使用,而且不同的平台需根据TensorRT和Tensorflow版本进行对应的转换,PC和AGX上的模型不同通用。

  • 环境配置:ubuntu18.04 + TensorRT6.0.1.5 + CUDA10.0 + cudann7.4.1

  • 问题1:No rule to make target ‘nvinfer_LIB_PATH-NOTFOUND’
  • 问题2:nvcc fatal : redefinition of argument ‘std’
  • 问题3:用转换后的uff模型和sampuffmaskrcnn测试时,UffParser: Validator error: roi_align_mask_trt: Unsupported operation _PyramidROIAlign_TRT
    • solution:[github-issue159],把/build/out/libnvinfer_plugin.so.6.0.1添加到/usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.6.0.1
  • 测试:用室内场景数据测试的实例分割结果如下。将maskRcnn权重量化为int8时,精度降低了很多,速度与精度的权衡。将maskRcnn权重量化为int8,在AGX Xavier上测试,单帧640*480图像在AGX上实例分割耗时由200~300ms降为约70ms。
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值