基于OpenPCDet框架进行Pointpillars算法环境搭建并基于TensorRT和ROS部署

文章目录

  • 参考链接
  • 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中给出的数据预处理脚本得到的代码无法用在这里,好像是数据格式之类的对不上,无奈再转一次

kitti3D检测数据集下载完成后整理为以下目录:

kitti
├── testing
│   ├── calib
│   ├── image_2
│   ├── velodyne
├── training
│   ├── calib
│   ├── image_2
│   ├── label_2
│   ├── velodyne

然后将testingtraining文件夹拷贝到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

作者给出的代码本身有一个toolspect文件夹,模型转换的相关脚本在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/600404.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常见错误以及如何纠正它们

团队和关键结果目标 (OKR) 之间的关系是深刻且至关重要的。总而言之,一切都应该是相互关联的。正如《团队的智慧》一书中所强调的: 在团队中,没有什么比每个成员对共同目标和一组相关绩效目标的承诺更重要的了,而团队对此负有共同…

经常发文章的你是否想过定时发布是咋实现的?

前言 可乐他们团队最近在做一个文章社区平台,由于人手不够,前后端都是由前端同学来写。后端使用 nest 来实现。 某一天周五下午,可乐正在快乐摸鱼,想到周末即将来临,十分开心。然而,产品突然找到了他,说道:可乐,我们要做一个文章定时发布功能。 现在我先为你解释一…

值得收藏!修复Windows 10/11中找不到输出或输入设备的五种方法

序言 这篇文章主要关注处理声音输出/输入设备未发现的问题。它提供了许多可行的方法,帮助了许多Windows用户。阅读以下内容以找到你的解决方案。 最近,我将Windows 10更新到21H2,发现我的音频无法工作。当我把鼠标放在任务栏上的声音图标(上面有一个十字图标)上时,它会…

市面上好用的AI工具有哪些?

市面上的AI工具数不胜数,选择合适自己的AI工具则需要考虑自己的需求,看是否能满足的使用需求。那么市面上又有哪些好用的AI工具呢? 泰迪智能科技拥有简单易用的大数据挖掘建模平台,能够让数据创造更大的价值。 功能板块&…

基于Springboot的校园新闻管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的校园新闻管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

Android 巧用putBinder方法传递大文件

使用Intent传递数据大家都知道,但是如果你使用Intent传递大于1Mb的数据时,就一定会报如下的错误: Caused by: android.os.TransactionTooLargeException: data parcel size 1049112 bytes 就是说你的传输数据太大了,当前的大小达…

Rust 解决循环引用

导航 循环引用一、现象二、解决 循环引用 循环引用出现的一个场景就是你指向我,我指向你,导致程序崩溃 解决方式可以通过弱指针,而Rust中的弱指针就是Weak 在Rc中,可以实现,对一个变量,持有多个不可变引…

FSC森林认证是什么?

FSC森林认证,又称木材认证,是一种运用市场机制来促进森林可持续经营,实现生态、社会和经济目标的工具。FSC森林认证包括森林经营认证(Forest Management, FM)和产销监管链认证(Chain of Custody, COC&#…

人大金仓V8R6迁移mysql8.0

人大金仓数据库迁移mysql mysql版本:mysql 8.0.22 人大金仓版本;KingbaseES V008R006C008B0014 on x64 打开数据迁移工具 等待执行完成后使用命令窗口中提示的地址在浏览器中打开: 登录。此处登录不用修改任何信息,点击登录即可 新建源数…

初识Node.js-认识node(安装Node.js环境配置)

目录 一、node介绍 1.概念和特点 2.核心功能 3.应用场景 二、Node初使用 1.安装node配置 windows上安Node.js 1.windows安装包(.msi) 2、Windows 二进制文件 (.exe)安装 Linux 上安装 Node.js 直接使用已编译好的包 Ubuntu 源码安装 Node.js …

⚡REST 和 SOAP 协议有什么区别?

原文链接:https://document360.com/blog/rest-vs-soap/ API 是应用程序编程接口(Application Programming Interface)的缩写。API 规定了不同的软件组件应如何以编程方式进行交互和通信。 最常见的 API 类型就是 Web API。网络应用&#xff…

自学错误合集--项目打包报错,运行报错持续更新中

java后端自学错误总结 一.项目打包报错2.项目打包之后运行报错 二.项目运行报错 一.项目打包报错 javac: �Ҳ����ļ�: E:\xx\xx\xx\docer-xx\src\main\java\xx\xx\xx\xx\xx\xx.java �&#xff…

OceanBase 如何实现多层面的资源隔离

OceanBase的资源隔离涵盖了多个方面,如物理机器间的隔离、不同租户之间的隔离、同一租户内的隔离,以及针对大型查询请求的隔离等。在实际应用OceanBase的过程中,我们经常会遇到这些操作场景或产生相关需求。这篇文章针对这些内容进行了简要的…

如果你作 为Java程序员曾经遭遇过NullPointerException,请举起手

如果你作 为Java程序员曾经遭遇过NullPointerException,请举起手 1.让Optional发光发热:去除代码中对null的检查, 采用防御式检查减少NullPointerException java8实战 书籍 第225页 免费下载链接: https://pan.quark.cn/s/5cf68…

书生·浦语大模型实战营之手把手带你评测 Llama 3 能力(OpenCompass 版)

书生浦语大模型实战营之手把手带你评测 Llama 3 能力(OpenCompass 版) 环境配置 conda create -n llama3 python3.10 pytorch torchvision pytorch-cuda -c nvidia -c pytorch -y conda activate llama3conda install git git-lfs install✨下载 Llama3…

Figma 高效技巧:设计系统中的图标嵌套

Figma 高效技巧:设计系统中的图标嵌套 在设计中,图标起着不可或缺的作用。一套便捷易用的图标嵌套方法可以有效提高设计效率。 分享一下我在图标嵌套上走过的弯路和经验教训。我的图标嵌套可以分三个阶段: 第一阶段:建立图标库 一…

使用Java编写的简单彩票中奖概率计算器

前言 在当今社会,彩票已经成为许多人追逐梦想和改变生活的一种方式。然而,中奖的概率却是一个让人犹豫和兴奋的话题。在这篇文章中,我们将探讨如何使用Java编程语言实现一个简单的彩票中奖概率计算器。通过这个计算器,我们可以根…

C++细节,可能存在的隐患,面试题03

文章目录 11. C编译过程12. const vs #define12.1. 全局const vs 局部const 13. C内存分区14. C变量作用域14.1. 常量 vs 全局变量 vs 静态变量 15. C类型转换16. 函数指针17. 悬空指针 vs 野指针18. 为什么使用空指针,建议使用nullptr而不是NULL? 11. C…

Linux初识

1.操作系统的那点事 (1)结论:操作系统是作软硬件管理的软件; (2)计算机是操作系统,设备驱动,硬件三个相互结合发挥作用的,操作系统是用来管理硬件的,常见的…

【Linux-I.MX6ULL裸机学习】中断向量表

代码来自于正点原子阿尔法Linux开发板光盘 比如在中断向量表中规定了:在某个地址0x80000A对应着某个中断服务函数,那么在产生这个中断时,就会从0x80000A这个地址去读取中断服务函数,并执行。 如果想改变这个地址,也就是…