- Nuscenes数据集简介
- 准备工作
- 数据读取
- 安装库
- 导入相关模块和数据集
- 场景scene
- 样本sample
- 样本数据 sample_data
- 样本标注 sample_annotation
- 实例 instance
- 类别categories
- 属性attributes
- 可视化 visibility
- 传感器 sensor
- 校准传感器 calibrated_sensor
- 车辆姿态 ego_pose
- 日志 log
- 地图 map
- 小结
- 总结
Nuscenes数据集简介
先来简单的介绍一下Nuscenes数据集,相信大家对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)。
准备工作
数据才是王道,第一步我们当然是需要下载数据了。
nuscenes数据集百度网盘下载:
链接: https://pan.baidu.com/s/16N0u688ksA-_6mIMpc8ohQ?pwd=u7na 提取码: u7na
Nuscenes的官网下载链接如下:https://www.nuscenes.org/download
下载完成进行解压后,应该有如下的文件结构:
接下来我们对上图中的4个文件进行分析:
- maps文件夹
打开map文件夹,可以看到4个地图的图片,这种图片信息的文件我们很容易理解,这里不过多叙述。
- samples文件夹
打开samples文件夹,出现了这样的目录结构:传感器(6个相机、1个激光雷达、5个毫米波雷达)所采集到的信息。
- sweeps文件夹
打开sweeps文件夹,你会发现其结构和samples文件夹是完全一样的。可以这样理解,samples文件夹中存储的信息是较为关键、重要的,而sweeps文件夹中的信息则相对次要。
- v1.0-mini文件夹
打开v1.0-mini文件夹
【图中的种类显示的是human.pedestrian.adult,表示一种所属关系,即adult属于pedestrian,pedestrian属于human】
数据读取
安装库
首先需要按照nuscenes-devkit库,使用pip安装即可。
pip install nuscenes-devkit
导入相关模块和数据集
dataroot为数据集根目录,运行成功后应出现如下的信息:
from nuscenes.nuscenes import NuScenes
nusc = NuScenes(version='v1.0-mini',dataroot='/root/code/Fast-BEV/data/nuscenes',verbose=True)
看到上图红框中的内容不知大家是否有种似曾相似的感觉,没错👉🏼👉🏼👉🏼就是之前v1.0-mini文件夹中的那些文件。下面对这些名词进行解释,英文为官方给出的解释,中文为自己总结的。
场景scene
使用nusc.list_scenes()
可以查看数据中的所有场景。
nusc.list_scenes()
输出结果 : mini数据集中只包含10个场景,每个场景大约持续20s【有的19s】,即每个场景有20秒采集到的信息。
可以使用下列命令来查看某个场景中的信息:
nusc.scene[0]
输出结果 :token为唯一标识,通过token可以获取对应信息。
样本sample
先来说说sample和scene的关系,前面说到,每个scene大约持续20s,那sample就是每0.5秒进行一次采样。也可以这样理解sample和scene,sence相当于20s的视频,sample就是每0.5s取一帧的图像。
上文已经得到了某个场景的信息【scene-0061】,现可以通过my_scene
得到某一个sample的token值。
sample_token = my_scene['first_sample_token']
sample_token
输出结果 :'ca9a282c9e77460f8360f564131a8af5'
当我们得到第一个sample的token值后,我们可以通过 nusc.get
命令来获取当前sample的信息:
my_sample = nusc.get('sample', sample_token)
输出结果 :结果中包含了传感器采集到的信息、标注信息等等。
样本数据 sample_data
使用my_sample['data']
可以获取sample的数据sample_data。
my_sample['data']
输出结果 :这些传感器里包含了许多的样本数据。
我们可以使用下列命令来将这些传感器中采集的进行可视化:
sensor_radar = 'RADAR_FRONT' #前向毫米波雷达传感器
radar_front_data = nusc.get('sample_data',my_sample['data'][sensor_radar])
radar_front_data
输出结果 :
nusc.render_sample_data(radar_front_data['token'])
输出结果 :
这里只展示了RADAR_FRONT,即前方毫米波雷达传感器的可视化结果,可视化其他传感器的方法和上文一致。
样本标注 sample_annotation
标注信息查看
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'])
实例 instance
通过nusc.instance
可以获取实例:
my_instance = nusc.instance[0]
my_instance
输出结果 :
我们也可以可视化这个实例:
instance_token = my_instance['token']
nusc.render_instance(instance_token)
输出结果 :
类别categories
通过nusc.list_categories
可以获取类别:
nusc.list_categories()
输出结果 :
属性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
输出结果 :
可视化 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)
输出结果 :
传感器 sensor
传感器前文其实也或多或少的讲过了,可以通过nusc.sensor
来查看传感器,部分结果如下:
[{'token': '725903f5b62f56118f4094b46a4470d8', 'channel': 'CAM_FRONT', 'modality': 'camera'},
{'token': 'ce89d4f3050b5892b33b3d328c5e82a3', 'channel': 'CAM_BACK', 'modality': 'camera'},
{'token': 'a89643a5de885c6486df2232dc954da2', 'channel': 'CAM_BACK_LEFT', 'modality': 'camera'},
{'token': 'ec4b5d41840a509984f7ec36419d4c09', 'channel': 'CAM_FRONT_LEFT', 'modality': 'camera'},
{'token': '2f7ad058f1ac5557bf321c7543758f43', 'channel': 'CAM_FRONT_RIGHT', 'modality': 'camera'},
{'token': 'ca7dba2ec9f95951bbe67246f7f2c3f7', 'channel': 'CAM_BACK_RIGHT', 'modality': 'camera'},
{'token': 'dc8b396651c05aedbb9cdaae573bb567', 'channel': 'LIDAR_TOP', 'modality': 'lidar'},
{'token': '47fcd48f71d75e0da5c8c1704a9bfe0a', 'channel': 'RADAR_FRONT', 'modality': 'radar'},
{'token': '232a6c4dc628532e81de1c57120876e9', 'channel': 'RADAR_FRONT_RIGHT', 'modality': 'radar'},
{'token': '1f69f87a4e175e5ba1d03e2e6d9bcd27', 'channel': 'RADAR_FRONT_LEFT', 'modality': 'radar'},
{'token': 'df2d5b8be7be55cca33c8c92384f2266', 'channel': 'RADAR_BACK_LEFT', 'modality': 'radar'},
{'token': '5c29dee2f70b528a817110173c2e71b9', 'channel': 'RADAR_BACK_RIGHT', 'modality': 'radar'}]
因sample_data中就存储着传感器的信息,因此可以通过nusc.sample_data[i]
来获取传感器的信息,结果如下:
{'token': '5ace90b379af485b9dcb1584b01e7212', 'sample_token': '39586f9d59004284a7114a68825e8eec', 'ego_pose_token': '5ace90b379af485b9dcb1584b01e7212', 'calibrated_sensor_token': 'f4d2a6c281f34a7eb8bb033d82321f79', 'timestamp': 1532402927814384, 'fileformat': 'pcd', 'is_key_frame': False, 'height': 0, 'width': 0, 'filename': 'sweeps/RADAR_FRONT/n015-2018-07-24-11-22-45+0800__RADAR_FRONT__1532402927814384.pcd', 'prev': 'f0b8593e08594a3eb1152c138b312813', 'next': '978db2bcdf584b799c13594a348576d2', 'sensor_modality': 'radar', 'channel': 'RADAR_FRONT'}
校准传感器 calibrated_sensor
通过下列命令来得到某传感器的校准信息:
sensor_token = nusc.calibrated_sensor[0]
sensor_token
输出结果 :
{'token': 'f4d2a6c281f34a7eb8bb033d82321f79',
'sensor_token': '47fcd48f71d75e0da5c8c1704a9bfe0a',
'translation': [3.412, 0.0, 0.5],
'rotation': [0.9999984769132877, 0.0, 0.0, 0.0017453283658983088], 'camera_intrinsic': []}
车辆姿态 ego_pose
nusc.ego_pose[0]
输出结果 :
{'token': '5ace90b379af485b9dcb1584b01e7212',
'timestamp': 1532402927814384,
'rotation': [0.5731787718287827, -0.0015811634307974854, 0.013859363182046986, -0.8193116095230444],
'translation': [410.77878632230204, 1179.4673290964536, 0.0]}
日志 log
nusc.log[0]
输出结果 :
{'token': '7e25a2c8ea1f41c5b0da1e69ecfa71a2',
'logfile': 'n015-2018-07-24-11-22-45+0800',
'vehicle': 'n015',
'date_captured': '2018-07-24',
'location': 'singapore-onenorth',
'map_token': '53992ee3023e5494b90c316c183be829'}
地图 map
nusc.map[0]
输出结果 :
{'category': 'semantic_prior',
'token': '53992ee3023e5494b90c316c183be829',
'filename': 'maps/53992ee3023e5494b90c316c183be829.png',
'log_tokens': ['0986cb758b1d43fdaa051ab23d45582b', '1c9b302455ff44a9a290c372b31aa3ce', 'e60234ec7c324789ac7c8441a5e49731', '46123a03f41e4657adc82ed9ddbe0ba2', 'a5bb7f9dd1884f1ea0de299caefe7ef4', 'bc41a49366734ebf978d6a71981537dc', 'f8699afb7a2247e38549e4d250b4581b', 'd0450edaed4a46f898403f45fa9e5f0d', 'f38ef5a1e9c941aabb2155768670b92a', '7e25a2c8ea1f41c5b0da1e69ecfa71a2', 'ddc03471df3e4c9bb9663629a4097743', '31e9939f05c1485b88a8f68ad2cf9fa4', '783683d957054175bda1b326453a13f4', '343d984344e440c7952d1e403b572b2a', '92af2609d31445e5a71b2d895376fed6', '47620afea3c443f6a761e885273cb531', 'd31dc715d1c34b99bd5afb0e3aea26ed', '34d0574ea8f340179c82162c6ac069bc', 'd7fd2bb9696d43af901326664e42340b', 'b5622d4dcb0d4549b813b3ffb96fbdc9', 'da04ae0b72024818a6219d8dd138ea4b', '6b6513e6c8384cec88775cae30b78c0e', 'eda311bda86f4e54857b0554639d6426', 'cfe71bf0b5c54aed8f56d4feca9a7f59', 'ee155e99938a4c2698fed50fc5b5d16a', '700b800c787842ba83493d9b2775234a'],
'mask': <nuscenes.utils.map_mask.MapMask object at 0x7f42a4928850>}
小结
官网给出了描述了nuScenes的数据库模式。所有的注释和元数据(包括校准、地图、车辆坐标等)都包含在一个关系数据库中。下图即为数据库表。每一行都可以由其唯一的主键token标识。像sample_token这样的外键可以用来链接到sample表的token。
总结
官方是给了参考的代码的,可以再Google colab上直接运行,这里给出官方的链接:Nuscenes使用教程。