KITTI 视觉基准测试套件:目标基准测试
数据集更新地址:http://www.cvlibs.net/datasets/kitti/eval_object.php。
国内数据集地址:http://bendfunction.f3322.net:666/share/kitti/
该文件介绍了KITTI 2D对象检测和方位估计基准、3D对象检测基准和鸟瞰图基准。基准测试包括每个任务的7481张训练图像(和点云)和7518张测试图像(和点云)。尽管我们已经标记了8个不同的类,但是在我们的基准中只对“Car”和“行人”类进行了评估,因为只有对这些类,才有足够的实例进行了全面评估。标记过程分为两个步骤:首先,我们雇佣了一组注释器,在点云中标记3D包围框的轨迹。因为对于人行轨迹,单个3D包围框轨迹条(尺寸已固定)往往不太合适,所以我们利用Mechanical Turk对每个物体的左右边界进行了额外的标注。我们还收集了对象遮挡状态的标签,并通过将汽车/行人模型反投影到图像平面中,计算了对象的截断。
注1:提交结果时,请将结果以提供GROUND TRUTH数据的相同数据格式存储(见下文),文件名为000000.txt 000001.txt…创建它们的ZIP归档文件,并将结果(仅测试集的结果)存储在根文件夹中。
注2:如果您计划自己评估培训集的结果,请仔细阅读此文件的底部。
注3:提交3D对象检测基准或鸟瞰图基准(2017年)结果时,请仔细阅读以下说明。
特别要注意的是,一定要同时提交2D边界框和3D边界框,以及在图像平面上不可见的过滤器边界框。
数据格式描述
= = = = = = = = = = = = = = = = = = = = = = =
培训和测试的数据可以在相应的文件夹中找到。
子文件夹的结构如下:
- image_02/包含左彩色相机图像(png)
- label_02/包含左彩色相机标签文件(纯文本文件)
- calib/包含所有四个摄像机的校准(纯文本文件)
标签文件包含以下信息,可以使用matlab工具(readtags)读写.m)在这个devkit中提供。
所有值(数值或字符串)都通过空格分隔,每一行对应一个对象。共15列表示:
数 | 名称 | 描述 |
---|---|---|
1 | type 目标类型 | 描述的目标类型有:'Car', 'Van', 'Truck', 'Pedestrian', 'Person_sitting', ‘Cyclist', 'Tram','Misc' or 'DontCare' 对应的介绍为汽车,货车,卡车,行人,坐着的人,骑自行车的人,有轨电车,其他,不关心 |
1 | truncated 截断 | 数值范围 0 非截断 到 1截断 ,其中 truncated表示离开图像边界的对象 |
1 | occluded 遮挡状态 | 整型数值(0,1,2,3)0 =完全可见,1 =部分遮挡,2 =大部分遮挡,3 =未知 |
1 | alpha 方位 | 目标的方位角 范围是 -pi-pi |
4 | bbox 边界框 | 图像中对象的二维边界框(基于0的索引)包含 左,上 右 下 像素坐标 |
3 | dimensions 三维边界 | 三维物体的尺寸 高 宽 长 (米) |
3 | location 位置 | 在相机坐标系下的三维物体的位置(米) |
3 | rotation_y绕y轴旋转 | 在相机坐标系下,绕Y轴旋转ry |
1 | score 置信度 | 仅对结果:Float,表示检测的置信度,对于p/r曲线需要,越高越好 |
在这里,“DontCare”标签表示对象没有被标记的区域,例如,因为它们离激光雷达太远。为防止这样的对象被算作错误的正样本,我们的评估脚本将忽略Don’t care区域的测试集,您可以在训练集中使用Don’t care 标签 来避免你的目标检测器从这些区域获取困难的负样本,如果你考虑将训练图像中的非目标区域视为负样本。
相机坐标系中的坐标可以通过calib文件夹中的3x4投影矩阵投影到图像中,其中提供图像的左侧彩色相机必须使用P2。rotation_y和之间的区别是,rotation_y是直接在相机坐标中给出的,而alpha也考虑了从相机中心到物体中心的向量,来计算物体相对于相机的相对方向。例如,无论汽车在X/Z平面(鸟瞰图)上的什么位置,当汽车面对相机坐标系的X轴时,汽车的旋转值为0,而当物体位于相机的Z轴上时,alpha值仅为0。当小车离开z轴时,观察角度会发生变化。
要将Velodyne坐标中的一个点投影到左边的彩色图像中,可以使用这个公式:x = P2 R0_rect Tr_velo_to_cam y,用于右边的彩色图像:x = P3 R0_rect Tr_velo_to_cam y。
注意:所有的矩阵都是以行为主存储的,即,第一个值对应于第一行。R0_rect包含一个3x3矩阵,您需要将其扩展为4x4矩阵,方法是在右下角添加一个1,在其他地方添加0。Tr_xxx是一个3x4矩阵(R|t),您需要以同样的方式将其扩展到4x4矩阵!
注意,虽然所有这些信息都可以用于训练数据,但是只有特定基准实际需要的数据才必须提供给评估服务器。但是,必须始终提供所有15个值,未使用的值设置为writeLabels.m中指定的默认值(=invalid)。此外,第16个值必须为特定的检测提供一个浮点值,其中越高表示对检测的信心越高。你的分数范围将由我们的评估服务器自动决定,你不需要标准化它,但它应该大致是线性的。如果你使用writeLabelsm用于编写结果,此函数将负责正确存储所需的所有数据。
二维目标检测基准
2D对象检测任务的目标是为“Car”、“行人”和“骑行者”类培训对象检测器。对象检测器必须使用上述格式在图像中提供基于0的2D边界框作为输出,并提供检测分数,表示对检测的置信度。所有其他值都必须设置为默认值(=invalid),请参见上面。每个图像必须在zip存档中提供一个文本文件,其中每个文件可以包含许多检测,这取决于每个图像的对象数量。在我们的评估中,我们只评估图像中大于25像素(高度)的检测对象,而没有将“Van”作为“Car”的错误正样本或“Sitting Person”作为“行人”的错误正样本,因为它们在外观上相似。
作为评价标准,我们采用PASCAL语言,要求边界框的相交-过并集大于50%,才能正确检测出目标。
目标方位估计基准
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
这个基准测试与前一个类似,只是您必须为每次检测额外提供最有可能的相对对象观察角度(=alpha)。如本文所述,我们的评分综合考虑了算法的检测性能和方向估计性能。
三维目标检测基准
3D对象检测任务的目标是为“Car”、“行人”和“骑行者”类训练对象检测器。对象检测器必须同时提供图像中基于0的2D边界框和3D边界框(以上面指定的格式,即3D维数和3D位置)以及检测分数/置信度。注意,2D包围框应该与3D包围框的投影相对应——这需要过滤大于25像素(高度)的对象。我们还注意到,点云中的所有对象都没有被标记。为了避免误报,应该过滤图像平面上不可见的检测(评估不会处理这个问题,请参见“cpp/evaluate_object.cpp”)。与2D目标检测基准类似,我们不将“Van”作为“Car”的假阳性,也不将“Sitting Person”作为“行人”的假阳性。评价准则遵循二维目标检测基准(使用三维边界框重叠)。
鸟瞰图基准
鸟瞰中的目标检测的任务是训练对象探测器的类“汽车”,“行人”,和“骑自行车”的探测器必须提供的2 d基于图像中的边界框以及3 d边界框在鸟瞰和检测得分/信心。这意味着三维包围框不需要包含高度轴上的信息,即包围框的高度和包围框沿高度轴的位置。例如,当只评估鸟瞰图基准(没有3D对象检测基准)时,可以将边界框的高度设置为等于或小于零。类似地,可以将边界框的y轴位置设置为-1000(注意,任何负值都不能工作)。如上所述,我们注意到二维边界框需要过滤大于25像素(高度)的对象,为了避免误报,应该过滤图像平面上不可见的检测。在所有的基准测试中,我们不把“Van”作为“Car”的假阳性,也不把“Sitting Person”作为“行人”的假阳性。评估标准遵循上述基准使用鸟瞰图边界框重叠。
原始数据映射
= = = = = = = = = = = = = = = = = = =
注意,此部分是基准测试的附加部分,解决对象检测任务不需要此部分。为了能够使用激光点云、gps数据、正确的相机图像和灰度图像作为训练数据,我们提供了训练集到KITTI数据集原始数据的映射。 此信息保存在mapping/train_mapping.txt和train_rand中。 txt: train_rand。 txt:随机排列,从目标检测训练集中为每幅图像分配一个唯一的索引。该索引基于1。 train_mapping。txt:将每个惟一索引(基于1的行号)映射到KITTI原始数据集文件的zip文件。 注意,这些文件在网站上被分成几个类别! 示例:训练集中的图像0索引为7282,映射到日期为2011_09_28、驱动器106和帧48。
驱动器和帧是基于0的。
评估协议:
= = = = = = = = = = = = = = = = = = = =
为了提高透明度,我们在这个开发工具包的子文件夹“cpp”中包含了KITTI评估代码。
可透过以下途径编制:
g++ -O3 -DNDEBUG -o evaluate_object evaluate_object.cpp或使用CMake和提供的' Cmakelists.txt'。
重要提示:
这段代码将产生41个值(41个回忆离散化步骤)。
但是,请注意,为了计算平均精度,我们遵循PASCAL协议,并在10%的收回步骤中求和。计算平均精度或方向相似度的伪代码如下:
sum = 0;
for (i=0; i<=40; i+=4)
sum += vals[i];
average = sum/11.0;