写在前面

大家好久不见,距离上一篇MOT相关博客发表正好已经过了一年。这一年笔者间也是继续深耕多目标跟踪领域,对此领域也产生了一些更加深刻的理解。作为主要作者发表的CAMO-MOT也在nuScenes榜单上占据第一位置半年有余。与此同时,此期间产生的一个初心就是继续产出高质量的,易于大家理解的技术博客,让更多的人来建设这个领域。一年过去了,从这篇博客开始,笔者将继续介绍多目标跟踪。本篇博客的概要如下:

  • NuScenes的介绍
  • NuScenes的使用和打开方式
  • NuScenes在使用中容易产生的疑问与问题

前景提要

在之前的博客中从KITTI看MOT,笔者以KITTI数据集为例,介绍多目标跟踪任务的定义、指标和基本解法。然而,KITTI作为十年前产出的数据集,在数据量(物体标注数量,物体类别,传感器数量和类被的维度等)上已经无法与NuScenes、Waymo等现代自动驾驶数据集相比。
NuScenes数据集是在这场自动驾驶数据集竞赛中的佼佼者,笔者认为其相较于Waymo, Argoverse等竞争者有着下面的优势:

  • 非常详细的入门文档和代码,文档中不但包括数据集本身架构的Tutorials,还包含各个任务(预测prediction、激光分割等)的Tutorials,各个Tutorials均是jupyter notebook的文件格式,这对初学者非常友好,可以非常方便和直观的进行函数的调用。
  • 非常良好的社区环境,NuScenes数据集的github中几乎不会有open状态的issue, 每一个提问的问题都会有大牛来回答,并且回答的非常详细,属于为爱发电。同时,mmdetection等知名开源检测框架均支持NuScenes数据集,拥有较低的开发门槛。
  • 较宽松的商业许可,这点是通常被大家忽略的一点。例如你的模型在Waymo数据集上进行训练,并代码开源,但是你的模型权重是无法在github上进行共享的,这个特点不利于大家在他人的模型上进行开发。

数据集使用与打开方式

本文不会像其他的博客一样,对数据集的基本用法进行介绍。

  • 一是正如上节所说的:数据集本身的入门文档和代码已经非常详细,地址在这
  • 二是重复造轮子是没意义的,笔者在初接触此数据集时,看到了一个非常良心且细致的介绍NuScenes数据集的中文博客,博客内容大抵就是对官方Tutorials的翻译,但是写的已经足够丰富和详细,也希望大家能直接在这个博客进行数据集内容的了解,地址在这

使用中容易产生的问题与解答

此节笔者将主要聚焦于四个在使用过程中容易产生的数据集问题,使用代码和文字的方法对问题进行解答。重要提示,此节需要大家会对NuScenes数据集进行基本使用

Q1:不同scene的calibrated sensor不一样是因为使用的车辆不一样吗(即使是同一个城市)?

不是的,车辆型号都是一样的,calibrated sensor针对的是传感器,按照数据集的数据构造,其值主要取决于两个事情:

  • 传感器的安装位置(平移translation和旋转rotation)
  • 额外的,对相机来说,还有相机内参(camera instrinsic)

因此calibrated sensor之所以不同可以参考一下几个原因:

  • 对不用类传感器而言,传感器的安装位置不同
  • 对同一类传感器而言(例如相机),数据集的车载平台具有六路摄像头(参考nuscenes官网的数据车图),每一个摄像头显然具有其自己独特的内参
  • 对数据集本身而言,对每一个场景给定传感器参数是一个数据集的最基础工作。针对此类,传感器参数不同主要参考以下原因:
    • 每一个场景的采集时间不同,有的晚上,有的白天。无法避免的传感器位置容易出现变换
    • 即使是接连采集场景(时间很近),即使传感器位置几乎没有变换,给定传感器参数也是一个必要的工作
    • 有的不同可能只是微乎其微

Q2:ego_pose是指车辆自身的坐标吗,还是传感器到全局坐标系的变换系数?为什么同一个时刻(汽车位置固定)下不同的传感器有不同的ego_pose?(即ego_pose的数量等于sample_data的数量)?

A1: 首先,是的,ego_pose是指车辆自身相对于世界坐标系global frame的坐标,接着,为什么要设立ego_pose?这是因为calibrated sensor均是相对于车身描述的,这很好理解,相对来说,传感器相对于车的位置是不变的,可以很好标定的(相对于传感器向世界坐标系标定)

A2: 第二个问题需要肯定是,ego_pose的数量等于sample_data的数量,这句话没问题。但是同一个时刻(汽车位置固定)这个理解是有问题的,主要下面的误区:

  • sample data的各个传感器的采样时间是不同的。正如下面第四个问题所说的,由于传感器不同的采样周期(LiDAR为10HZ,相机为20HZ?(如果笔者没记错的话)),同一个key sample下的sample data有着不同的标注时间,这导致,不同传感器采样的时刻虽然非常相近,但是仍然是有差异的。
  • 车身位置是不固定的。如上面所说的,如果车辆正在行驶中,即使是非常微小的时间差异车身也会产生微小的位移。一个简单的例子:
    nuscenes厘米级位移

可以看到,ego_pose的移动是厘米级的,这个微小位移在实际处理中可以忽略不计

Q3:sample_data包含samples和sweeps文件夹下的所有传感器记录数据,但只有samples文件夹下的传感器记录数据是关键帧,具有sample_annotation

是的,sweeps可以认为是不带标记的垃圾帧。大部分情况我们是不使用sweeps的。但是一个有趣的事情是,会有一些跟踪算法simpletrack或者三维检测算法centerpoint使用关键帧对垃圾帧进行标注(例如使用插值等方法),让他们发挥一些用处。

Q4:sample的采样时间作为关键帧的时间戳,但由于此时可能不在传感器的采样周期中,所以选取各传感器最近一次采样时间作为该sample时刻的sample_data

简单来说,NuScenes使用了一些法则尽量让各个传感器的采样时间接近。NuScenes将LiDAR的采样时间作为基准,让其他传感器与其时间戳尽量相近。至于关键帧的时间戳,应当是将LiDAR的采样时间作为时间戳。

写在后面

本文从数据集介绍、粗略使用和疑问解答对现代知名自动驾驶数据集NuScenes进行了讲解。在后面的博客中,笔者将还是聚焦于数据集的高级用法函数接口API背后的深入逻辑,对NuScenes数据集进行深入的介绍。