KITTI数据集

1.kitti数据集概述【数据集主页: http://www.cvlibs.net/datasets/kitti/raw_data.php

KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办,是目前国际上最大的自动驾驶场景下的计算机视觉算法评测数据集。该数据集用于评测立体图像(stereo),光流(optical flow),视觉测距(visual odometry),3D物体检测(object detection)和3D跟踪(tracking)等计算机视觉技术在车载环境下的性能。KITTI包含市区、乡村和高速公路等场景采集的真实图像数据,每张图像中最多达15辆车和30个行人,还有各种程度的遮挡与截断。整个数据集由389对立体图像和光流图,39.2 km视觉测距序列以及超过200k 3D标注物体的图像组成[1] ,以10Hz的频率采样及同步。总体上看,原始数据集被分类为’Road’, ’City’, ’Residential’, ’Campus’ 和 ’Person’。对于3D物体检测,label细分为car, van, truck, pedestrian, pedestrian(sitting), cyclist, tram以及misc组成。

需要注意的是,这个数据集中的点云仅包含各个点的三维坐标,而没有相应的颜色信息.

2.数据采集平台

如图-1所示,KITTI数据集的数据采集平台装配有2个灰度摄像机,2个彩色摄像机,一个Velodyne 64线的360度3D激光雷达,4个光学镜头,以及1个GPS导航系统。具体的传感器参数如下[2] :

  • 2 × PointGray Flea2 grayscale cameras (FL2-14S3M-C), 1.4 Megapixels, 1/2” Sony ICX267 CCD, global shutter
  • 2 × PointGray Flea2 color cameras (FL2-14S3C-C), 1.4 Megapixels, 1/2” Sony ICX267 CCD, global shutter
  • 4 × Edmund Optics lenses, 4mm, opening angle ∼ 90◦, vertical opening angle of region of interest (ROI) ∼ 35◦
  • 1 × Velodyne HDL-64E rotating 3D laser scanner, 10 Hz, 64 beams, 0.09 degree angular resolution, 2 cm distance accuracy, collecting ∼ 1.3 million points/second, field of view: 360◦ horizontal, 26.8◦ vertical, range: 120 m
  • 1 × OXTS RT3003 inertial and GPS navigation system, 6 axis, 100 Hz, L1/L2 RTK, resolution: 0.02m / 0.1◦

 图-1 数据采集平台

注解:

  • 红色3维坐标系的原点是一个摄像机,蓝色坐标系X的左上角所在位置是一个摄像机,这两个一个是灰度摄像机,一个是彩色摄像机,它们组成一对摄像机。红色数字2的下面是另一对摄像机。

  • 64线的激光雷达可以测距,可以辅助摄像头知道自己到被拍照物体之间的距离(depth),有的时候,物体的表面如果是黑色的或者是玻璃,那么激光大部分会被吸收,反射率很低,此时缺少激光的部分,摄像机可以拍照看清,所以,它们形成一个互补。
  • IMU可以知道车辆每一时刻的物理量,加速度,角速度,俯仰角,横滚角,方位角。

  如图-2所示为传感器的配置平面图。为了生成双目立体图像,相同类型的摄像头相距54cm安装。由于彩色摄像机的分辨率和对比度不够好,所以还使用了两个立体灰度摄像机,它和彩色摄像机相距6cm安装。为了方便传感器数据标定,规定坐标系方向如下[2] :
Camera: x = right, y = down, z = forward
Velodyne: x = forward, y = left, z = up
GPS/IMU: x = forward, y = left, z = up

图-2 传感器设置

 

3.Dataset详述

  图-3展示了KITTI数据集的典型样本,分为 ’Road’, ’City’, ’Residential’, ’Campus’ 和’Person’五类。原始数据采集于2011年的5天,共有180GB数据。
这里写图片描述
                    图-3 KITTI数据集的样本,展现KITTI数据集的多样性。

3.1 数据组织形式

  论文[2] 中提及的数据组织形式,可能是早期的版本,与目前KITTI数据集官网公布的形式不同,本文稍作介绍。
如图-4所示,一个视频序列的所有传感器数据都存储于data_drive文件夹下,其中date和drive是占位符,表示采集数据的日期和视频编号。时间戳记录在Timestamps.txt文件。
    这里写图片描述
                    图-4 数据组织形式
  对于从KITTI数据集官网下载的各个分任务的数据集,其文件组织形式较为简单。以Object detection为例,下图是Object Detection Evaluation 2012标准数据集中left color images文件的目录结构,样本分别存储于testing和training数据集。

data_object_image_2
|── testing
│ └── image_2
└── training
└── image_2

  下图是training数据集的label文件夹目录结构。

training/
└── label_2

3.2 Annotations

  KITTI数据集为摄像机视野内的运动物体提供一个3D边框标注(使用激光雷达的坐标系)。该数据集的标注一共分为8个类别:’Car’, ’Van’, ’Truck’, ’Pedestrian’, ’Person (sit- ting)’, ’Cyclist’, ’Tram’ 和’Misc’ (e.g., Trailers, Segways)。论文[2] 中说明了3D标注信息存储于date_drive_tracklets.xml,每一个物体的标注都由所属类别和3D尺寸(height,weight和length)组成。当前数据集的标注存于每种任务子数据集的label文件夹中,稍有不同。
  为了说明KITTI数据集的标注格式,本文以Object detection任务的数据集为例。数据说明在Object development kit的readme.txt文档中。从标注数据的链接 training labels of object data set (5 MB)下载数据,解压文件后进入目录,每张图像对应一个.txt文件。一帧图像与其对应的.txt标注文件如图-5所示。
    这里写图片描述
                    图-5 object detection样本与标注
  为了理解标注文件各个字段的含义,需要阅读解释标注文件的readme.txt文件。该文件存储于object development kit (1 MB)文件中,readme详细介绍了子数据集的样本容量,label类别数目,文件组织格式,标注格式,评价方式等内容。下面介绍数据格式的label描述:
    这里写图片描述
  注意,’DontCare’ 标签表示该区域没有被标注,比如由于目标物体距离激光雷达太远。为了防止在评估过程中(主要是计算precision),将本来是目标物体但是因为某些原因而没有标注的区域统计为假阳性(false positives),评估脚本会自动忽略’DontCare’ 区域的预测结果。

3.3 Development Kit

  KITTI各个子数据集都提供开发工具 development kit,主要由cpp文件夹,matlab文件夹,mapping文件夹和readme.txt组成。下图以object detection任务的文件夹devkit_object为例,可以看到cpp文件夹主要包含评估模型的源代码evaluate_object.cpp。Mapping文件夹中的文件记录训练集到原始数据集的映射,从而开发者能够同时使用激光雷达点云,gps数据,右边彩色摄像机数据以及灰度摄像机图像等多模态数据。Matlab文件夹中的工具包含读写标签,绘制2D/3D标注框,运行demo等工具。Readme.txt文件非常重要,详述介绍了某个子数据集的数据格式,benchmark介绍,结果评估方法等详细内容。

devkit_object
|── cpp
│ |── evaluate_object.cpp
│ └── mail.h
|── mapping
│ |── train_mapping.txt
│ └── train_rand.txt
|── matlab
│ |── computeBox3D.m
│ |── computeOrientation3D.m
│ |── drawBox2D.m
│ |── drawBox3D.m
│ |── projectToImage.m
│ |── readCalibration.m
│ |── readLabels.m
│ |── run_demo.m
│ |── run_readWriteDemo.m
│ |── run_statistics.m
│ |── visualization.m
│ └── writeLabels.m

4.评价准则Evaluation Metrics

4.1 stereo与visual odometry任务

  KITTI数据集针对不同的任务采用不同的评价准则。对于立体图像和光流(stereo and optical flow),依据disparity 和end-point error计算得到平均错误像素数目(average number of erroneous pixels)。
  对于视觉测距和SLAM任务(visual odometry/SLAM),根据轨迹终点(trajectory end-point)的误差进行评估。传统的方法同时考虑平移和旋转的误差,KITTI分开评估[1] :
    这里写图片描述
                    图-6 Stereo和optical flow的预测结果与评估

4.2 3D物体检测和方向预测

  目标检测需要同时实现目标定位和目标识别两项任务。其中,通过比较预测边框和ground truth边框的重叠程度(Intersection over Union,IoU)和阈值(e.g. 0.5)的大小判定目标定位的正确性;通过置信度分数和阈值的比较确定目标识别的正确性。以上两步综合判定目标检测是否正确,最终将多类别目标的检测问题转换为“某类物体检测正确、检测错误”的二分类问题,从而可以构造混淆矩阵,使用目标分类的一系列指标评估模型精度。
  KITTI数据集采用文献[3] 用到的平均正确率(Average Precision,mAP)评估单类目标检测模型的结果。PASCAL Visual Object Classes Challenge2007 (VOC2007)[3] 数据集使用Precision-Recall曲线进行定性分析,使用average precision(AP)定量分析模型精度。物体检测评估标准对物体漏检和错检进行惩罚,同时规定对同一物体重复且正确的检测只算一次,多余的检测视为错误(假阳性)。
  对于每一张样本和某一个给定类型的检测器,算法输出预测结果 ,表示检测出图像中有个物体,每个物体的位置信息和置信度分布是和。
  为了评估边界框定位的准确性,使用检测框与ground truth框之间的重合度来度量:
            这里写图片描述
  如果则说明检测到的边框和图像上该类的ground truth匹配,此时。为了防止重复检测,如果边框与ground truth多个边框重合度都大于50%,取重合度最大的视为对的匹配。检测算法对真实物体的重复检测,只算其中一次为正确预测,其余的重复预测视为错误检测。
  对于一个给定类别,N是该类所有图像上的真实物体数目。物体检测任务采用PR曲线和AP值评估模型精度,给定不同阈值t,得到不同的召回率和精确率,从而可以绘制P-R曲线,计算每个检测器的AP值:
            这里写图片描述
  评价精确率AP是P-R曲线的积分值,当t是离散的情况时,AP就是不同t的召回率对应的精确率的平均值。为了简化计算,PASCAL VOC2007采用插值的方法,使用11个等间距recall上的精确值的平均值作为分类器的AP。召回率取值[0,0.1,…,1],计算公式如下:
            这里写图片描述
  每个召回率r上的精确值由大于r所对应精确率的最大值插值来决定:
            这里写图片描述
  对于KITTI目标检测任务,仅仅评估目标高度大于25pixel的预测结果,将易混淆的类别视为同一类以减少假阳性(false positives)率,并且使用41个等间距recall上的精确值的平均值近似计算分类器的AP。
对于物体方向预测,文献[1] 提出了一种新颖的方法:平均方向相似性,Average Orientation Similarity (AOS)。该指标被定义为:
            这里写图片描述
  其中,r代表物体检测的召回率recall。在因变量r下,方向相似性s∈[0,1]被定义为所有预测样本与ground truth余弦距离的归一化:
            这里写图片描述
  其中D(r)表示在召回率r下所有预测为正样本的集合,∆θ(i) 表示检出物体i的预测角度与ground truth的差。为了惩罚多个检出匹配到同一个ground truth,如果检出i已经匹配到ground truth(IoU至少50%)设置δi = 1,否则δi = 0。

5. 数据使用实践

  KITTI数据集的标注信息更加丰富,在实际使用中可能只需要一部分字段,或者需要转换成其他数据集的格式。例如可以将KITTI数据集转换成PASCAL VOC格式,从而更方便地使用Faster RCNN或者SSD等先进的检测算法进行训练。转换KITTI数据集需要注意源数据集和目标数据集的格式,类别标签的重新处理等问题,实现细节建议参考Jesse_Mx[4] 和github上manutdzou的开源项目[5] ,这些资料介绍了转换KITTI数据集为PASCAL VOC格式,从而方便训练Faster RCNN或者SSD等模型。

Reference

[1] Andreas Geiger and Philip Lenz and Raquel Urtasun. Are we ready for Autonomous Driving? The KITTI Vision Benchmark Suite. CVPR, 2012
[2] Andreas Geiger and Philip Lenz and Christoph Stiller and Raquel Urtasun. Vision meets Robotics: The KITTI Dataset. IJRR, 2013
[3] M. Everingham, L.Van Gool, C. K. I.Williams, J.Winn, and A. Zisserman. The PASCAL Visual Object Classes Challenge 2011 (VOC2011) Results.
[4] Jesse_Mx.SD: Single Shot MultiBox Detector 训练KITTI数据集(1).
http://blog.csdn.net/jesse_mx/article/details/65634482
[5]manutdzou.manutdzou/KITTI_SSD.https://github.com/manutdzou/KITTI_SSD
附录
    这里写图片描述
                    图-7 不同类别物体在数据集中出现的频率(上图);
对于两个主要类别(车辆,行人)主要的方向统计直方图(下图)
    这里写图片描述
                    图-8 每张图中不同类别物体出现频率统计。
    这里写图片描述
                    图-9 分别为速度,加速度(排除静止状态)统计直方图;视频序列长度统计直方图;每种场景(e.g., Campus, city)的帧数统计直方图。

 https://blog.csdn.net/Solomon1558/article/details/70173223



各设备坐标系、距离信息由上图可见。坐标系转换原理参见click。其实KITTI提供的数据中都包含三者的标定文件,不需人工转换。

从图中可看出,关于相机坐标系(camera)的方向与雷达坐标系(velodyne)的方向规定:

camera:  x = right, y = down, z = forward

velodyne: x = forward, y = left, z = up

那么velodyne所采集到的点云数据中,各点的x轴坐标,即为所需的深度信息。

kitti数据集的raw_data

raw_data对于每个序列都提供了同步且校准后的数据、标定数据。

同步且校准后的数据:

./imageXX 包含有各个摄像机采集到的图像序列

./velodyne_points 包含有雷达扫描到的数据,点云形式,每个点以 (x,y,z,i) 格式存储,i为反射值

(雷达采集数据时,是绕着竖直轴旋转扫描,只有当雷达旋转到与相机的朝向一致时会触发相机采集图像。不过在这里无需关注这一点,直接使用给出的同步且校准后的数据即可,它已将雷达数据与相机数据对齐,也就是可以认为同一文件名对应的图像数据与雷达点云数据属于同一个场景。)

标定数据:

./cam_to_cam 包含有各个摄像机的标定参数

./velo_to_cam 包含有雷达到摄像机的变换参数

对于raw_data,kitti还提供了样例工具,方便读取各种数据文件并输出,参见官网raw_data下载页的development kit

利用kitti提供的devkit以及相应数据集的calib文件

解读calib文件夹

cam_to_cam,包含各相机的标定参数

  - S_xx: 1x2 矫正前xx号相机的图片尺寸
  - K_xx: 3x3 矫正前xx号相机的标定参数
  - D_xx: 1x5 矫正前xx号相机的畸变系数
  - R_xx: 3x3 外参,xx号相机的旋转矩阵
  - T_xx: 3x1 外参,xx号相机的平移矩阵
  - S_rect_xx: 1x2 矫正后XX号相机的图片尺寸
  - R_rect_xx: 3x3 旋转矩阵,用于矫正xx号相机,使得图像平面共面(原话是make image planes co-planar)。
  - P_rect_0x: 3x4 投影矩阵,用于从矫正后的0号相机坐标系 投影到 X号相机的图像平面。

这里只用到最后两个矩阵R_rect和P_rect

velo_to_cam,从雷达坐标系到0号相机坐标系的转换

  - R: 3x3 旋转矩阵
  - T:  3x1 平移矩阵
  - delta_f 和delta_c 已被弃用

由此可以得出从雷达坐标系变换到xx号相机的图像坐标系的公式:

设X为雷达坐标系中的齐次坐标 X = [x y z 1]',对应于xx号相机的图像坐标系的齐次坐标Y = [u v 1]',则:

其中 

(R|T) :        雷达坐标系  ->  0号相机坐标系
R_rect_00: 0号相机坐标系 -> 矫正后的0号相机坐标系
P_rect_0x: 矫正后的0号相机坐标系  ->  x号相机的图像平面
更详细完整的解读参见devkit中的readme.txt

解读devkit

官网提供的样例代码中 run_demoVelodyne.m 实现了将雷达点云投影到相机图像

代码流程

  1. 从所给路径中读取标定文件,获取具体矩阵数值
  2. 根据上述公式,计算投影矩阵 P_velo_to_img,即 Y = P_velo_to_img * X
  3. 从所给路径中读取相机图片,并加载雷达的点云数据。由于只做展示用,为了加快运行速度,对于雷达点云,每隔5个点只保留1个点
  4. 移除那些距离雷达5米之内(雷达的x方向)的点 (猜测这些点落在相机和雷达之间,故不会出现在图像平面上)
  5. 作投影计算,得到投影到二维图像上的点
    6.在图像上画出投影后的点,按照深度(雷达点的x方向值)确定颜色,彩色则是暖色越近,冷色越远;灰度则是深色越近,浅色越远。

若需要从深度图获取深度值,应按照画投影点时深度值到颜色(灰度)值的转换。

来源:https://www.cnblogs.com/notesbyY/p/10478645.html

posted on 2019-10-16 14:39  一杯明月  阅读(17304)  评论(0编辑  收藏  举报