PointPillars 工程复现

先赞后看,养成好习惯。有帮助的话,点波关注!我会坚持更新,感谢谢您的支持!

需求: 学习并复现PointPillars,解决部署时遇到的各类问题,原始参考工程为PointPillars_MultiHead_40FPS,注释版以及添加ROS节点版本在PointPillars_MultiHead_40FPS_ROS,供大家参考学习,欢迎留言!

参考工程
1. PointPillars_MultiHead_40FPS
2. OpenPCDet
3. onnx2trt
4. onnx2trt安装过程可能遇到的问题
5. Spconv


一. 准备工作

1. 下载工程

  • PointPillars_MultiHead_40FPS:点云目标检测网络主工程
  • OpenPCDet工具:用于将pth的模型,转换为onnx模型
  • onnx-tensorrt工具:用于onnx到trt模型的转换。
git clone https://github.com/hova88/PointPillars_MultiHead_40FPS.git --recursive
git clone https://github.com/hova88/OpenPCDet.git
git clone https://github.com/onnx/onnx-tensorrt.git

2. 模型转换:
注意
官方提供的两个onnx两个链接文件地址失效,故只能采用OpenPCDet工具进行onnx的生成。
1) cbgs_pp_multihead_pfe.onnx. 2) cbgs_pp_multihead_backbone.onnx
2.1)pth转化为onnx
在OpenPCDet工具工程下,执行下面的操作:

  • A. 下载*.pth权重文件拷贝到OpenPCDet工程下
  • B. 配置修改
    主要修改tools/onnx_utils/trans_pfe.py和tools/onnx_utils/trans_backbone_multihead.py相关路径,例如:
## 1. trans_pfe.py, 修改main文件中三处路径, 用### 标记
if __name__ == "__main__":from pcdet.config import cfg, cfg_from_yaml_filecfg_file = '/home/cui/workspace/deepLearning/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_pp_multihead.yaml' ###filename_mh = "/home/cui/workspace/deepLearning/OpenPCDet/pp_multihead_nds5823_updated.pth" ###cfg_from_yaml_file(cfg_file, cfg)model_cfg=cfg.MODELpfe , dummy_input  = build_pfe( filename_mh, cfg)pfe.eval().cuda()export_onnx_file = "/home/cui/workspace/deepLearning/OpenPCDet/cbgs_pp_multihead_pfe.onnx" ###torch.onnx.export(pfe,dummy_input,export_onnx_file,opset_version=12,verbose=True,do_constant_folding=True) # 输出名## 2. trans_backbone_multihead.py,同样修改三处路径,形式如下:
if __name__ == "__main__":from pcdet.config import cfg, cfg_from_yaml_filecfg_file = '/home/cui/workspace/deepLearning/OpenPCDet/tools/cfgs/nuscenes_models/cbgs_pp_multihead.yaml'filename_mh = "/home/cui/workspace/deepLearning/OpenPCDet/pp_multihead_nds5823_updated.pth"cfg_from_yaml_file(cfg_file, cfg)model_cfg=cfg.MODELpfe , dummy_input  = build_pfe( filename_mh, cfg)pfe.eval().cuda()export_onnx_file = "/home/cui/workspace/deepLearning/OpenPCDet/cbgs_pp_multihead_pfe.onnx"torch.onnx.export(pfe,dummy_input,export_onnx_file,opset_version=12,verbose=True,do_constant_folding=True) # 输出名
  • C. 安装SparseConv库
    根据系统中CUDA版本,执行不同命令,具体参考 Spconv,本文CUDA10.2如下:
pip install spconv-cu102  # 本人使用cuda10.2版本
  • D. 安装pcdet工具
conda create -n pointpillars python=3.6   #创建pointpillars
conda activate pointpillars    #进入pointpillars虚拟环境
pip install -r requirements.txt   # 安装依赖,在OpenPCDet工程下
python setup.py develop
  • E. 执行onnx生成脚本
cd tools/onnx_utils
python trans_pfe.py   # 在OpenPCDet目录下,生成cbgs_pp_multihead_pfe.onnx
python trans_backbone_multihead.py  # 在OpenPCDet目录下,生成cbgs_pp_multihead_backbone.onnx

注意执行脚本过程中有任何问题,参考第五部分问题答疑

2.2)onnx转化为trt模型
拷贝上一步中两个onnx文件到workspace/tools/onnx-tensorrt/build目录下,然后执行转换命令:

cd workspace/tools/onnx-tensorrt/build  # 进入onnx-tensorrt工具的目录
onnx2trt cbgs_pp_multihead_pfe.onnx -o cbgs_pp_multihead_pfe.trt -b 1 -d 16
onnx2trt cbgs_pp_multihead_backbone.onnx -o cbgs_pp_multihead_backbone.trt -b 1 -d 16

生成类似如下结果,即生成成功!

----------------------------------------------------------------
Input filename:   cbgs_pp_multihead_backbone.onnx
ONNX IR version:  0.0.7
Opset version:    10
Producer name:    pytorch
Producer version: 1.10
Domain:
Model version:    0
Doc string:
----------------------------------------------------------------
Parsing model
[2022-07-29 02:47:54 WARNING] [TRT]/home/cui/workspace/tools/onnx-tensorrt/onnx2trt_utils.cpp:220: Your ONNX model has been generated with INT64 weights, while TensorRT does not natively support INT64. Attempting to cast down to INT32.
Building TensorRT engine, FP16 available:1Max batch size:     1Max workspace size: 1024 MiB
Writing TensorRT engine to cbgs_pp_multihead_backbone.trt
All done

3. 模型路径修改
拷贝4个模型文件到PointPillars/model下。
如果有模型文件变动,则需要修改bootstrap.yaml文件中,*.onnx 和 *.trt 模型路径。

## bootstrap.yaml文件内容
BoxFeature: 7
ScoreThreshold: 0.1
NmsOverlapThreshold: 0.2
UseOnnx: false PfeOnnx: ../model/cbgs_pp_multihead_pfe.onnx
BackboneOnnx: ../model/cbgs_pp_multihead_backbone.onnxPfeTrt: ../model/cbgs_pp_multihead_pfe.trt
BackboneTrt: ../model/cbgs_pp_multihead_backbone.trtModelConfig: ../pointpillars/cfgs/cbgs_pp_multihead.yamlInputFile: ../test/testdata/nuscenes_10sweeps_points.txt
OutputFile: ../test/testdata/demo_boxes.txt

4. 下载测试点云数据
nuscenes_10sweeps_points.txt

二. 编译

cd PointPillars_MultiHead_40FPS
mkdir build && cd build
cmake .. && make -j8

注意编译过程中有任何问题,参考第五部分问题答疑

三. 运行测试

./test/test_model

注意运行过程中有任何问题,参考第五部分问题答疑

四. 可视化结果

python viewer.py

五. 问题排疑

Q1. CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
CMake 3.17 or higher is required. You are running version 3.16.6
A1:Cmakelists.txt中cmake版本过高,降低即可。

cmake_minimum_required(VERSION 3.16) # 本机是3.16版本

Q2. test中的Cmakelists报错,CMake Error at test/CMakeLists.txt:1 (add_subdirectory): The source directory
A2:工程中test/gtest是属于子工程 submodule,原因在于工程未下载完全。

git clone https://github.com/hova88/PointPillars_MultiHead_40FPS.git --recursive

Q3. NVINFER NOT FOUND
A3:添加TensorRT的地址

set(CMAKE_PREFIX_PATH "/usr/local/TensorRT/TensorRT-7.1.3.4/lib") # 设置前缀路径

Q4. #error – unsupported GNU version! gcc versions later than 6 are not supported!
A4: 查看CUDA环境,发现版本不对,切换到CUDA10.2的conda环境,重新编译执行即可。

Q5. fatal error: NvInfer.h: No such file or directory
A5: 未添加包含目录,根据本机TensorRT情况添加include路径

include_directories("/usr/local/TensorRT/TensorRT-7.1.3.4/include")

Q6. nuscenes_10sweeps_points.txt 样例数据下载地址不对
A6. 更换下载地址为: nuscenes_10sweeps_points.txt 新下载地址

Q7. 使用可视化脚本python viewer.py提示找不到数据
A7. 需要修改数据路径,bootstrap.yaml文件中, 修改InputFile和OutputFile,例如

InputFile: ../test/testdata/nuscenes_10sweeps_points.txt # 将Q6中下载好的数据放入此文件夹中
OutputFile: ../test/testdata/demo_boxes.txt

Q8. 执行trans_pfe.py 脚本时,报错 SyntaxError: Non-ASCII character ‘\xe8’ in file trans_pfe.py on line 113, but no encoding declared;
A8. 在trans_pfe.py文件开头位置,添加如下代码,支持中文字符

# -*- coding:utf-8 -*-

Q9. 执行trans_pfe.py 脚本时, 报错 No module named ‘pcdet’
A9. 需要根据安装教程,先安装pcdet工程,也可以参考本文 2.1)C.步骤。

Q10. 执行trans_pfe.py 脚本时,报错 AttributeError: module ‘spconv’ has no attribute ‘SparseModule’
A10. 参考:
1. github spconv issue
2. openpcdet项目代码(调试及问答记录)
修改pcdet/models/backbones_3d/spconv_backbone.py文件和pcdet/models/backbones_3d/spconv_unet.py文件

## 文件初始位置引入spconv
from spconv.pytorch import ops
from spconv.pytorch.conv import (SparseConv2d, SparseConv3d, SparseConvTranspose2d,SparseConvTranspose3d, SparseInverseConv2d,SparseInverseConv3d, SubMConv2d, SubMConv3d)
from spconv.pytorch.core import SparseConvTensor
from spconv.pytorch.identity import Identity
from spconv.pytorch.modules import SparseModule, SparseSequential
from spconv.pytorch.ops import ConvAlgo
from spconv.pytorch.pool import SparseMaxPool2d, SparseMaxPool3d
from spconv.pytorch.tables import AddTable, ConcatTableclass SparseBasicBlock(SparseModule)  ## 去掉spconv.

Q11. 执行trans_pfe.py 脚本时,报错No such file or directory: ‘cfgs/dataset_configs/nuscenes_dataset.yaml’
A11. 修改tools/cfgs/nuscenes_models/cbgs_pp_multihead.yaml文件中第5行,_BASE_CONFIG_为绝对路径,修改为如下效果:

_BASE_CONFIG_: /home/cui/workspace/deepLearning/OpenPCDet/tools/cfgs/dataset_configs/nuscenes_dataset.yaml

Q12. 执行可视化脚本python viewer.py 时,报错 ModuleNotFoundError: No module named ‘open3d’
A12. 安装open3d

pip install open3d

Q13. 将gtest文件修改为普通文件,方便单步调试查看文件中变量,编译报错 unsupported GNU version! gcc versions later than 6 are not supported
A13. 编译时候,cmake指令指定gcc g++6.0版本

cmake -DCMAKE_C_COMPILER=/usr/bin/gcc-6 -DCMAKE_CXX_COMPILER=/usr/bin/g++-6 ..

PointPillars 工程复现相关推荐

  1. 工程复现 -- 占据栅格地图 G-VOM

    工程复现 – G-VOM 参考: 1.G-VOM 2.catkin-tools官方文档 3.G-VOM论文地址 4. 本文工程地址GVOM_Nuscenes 一. 效果(主要查看voxel_map和h ...

  2. MotionNet 工程复现

    MotionNet 工程复现 1. 下载工程和数据 1)通过下面的网站,注册下载software即可 https://www.merl.com/research/?research=license-r ...

  3. 基于PYNQ-Z2实现BNN硬件加速

    用HLS工具在PYNQ-Z2开发板上实现BNN(二值神经网络)硬件加速--毕设小结 本文主要是本人本科毕业设计的主要工作. 主要工作有两部分,一是使用Vivado HLS工具实现二值卷积神经网络模型并 ...

  4. 待办-9月7号-11号(month9week2)

    拟复现:Discontinuous Named Entity Recognition as Maximal Clique Discovery--不连续实体--缺少数据,先等一天,看邮件有无回复. 也乜 ...

  5. 【个人总结】2020计算机保研经历(北大信科、上交、浙大、南大、中科院)

    前言 在推免系统上确认录取已经过去一周了,心里的一块大石头也终于落下.几个月的跌宕起伏到现在还有些后劲,经历过迷茫与抑郁最终还是走了过来,也算是人生的一个转折点.想了想还是写点东西记录一下,调整好状态 ...

  6. 梦见妈妈_梦见文字!

    梦见妈妈 "DeepDream is an experiment that visualizes the patterns learned by a neural network. Simi ...

  7. 从复现人类智能到挑战AI大工程,智能计算正经历什么考验?

    来源:AI科技评论 作者:杏花 编辑:青暮 世界顶级机器学习专家Michael I.Jordan曾提出一个观点,他认为人工智能正逐步由原理性研究,走向人工智能大工程. Michael I.Jordan ...

  8. 《基于单幅图像的快速去雾》原理与C++复现(有一定工程意义)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 1.前言 今天为大家带来一篇之前看到的用于单幅图像去雾的算法,作者 ...

  9. OpenCV图像处理专栏十七 | 清华大学《基于单幅图像的快速去雾》C++复现(有一定工程意义)

    代码开源在 https://github.com/BBuf/Image-processing-algorithm,感兴趣给我来个星星呗. 1. 前言 这是OpenCV图像处理算法朴素实现专栏的第17篇 ...

最新文章

  1. R语言使用pheatmap绘制热力图(数据归一化、行列聚类、注释、文字角度、字体)
  2. 如何调整按钮里的文字的位置android_UI设计中按钮场景分析
  3. 累计占比_全国ETC用户累计突破1亿!广东占比超过1/10
  4. php编译工具 知乎,关于知乎回答问题编辑框用Ctrl+V 粘贴图片是如何实现的详解...
  5. 【C++学习详细教程目录】
  6. 阿里云移动端播放器高级功能---截图和音频波形 1
  7. Android常见漏洞
  8. iptables,haproxy转发ftp(21端口)
  9. 《Java从入门到放弃》JavaSE入门篇:面向对象语法二(入门版)
  10. android多版本打包,Android的持续化集成及多版本打包
  11. CentOS 6.5 + Nginx 1.8.0 + PHP 5.6(with PHP-FPM) 负载均衡源码安装 之 (三)Nginx负载均衡配置...
  12. 底图切换_如何用PPT切换效果制作时间轴推进动画?
  13. 你真的了解 MySQL 数据库的运行状况吗?
  14. Linux中设置Java程序开机自动运行
  15. 钱晓捷第五版习题4 题4.8 bufx bufy bufz 为三个有符号十六进制数编写一个比较相等关系的程序如果这三个数都不相等则显示0,其中两个相等显示1 ,三个都相等则显示2
  16. Power BI 数据分析基础
  17. 软件测试方法_边界值分析法
  18. PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)
  19. ipq wifi校准
  20. Matlab——sym和syms

热门文章

  1. 哪个u盘格式win和mac都能用 mac上插u盘怎么没反应
  2. 如何解决灾难性遗忘和概念漂移这两个问题?
  3. LED显示屏亮度专业知识
  4. JAVA集合-线程安全
  5. java中常见的线程安全集合类
  6. 亲测Trimble SX系列三维扫描机器人
  7. hugging face datasets使用
  8. 深圳地铁和出租车上线区块链电子发票功能
  9. 在世界舞台MBBF一骑绝尘:永远更快一步的北京5G是怎样炼成的?
  10. 强网杯 2019-随便注 (堆叠注入)