目录
Lidar AI Solution环境配置
前言
开源项目 Lidar AI Solution 的环境配置,记录自己环境配置过程,仅供自己参考,只进行最最最基本的运行,不涉及任何原理分析(主要是不会😂)
博主环境如下:
系统:Ubuntu20.04
显卡:RTX3060
显卡驱动:510.108.03
CUDA:11.6
cuDNN:8.4.0
TensorRT:8.4.1
整个环境配置的重点和难点在于整个项目的完整拉取
以下内容均 Copy 自 Lidar AI Solutin 的 README 文档,请大家熟读熟读熟读文档
1. Lidar AI Solution
Lidar AI Solution 项目为自动驾驶 3D-Lidar 提供了一个高性能的解决方案🚀🚀🚀,在加速 sparse convolution/CenterPoint/BEVFusion/OSD/Conversion 方面做得非常好
图1-1 title
1.1 Pipeline overview
图1-2 pipeline.png
1.2 GetStart
sudoapt-getinstall git-lfs
git clone --recursive https://github.com/NVIDIA-AI-IOT/Lidar_AI_Solution
cd Lidar_AI_Solution
一定一定一定要按照上述方法完整拉取整个项目(PS:完整项目在 Linux 下大概有 365M 的大小),不要去直接点击 Code ==> DownZIP 下载,也不要直接 git clone 下载,因为该项目依赖于其他项目,因此加上 --recursive 指令是为了循环克隆子项目。
注意:项目的完整拉取非常非常非常重要,后续的问题基本上都是因为没有完整的拉取整个项目所导致的
接下来我们就来聊聊如何完整的拉取整个 repo
首先如果在 Linux 下执行上述指令你会发现由于访问的是外网会非常缓慢,当然你如果有一个好的代理应该是没有问题的,博主之前下了一晚上才下完,但是由于网络经常断开,因此也不能确保整个项目是否完整。当然网上也提供了一些快速高效下载方法,博主也没去折腾了,感兴趣的可以看看 git clone --recursive快速高效下载方法
由于在 Linux 上没有找到合适的代理,也不愿去折腾高速下载方法,因此博主决定在 Windows 下去拉取整个 repo (主要是因为 Windows 下有代理🤣)
在此之前你需要在 Windows 下面安装 git 和 git lfs,比较简单,这里提供博主主要参考的文章:
- git 安装:Windows系统Git安装教程
- git 下载地址:https://git-scm.com/downloads
- git lfs 安装:Windows安装Git LFS
- git lfs 下载地址:https://github.com/git-lfs/git-lfs/releases/tag/v3.3.0
将 git 和 git lfs 安装完成后,就可以在 cmd 窗口正常执行 git 指令了,指令如下:(PS:一定要记得开代理)
sudoapt-getinstall git-lfs
git clone --recursive https://github.com/NVIDIA-AI-IOT/Lidar_AI_Solution
完整的项目拉取如下图所示:
图1-3 LiDAR-AI-Solution完整项目拉取
下载完成以后把整个项目拷贝到 Linux 进行后续操作就行,值得注意的是,从 Windows 拉取的代码放在 Linux 下会有一个小小的 bug,这个我们之后也会提到。
这里博主也提供下博主自己拉取的整个 repo,感兴趣的可以自行下载,下载链接 Baidu Drive (注意该代码下载于 2023/5/25 日,若有改动请参考最新)
至此,整个项目文件就准备好了,对于每个任务可以查看对应子文件夹下的 README 文档
2. CUDA-BEVFusion
Copy 自 CUDA-BEVFusion 的 README.md 文档
这个 repo 包含使用 CUDA & TensorRT 进行 BEVFusion 推理的源码和模型
图2-1 cuda-bevfusion推理
2.1 3D目标检测(nuScenes验证集)
对于所有模型,我们使用 BEVFusion-Base 配置 - 相机分辨率为 256x701
对于相机的 backbone 我们选择 SwinTiny 和 ResNet50
ModelFrameworkPrecisionmAPNDSFPSSwin-Tiny
BEVFusion-BasePytorchFP32+FP1668.5271.388.4(on RTX3090)ResNet50PytorchFP32+FP1667.9370.97-ResNet50TensorRTFP1667.8970.9818(on ORIN)ResNet50-PTQTensorRTFP16+INT867.6670.8125(on ORIN)注:我们在 ORIN 测试的时间是基于 nuScenes 6019 验证集样本的平均值 - 因此激光雷达点的数量是影响 FPS 的主要原因- 请参考 3DSparseConvolution 的 README 查看更多细节
2.2 演示
图2-2 cuda-bevfusion演示
2.3 模型和数据
- 为了快速体验,我们提供了 nuScenes 的样例数据,你可以从 Baidu Drive 下载,它包含如下内容: - 6 视角的相机图像- camera/lidar/ego 的转换矩阵- 用于 bevfusion-pytorch 数据的 example-data.pth,允许导出 onnx 不用依赖于完整的数据集
- 所有的模型都可以从 Baidu Drive 下载,它包含如下内容: - swin-tiny onnx models- resnet50 onnx 和对应的 pytorch models- resnet50 int8 onnx 和对应的 PTQ models
2.4 前置条件
为了构建 bevfusion,我们需要以依赖以下库:
- CUDA >= 11.0
- CUDNN >= 8.2
- TensorRT >= 8.5.0
- libprotobuf-dev == 3.6.1
- Compute Capability >= sm_80
- Python >= 3.6
上面性能表中的数据是我们在 Nvidia Orin 平台上,使用 TensorRT-8.6、cuda-11.4 以及 cudnn8.6 得到的
关于 CUDA、CUDNN、TensorRT 的安装可以参考 Ubuntu20.04部署YOLOv5 或者 Ubuntu20.04软件安装大全 这里不再赘述
你可能会发现博主的 TensorRT 版本似乎并不满足要求,是的,但博主没去安装高版本的 TensorRT,先将就用吧,后续推理也就提示了一个 API 的警告,并没有太大的错误。软件版本不要求完全一致,但是需要尽可能的对应
2.5 快速开始推理
注:在安装完
apt install git-lfs
以后请使用
git clone --recursive
来拉取整个项目,确保依赖的完整性
2.5.1 下载模型和数据到CUDA-BEVFusion文件夹
- 从 Baidu Drive 下载 model.zip
- 从 Baidu Drive 下载 nuScenes-example-data.zip
# 下载模型和数据到 CUDA-BEVFusion 文件夹cd CUDA-BEVFusion
# 解压模型和数据压缩文件unzip model.zip
unzip nuScenes-example-data.zip
# 下面是解压后整个文件夹的结构
CUDA-BEVFusion
|-- example-data
|-- 0-FRONT.jpg
|-- 1-FRONT_RIGHT.jpg
|-- ...
|-- camera_intrinsics.tensor
|-- ...
|-- example-data.pth
`-- points.tensor
|-- src
|-- qat
|-- model
|-- resnet50int8
||-- bevfusion_ptq.pth
||-- camera.backbone.onnx
||-- camera.vtransform.onnx
||-- default.yaml
||-- fuser.onnx
||-- head.bbox.onnx
|`-- lidar.backbone.xyz.onnx
|-- resnet50
`-- swint
|-- bevfusion
`-- tool
2.5.2 配置environment.sh
好,在正式配置之前我们需要解决一个小bug,也就是之前提到过的,当你在 Windows 下面拉取代码放到 Linux 上面时会导致执行 shell 脚本时报错,如下图所示:
图2-3 执行shell脚本出错
原因是 Windows 和 Linux 的 .sh 脚本文件格式不同,如果在脚本中有空行,脚本是在 Windows 下进行编辑之后传到 Linux 上去执行的话,就会出现这个问题
Windows 下的换行符是\r\n,而 Linux 下的换行符是 \n,没有识别/r,所以会导致上述错误,这个属于脚本编码的问题
解决办法是在对应脚本文件目录下,执行以下命令即可
vim enviroment.sh
:set ff=unix
:wq
上述通过 vim 编辑器打开脚本文件后设置格式为 Linux 格式并保存退出
参考自 Linux下执行Shell脚本出现$‘\r‘: command not found解决方法
因此,如果你的项目是从 Windows 复制到 Linux 下的话,可能存在上述问题,请将 tools 文件夹下的所有脚本文件均按照上述方法修改为 Linux 格式,请确保 tools 下所有 .sh 文件格式均修改完成
OK! 解决了上述小 bug 之后按照 README.md 就可以正常执行推理了
1. 安装 python 依赖库
sudo apt install libprotobuf-dev
pip install onnx
如果需要使用 Python 推理的话需要安装
这里有些问题需要和大家讨论下,我看 Issues 里面有人提问说推理遇到了一些问题,杜老师是说
sudo apt install libprotobuf-dev=3.6.1
但是我安装时说找不到对应版本,如下图所示:
图2-4 libprotobuf-dev版本找不到
我们可以使用 apt-cache show package 查找指定包的详情,参考自 【Linux】使用apt-get查询并安装指定版本的软件
sudoapt update
sudoapt-cache show package
图2-5 查找libprotobuf-dev
可以看到查找有多个版 3.6.1.3-2ubuntu5.2、3.6.1.3-2ubuntu5,博主随便安装了一个指令如下:
sudoaptinstall libprotobuf-dev=3.6.1.3-2ubuntu5.2
但是在后续执行 Python 推理的时候出现如下警告,最终能编译完成,但是执行的时候直接 Segmentation fault 崩溃了
图2-6 python推理时出错
从编译警告不难看出,protobuf编译的版本是 3.20.3 与要求的版本 3.6.1 并不匹配,博主之前有安装过 protobuf,而 CMakeLists.txt 中是通过 find_pakcage 去找 protobuf 的,找到了之前下载的 3.20.3 版本,还有一些其它的警告也是与 protobuf 相关的,因此可能需要自己手动指定下 protobuf 的头文件和库文件路径,让它正常匹配到所对应的 3.6.1 版本,而不是其它的版本。
因此,博主最终也没解决 Python 推理,等有时间再去折腾吧,C++ 的推理一切正常,下面我们继续。
2. 在 environments.sh 文件中修改 TensorRT/CUDA/CUDNN/BEVFusion 变量
# 修改为你当前使用的路径exportTensorRT_Lib=/path/to/TensorRT/lib
exportTensorRT_Inc=/path/to/TensorRT/include
exportTensorRT_Bin=/path/to/TensorRT/bin
exportCUDA_Lib=/path/to/cuda/lib64
exportCUDA_Inc=/path/to/cuda/include
exportCUDA_Bin=/path/to/cuda/bin
exportCUDA_HOME=/path/to/cuda
exportCUDNN_Lib=/path/to/cudnn/lib
# resnet50/resnet50int8/swintexportDEBUG_MODEL=resnet50int8
# fp16/int8exportDEBUG_PRECISION=int8
exportDEBUG_DATA=example-data
exportUSE_Python=OFF
博主修改后如下所示:
exportTensorRT_Lib=/opt/TensorRT-8.4.1.5/lib
exportTensorRT_Inc=/opt/TensorRT-8.4.1.5/include
exportTensorRT_Bin=/opt/TensorRT-8.4.1.5/bin
exportCUDA_Lib=/usr/local/cuda-11.6/lib64
exportCUDA_Inc=/usr/local/cuda-11.6/include
exportCUDA_Bin=/usr/local/cuda-11.6/bin
exportCUDA_HOME=/usr/local/cuda-11.6/
exportCUDNN_Lib=/usr/local/cuda-11.6/lib64
# resnet50/resnet50int8/swintexportDEBUG_MODEL=resnet50int8
# fp16/int8exportDEBUG_PRECISION=int8
exportDEBUG_DATA=example-data
exportUSE_Python=OFF
3.在终端上执行 enviroment.sh 文件
bash tool/enviroment.sh
博主执行完之后如下图所示:
图2-7 执行enviroment.sh文件
2.5.3 编译运行
1.利用 tensorRT 构建模型
bash tool/build_trt_engine.sh
博主执行完之后如下图所示:
图2-8 执行build_trt_engine.sh文件
2.编译并运行程序
bash tool/run.sh
博主执行完之后如下图所示:
图2-9-1 执行run.sh文件
图2-9-2 执行run文件
图2-9-3 执行run文件
图2-9-4 执行run文件
build/cuda-bevfusion.jpg 如下图所示:
图2-10 build/cuda-bevfusion.jpg
至此,CUDA-BEVFusion 的环境配置到这里就结束了!!!
后续的 onnx 和 PTQ 模型导出的细节、Python推理、进一步的性能提升相关内容需要大家自行去了解了
2.6 可能遇到的问题
2.6.1 问题1:/usr/bin/ld:cannot find -lspconv
分析:没有找到稀疏卷积的库文件,其库文件位于 libraries/3DSparseConvolution/libspconv 中,如果你没有完整拉取整个项目会发现该文件夹下的 lib 文件为空,导致无法找到库文件
解决办法:完整拉取整个项目
图2-11 问题1
2.6.2 问题2:/libspconv.so:file format not recognized
分析:这个问题在 Issues 17 有人遇到,博主遇到这个问题是因为在问题 1 中的 libspconv.so 找不到时利用手动添加的方式,手动下载库文件导致的
解决办法:完整拉取整个项目
图2-12 问题2
3. CUDA-CenterPoint
Copy 自 CUDA-CenterPoint 的 README.md 文档
这个 repo 包含使用 CUDA & TensorRT 进行 CenterPoint 推理的源码和模型
整个推理分为以下几个阶段:
- Voxelization with CUDA kernel
- 3D backbone with NV spconv-scn
- RPN & CenterHead with TensorRT
- Decode & NMS with CUDA kernel
3.1 模型和数据
这个 demo 使用 nuScenes Dataset 中的激光雷达数据,onnx 模型可以通过给定的脚本从下面给出的 checkpoint 中导出
DatasetCheckpointConfignuScenesepoch_20.pthnusc_centerpoint_voxelnet_0075voxel_fix_bn_z
3.2 前置条件
为了构建 centerpoint 推理需要 CUDA、TesorRT、libspconv 库,注意 libspconv 在 Tesla 平台只支持 sm_80 & sm_86,在嵌入式平台只支持 sm_87
3.3 环境
Tesla 平台
- Ubuntu20.04 x86_64 with Nvidia Tesla A30
- CUDA 11.4 + cuDNN 8.4.1 + TensorRT 8.4.12.5
嵌入式平台
- Nvidia Drive Orin 6.0.3.0
- CUDA 11.4 + cuDNN 8.3.3 + TensorRT 8.4.10.4
3.4 编译运行
在编译运行之前还需要做几件事情
首先,如果你的项目是从 Windows 下面复制到 Linux 下面的,请按照之前 CUDA-BEVFusion 所讲,将 tool 文件夹下的所有 .sh 脚本文件格式均修改为 Linux 格式,具体方法请参照 2.5.2 小节,这里不再赘述
然后,你需要修改 CMakeLists.txt 中的内容,具体修改如下:
# 30行 修改tensorRT路径
set(TENSORRT_ROOT /opt/TensorRT-8.4.1.5)
# 31行 修改CUDA路径
set(CUDA_TOOLKIT_ROOT_DIR /usr/local/cuda-11.6)
最后,在 data 文件夹下创建一个 prediction 文件夹用于保存预测结果信息
在测试数据上运行检测过程,指令如下:
cd CUDA-CenterPoint
bash tool/build.trt.sh
mkdir -p build &&cd build
cmake ..&&make -j
./centerpoint ../data/test/ --verbose
图3-1 CUDA-CenterPoint模型构建过程
图3-2 CUDA-CenterPoint编译过程
图3-3 CUDA-CenterPoint运行过程
至此,CUDA-CenterPoint 的环境配置到这里就结束了!!!
后续的可视化推理结果以及推理结果评估博主没有尝试,感兴趣的可以自己看看
图3-4 CUDA-CenterPoint结果可视化
4. CUDA-PointPillars
Copy 自 CUDA-PointPillars 的 README.md 文档
这个 repo 包含使用 TensorRT 进行 pointpillars 推理的源码和模型,模型由 OpenPCDet 创建由 onnx_graphsurgeon 修改
整个推理分为 4 个阶段:
- Convert points cloud into 4-channle voxels
- Extend 4-channel voxels to 10-channel voxel features
- Run TensorRT engine to get 3D-detection raw data
- Parse bounding box, class type and direction
4.1 模型和数据
这个 demo 使用 KITTI 数据集中的激光雷达数据,onnx 文件可以通过 tool 文件夹下的脚本从预训练模型中导出
4.2 前置条件
为了构建 pointpillars 推理,需要 TensorRT、CUDA 以及在 TensorRT 中的 PillarScatter layer 插件
4.3 环境
- Nvidia Jetson Xavier/Orin + Jetpack 5.0
- CUDA 11.4 + cuDNN 8.3.2 + TensorRT 8.4.0
4.4 编译运行
由于我们拉取的 Lidar_AI_Solution 项目已经包含了 CUDA-PointPillars 因此不需要单独去拉取该 repo 了
在正式编译运行之前还需要修改下对应的 CMakeLists.txt 文件,修改内容如下:
# 61行 修改TensorRT头文件路径
set(TENSORRT_INCLUDE_DIRS /opt/TensorRT-8.4.1.5/include)
# 62行 修改TensorRT库文件路径
set(TENSORRT_LIBRARY_DIRS /opt/TensorRT-8.4.1.5/lib)
修改完成后执行如下指令完成编译:
mkdir build &&cd build
cmake ..&&make -j$(nproc)
./demo
${nproc}
会显示当前进程可用的CPU数量,博主的数量为12,上述指令等价于
cmake .. && make -j12
编译过程如下图所示:
图4-1 CUDA-PointPillars编译过程
图4-2 CUDA-PointPillars运行过程
至此,CUDA-PointPillars 的环境配置到这里就结束了!!!
结语
这篇博客主要介绍了 Lidar_AI_Solution 的环境配置,也就是将 README 文档重新 Copy 了一次,没有涉及到任何的原理分析,大家在环境配置过程中一定要熟读 README 文档,不要忘记安装对应的库和包,除此之外,可以到 Issues 里面多看看别人遇到的一些问题,可能你也遇到过。
该 repo 中涉及到了大量的知识,包括剪枝、量化、部署、BEV感知、Lidar点云、3D检测…,集大成者,感觉把前面所学的剪枝、量化、自动驾驶CV课程全都串起来了呀,如果大家对这个 repo 感兴趣的话可以自行研究。
最后如果大家觉得这个 repo 对你有帮助的话,不妨帮忙点个 ⭐️ 支持一波!!!
下载链接
- git 下载地址
- git lfs 下载地址
- Lidar AI Solution 完整项目下载地址
- CUDA-BEVFuison 数据下载
- CUDA-BEVFusion 模型下载
参考
- Lidar AI Solution
- git clone --recursive快速高效下载方法
- Windows系统Git安装教程
- Windows安装Git LFS
- Ubuntu20.04部署YOLOv5
- Ubuntu20.04软件安装大全
- Linux下执行Shell脚本出现$‘\r‘: command not found解决方法
- 【Linux】使用apt-get查询并安装指定版本的软件
版权归原作者 爱听歌的周童鞋 所有, 如有侵权,请联系我们删除。