赞
踩
KITTI数据集(Karlsruhe Institute of Technology and Toyota Technological Institute dataset)是一个常用的自动驾驶和计算机视觉领域的数据集。它提供了大量的传感器数据,例如激光雷达、相机图像、GPS和IMU数据等,用于研究与开发自动驾驶车辆和视觉感知相关的算法。
KITTI官网网址: https://www.cvlibs.net/datasets/kitti/index.php
本篇文章参考:一文带你了解KITTI数据集
KITTI数据集采集车的传感器布置平面如上图所示,车辆装配有2个灰度摄像机,2个彩色摄像机,一个Velodyne 64线3D激光雷达,4个光学镜头,以及1个GPS导航系统,在上图中使用了红色标记。
双目相机之间的距离为0.54米,点云到相机之间的距离为0.27米,在上图中使用了蓝色标记。
图中蓝色的坐标系表示激光点云的坐标系,红色的坐标系表示相机的坐标系。
官网网址:KITTI 3D object detection dataset
道路平面信息:https://download.openmmlab.com/mmdetection3d/data/train_planes.zip
其中,道路平面信息是由 AVOD 生成的,其在训练过程中作为一个可选项,用来提高模型的性能。
在官网下载KITTI数据集后,在mmdetection3d文件夹下组织成以下所示的结构。
mmdetection3d ├── configs ├── mmdet3d ├── tools ├── data │ ├── kitti │ │ ├── ImageSets │ │ ├── testing │ │ │ ├── calib │ │ │ ├── image_2 │ │ │ ├── velodyne │ │ ├── training │ │ │ ├── calib │ │ │ ├── image_2 │ │ │ ├── label_2 │ │ │ ├── velodyne │ │ │ ├── planes
项目的数据预处理需要使用tools/create_data.py重新处理一次。
创建 KITTI 点云数据,首先需要加载原始的点云数据并生成相关的包含目标标签和标注框的数据标注文件,同时还需要为 KITTI 数据集生成每个单独的训练目标的点云数据,并将其存储在 data/kitti/kitti_gt_database
的 .bin
格式的文件中。此外,需要为训练数据或者验证数据生成 .pkl
格式的包含数据信息的文件。
cd mmdetection3d
mkdir ./data/kitti/ImageSets
# Download data split
#wegt未安装或者版本较低时,需要手动下载安装并设置环境变量
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
小吐槽:我的wegt需要重新安装(https://eternallybored.org/misc/wget/,下载.exe程序放入C:\Windows\System32)。此外,我下载过程一直出现主机地址无法解析的问题,解决方法是重新手动配置DNS,找到正在使用的网络连接,右键点击并选择 “属性”,选中 “Internet 协议版本 4(TCP/IPv4)” ,手动设置 DNS:我选用了Google 的 DNS 服务器:首选 DNS 为 8.8.8.8,备用 DNS 为 8.8.4.4,更改后重连网络即可。
运行完成后,如图:
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_train.pkl ├── kitti_infos_val.pkl ├── kitti_dbinfos_train.pkl ├── kitti_infos_test.pkl ├── kitti_infos_trainval.pkl
image文件是以8位PNG格式存储,以kitti/training/image_2/000000.png
为例,如下图所:
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表示强度或反射值),点云的存储方式如下表所示:
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
: 矫正后的相机投影矩阵 R3×4,其中0、1、2、3 代表相机的编号,0表示左边灰度相机,1右边灰度相机,2左边彩色相机,3右边彩色相机。R0_rect
: 矫正后的相机旋转矩阵 R3×3,在实际计算时,需要将该3x3的矩阵扩展为4x4的矩阵,方法为在第四行和第四列添加全为0的向量。Tr_velo_to_cam
: 从雷达到相机的旋转平移矩阵 R3×4 ,在实际计算时,需要将该3x4的矩阵扩展为4x4的矩阵,方法为增加第四行向量[0,0,0,1]。Tr_imu_to_velo
: 从惯导或GPS装置到相机的旋转平移矩阵 R3×4。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列分别表示不同的含义,具体如下:
planes文件是是由 AVOD 生成的道路平面信息,其在训练过程中作为一个可选项,用来提高模型的性能,以kitti/training/planes/000000.txt
文件为例,内容如下:
# Matrix
WIDTH 4
HEIGHT 1
-7.051729e-03 -9.997791e-01 -1.980151e-02 1.680367e+00
velodyne_reduced/xxxxx.bin
:文件内容是将原始 velodyne 文件中的点云进行了裁剪,只保留了相机前方90°的点云数据,而舍弃了其它未标注的点云数据。kitti_gt_database/xxxxx.bin
:文件内容是将原始 velodyne 文件中每个场景下的汽车、行人和自行车的点云都单独裁剪出来,包含在 3D 标注框中的点云数据,用于训练时进行数据增强。kitti_infos_train.pkl
:训练数据集,该字典包含了两个键值:metainfo 和 data_list。metainfo 包含数据集的基本信息,例如 categories, dataset 和 info_version。基于上文mmdetection3d的 PointPillars 模型跑出来的kitti验证结果(基于 mmdetection3D 的点云目标检测),训练的是3个类别,分别是行人、骑行者和汽车,对于这三个类其实含义一样,以下就以Car的数值为例进行解释。
对于Car的评价结果分成红色框和蓝色框两部分。对第一个红色框内容:
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
,表示只有当预测输出与真实框的IOU大于0.70,才认为该输出是正确的。bbox
就是2d下的检测;bev
(bird’s eye view),就是鸟瞰图下的检测;3d
就是3d下的检测。对于二、三、四、五行,每一行都有三个数值,分别对应的是Easy、Moderate和Hard
下的评估结果,表示难度越来越大,所以数值也越来越小。aos表示平均朝向相似度
(average orientation similarity),用于评价预测输出的朝向与真实框的朝向的相似程度,通俗来说就是朝向预测得是否准确,结果是越高越好。对于第二个蓝色框,它与红色框基本相同,唯一区别就是三个IOU改为了0.70,0.50,0.50
。也就是说,对于bbox
,它的IOU阈值没有改变,结果也与红色框相同。而对于bev
和3d
,它们的IOU阈值降低了0.20(从0.70, 0.70降低到了0.50, 0.50),也就是要求降低了,那么评估的AP结果就提高了,所以蓝色框中的第三和第四行的结果要比红色框中的要高。最后一行,对于aos
指标,它的计算条件在这两个框里都是相同的,那么结果一样。
点云的可视化要比图像复杂,需要借助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数据集所有点云的可视化结果,如下图所示:
图片结果保存在D:\mmdetection3d\work_dirs\lidar
,如下:
选取第一张图片的原图与点云目标检测进行对比如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。