nuscenes数据集分析
标注与总体介绍
nuscenes包含有相机、激光雷达、毫米波雷达、IMU与GPS等设备提供的数据。它的数据采集了1000个场景,每个场景大约有20s,针对目标检测任务,对23类物体进行标注,且以2Hz的频率提供精确的三维目标框标注。此外,还有物体级别的属性如可见度、姿态、活动状态等。
具体来说,对于标注数据,标注的要求有以下几点:
- 一个物体不超过一个框,确保所有点在框中且在图像视角看着正常。
- 如果对于一个物体能够判断出他的位置形状等,且至少有一个点云,就标注它。
- 框要紧凑,如果目标物体有外延如胳膊腿等要包含进来,但像车的侧边镜或超过一定高度的外延不需要考虑。如果目标携带其他物体,需要包含进来,若多个目标携带一个东西,则这个东西只能包含在一个框中。
- 如果由于定位误差导致一个静止的物体移动,同样要标注框。对于点云稀疏的物体,用图像辅助框进行调整。
标注的物体类别有23类,
- 此外他们还有属性
Visibility
,它代表该物体在全景视角下的可见程度。 - 对于有四个轮子以上的汽车有属性
Vehicle Activity
,它有三种选择,Parked代表静止的,Stopped代表静止的,但是司机在上面,Moving代表在移动。 - 对于自行车、摩托车与个人便携移动工具,有属性
Has Ride
,它有Yes与No代表是否有人在上面。 - 对于场景中的人有属性
Human Activity
,可以有Sitting or Lying Down,Standing与Moving三种。
在元数据中,maps文件夹就是我们采集场景的4张地图。
数据格式介绍
所有的标注数据与元数据都以关系数据库的形式组织起来,接下来将分别介绍。
下面三个记录了我们需要标注的属性
- 对于
visibility.json
,记录了四种不同程度的可见程度。 - 对于
attribute.json
,记录了动态物体的运动状态,也就是上一节说到的Vehicle Activity等等,通过token进行标识。 - 对于
category
,记录的就是类别信息,一共有23类。
下面四个则是我们汽车的一些记录信息,如传感器参数,地图等。
- 对于
log
,记录的是数据采集的日志信息,它包含以下的信息,vehicle代表车名,date_captured代表数据采集日期,location代表采集地点,logfile代表数据日志文件名,可能多个场景对应同个日志。 - 对于
map
,它描述了每段数据采集的语义地图,包含有category表示语义先验图,filename代表地图文件路径,log_tokens为一个列表,包含所有在该地图下进行数据采集的log_token。 - 对于
sensor,
它记录了我们的传感器,即6个相机,lidar与radar等,包含有channel表示它具体的通道,如CAM_FRONT,CAM_BACK_LEFT等等,modality标识它的传感器类别。 - 对于
calibrated_sensor
,他记录了对传感器标定的参数信息,其中的sensor_token定义传感器对象,translation与rotation则是外参,camera_intrinsic则是相机内参矩阵。
下面四个是关于具体采集数据时的一些信息记录。
- 对于
ego_pose
,他记录了具体时间戳下的车辆相对于世界坐标系的外参,即translation与rotation,还有timestamp记录时间戳。 - 对于
scene
,他是从log中提取的连续的20s长的连续帧,可能多个scene取自一个log。包含的信息有,log_token告诉我们来自哪个log,nbr_samples告诉我们samples的数量,first_sample_token代表该场景下第一个sample的token,last_sample_token代表该场景下最后一个sample,name即场景的名字,description是场景详细描述。 - 对于
sample
,它代表关键采样帧,频率为2HZ,包含以下信息,timestamp代表时间戳信息,prev与next代表前一个与下一个sample的token,scene_token对应的是该sample属于的场景token。 - 对于
sample_data
,代表传感器采集的原始数据。sample_token为所属的sample的token,要选择时间上最接近的;ego_pose_token代表汽车位姿信息;calibrated_sensor_token代表传感器内外参信息;filename代表文件的相对路径;fileformat为数据文件的格式;width与height代表如果是图片,它的宽高;timestamp为时间戳;is_key_frame代表sample_data是否是关键帧。next与prev代表在该场景下该传感器顺着时间向前向后的一个Sample data。
下面是标注信息的介绍
- 对于
instance
,代表的就是单个物体实例。category_token指向类别,nbr_annotations为该实例被标注的数量。first_annotation_token与last_annotation_token指向sample_annotation,代表第一次与最后一次被标注的token,指向sample_annotation。 - 对于
sample_annotation
,它是坐标框信息,定义了在sample中看到的物体的位置,所有位置信息都是全局坐标系下的,sample_token代表对应的sample,instance_token代表对应的实例,attribute_tokens与attribute_tokens即属性,translation代表框的中心位置,size代表框的大小,rotation代表框的朝向,num_lidar_pts代表此边界框内的激光雷达点数,next与prev指向自身,代表同一物体之前之后的下一个标注token。
nuscenes数据集的使用
在这里以mini数据集为例
#导入nuscenes开发包,并把数据集加载进来,得到对象nusc。
from nuscenes.nuscenes import NuScenes
nusc = NuScenes(version='v1.0-mini', dataroot='/data/sets/nuscenes', verbose=True)
#可以使用nusc访问我们的场景,具体展示如下
my_scene = nusc.scene[0]
print(my_scene)
#接下来获得该场景下的第一个sample
first_sample_token = my_scene['first_sample_token']
my_sample = nusc.get('sample', first_sample_token)
print(my_sample)
#展示如下所示,它提功了该sample对应的数据sample_data以及所需要的标注信息sample_annotation。
#接下来看data数据是什么样子的
sensor = 'CAM_FRONT'
cam_front_data = nusc.get('sample_data', my_sample['data'][sensor])
print(cam_front_data)
#此外,还可以对此进行渲染,如图所示
nusc.render_sample_data(cam_front_data['token'])
#这个则是获取标注信息,同样可以可视化。
my_annotation_token = my_sample['anns'][18]
my_annotation_metadata = nusc.get('sample_annotation', my_annotation_token)
nusc.render_annotation(my_annotation_token)
总结
nuscenes的开发工具主要就是加载数据集并让你可以用字典的方式访问它,并且可以对其进行渲染,并通过token标识获取你想要的东西。具体的操作可以在官网查看,本篇文章讲述了一些核心的方法,最主要还是数据库的架构得看懂。