3D目标检测实战 | 图解KITTI数据集与数据格式
目录
- 1 数据集简介
- 2 传感器坐标系
- 3 数据集下载与组织
- 4 数据内容说明
- 4.1 矫正文件calib
- 4.2 图像文件image
- 4.3 点云文件velodyne
- 4.4 标签文件label
- 4.5 平面文件plane
1 数据集简介
KITTI数据集是一个广泛应用于自动驾驶和计算机视觉领域的公开数据集。该数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院共同创建,旨在提供丰富的场景和多种类型的传感器数据,包括立体摄像头、激光雷达和GPS/IMU定位。该数据集用于评测
- 立体图像(stereo)
- 光流(optical flow)
- 视觉测距(visual odometry)
- 3D物体检测(object detection)
- 3D跟踪(tracking)
- …
等计算机视觉技术在车载环境下的性能。KITTI包含市区、乡村和高速公路等场景采集的真实图像数据
3D目标检测旨在从传感器数据中准确地定位和识别三维空间中的物体。KITTI数据集针对3D目标检测任务提供了14999张图像以及对应的点云,其中7481组用于训练,7518组用于测试,针对场景中的汽车、行人、自行车三类物体进行标注,共计80256个标记对象。
KITTI数据集的广泛使用推动了3D目标检测算法的发展,为自动驾驶技术的进步做出了重要贡献。同时,这个数据集也成为了研究人员之间共享和比较算法性能的标准基准,促进了该领域的研究和创新。
2 传感器坐标系
KITTI数据集使用的数据采集车如下所示,该图展示了传感器、传感器之间的变换,以及车体在地面上方的高度
其中的传感器配置为
- 2个一百四十万像素的PointGray Flea2灰度相机
- 2个一百四十万像素的PointGray Flea2彩色相机
- 1个64线的Velodyne激光雷达,10Hz,角分辨率为0.09度,每秒约一百三十万个点,水平视场360°,垂直视场26.8°,至多120米的距离范围
- 4个Edmund的光学镜片,水平视角约为90°,垂直视角约为35°
- 1个OXTS RT 3003的惯性导航系统(GPS/IMU),6轴,100Hz,分别率为0.02米,0.1°
主要传感器的坐标系定义如下所示,后续进行数据可视化时,需要根据车体信息和坐标系定义进行数据转换
3 数据集下载与组织
主要下载资源如下
- KITTI官网:3D目标检测
- AVOD:道路平面信息
下载完成主要的数据集后,可以按训练集和测试集组织为如下格式
.data
└── kitti├── test│ ├── calib│ ├── image_2│ └── velodyne└── train├── calib├── image_2├── label_2├── planes└── velodyne
4 数据内容说明
4.1 矫正文件calib
calib
是相机、雷达、惯导等传感器的矫正数据或变换关系,以train/calib/000000.txt
文件为例
P0: 7.215377000000e+02 0.000000000000e+00 6.095593000000e+02 0.000000000000e+00 0.000000000000e+00 7.215377000000e+02 1.728540000000e+02 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 0.000000000000e+00
P1: 7.215377000000e+02 0.000000000000e+00 6.095593000000e+02 -3.875744000000e+02 0.000000000000e+00 7.215377000000e+02 1.728540000000e+02 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 0.000000000000e+00
P2: 7.215377000000e+02 0.000000000000e+00 6.095593000000e+02 4.485728000000e+01 0.000000000000e+00 7.215377000000e+02 1.728540000000e+02 2.163791000000e-01 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 2.745884000000e-03
P3: 7.215377000000e+02 0.000000000000e+00 6.095593000000e+02 -3.395242000000e+02 0.000000000000e+00 7.215377000000e+02 1.728540000000e+02 2.199936000000e+00 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 2.729905000000e-03
R0_rect: 9.999239000000e-01 9.837760000000e-03 -7.445048000000e-03 -9.869795000000e-03 9.999421000000e-01 -4.278459000000e-03 7.402527000000e-03 4.351614000000e-03 9.999631000000e-01
Tr_velo_to_cam: 7.533745000000e-03 -9.999714000000e-01 -6.166020000000e-04 -4.069766000000e-03 1.480249000000e-02 7.280733000000e-04 -9.998902000000e-01 -7.631618000000e-02 9.998621000000e-01 7.523790000000e-03 1.480755000000e-02 -2.717806000000e-01
Tr_imu_to_velo: 9.999976000000e-01 7.553071000000e-04 -2.035826000000e-03 -8.086759000000e-01 -7.854027000000e-04 9.998898000000e-01 -1.482298000000e-02 3.195559000000e-01 2.024406000000e-03 1.482454000000e-02 9.998881000000e-01 -7.997231000000e-01
其中数据的含义是:
- P 0 P_0 P0- P 4 P_4 P4:相机内参矩阵 R 3 × 4 \mathbb{R} ^{3\times 4} R3×4
P i = [ f u i 0 c u i − f u i b i 0 f v i c v i 0 0 0 1 0 ] P_i=\left[ \begin{matrix} f_{u}^{i}& 0& c_{u}^{i}& -f_{u}^{i}b_i\\ 0& f_{v}^{i}& c_{v}^{i}& 0\\ 0& 0& 1& 0\\ \end{matrix} \right] Pi= fui000fvi0cuicvi1−fuibi00
其中参数 c u c_u cu、 c v c_v cv用于中心映射——将光轴与归一化成像面的交点,即成像面中心点映射到像素平面中心,其取决于拜耳阵列与光轴如何对齐。参数 f u f_u fu、 f v f_v fv用于归一化——将矩形的传感器阵列映射为正方形, b i b_i bi是第 i i i个相机沿 x x x方向距离0号相机的位移。序号含义如下
序号 | 相机 |
---|---|
0 | 左边灰度相机 |
1 | 右边灰度相机 |
2 | 左边彩色相机 |
3 | 右边彩色相机 |
- R 0 r e c t R^{rect}_0 R0rect:立体矫正矩阵 R 3 × 3 \mathbb{R} ^{3\times 3} R3×3,在实际计算时在第四行和第四列添加全为0的向量,扩展为4x4的矩阵。 R 0 r e c t R^{rect}_0 R0rect用于立体视觉中使相机图像共面,详见计算机视觉教程6-1:图解双目视觉系统与立体校正原理
- T r v e l o _ t o _ c a m Tr_{\mathrm{velo\_to\_cam}} Trvelo_to_cam:从雷达到0号相机的旋转平移矩阵 R 3 × 4 \mathbb{R} ^{3\times 4} R3×4,在实际计算时,需要添加一行 [ 0 , 0 , 0 , 1 ] [0,0,0,1] [0,0,0,1]齐次化为 R 4 × 4 \mathbb{R} ^{4\times 4} R4×4的矩阵
- T r i m u _ t o _ v e l o Tr_{\mathrm{imu\_to\_velo}} Trimu_to_velo:从惯导或GPS装置到0号相机的旋转平移矩阵 R 3 × 4 \mathbb{R} ^{3\times 4} R3×4,在实际计算时,需要添加一行 [ 0 , 0 , 0 , 1 ] [0,0,0,1] [0,0,0,1]齐次化为 R 4 × 4 \mathbb{R} ^{4\times 4} R4×4的矩阵
利用上述矩阵可以将不同坐标系的数据相互转换,例如将雷达坐标系的点 x x x映射到左侧彩色相机可以使用
y = P 2 ⋅ R 0 r e c t ⋅ T r v e l o _ t o _ c a m ⋅ x y=P_2\cdot R^{rect}_0 \cdot Tr_{\mathrm{velo\_to\_cam}} \cdot x y=P2⋅R0rect⋅Trvelo_to_cam⋅x
即先将 x x x转换到0号相机,再进行0号相机立体矫正,最后投影到2号相机,即左侧彩色相机
4.2 图像文件image
image
是以8位PNG格式存储的图像文件,以train/image_2/000000.png
为例
4.3 点云文件velodyne
velodyne
是以浮点二进制格式存储的激光雷达点云文件,每行包含8个浮点数数据,其中每个浮点数数据由四位十六进制数表示且通过空格隔开。一个点云数据由4个浮点数数据构成,分别表示点云的 x x x、 y y y、 z z z、 r r r(其中 x x x、 y y y、 z z z表示点云的三维坐标, r r r表示反射强度),以train/velodyne/000000.bin
为例
8D97 9241 39B4 483D | 5839 543F 0000 0000
83C0 9241 8716 D93D | 5839 543F 0000 0000
2D32 4D42 AE47 013F | FED4 F83F 0000 0000
3789 9241 D34D 623E | 5839 543F 0000 0000
E5D0 9241 1283 803E | E17A 543F EC51 B83D
...
4.4 标签文件label
label
是标签文件,以train/label_2/000000.txt
为例
Pedestrian 0.00 0 -0.20 712.40 143.00 810.73 307.92 1.89 0.48 1.20 1.84 1.47 8.41 0.01
训练数据共15列,每列的含义如下
- 第1列 字符串:代表物体类别,总共有9类,分别是
Car
、Van
、Truck
、Pedestrian
、Person_sitting
、Cyclist
、Tram
、Misc
和DontCare
。其中DontCare
表示该区域没有被标注,比如由于目标物体距离激光雷达太远。为了防止在评估过程中(主要是计算精确度precision),将本来是目标物体但因某些原因而没有标注的区域统计为假阳性,评估脚本会自动忽略DontCare
区域的预测结果 - 第2列 浮点数:代表物体是否被截断(truncated),数值在0(非截断)到1(截断)间浮动,数字表示指离开图像边界的程度
- 第3列 整数:代表物体是否被遮挡(occluded),离散值0、1、2、3分别表示被遮挡的程度
- 第4列 弧度:物体的观察角度(alpha),取值范围为 [ − π , π ] [-\pi, \pi ] [−π,π],它表示在相机坐标系下,以相机原点为中心,相机原点到物体中心的连线为半径,将物体绕相机 y y y轴旋转至相机 z z z轴,此时物体方向与相机 x x x轴的夹角
- 第5~8列 浮点数:物体的2D边界框大小(bbox),四个数分别是xmin、ymin、xmax、ymax(单位:pixel),表示2D边界框的左上角和右下角的坐标
- 第9~11列 浮点数: 3D物体的尺寸(dimensions),三个数分别是高、宽、长(单位:米)
- 第12-14列 浮点数: 3D物体在相机坐标系下的位置(location),三个数分别是 x x x、 y y y、 z z z(单位:米),特别注意的是,这里的xyz是在相机坐标系下3D物体的中心点位置,这里中心点位于底面中心
- 第15列 弧度:3D物体的方向角(rotation_y),取值范围为 [ − π , π ] [-\pi, \pi ] [−π,π],它表示在相机坐标系下,物体的全局方向角,也就是物体前进方向与相机坐标系x轴的夹角
- 第16列 浮点数:目标检测的置信度(score),只在测试集中有
4.5 平面文件plane
planes
是由AVOD
生成的道路平面信息,其在训练过程中作为一个可选项,用来提高模型的性能,例如限制物体在道路平面上。以train/planes/000000.txt
文件为例
# Matrix
WIDTH 4
HEIGHT 1
-7.051729e-03 -9.997791e-01 -1.980151e-02 1.680367e+00
四个系数代表了平面方程系数 A A A、 B B B、 C C C、 D D D,即
A x + B y + C z + D = 0 Ax+By+Cz+D=0 Ax+By+Cz+D=0
🔥 更多精彩专栏:
- 《ROS从入门到精通》
- 《Pytorch深度学习实战》
- 《机器学习强基计划》
- 《运动规划实战精讲》
- …
相关文章:

3D目标检测实战 | 图解KITTI数据集与数据格式
目录 1 数据集简介2 传感器坐标系3 数据集下载与组织4 数据内容说明4.1 矫正文件calib4.2 图像文件image4.3 点云文件velodyne4.4 标签文件label4.5 平面文件plane 1 数据集简介 KITTI数据集是一个广泛应用于自动驾驶和计算机视觉领域的公开数据集。该数据集由德国卡尔斯鲁厄理…...

周界警戒AI算法+视频智能分析在安全生产场景中的应用
长期以来,周界防范安防系统在大型园区、工厂、社区、机场、火车站站台、重点单位等领域应用较为广泛和常见。随着AI人工智能等新兴技术的快速发展与落地应用,通过AI智能检测与视频智能分析技术,现代化的周界安防系统可以做到全天候快速、准确…...
C++中执行shell命令,popen与system的区别
C中执行shell命令,popen与system的区别_c popen_Op_chaos的博客-CSDN博客 2.system system()函数执行过程: 1.fork一个子进程; 2.在子进程中调用exec函数去执行command; 3.在父进程中调用wait去等待子进程结束。 由于system没…...
Flink相关
墨滴社区 用 Flink 取代 Spark Streaming!知乎实时数仓架构演进_天池技术圈-阿里云天池 关于flink实时数仓的实际问题_flink datastream 按天,小时写入hdfs_一个写湿的程序猿的博客-CSDN博客 基于 Flink Hudi 的实时数仓在 Shopee 的实践 - 墨天轮...
数据结构题型9-顺序栈
#include <iostream> //引入头文件 using namespace std;typedef int Elemtype;#define Maxsize 10 #define ERROR 0 #define OK 1typedef struct {Elemtype data[Maxsize];int top; }SqStack;void InitStack(SqStack& S) {S.top -1; } bool StackEmpty(SqStack…...

时间复杂度、空间复杂度
一、时间复杂度 1、概念 时间复杂度:计算的是当一个问题量级增加的时间,时间增长的趋势; O(大O表示法):渐进的时间复杂度 2、举例 ① 以下 for 循环的时间复杂度:O(1 3n) O(n) 去掉常数…...

C++---多态
多态 前言多态的概念多态的定义及实现多态的构成条件虚函数虚函数的重写虚函数重写的两个例外协变(基类与派生类虚函数返回值类型不同)析构函数的重写 override和final 虚函数的默认参数 抽象基类 前言 在买火车票的时候,如果你是学生,是买半价票&#…...

Android 滑动事件消费监控,Debug 环境下通用思路
Android Debug 环境下滑动事件消费监控通用思路 背景 Android 开发中,经常会遇到滑动事件冲突。在一些简单的场景下,我们如果能够知道是那个 View 拦截了事件,那我们能够很容易得解决。解决方法通常就是内部拦截法或者外部拦截法。ViewPage…...

Unity中Shader用到的向量的乘积
文章目录 前言一、向量的乘法1、点积2、差积 二、点积(结果是一个标量)1、数学表示法2、几何表示法 三、叉积1、向量叉积的结果 与 两个相乘的向量互相垂直2、判断结果正负方向的方法:右手法则 前言 Unity中Shader用到的向量的点积 一、向量…...

帆软FineReport决策报表之页面布局
最近在用帆软决策报表绘制首页大屏,记录使用过程,方便查看。 版本:FineReport10.0 第一步、页面布局 页面布局其实就是组件的排列组合,决策报表主区域body有两种布局方式:自适应布局和绝对布局。 1)自适应…...

[Linux入门]---进程的概念
文章目录 1.进程的概念①描述进程-PCB②task_struct-PCB的一种③task_ struct内容分类 2.查看进程3.通过系统调用获取进程表示符4.通过系统调用创建进程---fork初识 1.进程的概念 在我们的电脑开机的时候,操作系统会被加载到内存中,点击多个应用进行时&a…...

Leetcode—— 20.有效的括号
20. 有效的括号 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭…...

视频播放器的技术组成
Qt视频播放器实现(目录) 什么是视频 我们这里讲的视频,通常也包括了音频。因为没有声音的画面播放几乎是不可接受的。 这样暗含了一个事实,那就是视频总是包括视频数据和音频数据两部分。 Video 表示视频; Audio …...

Stable Diffusion 系统教程 | 强大的ControlNet 控制网
2023年的2月13日,一款名叫ControlNet的插件横空出世,AI绘画变得更加可控 ControlNet直译过来很简单,就叫做控制网,开发者是一名华裔,毕业于苏州大学,目前在斯坦福做读博士一年级,大佬大佬&…...

Hadoop-sqoop
sqoop 1. Sqoop简介及原理 简介: Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysq1.postgresql..)间进行数据的传递,可以将一个关系型数据库(例如: MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop 的HDFS中&…...

[论文阅读]YOLOV1:You Only Look Once:Unified, Real-Time Object Detection
摘要 我们提出了YOLO,一种新的目标检测方法。之前的目标检测工作重新使用分类器来执行检测。相反,我们将目标检测表述为空间分离的边界框和相关类概率的回归问题。单个神经网络在一次评估中直接从完整图像中预测边界框和类别概率。由于整个检测管道是一…...

Ubuntu 20.04 安装MySQL 8.0.34
MySQL安装 sudo wget https://cdn.mysql.com/archives/mysql-8.0/mysql-server_8.0.31-1ubuntu20.04_amd64.deb-bundle.tar下载MySQL文件。 sudo mkdir /mysql8创建目录。 sudo tar -xf mysql-server_8.0.31-1ubuntu20.04_amd64.deb-bundle.tar -C /mysql8进行解压。 需…...

MySQL 高级语句 Part1(进阶查询语句+MySQL数据库函数+连接查询)
高级语句 第一部分 一、MySQL进阶查询语句1.1 select ----显示表格中一个或数个字段的所有数据记录1.2 distinct ----不显示重复的数据记录1.3 where ----有条件查询1.4 and or ----且 或1.5 in----显示已知的值的数据记录1.6 between----显示两个值范围内的数据记录1.7 通配符…...
Rust免杀 Shellcode加载与混淆2
前言 这是半年前我学习Rust和免杀时的一些记录,最近打开知识库看到了这篇半年前的笔记,并且发现我常逛的安全社区都比较少有人分享Rust以及Rust免杀的帖子,于是想着将这篇笔记分享出来供大家参考和指正。由于我写这篇文章时也刚刚开始接触Ru…...

牛客java训练题 day1
9.24 day1 Q 1. this 指针是用来干什么的? 2.基类和派生类分别是指什么? 3.为什么方法中不能写静态变量 4. 解释一下ASCII码和ANSI码和两者的区别 5.简述j ava.io java.sql java.awt java.rmi 分别是什么类型的包 6. 看下面一段代码:…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...