当前位置: 首页 > news >正文

BEV学习--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)。

二、数据下载

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_tokeni = 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:passelif current_attr != last_attr:print("Changed from `{}` to `{}` at timestamp {} out of {} annotated timestamps".format(last_attr, current_attr, i, nbr_samples))found_change = Truenext_token = current_ann['next']current_token = next_tokenlast_attr = current_attri += 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教程icon-default.png?t=O83Ahttps://bbs.huaweicloud.com/blogs/349393


http://www.mrgr.cn/news/34577.html

相关文章:

  • 用Flowise+OneAPI+Ollama做一个在线翻译工作流
  • 如何登录通义灵码,快速开启AI编码之旅?
  • 基于单片机巡迹避障智能小车系统
  • 设计模式相关知识
  • SpringBoot+Aop+注解方式 实现多数据源动态切换
  • vcruntime140_1.dll无法继续执行代码的6种解决方法
  • Undet for sketchup 2023.3注册机 支持草图大师sketchup2021-2022-2023
  • 数据结构之图的遍历
  • MySQL | 使用 HAVING 子句进行高级数据筛选
  • 数据链路层协议 —— 以太网协议
  • 如何快速免费搭建自己的Docker私有镜像源来解决Docker无法拉取镜像的问题(搭建私有镜像源解决群晖Docker获取注册表失败的问题)
  • 全栈开发(四):使用springBoot3+mybatis-plus+mysql开发restful的增删改查接口
  • 代码随想录算法训练营Day11
  • JDK7u21 HashMap版
  • C++之STL—vector容器进阶篇
  • Spring源码学习:SpringMVC(2)DispatcherServlet初始化【子容器9大组件】
  • go解决引入私有包报错“Repository owner does not exist“的两种方式
  • 难题妙解——前K个高频单词
  • Vue从入门到精通:全方位掌握Vue.js开发技能
  • CF 461 B Appleman and Tree 题解(树形 dp+排列组合)