(二)一文带你了解KITTI数据集
KITTI官网网址:https://www.cvlibs.net/datasets/kitti/index.php
KITTI数据集论文:Are we ready for Autonomous Driving? The KITTI Vision Benchmark Suite
KITTI3D AP Metric:Disentangling Monocular 3D Object Detection
第一章:KITTI数据集介绍
1.1 KITTI数据集简介
KITTI数据集是由德国卡尔斯鲁厄理工学院 Karlsruhe Institute of Technology (KIT) 和美国芝加哥丰田技术研究院 Toyota Technological Institute at Chicago (TTI-C) 于2012年联合创办,是目前国际上最为常用的自动驾驶场景下的计算机视觉算法评测数据集之一。该数据集用于评测立体图像(stereo),光流(optical flow),视觉测距(visual odometry),3D物体检测(object detection)和3D跟踪(tracking)等计算机视觉技术在车载环境下的性能。KITTI数据集包含市区、乡村和高速公路等场景采集的真实图像数据,每张图像中最多达15辆车和30个行人,还有各种程度的遮挡与截断。 KITTI数据集针对3D目标检测任务提供了14999张图像以及对应的点云,其中7481组用于训练,7518组用于测试,针对场景中的汽车、行人、自行车三类物体进行标注,共计80256个标记对象。
1.2 KITTI数据集采集车
KITTI数据集采集车的传感器布置平面如上图所示,车辆装配有2个灰度摄像机,2个彩色摄像机,一个Velodyne 64线3D激光雷达,4个光学镜头,以及1个GPS导航系统,在上图中使用了红色
标记。
- 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°
注意:双目相机之间的距离为0.54米,点云到相机之间的距离为0.27米,在上图中使用了蓝色
标记。
1.3 KITTI数据集坐标系表示
图中蓝色的坐标系
表示激光点云的坐标系,红色的坐标系
表示相机的坐标系。
第二章:准备KITTI数据集
2.1 官网下载KITTI数据集
在KITTI 3D object detection dataset下载KITTI数据集安装包。
当然,如果在官网下载麻烦的话,我已经下载好了,使用百度网盘可以直接进行下载。
百度网盘链接:https://pan.baidu.com/s/1K-UaIFUt_bibjC6ZtLUKYA
提取码:7jq1
道路平面信息是由 AVOD 生成的,其在训练过程中作为一个可选项,用来提高模型的性能,点击下载道路平面信息。
2.2 官网下载KITTI数据集后的组织结构
在官网下载KITTI数据集后,并在mmdetection3d文件夹下组织成以下所示的结构。
mmdetection3d
├── configs
├── mmdet3d
├── tools
├── data
│ ├── kitti
│ │ ├── ImageSets
│ │ ├── testing
│ │ │ ├── calib
│ │ │ ├── image_2
│ │ │ ├── velodyne
│ │ ├── training
│ │ │ ├── calib
│ │ │ ├── image_2
│ │ │ ├── label_2
│ │ │ ├── velodyne
│ │ │ ├── planes
2.3 数据预处理
项目的数据预处理需要使用tools/create_data.py重新处理一次。
cd mmdetection3d
mkdir ./data/kitti/ && mkdir ./data/kitti/ImageSets
# Download data split
wget -c https://raw.githubusercontent.com/traveller59/second.pytorch/master/second/data/ImageSets/test.txt --no-check-certificate --content-disposition -O ./data/kitti/ImageSets/test.txt
wget -c https://raw.githubusercontent.com/traveller59/second.pytorch/master/second/data/ImageSets/train.txt --no-check-certificate --content-disposition -O ./data/kitti/ImageSets/train.txt
wget -c https://raw.githubusercontent.com/traveller59/second.pytorch/master/second/data/ImageSets/val.txt --no-check-certificate --content-disposition -O ./data/kitti/ImageSets/val.txt
wget -c https://raw.githubusercontent.com/traveller59/second.pytorch/master/second/data/ImageSets/trainval.txt --no-check-certificate --content-disposition -O ./data/kitti/ImageSets/trainval.txt
# Data preprocessing
python tools/create_data.py kitti --root-path ./data/kitti --out-dir ./data/kitti --extra-tag kitti --with-plane
2.4 数据预处理后的组织结构
项目的数据预处理后,在mmdetection3d文件夹下将会组织成以下所示的结构。
mmdetection3d
├── configs
├── mmdet3d
├── tools
├── data
│ ├── kitti
│ │ ├── ImageSets
│ │ │ ├── test.txt
│ │ │ ├── train.txt
│ │ │ ├── trainval.txt
│ │ │ ├── val.txt
│ │ ├── testing
│ │ │ ├── calib
│ │ │ ├── image_2
│ │ │ ├── velodyne
│ │ │ ├── velodyne_reduced
│ │ ├── training
│ │ │ ├── calib
│ │ │ ├── image_2
│ │ │ ├── label_2
│ │ │ ├── velodyne
│ │ │ ├── velodyne_reduced
│ │ │ ├── planes
│ │ ├── kitti_gt_database
│ │ │ ├── xxxxx.bin
│ │ ├── kitti_infos_test.pkl
│ │ ├── kitti_infos_train.pkl
│ │ ├── kitti_infos_trainval.pkl
│ │ ├── kitti_infos_val.pkl
│ │ ├── kitti_dbinfos_train.pkl
│ │ ├── kitti_infos_test_mono3d.coco.json
│ │ ├── kitti_infos_train_mono3d.coco.json
│ │ ├── kitti_infos_trainval_mono3d.coco.json
│ │ ├── kitti_infos_val_mono3d.coco.json
第三章:KITTI数据集文件解析
3.1 image 文件
image文件是以8位PNG格式存储,以kitti/training/image_2/000000.png
为例,如下图所示。
3.2 velodyne 文件
velodyne文件是激光雷达的测量数据,以kitti/training/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
...
激光点云数据是以浮点二进制文件格式存储,每行包含8个浮点数数据,其中每个浮点数数据由四位十六进制数表示且通过空格隔开。一个点云数据由4个浮点数数据构成,分别表示点云的x、y、z、r(其中xyz表示点云的坐标,r表示强度或反射值),点云的存储方式如下表所示:
3.3 calib 文件
calib文件是相机、雷达、惯导等传感器的矫正数据,以kitti/training/calib/000000.txt
文件为例,内容如下:
P0: 7.070493000000e+02 0.000000000000e+00 6.040814000000e+02 0.000000000000e+00 0.000000000000e+00 7.070493000000e+02 1.805066000000e+02 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 0.000000000000e+00
P1: 7.070493000000e+02 0.000000000000e+00 6.040814000000e+02 -3.797842000000e+02 0.000000000000e+00 7.070493000000e+02 1.805066000000e+02 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 0.000000000000e+00
P2: 7.070493000000e+02 0.000000000000e+00 6.040814000000e+02 4.575831000000e+01 0.000000000000e+00 7.070493000000e+02 1.805066000000e+02 -3.454157000000e-01 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 4.981016000000e-03
P3: 7.070493000000e+02 0.000000000000e+00 6.040814000000e+02 -3.341081000000e+02 0.000000000000e+00 7.070493000000e+02 1.805066000000e+02 2.330660000000e+00 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 3.201153000000e-03
R0_rect: 9.999128000000e-01 1.009263000000e-02 -8.511932000000e-03 -1.012729000000e-02 9.999406000000e-01 -4.037671000000e-03 8.470675000000e-03 4.123522000000e-03 9.999556000000e-01
Tr_velo_to_cam: 6.927964000000e-03 -9.999722000000e-01 -2.757829000000e-03 -2.457729000000e-02 -1.162982000000e-03 2.749836000000e-03 -9.999955000000e-01 -6.127237000000e-02 9.999753000000e-01 6.931141000000e-03 -1.143899000000e-03 -3.321029000000e-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
calib文件中每一行代表一个参数名,冒号后面是参数矩阵,具体如下:
- P0-P4: 矫正后的相机投影矩阵 R 3 × 4 R^{3\times 4} R3×4,其中0、1、2、3 代表相机的编号,0表示左边灰度相机,1右边灰度相机,2左边彩色相机,3右边彩色相机。
- R0_rect: 矫正后的相机旋转矩阵 R 3 × 3 R^{3\times 3} R3×3,在实际计算时,需要将该3x3的矩阵扩展为4x4的矩阵,方法为在第四行和第四列添加全为0的向量。
- Tr_velo_to_cam: 从雷达到相机的旋转平移矩阵 R 3 × 4 R^{3\times 4} R3×4,在实际计算时,需要将该3x4的矩阵扩展为4x4的矩阵,方法为增加第四行向量[0,0,0,1]。
- Tr_imu_to_velo: 从惯导或GPS装置到相机的旋转平移矩阵 R 3 × 4 R^{3\times 4} R3×4。
注意:将 Velodyne 坐标中的点 x 投影到左侧的彩色图像(P2)中 y,使用以下公式:
y = P 2 ∗ R 0 _ r e c t ∗ T r _ v e l o _ t o _ c a m ∗ x y = P2 * R0\_rect * Tr\_velo\_to\_cam * x y=P2∗R0_rect∗Tr_velo_to_cam∗x
若想将激光雷达坐标系中的点x投射到其他摄像头,只需替换P2矩阵即可(例如右边的彩色相机P3)。
3.4 label 文件
label文件是object的标签和评估数据,以kitti/training/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
label文件中的每一行代表一个object,每一行都有16列分别表示不同的含义,具体如下:
-
第1列(字符串): 代表物体类别(type)
总共有9类,分别是:Car、Van、Truck、Pedestrian、Person_sitting、Cyclist、Tram、Misc、DontCare。其中DontCare标签表示该区域没有被标注,比如由于目标物体距离激光雷达太远。为了防止在评估过程中(主要是计算precision),将本来是目标物体但是因为某些原因而没有标注的区域统计为假阳性(false positives),评估脚本会自动忽略DontCare区域的预测结果。 -
第2列(浮点数): 代表物体是否被截断(truncated)
数值在0(非截断)到1(截断)之间浮动,数字表示指离开图像边界对象的程度。 -
第3列(整数): 代表物体是否被遮挡(occluded)
整数0、1、2、3分别表示被遮挡的程度。 -
第4列(弧度数): 物体的观察角度(alpha)
取值范围为- π \pi π ~ π \pi π(单位:rad),它表示在相机坐标系下,以相机原点为中心,相机原点到物体中心的连线为半径,将物体绕相机y轴旋转至相机z轴,此时物体方向与相机x轴的夹角,如上图所示的夹角 α \alpha α 便是观测角度。 -
第5~8列(浮点数): 物体的2D边界框大小(bbox)
四个数分别是xmin、ymin、xmax、ymax(单位:pixel),表示2D边界框的左上角和右下角的坐标。 -
第9~11列(浮点数): 3D物体的尺寸(dimensions)
三个数分别是高、宽、长(单位:米) -
第12-14列(浮点数): 3D物体的位置(location)
分别是x、y、z(单位:米),特别注意的是,这里的xyz是在相机坐标系下3D物体的中心点位置。 -
第15列(弧度数): 3D物体的方向角(rotation_y)
取值范围为:- π \pi π ~ π \pi π(单位:rad),它表示在相机坐标系下,物体的全局方向角,也就是物体前进方向与相机坐标系x轴的夹角,如上图所示的夹角 θ \theta θ 便是方位角。 -
第16列(浮点数): 检测的置信度(score),要特别注意的是,这个数据只在测试集的数据中有。
3.5 planes 文件
planes文件是是由 AVOD 生成的道路平面信息,其在训练过程中作为一个可选项,用来提高模型的性能,以kitti/training/planes/000000.txt
文件为例,内容如下:
# Matrix
WIDTH 4
HEIGHT 1
-7.051729e-03 -9.997791e-01 -1.980151e-02 1.680367e+00
3.6 KITTI数据集经过MMDetection3D数据预处理后的文件解析
KITTI数据集经过MMDetection3D数据预处理后在kitti文件夹下生成了下列文件:
- velodyne_reduced/xxxxx.bin:文件内容是将原始 velodyne 文件中的点云进行了裁剪,只保留了相机前方90°的点云数据,而舍弃了其它未标注的点云数据,如下图所示,velodyne_reduced 文件内容是图中虚线内的点云数据。
- kitti_gt_database/xxxxx.bin:文件内容是将原始 velodyne 文件中每个场景下的汽车、行人和自行车的点云都单独裁剪出来,包含在 3D 标注框中的点云数据,用于训练时进行数据增强。
- kitti_infos_train.pkl:训练数据集,该字典包含了两个键值:metainfo 和 data_list。metainfo 包含数据集的基本信息,例如 categories, dataset 和 info_version。data_list 是由字典组成的列表,每个字典(以下简称 info)包含了单个样本的所有详细信息。
- info[‘sample_idx’]:该样本在整个数据集的索引。
- info[‘images’]:多个相机捕获的图像信息。是一个字典,包含 5 个键值:CAM0, CAM1, CAM2, CAM3, R0_rect。
- info[‘images’][‘R0_rect’]:校准旋转矩阵,是一个 4x4 数组。
- info[‘images’][‘CAM2’]:包含 CAM2 相机传感器的信息。
- info[‘images’][‘CAM2’][‘img_path’]:图像的文件名。
- info[‘images’][‘CAM2’][‘height’]:图像的高。
- info[‘images’][‘CAM2’][‘width’]:图像的宽。
- info[‘images’][‘CAM2’][‘cam2img’]:相机到图像的变换矩阵,是一个 4x4 数组。
- info[‘images’][‘CAM2’][‘lidar2cam’]:激光雷达到相机的变换矩阵,是一个 4x4 数组。
- info[‘images’][‘CAM2’][‘lidar2img’]:激光雷达到图像的变换矩阵,是一个 4x4 数组。
- info[‘lidar_points’]:是一个字典,包含了激光雷达点相关的信息。
- info[‘lidar_points’][‘lidar_path’]:激光雷达点云数据的文件名。
- info[‘lidar_points’][‘num_pts_feats’]:点的特征维度。
- info[‘lidar_points’][‘Tr_velo_to_cam’]:Velodyne 坐标到相机坐标的变换矩阵,是一个 4x4 数组。
- info[‘lidar_points’][‘Tr_imu_to_velo’]:IMU 坐标到 Velodyne 坐标的变换矩阵,是一个 4x4 数组。
- info[‘instances’]:是一个字典组成的列表。每个字典包含单个实例的所有标注信息。对于其中的第 i 个实例,我们有:
- info[‘instances’][i][‘bbox’]:长度为 4 的列表,以 (x1, y1, x2, y2) 的顺序表示实例的 2D 边界框。
- info[‘instances’][i][‘bbox_3d’]:长度为 7 的列表,以 (x, y, z, l, h, w, yaw) 的顺序表示实例的 3D 边界框。
- info[‘instances’][i][‘bbox_label’]:是一个整数,表示实例的 2D 标签,-1 代表忽略。
- info[‘instances’][i][‘bbox_label_3d’]:是一个整数,表示实例的 3D 标签,-1 代表忽略。
- info[‘instances’][i][‘depth’]:3D 边界框投影到相关图像平面的中心点的深度。
- info[‘instances’][i][‘num_lidar_pts’]:3D 边界框内的激光雷达点数。
- info[‘instances’][i][‘center_2d’]:3D 边界框投影的 2D 中心。
- info[‘instances’][i][‘difficulty’]:KITTI 官方定义的困难度,包括简单、适中、困难。
- info[‘instances’][i][‘truncated’]:从 0(非截断)到 1(截断)的浮点数,其中截断指的是离开检测图像边界的检测目标。
- info[‘instances’][i][‘occluded’]:整数 (0,1,2,3) 表示目标的遮挡状态:0 = 完全可见,1 = 部分遮挡,2 = 大面积遮挡,3 = 未知。
- info[‘instances’][i][‘group_ids’]:用于多部分的物体。
- info[‘plane’](可选):地平面信息。
第四章:KITTI数据集的评价指标
KITTI数据集可以针对很多下游任务,本文只针对3D目标检测的评价数值进行详细解释,如下图所示。
在论文 Disentangling Monocular 3D Object Detection 中对KITTI 3D的评价指标进行了回顾,以及提出了修改:由原来的
A
P
∣
R
11
AP|_{R_{11}}
AP∣R11 修改为了
A
P
∣
R
40
AP|_{R_{40}}
AP∣R40 ,而且KITTI官方也认可了该指标。下面先简单回顾
A
P
∣
R
11
AP|_{R_{11}}
AP∣R11,称为 11-point Interpolated Average Precision
,表示11点插值平均精度,公式为:
A
P
∣
R
=
1
∣
R
∣
∑
r
∈
R
ρ
i
n
t
e
r
p
(
r
)
AP|_{R} =\frac{1}{|R|} \sum_{r\in R}\rho_{interp}(r)
AP∣R=∣R∣1r∈R∑ρinterp(r)
其中插值函数
ρ
i
n
t
e
r
p
(
r
)
=
max
r
′
:
r
′
>
r
ρ
(
r
′
)
\rho_{interp}(r)=\max_{r^{'}:r^{'}> r} \rho(r^{'})
ρinterp(r)=maxr′:r′>rρ(r′),在KITTI3D中
R
11
=
{
0
,
1
10
,
2
10
,
.
.
.
,
1
}
R_{11}=\left \{0,\frac{1}{10},\frac{2}{10},...,1 \right \}
R11={0,101,102,...,1},但是从插值函数的形式可以看出,它并不是取每个
r
r
r 实际观察值的平均值,而是取其中的最大值。
r
r
r 从0开始取,则如果只有单个预测,而且是正确匹配的,则此时对应的
ρ
i
n
t
e
r
p
(
0
)
=
1
\rho_{interp}(0)=1
ρinterp(0)=1。如果每个
r
r
r 都能够提供单一的且正确匹配的预测,那么整个数据集的
A
P
∣
R
11
=
1
11
=
0.909
AP|_{R_{11}}=\frac{1}{11}=0.909
AP∣R11=111=0.909,这个精度已经超过了很多方法,显然这无法正确地评估算法的质量。因此,该论文中提出:不对41个点进行下采样,而是直接利用40个点进行AP的计算,即将
R
11
=
{
0
,
1
10
,
2
10
,
.
.
.
,
1
}
R_{11}=\left \{0,\frac{1}{10},\frac{2}{10},...,1 \right \}
R11={0,101,102,...,1} 修改为
R
40
=
{
1
40
,
2
40
,
3
40
,
.
.
.
,
1
}
R_{40}=\left \{\frac{1}{40},\frac{2}{40},\frac{3}{40},...,1 \right \}
R40={401,402,403,...,1},后面基本上都是采用
A
P
∣
R
40
AP|_{R_{40}}
AP∣R40进行
A
P
AP
AP的计算了。
我们回到前面图片的其它指标,上图是基于mmdetection3d的 PointPillars
模型跑出来的kitti验证结果,训练的是3个类别,分别是行人、骑行者和汽车,对于这三个类其实含义一样,以下就以Car的数值为例进行解释。
我们可以看到,对于Car的评价结果分成两部分,分别是我们的红色框和蓝色框部分。首先解释第一个红色框内容:
- 第一行 Car AP40@0.70, 0.70, 0.70:
Car
表示类别,AP40
表示平均准确率(Average Precision),后面三个0.70
都是指IOU threshold(目标检测中用于评价预测输出边界框与真实框的重叠情况而设置的阈值,从而判断预测结果是否为positive)。我们需要注意第一个0.70
是bbox对应的IOU,表示的意思是在bbox下,只有当预测输出与真实框的IOU大于0.70,才认为该输出是正确的;第二个0.70
是bev对应的IOU,表示的意思是在bev下,只有当预测输出与真实框的IOU大于0.70,才认为该输出是正确的;第三个0.70
是3d对应的IOU,表示的意思是在3d下,只有当预测输出与真实框的IOU大于0.70,才认为该输出是正确的。 - 第二、三、四行的
bbox
、bev
和3d
是对应的三种评价情况。
bbox
就是2d下的检测;bev
(bird’s eye view),就是鸟瞰图下的检测;3d
就是3d下的检测。对于二、三、四、五行,每一行都有三个数值,分别对应的是Easy、Moderate和Hard下的评估结果,表示难度越来越大,所以数值也越来越小。 - 第五行
aos
是对应于物体的朝向预测指标。
aos
表示平均朝向相似度(average orientation similarity),用于评价预测输出的朝向与真实框的朝向的相似程度,通俗来说就是朝向预测得是否准确,结果是越高越好。
第一个红色框内容讲完,接着到第二个蓝色框内容。我们可以发现这两个框的内容基本上是一模一样,唯一区别就是三个IOU改为了0.70,0.50,0.50。也就是说,对于bbox
,它的IOU阈值没有改变,既然IOU阈值没有改变,那么结果当然是一模一样的,所以可以看到两个框的第二行的数值是完全一样的。而对于bev
和3d
,它们的IOU阈值降低了0.20(从0.70, 0.70降低到了0.50, 0.50),通俗地讲就是要求降低了,那么评估的AP结果自然就提高了,所以蓝色框中的第三和第四行的结果要比红色框中的要高。最后一行,对于aos
指标,它的计算条件在这两个框里都是相同的,那么结果当然是一模一样的。
第五章:KITTI数据集可视化
点云的可视化要比图像复杂,需要借助3D显示的工具和库,例如Mayavi、Open3D等。MMDetection 3D基于Open3D构建了若干可视化点云的工具,这里我们采用Open3D来进行点云可视化,使用命令pip install open3d
安装Open3D库。
# 点云可视化
python tools/misc/browse_dataset.py configs/_base_/datasets/kitti-3d-3class.py \
--task lidar_det \
--output-dir work_dirs/lidar
运行上面的命令后将依次展现出KITTI数据集所有点云的可视化结果,如下图所示:
至此,相信大家对于KITTI数据集会有一个更好的理解!感谢大家的观看!