CenterPoint-TensorRT部署

CenterPoint-TensorRT部署


1 构建trt

  1. 下载代码与环境

+运行 tool/build.trt.sh先修改相关参数,修改详见本节第3.内容

  1. 运行tool/build.trt.sh
  • 这一步就是onnxtensorRT支持engine文件
# 1 进入CUDA-CenterPoint目录
cd CUDA-CenterPoint

# 2 运行脚本
bash tool/build.trt.sh

# 3 终端显示如下,转换的时候时间比较长,如果1-2秒就结束了,代表没转换成功, 可以先看下面的修改
# 转换后会在model中生成3个新文件。
Building the model: model/rpn_centerhead_sim.plan.8531, this will take 2 minutes. Wait a moment 🤗🤗🤗~.
  1. 构建trt需要修改tool/build.trt.sh文件,本人的如下:

主要指定正确的cuda tensorRT cudnn trtexec的路径

# TensorRT-8.5.3.1路径
export PATH=/home/lin/software/TensorRT-8.5.3.1/bin:$PATH
export LD_LIBRARY_PATH=/home/lin/software/TensorRT-8.5.3.1/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=/home/lin/software/TensorRT-8.5.3.1/lib:$LIBRARY_PATH

# cuda路径, 按照自己的修改
export CUDA_Lib=/usr/local/cuda/lib64
export CUDA_Inc=/usr/local/cuda/include
export CUDA_Bin=/usr/local/cuda/bin
export CUDA_HOME=/usr/local/cuda

#cudnn路径, 安装cuda已经将cudnn的lib64放入了cuda/lib64里面
export CUDNN_Lib=/usr/local/cuda/lib64

# if 语句中运行trtexec可执行文件改成绝对路径, 
# 这句trtexec运行作用是在使用TensorRT-8.5.3.1/bin/下trtexec程序生成engine文件
# 需要在CUDA-CenterPoint目录运行tool/build.trt.sh, 不能在tool运行build.trt.sh
# 我修改的绝对路径如下:
/home/lin/software/TensorRT-8.5.3.1/bin/trtexec
  1. 运行后tool/build.trt.sh会在./model路径下,总共5个文件,

原本有centerpoint.scn.onnxrpn_centerhead_sim.onnx两个onnx文件

生成一个rpn_centerhead_sim.plan2log文件,目录如下:

model
  ├── centerpoint.scn.onnx
  ├── rpn_centerhead_sim.8531.log
  ├── rpn_centerhead_sim.onnx
  ├── rpn_centerhead_sim.plan -> ...
  └── rpn_centerhead_sim.plan.8531

2 编译

cd CUDA-CenterPoint
mkdir -p build && cd build
cmake .. && make -j

3 运行

# 进入build
cd build

# 运行demo程序
./centerpoint ../data/test/ --verbose
  • 运行结果后终端会提示如下信息,即是代表成功。
<<<<<<<<<<<
load file: ../data/test/291e7331922541cea98122b607d24831.bin
find points num: 239911
[TIME] Voxelization:            0.12720 ms
valid_num: 85179
[TIME] 3D Backbone:             2.22150 ms
[TIME] RPN + Head:              1.49750 ms
[TIME] Decode + NMS:            2.27770 ms
Detection NUM: 194
Saved prediction in: ../data/prediction/291e7331922541cea98122b607d24831.txt

4 可视化

一般在实际部署中是,是实时采集数据,做检测

因此需要修改源代码。一般移动机器人采用ros通讯,这里可视化基于ros进行修改

需要注意的几点:

  1. 将rosmsg格式的点云加载到内存上,用float指针指向这块内存,以便把点云数据加载gpu上使用。

  2. 需要注意的是检测模型输入点云的维度要与float指针的指的数据对应上,原始pcl的的点云的一个点是8位float,
    但是一般做检测时,用xyz三维数据或者xyzi四维数据,具体得看网络的输入需求。

  • CUDA-CenterPoint用的5维取xyzi+1可以将1置为0(有的点云ring和time通道数据),而CUDA-PointPillars取的xyzi四维。

  • 改ros的时候,CUDA-CenterPoint取的xyzi+0五维数据

  1. ros接口
    因为ros是一帧一帧的读取(回调函数),构建cuda需要初始化操作,
    如果要在回调函数使用已经初始化好的cuda变量, 可以使用如下3种方法实现:
  • 类实现。cuda变量和点云回调在同一个类里
  • 全局变量:定义一个全局的cuda相关类
  • 多线程+全局变量(点云队列):

定义2个线程和全局点云buf变量,一个线程只负责接受点云,入队;另一个线程负责点云检测,出队

  1. 结果显示
    在这里插入图片描述
  • 配合lio-slam实现定位与3D检测效果如下:
    在这里插入图片描述

5 报错

报错1:

Parse onnx failed.
Cuda failure: invalid configuration argument in file /home/lin/ros_code/pointpillars_ws/src/center_point_trt/src/preprocess.cpp:92 error status: 9
已放弃 (核心已转储)

Parse onnx failed. - 失败是是因为主函数实例化CenterPoint,构造函数要去找rpn_centerhead_sim.onnx文件路径,源码是学的固定路径

这里我们修改CenterPoint的构造函数,从构造函数传参, 构造函数scn_engine_读取是用传入的参数

报错2

Assert failed 💀. false in file src/spconv/engine.cu:1528, message: Unsupport operator [Conv]
  • 我换了一个工程就好,不知道怎么回事

  • 如果觉得本文章可以,一键三连一波,^_^
  • 部署有问题的小伙伴欢迎留言和加Q裙-472648720

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全网最菜的Slamer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值