nuScenes数据集 是自动驾驶公司nuTonomy建立的大规模自动驾驶数据集,标注了BEV视野下3D目标真值信息,同时有车辆底盘CAN信息,以及IMU位姿信息。关于数据集的信息可参考官网:
https://www.nuscenes.org/nuscenes
本文旨在做一个科普性的入门介绍,希望对你有帮助。
nuScenes数据集本身比较大,如果想先了解一下数据结构建议下载mini数据集进行学习。
下载链接:https://www.nuscenes.org/nuscenes 点击download栏,登录后可下载**Full dataset (v1.0)**中mini数据。
一、工具简介
nuScenes数据集真值标注数据都存在了json文件中,并且每个json文件还存了不同的信息,直接看可能不够直观。而本身数据集就提供了库或函数帮助我们使用这些数据。下面是相关工具简介:
- nuscenes-devkit安装包,可通过pip直接安装
- nuscenes-devkit repo代码,提供了一些示例脚本,帮助我们可视化数据。
以上两个工具配合使用,可以调用函数处理或可视化数据。
二、 nuscenes-devkit安装包安装
python环境:Python 3.6 or Python 3.7.
pip install nuscenes-devkit
三、nuscenes-devkit repo代码使用
代码仓库:GitHub - nutonomy/nuscenes-devkit: The devkit of the nuScenes dataset.
clone到本地后,打开以下路径:nuscenes-devkit/python-sdk/tutorials进入到应用脚本文件夹。
其中的脚本会使用nuscenes-devkit安装包里的函数,或者repo代码里实现的函数处理数据,输出相应结果。
以nuscenes_tutorial.ipynb代码为例:
1.导入数据集
from nuscenes import NuScenes
#nuscenes即我们上面安装的库
# This is the path where you stored your copy of the nuScenes dataset.
# 你本机存放数据的路径,即包含v1.0-mini,samples,sweeps的文件夹路径
DATAROOT = '/data/sets/nuscenes'
nuscenes = NuScenes('v1.0-mini', dataroot=DATAROOT) #v1.0-mini为存放json文件的文件夹
from nuscenes.nuscenes import NuScenes
#nuscenes即我们上面安装的库
nusc = NuScenes(version='v1.0-mini', dataroot='/data/sets/nuscenes', verbose=True)
# dataroot,你本机存放数据的路径,即包含v1.0-mini,samples,sweeps的文件夹路径
#v1.0-mini为存放json文件的文件夹
通过以上方法即将数据加载到了nusc 句柄中(可能这个名称并不专业)。
2.显示场景信息
nusc.list_scenes()
>>>
scene-0161, Car overtaking, parking lot, peds, ped ... [18-05-21 15:07:23] 19s, boston-seaport, #anns:1970
scene-0162, Leaving parking lot, parked cars, hidde... [18-05-21 15:07:43] 19s, boston-seaport, #anns:2230
scene-0163, Drive along street with dozens of parke... [18-05-21 15:08:03] 19s, boston-seaport, #anns:1585
scene-0164, Turn into narrow street, parked cars, p... [18-05-21 15:08:38] 19s, boston-seaport, #anns:745
scene-0165, Pass crane, truck and construction work... [18-05-21 15:09:15] 19s, boston-seaport, #anns:1423
scene-0166, Leaving narrow street, many cars [18-05-21 15:09:35] 19s, boston-seaport, #anns:1313
scene-0167, Pass parked trucks, sitting pedestrians... [18-05-21 15:10:13] 19s, boston-seaport, #anns:1455
...
会显示是在哪些场景中采集的数据,一般一个场景20s左右,包含40帧sample标注。
注:我使用的是全的数据,可能mini的显示和这个略有不同,但格式是一样的。
2.1显示具体场景信息
my_scene = nusc.scene[0]
my_scene
>>>
{'token': '73030fb67d3c46cfb5e590168088ae39',
'log_token': '6b6513e6c8384cec88775cae30b78c0e',
'nbr_samples': 40, #该场景包含的帧数
'first_sample_token': 'e93e98b63d3b40209056d129dc53ceee', #对应的sampletoken
'last_sample_token': '40e413c922184255a94f08d3c10037e0',
'name': 'scene-0001',
'description': 'Construction, maneuver between several trucks'}
3.显示sample信息
sample是scene中的某一帧环境感知信息。
如取上面场景的第一个sample数据, token作用可参考:NuScenes中token作用-CSDN博客
first_sample_token = my_scene['first_sample_token']
my_sample = nusc.get('sample', first_sample_token)
>>>
{'token': '2cc9075f8e4348fb922c712ffd3fee12',
'timestamp': 1532402418046971, #unix时间戳
'prev': '',
'next': 'dfdd53ac5a6e464abc187ee789b2e5ff',
'scene_token': '6d4b2bd795ae4c66900ad98ccd2371a6', #对应的场景token
'data': {'RADAR_FRONT': '43a6ac808b7a4e5189c9ee804c3c368b', #对应的传感器信息,因为其实BEV视野,所以包含多个传感器
'RADAR_FRONT_LEFT': 'dfb26980b12d4471bde15ad81bb5f529',
'RADAR_FRONT_RIGHT': 'ba9146cd7c80400a947be99f4fcf1a3b',
'RADAR_BACK_LEFT': 'a990dc188cf841d5933d2679e8b26a22',
'RADAR_BACK_RIGHT': '41d69cb8494148cc957d6f819d9b9008',
'LIDAR_TOP': '5bfd05fdff414f5ea2cc38ea6740f5f1',
'CAM_FRONT': 'e5ec064ef77a4a3a828cc9a589773492',
'CAM_FRONT_RIGHT': '4bc790012be24843b8422018c7b202ba',
'CAM_BACK_RIGHT': '3491f77b6ec14ccd84518fa597fe9b6d',
'CAM_BACK': '12d71b77a814404e972af142dc3b6fe1',
'CAM_BACK_LEFT': '724fc0551c444322b43c46b6deb5f9f2',
'CAM_FRONT_LEFT': 'e21670f38989456fb2f5d1218a6945d0'},
'anns': ['8974f7dd53b24df883947d84ddc8ba05', #标注实例(目标)token
'96b507556cde460aaaccc9c05f698338',
'9b23587b63d14002b44dc4f6166d2e0f',
'6fceba25a9ca4bd9b289b929be43d6d4',
'e401fe9655f94f4ab1d7cb6069c18f99',
'fc0e3834967a40579c01bd102b864124',
'1a4c7a6e22264ef2a5f8406e9f50a927',
'c354ed3e8f50467f82345bcffff5abca',
...
'b822085aa4e54d86b852f5375e8b361a',
'cf2a81436b9047edb446ce0fb6fa26ce',
'018f12b168fc4f1e99859477a597fca8',
'0faa6713fe73452f8ac4dbd1b107f723',
'cfa300e2b5e14a64b0248c9ce190348e']}
这一块可以展开说一下:
打开v1.0-mini中sample.json文件,会发现文件中对应token信息如下,并没有通过函数获取到的内容多。所以通过官方库函数,它内部做了更多的链接处理,可以帮助获取更多信息。
{
"token": "2cc9075f8e4348fb922c712ffd3fee12",
"timestamp": 1532402418046971,
"prev": "",
"next": "dfdd53ac5a6e464abc187ee789b2e5ff",
"scene_token": "6d4b2bd795ae4c66900ad98ccd2371a6"
},
3.1显示具体传感器帧信号
sensor = 'CAM_FRONT'
cam_front_data = nusc.get('sample_data', my_sample['data'][sensor])
cam_front_data
>>>
{'token': 'e5ec064ef77a4a3a828cc9a589773492',
'sample_token': '2cc9075f8e4348fb922c712ffd3fee12',
'ego_pose_token': 'e5ec064ef77a4a3a828cc9a589773492',
'calibrated_sensor_token': '4e71d28eb4094dfb9c5f1375ee9495dd',
'timestamp': 1532402418012468,
'fileformat': 'jpg',
'is_key_frame': True,
'height': 900,
'width': 1600,
'filename': 'samples/CAM_FRONT/n015-2018-07-24-11-13-19+0800__CAM_FRONT__1532402418012468.jpg',
'prev': '',
'next': 'a407f2cd85504c1a9a58521e3d6dc62c',
'sensor_modality': 'camera',
'channel': 'CAM_FRONT'}
对应的可以看到对应的图片的路径
3.2显示该图像
nusc.render_sample_data(cam_front_data['token'])
3.3显示激光雷达信息
lidar_top_data = nusc.get('sample_data', my_sample['data']['LIDAR_TOP'])
nusc.render_sample_data(lidar_top_data['token'])
3.4获取标注实例信息
my_annotation_token = my_sample['anns'][0] #获取token
my_annotation_metadata = nusc.get('sample_annotation', my_annotation_token) #从标准信息中根据token查找信息
my_annotation_metadata
>>>
{'token': '8974f7dd53b24df883947d84ddc8ba05',
'sample_token': '2cc9075f8e4348fb922c712ffd3fee12',
'instance_token': 'caa1d11657774a378928e82dd4e07a0d',
'visibility_token': '4',
'attribute_tokens': ['cb5118da1ab342aa947717dc53544259'],
'translation': [739.251, 941.023, 0.545], #位置
'size': [1.671, 4.441, 1.404], #大小
'rotation': [0.42193005462085964, 0.0, 0.0, 0.9066283852867383], #角度信息
'prev': '',
'next': '5c7896d5fbdf4324ae71d30abf5184e1',
'num_lidar_pts': 104,
'num_radar_pts': 0,
'category_name': 'vehicle.car'}
可以获取得到目标的位置,大小,角度,类型等信息。
3.5根据token显示标注信息
nusc.render_annotation(my_annotation_token)