CenterPoint-KITTI:环境配置、模型训练、效果展示;KITTI 3D 目标检测数据集下载
目录
前言
Python虚拟环境创建以及使用
KITTI3D目标检测数据集
CenterPoint-KITTI编译遇到问题合集
ImportError: cannot import name 'VoxelGenerator' from 'spconv.utils
失败案例
最终解决方案
对于可选参数,road plane的处理
E: Unable to locate package libboost-all-dev
TypeError: load() missing 1 required positional argument: ‘Loader‘
GPU内存不足如何解决:
训练效果
2024-09-13更新
前言
最近在做基于雷达的目标检测跟踪实现,阅读了同济大学最新的论文LIMOT,但论文复线时需要自己训练Detector,下面记录自己在编译CenterPoint-KITTI过程中遇到的问题以及解决方法。
LIMOT论文官方Github仓库:
GitHub - tiev-tongji/LIMOT: A Tightly-Coupled System for LiDAR-Inertial Odometry and Multi-Object Tracking.
CenterPoint-KITTI官方Github仓库:
GitHub - tianweiy/CenterPoint-KITTI
Python虚拟环境创建以及使用
官方编译运行CenterPoint时并没有使用Python的虚拟环境,但自己考虑之后处于虚拟环境的便捷性,还是选择使用虚拟环境实现。
- Python中虚拟环境的使用:
- 创建虚拟环境ptython3 -m virtualenv venv
- 激活虚拟环境source venv/bin/activate
- 退出虚拟环境deactivate
- Linux中如何彻底删除虚拟环境以及虚拟环境中安装的软件,记住一个原则,虚拟环境里面安装的软件全部存在于此虚拟环境中,当执行命令rm -rf venv删除对应的虚拟环境后,安装的软件也就被删除了。
最终自己创建并使用虚拟环境如下:
KITTI3D目标检测数据集
- KITTI原始3D对象预测数据集:
-
- KITTI 3D目标检测数据集解析(完整版)_kitti数据集-CSDN博客
- 百度网盘 请输入提取码 提取码:hsg5.
- KITTI数据集下载(百度云)-CSDN博客
CenterPoint-KITTI编译遇到问题合集
ImportError: cannot import name 'VoxelGenerator' from 'spconv.utils
失败案例
搜索上述错误,有很多种其他参考参考,但修改代码后,又报了很多错误,如下:最终也是卸载,并安装对应版本解决。
第一次参考这篇博客,修改对应代码,大错特错,随后错误一个接着一个,直接干沉默了。
SSD 复现过程报错_importerror: cannot import name ‘voxelgenerator’ f-CSDN博客
ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 2 dimensions. The detected shape was (1, 4) + inhomogeneous part. · Issue #1109 · theislab/scvelo
成功解决ValueError: setting an array element with a sequence. The requested array has an...-CSDN博客
最终解决方案
如何解决,最终卸载了cuda11.8对应的spconv,将其替换为Git官网上对应的v1.1版本完美解决。
自己搜索过程中查询到另一篇Github博客所讲,将低版本在这里也就是v1.1版本的VoxelGeneratorV2的相关文件复制一份放到你安装的spconv文件中,这种方式我并没有尝试,使用重新安装v1.1的方式。
1. 查看并卸载已经安装的spconv:
#通过pip list命令查看安装的spconv以及cumm
pip list | grep spconv
pip list | grep cumm
#查询到对应的spconv以及cumm版本后使用uninstall命令卸载(这种方式仅针对于使用pip方式安装的)
pip uninstall spconv
pip uninstall cumm
#卸载后再次查看已经没有安装的spconv以及cumm
根据官方网站查看:对于cuda11.8如果使用下述方式安装是会有cumm的,自己第一次安装了cuda11.8对应的spconv,下面安装了v1.1版本就没有cumm了,所有安装后验证是否安装正确,没有出现cumm也不用慌,可以正常使用。
2. 从sponv官网拉取对应v1.1版本的spconv:
git clone -b v1.1 https://github.com/traveller59/spconv.git --recurisve
-b v1.1:指定了拉取对应v1.1版本的spconv。
--recursive: 这个选项用于克隆所有子模块(submodule)。Git 子模块是指在 Git 仓库中嵌套的另一个 Git 仓库。使用
--recursive
选项可以确保在克隆主仓库的同时,也会递归地克隆所有子模块。
安装步骤:(参考官网)
- if you are using pytorch 1.4+ and encounter "nvcc fatal: unknown -Wall", you need to go to torch package dir and remove flags contains "-Wall" in INTERFACE_COMPILE_OPTIONS in Caffe2Targets.cmake. This problem can't be fixed in this project (to avoid this, I need to remove all torch dependency in cuda sources and drop half support).
Use
git clone xxx.git --recursive
to clone this repo.Install boost headers to your system include path, you can use either
sudo apt-get install libboost-all-dev
or download compressed files from boost official website and copy headers to include path.Download cmake >= 3.13.2, then add cmake executables to PATH.
Ensure you have installed pytorch 1.0+ in your environment, run
python setup.py bdist_wheel
(don't usepython setup.py install
).Run
cd ./dist
, use pip to install generated whl file.
第5步执行完成后,在dist目录下会生成一个文件(参考如下),执行下述命令安装spconv v1.1:
pip install spconv-1.1-cp38-cp38-linux_x86_64.whl
GitHub - traveller59/spconv at v1.1
3. 验证是否安装成功:
由于我使用的时python的虚拟环境,最终安装的软件都位于venv这个虚拟环境中,按照下图第一个方框里的内容找到对应的路径查看有VoxelGeneratorV2这个类,表示成功。
对于可选参数,road plane的处理
进入对应的数据配置文件和模型配置文件,将USE_ROAD_PLANE: 由True改为False。
E: Unable to locate package libboost-all-dev
对于无法定位到软件包的问题,直接使用sudo apt-get update先更新下载源,之后再重试即可。
sudo apt-get update
sudo apt-get install libboost-all-dev
E: Unable to locate package libboost-all-dev_unable to locate package libboost-dev-CSDN博客
TypeError: load() missing 1 required positional argument: ‘Loader‘
解决方案:TypeError: load() missing 1 required positional argument: ‘Loader‘_typeerror: adb() missing 1 required positional arg-CSDN博客
- 将yaml.load()改为 yaml.safe_load()即可解决。
GPU内存不足如何解决:
直接搜索相应博客,我的解决方案就是将batch_size大小指定为2,也就是批量大小指定为2就可以,对于KITTI的CenterPoint的训练。
pytorch: 四种方法解决RuntimeError: CUDA out of memory. Tried to allocate ... MiB_cuda out of memory. tried to allocate 1.38 gib (gp-CSDN博客
- 如何实时查看GPU使用情况,使用命令:watch -n 0.5 nvidia-smi。
watch
是一个在 Unix 和类 Unix 操作系统中常用的命令行工具,它可以用来周期性地执行一个程序,并全屏显示其输出。这对于实时监控某些操作或系统状态非常有用。watch
:这是用来执行周期性命令的工具。-n 0.5
:这个选项告诉watch
每 0.5 秒执行一次后面的命令。-n
后面的数字是间隔时间,单位是秒。
训练效果
=========================================================================
2024-09-13更新
昨天经过漫长时间的训练,模型已经训练成功,但是模型评估的时候出了点小问题:可以参考下面第二个图片,主要是编译的时候修改了numpa好像(具体忘记记录了),但这个问题不大,直接卸载原有的numpy,安装报错指定的numpy就可以。
pip unstall numpy
pip install numpy==1.22.0
安装新版本的numpy后可以对训练出的.pth结尾的模型进行验证。
训练后模型的存放位置:在CenterPouint-KITTI根目录下的output文件夹中,具体参考下图。
根据官网GETTING_STARTED.md提示测试训练的模型:
修改了numpy版本后测试没问题了,这里就不贴图片了。
训练完成之后最重要的也就是按照DEMO.md的提示进行可视化验证:
按照官网提示安装mayavi的同时需要安装pyqt5工具:
pip install pyqt5
否则会报如下错误:
上述工作完成后,执行如下命令:
#官网提示
python demo.py --cfg_file cfgs/kitti_models/pv_rcnn.yaml \--ckpt pv_rcnn_8369.pth \--data_path ${POINT_CLOUD_DATA}#example for me
python3 demo.py --cfg_file cfgs/kitti_models/centerpoint.yaml --ckpt ../output/kitti_models/centerpoint/default/ckpt/checkpoint_epoch_51.pth --data_path ~/Lab/object_detector/CenterPoint-KITTI/data/kitti/testing/velodyne
之后通过可视化界面可以看到如下预测:
和官网模型基本一致,非常nice,后续继续探索一下和LIMOT的集成。
相关文章:

CenterPoint-KITTI:环境配置、模型训练、效果展示;KITTI 3D 目标检测数据集下载
目录 前言 Python虚拟环境创建以及使用 KITTI3D目标检测数据集 CenterPoint-KITTI编译遇到问题合集 ImportError: cannot import name VoxelGenerator from spconv.utils 失败案例 最终解决方案 对于可选参数,road plane的处理 E: Unable to locate packag…...
【Android】ViewPager
1.ViewPager的简介和作用 ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view,用于允许用户在几个页面(或称为碎片)之间左右滑动切换。它通常用于创建像画廊或轮播图那样的用户体验。 ViewPager类直接继承了…...
[go] 命令模式
命令模式 将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。 模型说明 触发者类负责对请求进行初始化,其中必须包含一个成员变量来存储对于命令对象的引用。触发命令,而不同接受者直接…...
代码随想录冲冲冲 Day48 单调栈Part2
42. 接雨水 关键点有以下几个 首先是怎么去理解接雨水 其实就是找每一个段的左边第一个最大值和右边第一个最大值 既然是最大值 那么单调栈就是递增的 左边第一个最大值其实就是pop掉中间的之后st.top 由于是出现大于等于情况时候进行操作 所以右边最大值就是i 接下来就…...
企业内训|Nvidia智算中心深度技术研修-某智算厂商研发中心
课程概述 此企业内训课程“Nvidia智算中心的深度技术研修”专为某智算厂商研发中心设计,内容涵盖了从基础设施构建到高性能计算优化的全方位技术要点。课程为期七天,分模块详细讲解了NV算力资源的网络架构、存储优化、智算集群的建设与自动化管理、NCCL…...
《算法笔记》例题解析 第3章入门模拟--3图形输出(9题)2021-03-03
例题 旋转方阵 题目描述 Time Limit: 1000 ms Memory Limit: 256 mb 打印出一个旋转方阵,见样例输出。 输入描述: 输入一个整数n(1 < n < 20), n为方阵的行数。 输出描述: 输出一个大小为n*n的距阵 输入 5 输出 1 16 15 14 13 2 17 24 23 12 3 18 25 22 11 4 1…...

合宙Air201模组LuatOS:PWRKEY控制,一键解决解决关机难问题
不知不觉间,我们已经发布拉期课程:hello world初体验,点灯、远程控制、定位和扩展功能,你学的怎么样?很多伙伴表示已经有点上瘾啦!合宙Air201,如同我们一路升级打怪的得力法器,让开发…...
Kafka 命令详解及使用示例
文章目录 Kafka 命令详解及使用示例Kafka 命令详解kafka-topics.sh:主题管理创建主题创建带副本的主题修改主题分区数了解分区分布列出主题查看主题详情删除主题 kafka-console-producer.sh:消息生产者发送消息到主题带键值对的消息消息生产性能优化带分…...

重生归来之挖掘stm32底层知识(1)——寄存器
概念理解 要使用stm32首先要知道什么是引脚和寄存器。 如下图所示,芯片通过这些金属丝与电路板连接,这些金属丝叫做引脚。一般做软件开发是不需要了解芯片是怎么焊的,只要会使用就行。我们平常通过编程来控制这些引脚的输入和输出,…...

Qt构建JSON及解析JSON
目录 一.JSON简介 JSON对象 JSON数组 二.Qt中JSON介绍 QJsonvalue Qt中JSON对象 Qt中JSON数组 QJsonDocument 三.Qt构建JSON数组 四.解析JSON数组 一.JSON简介 一般来讲C类和对象在java中是无法直接直接使用的,因为压根就不是一个规则。但是他们在内存中…...

合宙Air201模组LuatOS扩展功能:温湿度传感器篇!
通过前面几期的学习,同学们的学习热情越来越高。 合宙Air201模组除了支持3种定位方式外,还具有丰富的扩展功能,比如:通过外扩BTB链接方案,最多可支持21个IO接口:SPI、I2C、UART等多种接口全部支持。 本期…...
主流敏捷工具scrum工具
在当今的快速变化和高需求的业务环境中,敏捷开发已经成为许多企业实现快速迭代和响应市场需求的重要方法。而在众多敏捷工具中,选择适合自己团队的工具尤为重要。 今天,我们将对比几款主流的敏捷工具,供参考 1. Leangoo领歌&…...
探索微服务架构:从理论到实践,深度剖析其优缺点
微服务架构(Microservice Architecture)是一种软件开发架构形式,它的核心 思想是将大型应用程序拆分成一组小的服务,每个服务都运行在其独立的进程中,并且 服务与服务之间通过轻量级的通信机制(如HTTP REST…...

2024 年最佳 Chrome 验证码扩展,解决 reCAPTCHA 问题
验证码,特别是 reCAPTCHA,已成为在线安全的不可或缺的一部分。虽然它们在区分人类和机器人方面起着至关重要的作用,但它们也可能成为合法用户和从事网络自动化的企业的主要障碍。无论您是试图简化在线体验的个人,还是依赖自动化工…...
Go语言现代web开发defer 延迟执行
The defer statement will delay the execution of a function until the surrounding function is completed. Although execution is postponed, funciton arguments will be evaluated immediately. defer语句将延迟函数的执行,直到周围的函数完成。虽然执行被延…...

Vue路由二(嵌套多级路由、路由query传参、路由命名、路由params传参、props配置、<router-link>的replace属性)
目录 1. 嵌套(多级)路由2. 路由query传参3. 路由命名4. 路由params传参5. props配置6. <router-link>的replace属性 1. 嵌套(多级)路由 pages/Car.vue <template><ul><li>car1</li><li>car2</li><li>car3</li></ul…...

【RabbitMQ】可靠性传输
概述 作为消息中间件来说,最重要的任务就是收发消息。因此我们在收发消息的过程中,就要考虑消息是否会丢失的问题。结果是必然的,假设我们没有采取任何措施,那么消息一定会丢失。对于一些不那么重要的业务来说,消息丢失…...

【论文阅读】PERCEIVER-ACTOR: A Multi-Task Transformer for Robotic Manipulation
Abstract transformers凭借其对大型数据集的扩展能力,彻底改变了视觉和自然语言处理。但在机器人操作中,数据既有限又昂贵。通过正确的问题表述,操纵仍然可以从变形金刚中受益吗?我们使用peract来研究这个问题,peract…...
Linux 常用指令
Linux 常用指令 这是本人在备战 CSP 初赛做 Linux 指令题时,心血来潮整理的,希望对大家有帮助。如有错误或有补充,麻烦私信或评论指出。 表格按字母顺序排列 命令作用alias对命令重命名cal显示日历的指令cat查看文本文件的内容cd改变当前工…...

使用 PHPstudy 建立ThinkPHP8 本地集成环境
安装Composer 下载地址:https://getcomposer.org/Composer-Setup.exehttps://getcomposer.org/Composer-Setup.exe 打开PHPstudy创建网站: cmd终端进入PHPstudy www根目录下: 执行代码:cd phpstudy www 根目录地址 cd C:\phpst…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...