CenterPoint-TensorRT部署
- 感谢大佬们的开源工作,
yyds
Lidar_AI_Solution - BEVFustion-python代码复现
- BEVFustion-TensorRT部署
- PointPillars-TensorRT部署
- BEV各算法环境部署实战汇总
- 如果觉得本文章可以,一键三连一波,
^_^
- 部署有问题的小伙伴欢迎留言和加Q裙-472648720
1 构建trt
- 下载代码与环境
- 代码下载和基础环境配置参考BEVFustion-TensorRT部署
+运行 tool/build.trt.sh
先修改相关参数,修改详见本节第3.
内容
- 运行
tool/build.trt.sh
- 这一步就是
onnx
转tensorRT
支持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 🤗🤗🤗~.
- 构建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
- 运行后
tool/build.trt.sh
会在./model
路径下,总共5个文件,
原本有centerpoint.scn.onnx
与rpn_centerhead_sim.onnx
两个onnx
文件
生成一个rpn_centerhead_sim.plan
和2
个log
文件,目录如下:
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
进行修改
需要注意的几点:
-
将rosmsg格式的点云加载到内存上,用float指针指向这块内存,以便把点云数据加载gpu上使用。
-
需要注意的是检测模型输入点云的维度要与float指针的指的数据对应上,原始pcl的的点云的一个点是8位float,
但是一般做检测时,用xyz三维数据或者xyzi四维数据,具体得看网络的输入需求。
-
CUDA-CenterPoint
用的5维取xyzi+1可以将1置为0(有的点云ring和time通道数据),而CUDA-PointPillars
取的xyzi四维。 -
改ros的时候,
CUDA-CenterPoint
取的xyzi+0
五维数据
- ros接口
因为ros是一帧一帧的读取(回调函数),构建cuda需要初始化操作,
如果要在回调函数使用已经初始化好的cuda变量, 可以使用如下3种方法实现:
- 类实现。cuda变量和点云回调在同一个类里
- 全局变量:定义一个全局的cuda相关类
- 多线程+全局变量(点云队列):
定义2个线程和全局点云buf变量,一个线程只负责接受点云,入队;另一个线程负责点云检测,出队
- 结果显示
- 配合
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