一、Nuscenes数据集简介
Nuscenes数据的采集来自不同城市的1000个场景中,采集车上配备了完善的传感器,包括6个相机(CAM)、1个激光雷达(LIDAR)、5个毫米波雷达(RADAR)、IMU和GPS,传感器在采集车上的布置如下所示:
可以看出,相机(CAM)有六个,分别分布在前方(Front)、右前方(Front Right)、左前方(Front Left)、后方(Back)、右后方(Back Right)、左后方(Back Left);激光雷达(LIDAR)有1个,放置在车顶(TOP);毫米波雷达有五个,分别放置在前方(Front)、右前方(Front Right)、左前方(Front Left)、右后方(Back Right)、左后方(Back Left)。
二、数据下载
mini版下载链接:
https://www.nuscenes.org/download
下载完成进行解压后,应该有如下的文件结构:
2.1 maps文件夹
打开map文件夹,其中有4个包含地图信息的图片,
2.2 samples文件夹
samples文件夹目录如下:
文件夹名代表了每个传感器所采集到的信息(6个相机、1个激光雷达、5个毫米波雷达),只是激光雷达和毫米波雷达所采集的信息,不能像相机一样支持图片直接打开。
2.3 sweeps文件夹
sweeps文件夹打开后,其结构和samples一样,二者区别可理解为:samples中存储的信息比较重要,sweeps文件夹的内容重要程度相对较低。
2.4 v1.0-mini文件夹
v1.0-mini文件夹结构如下所示:
打开其中一个json文件:
如图 中箭头所示:表示目标对象是一个adult,图中的种类显示的是human.pedestrian.adult,表示一种所属关系,即adult属于pedestrian,pedestrian属于human。
三、数据读取
2.1 安装库
安装nuscenes-devkit库,使用pip安装即可。
pip install nuscenes-devkit
2.2 导入相关模块和数据集
from nuscenes.nuscenes import NuScenes
nusc = NuScenes(version='v1.0-mini', dataroot='E:/数据集集合/v1.0-mini', verbose=True)
这里的dataroot为下载的mini数据集的路径,运行成功后应出现如下的信息:
图中红框中的文件夹名字,跟2.4中v1.0-mini下文件的名字一样,
如下为中文解释:
2.3 场景scene
使用nusc.list_scenes()
可以查看数据中的所有场景。
nusc.list_scenes()
可以使用下列命令来查看某个场景中的信息:
my_scene = nusc.scene[0]
print(my_scene)
输出结果 :token为唯一标识,通过token可以获取对应信息。
2.4 样本sample
sample和scene的关系:
每个scene大约持续20s,那sample就是每0.5秒进行一次采样。也可以这样理解sample和scene,sence相当于20s的视频,sample就是每0.5s取一帧的图像。
上文已经得到了某个场景的信息【scene-0061】,现可以通过my_scene
得到某一个sample的token值。
first_sample_token = my_scene['first_sample_token'] #获取第一个sample的token值
print(first_sample_token)
输出结果:ca9a282c9e77460f8360f564131a8af5
当我们得到第一个sample的token值后,我们可以通过 nusc.get
命令来获取当前sample的信息:
my_sample = nusc.get('sample', first_sample_token)
print(my_sample)
输出结果 :结果中包含了传感器采集到的信息、标注信息等等。
2.5 样本数据 sample_data
使用my_sample['data']
可以获取sample的数据sample_data。
my_sample['data']
print(my_sample['data'])
输出结果 :这些传感器里包含了许多的样本数据。
可以使用下列命令来将这些传感器中采集的进行可视化:
sensor_radar = 'RADAR_FRONT' #这里选择的传感器为前方的毫米波雷达传感器
radar_front_data = nusc.get('sample_data',my_sample['data'][sensor_radar])
print(radar_front_data)
输出结果:
nusc.render_sample_data(radar_front_data['token'])
输出结果:
这里只展示了RADAR_FRONT,即前方毫米波雷达传感器的可视化结果,可视化其他传感器的方法和上文一致。
2.6 样本标注 sample_annotation
上节提到my_sample中包含了传感器采集到的信息、标注信息,在sample_data.json中已经展示了传感器采集到的信息,这一部分将展示样本标注的信息,方法与之前是类似的。
my_annotation_token = my_sample['anns'][18]
my_annotation_metadata = nusc.get('sample_annotation',my_annotation_token)
my_annotation_metadata
输出结果:
可视化标注结果:
nusc.render_annotation(my_annotation_metadata['token'])
2.7 实例 instance
通过nusc.instance
可以获取实例:
my_instance = nusc.instance[0]
my_instance
输出结果:
也可以可视化这个实例:
instance_token = my_instance['token']
nusc.render_instance(instance_token)
2.8 类别categories
通过nusc.list_categories
可以获取类别:
nusc.list_categories()
输出结果:
nusc.category[i]
表示获取第i个类别的信息:
2.9 属性attributes
通过nusc.list_attributes
可以获取属性:
nusc.list_attributes()
输出结果:
属性在一个场景中是可以变换的,下列代码展示了行人从移动到站立,属性发生了变换。
my_instance = nusc.instance[27]
first_token = my_instance['first_annotation_token']
last_token = my_instance['last_annotation_token']
nbr_samples = my_instance['nbr_annotations']
current_token = first_token
i = 0
found_change = False
while current_token != last_token:
current_ann = nusc.get('sample_annotation', current_token)
current_attr = nusc.get('attribute', current_ann['attribute_tokens'][0])['name']
if i == 0:
pass
elif current_attr != last_attr:
print("Changed from `{}` to `{}` at timestamp {} out of {} annotated timestamps".format(last_attr, current_attr, i, nbr_samples))
found_change = True
next_token = current_ann['next']
current_token = next_token
last_attr = current_attr
i += 1
输出结果:
2.10 可视化 visibility
anntoken = my_sample['anns'][9]
visibility_token = nusc.get('sample_annotation', anntoken)['visibility_token']
print("Visibility: {}".format(nusc.get('visibility', visibility_token)))
nusc.render_annotation(anntoken)
输出结果:
2.11 传感器 sensor
1)可以通过nusc.sensor
来查看传感器:
因sample_data中就存储着传感器的信息,因此可以通过nusc.sample_data[i]
来获取传感器的信息,结果如下:
2)校准传感器 calibrated_sensor
通过下列命令来得到某传感器的校准信息:
sensor_token = nusc.calibrated_sensor[0]
sensor_token
输出结果:
2.12 车辆姿态 ego_pose
nusc.ego_pose[0]
输出:
2.13 地图 map
nusc.map[0]
输出:
2.14 整体模式
如下为官网给出的nuScenes数据库模式,所有的注释和元数据(包括校准、地图、车辆坐标等)都包含在一个关系数据库中。下图即为数据库表。每一行都可以由其唯一的主键token标识。像sample_token这样的外键可以用来链接到sample表的token。
最后,推荐nuSenes数据集的渲染可视化教程:
手把手带你玩转Nusences数据集2——nuScenes lidarseg and panoptic教程-云社区-华为云手把手带你玩转Nusences数据集2——nuScenes lidarseg and panoptic教程https://bbs.huaweicloud.com/blogs/349393