文章目录
- 参考链接
- 1.创建虚拟环境
- 2.安装OpenDet
- 3.安装用于模型转换的库
- 4.数据集转换
- 5.模型训练
- 6.部署
- 安装tensorrt
- 模型转换
- 编译ROS工程
- 结果
- 报错梳理
- 【报错1】
- 【报错2】
- 【报错3】
- 【报错4】
- 【报错5】
参考链接
基于OpenDet进行训练,基于tensorrt-8.5进行部署并移植到ROS
参考链接:https://github.com/windzu/pointpillars
本篇指涉及环境搭建和自己测试的效果演示,部分修改的代码目前不方便放出,留待以后吧,而且只是一些小改动实现也比较简单。
训练和推理环境:
- 显卡:
3090Ti
- CUDA:电脑本地安装了
cuda11.6
但是在conda环境中配置的是cuda11.3
,倒是也没耽误训练和推理。 - tensorrt:
8.5版本
1.创建虚拟环境
conda create -n pointpillars_ros python=3.8
conda activate pointpillars_ros
conda install pytorch=1.11.0 torchvision torchaudio cudatoolkit=11.3 -c pytorch -y
2.安装OpenDet
git clone https://github.com/open-mmlab/OpenPCDet.git
cd OpenPCDet
pip install spconv-cu113
pip install av2
pip install kornia==0.5.8
pip install -r requirements.txt
pip install -v e .
3.安装用于模型转换的库
pip install pyyaml scikit-image onnx==1.14.0 onnx-simplifier==0.4.33
pip install onnx_graphsurgeon==0.3.27 --index-url https://pypi.ngc.nvidia.com
pip install onnxruntime==1.15.1
4.数据集转换
之前使用mmdetection3d
中给出的数据预处理脚本得到的代码无法用在这里,好像是数据格式之类的对不上,无奈再转一次
在kitti
3D检测数据集下载完成后整理为以下目录:
kitti
├── testing
│ ├── calib
│ ├── image_2
│ ├── velodyne
├── training
│ ├── calib
│ ├── image_2
│ ├── label_2
│ ├── velodyne
然后将testing
和training
文件夹拷贝到OpenPCDet/data/kitti/
目录下,此时该目录的结构为:
├── data
│ ├── kitti
│ │ ├── ImageSets
│ │ ├── testing
│ │ │ ├── calib
│ │ │ ├── image_2
│ │ │ ├── velodyne
│ │ ├── training
│ │ │ ├── calib
│ │ │ ├── image_2
│ │ │ ├── label_2
│ │ │ ├── velodyne
【注意】如果不想将数据集拷贝到代码目录下,需要修改OpenPCDet/tools/cfgs/dataset_configs/kitti_dataset.yaml
中的数据集根目录
运行以下程序进行数据集转换
python -m pcdet.datasets.kitti.kitti_dataset create_kitti_infos tools/cfgs/dataset_configs/kitti_dataset.yaml
结束后会生成相应的pkl文件:
5.模型训练
修改OpenPCDet/tools/cfgs/dataset_configs/kitti_dataset.yaml
目录下的数据集路径
根据自己的配置修改该文件中的BATCH_SIZE_PER_GPU
,NUM_EPOCHS
,LR
cd OpenPCDet/tools
python train.py --cfg_file ./cfgs/kitti_models/pointpillar.yaml
模型训练结束后权重文件自动保存到OpenPCDet/output/cfgs/kitti_models/pointpillar/default/ckpt
目录下,选择最后一次迭代得到的权重文件checkpoints_epoch_80.pth
6.部署
安装tensorrt
在官网下载和自己cuda版本对应的tensorrt,这里下载的8.5
https://developer.nvidia.com/nvidia-tensorrt-8x-download
然后解压
cd python
pip install tensorrt-8.5.1.7-cp38-none-linux_x86_64.whl
cd ../graphsurgeon
pip install graphsurgeon-0.4.6-py2.py3-none-any.whl
sudo cp -r lib/* /usr/lib
sudo cp -r include/* /usr/include
vim ~/.bashrc
# 添加以下内容
export LD_LIBRARY_PATH=/home/tjsiasun/3rdparty/TensorRT-8.5.1.7/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=/home/tjsiasun/3rdparty/TensorRT-8.5.1.7/lib:$LIBRARY_PATH
source ~/.bashrc
模型转换
在exporter.py
文件的开头处加上一句:
import _init_path
作者给出的代码本身有一个tools
和pect
文件夹,模型转换的相关脚本在tools
文件夹中,但是在跑脚本的时候会出现报错ImportError: cannot import name 'iou3d_nms_cuda' from 'pcdet.ops.iou3d_nms'
,因此直接将模型转换的文件移动到OpenPCDet/tools
下。
cd tools
cp exporter.py exporter_paramters.py simplifier_onnx.py ../OpenPCDet/tools
python exporter.py --ckpt ./pointpillar_7728.pth
编译ROS工程
如果是在conda虚拟环境下编译需要指定下python环境catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3
,但部署环境只需要有tensorrt和cuda环境就可以了,不需要在conda环境下。
作者的ROS节点中将3D检测框封成了autoware_msgs
消息格式,这里对作者的ROS节点进行了修改,在ROS节点中新增点云转BEV图像并在图像绘制检测框和发布检测结果等内容,另外就是为了适配开发需求至保留了前向的雷达数据。
为了方便测试,将3D检测数据集的velodyne点云数据转成了bag进行测试
【注意】在第一次运行程序时,播放数据集后需要稍微等待一会,会生成一个pointpillar.onnx.cache
,下次再运行程序时便可以快速进行推理了
catkin_make
source devel/setup.bash
roslaunch det3d det3d.launch
# 新开一个终端
rosbag play kitti-11.bag
结果
从结果上看,在3090 Ti
上跑的话,推理时间在10ms以内,6-7ms的样子,但是推理效果差强人意吧(见下方视频),还是存在一些漏检误检情况的,除了算法本身的问题之外,将雷达换成更高线束或者固态激光雷达应该会好一些,留待后期验证
[DEBUG] [1714358006.911716987]: find points num: 119369
[DEBUG] [1714358006.920608202]: TIME: pointpillar: 7.42605 ms.
[DEBUG] [1714358006.920830268]: Bndbox objs: 2
[DEBUG] [1714358006.952122977]: >>>>>>>>>>>
[DEBUG] [1714358007.009191113]: find points num: 118731
[DEBUG] [1714358007.017682531]: TIME: pointpillar: 6.77171 ms.
[DEBUG] [1714358007.017896892]: Bndbox objs: 2
[DEBUG] [1714358007.058071466]: >>>>>>>>>>>
[DEBUG] [1714358007.114336414]: find points num: 118054
[DEBUG] [1714358007.122160031]: TIME: pointpillar: 6.39386 ms.
[DEBUG] [1714358007.122356912]: Bndbox objs: 3
[DEBUG] [1714358007.156686901]: >>>>>>>>>>>
[DEBUG] [1714358007.221342189]: find points num: 118725
[DEBUG] [1714358007.228728811]: TIME: pointpillar: 6.05872 ms.
[DEBUG] [1714358007.228962855]: Bndbox objs: 2
[DEBUG] [1714358007.265633679]: >>>>>>>>>>>
[DEBUG] [1714358007.326172815]: find points num: 118807
[DEBUG] [1714358007.334805892]: TIME: pointpillar: 7.41907 ms.
[DEBUG] [1714358007.334993421]: Bndbox objs: 2
[DEBUG] [1714358007.370434275]: >>>>>>>>>>>
【测试视频】
detect3d_example
报错梳理
【报错1】
在数据集转换时报错,找不到相应图像数据
File "/workspace/aixiding/OpenPCDet/pcdet/datasets/kitti/kitti_dataset.py", line 69, in get_image_shape
assert img_file.exists()
AssertionError
在OpenPCDet/data/kitti/ImageSets
目录下给出了train.txt,test.txt等,因为在处理数据集时用了之前mmdetection3d的文件目录,所以出现了缺少文件的提示,用该目录下的ImageSets
替换掉对应的文件即可
【报错2】
ImportError: cannot import name 'iou3d_nms_cuda' from 'pcdet.ops.iou3d_nms' (/home/tjsiasun/demos/pointpillars/tools/../pcdet/ops/iou3d_nms/__init__.py)
【解决1】
首先将OpenPCDet/build
目录下的编译文件删除,使用python setup.py develop
进行安装
【报错3】
ModuleNotFoundError: No module named 'av2'
【解决2】
pip install av2
【报错4】
ModuleNotFoundError: No module named 'kornia'
要注意版本,目前0.5.8版本安全
pip install kornia==0.5.8
【报错5】
ModuleNotFoundError: No module named 'pcdet.models.backbones_3d.focal_sparse_conv'
在exporter.py
文件的开头处加上一句:
import _init_path