手把手带你玩转Nuscenes数据集2——nuScenes lidarseg and panoptic教程

2023-11-08 15:40

本文主要是介绍手把手带你玩转Nuscenes数据集2——nuScenes lidarseg and panoptic教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 准备工作✨✨✨
    • 数据读取✨✨✨
      • 导入相关库并加载数据集
      • lidarseg和panoptic数据集的点统计
      • panoptic数据集的instance统计
      • 获取lidarseg和panoptic的sample token的统计信息⭐⭐⭐
      • 渲染lidarseg标签⭐⭐⭐
      • 渲染panoptic标签⭐⭐⭐
      • 在图像中渲染lidarseg和panoptic 标签⭐⭐⭐
      • 渲染sample(例如lidar、radar and all camera)⭐⭐⭐
      • 使用lidarseg/panoptic标签为给定的相机传感器渲染场景
      • 渲染场景的所有cameras与lidarseg/panoptic标签
      • 可视化激光雷达分割预测
      • 可视化激光雷达全景预测
    • 总结

  在之前的文章中,已经介绍了Nuscenes数据集的基本使用——包括数据集的简介、下载、数据读取等等,还不清楚的可以点击链接跳转学习🎨🎨🎨本节将对Nuscenes的扩展包lidarseg 和 panoptic进行讲解,lidarseg和panoptic在教程中有很多功能是类似的,所以我们把它们放在一个教程中。当然你也可以自己选择lidarseg或panoptic数据集,即针对特定的任务使用某个数据集。下面就让我们一起来学习,一起真正的玩转Nuscenes数据集叭🚀🚀🚀

 
 

准备工作✨✨✨

​  在上一节中,我们已经下载了mini数据集,这里依旧可以用到。但不同的是,这节我们还会下载其他的数据(lidarseg 和 panoptic),我们需要让这些数据集存储在特定位置,即让不同数据集之前有一定的文件关系,以便后面成功读取✅✅✅

  再次强调,本次实验我们将用到三个数据集,分别是v1.0_mini,lidarseg 和 panoptic。**【注意:v1.0_mini在上节我们已经下载,lidarseg 和 panoptic我们仍然使用其mini版本】**下面先来介绍如何下载lidarseg 和 panoptic数据集,方法很简单,我们去官网直接点击下载即可,下载示意图如下:

image-20220316203630649

​   为了给大家带来方便,这里也可以在浏览器搜索框输入下面网址直接下载两个数据集:

https://www.nuscenes.org/data/nuScenes-lidarseg-mini-v1.0.tar.bz2  #下载lidarseg-mini数据集
https://www.nuscenes.org/data/nuScenes-panoptic-v1.0-mini.tar.gz   #下载panoptic数据集 

​   上文提到,我们应将3个数据集提取到规定的特殊位置,即将刚刚下载压缩文件解压到/data/sets/nuscenes中,你的文件夹结构应该是这样的:

​  看到这个结构,可能大家还有些许疑惑,这里贴出我文件夹的路径相信大家就一目了然了。【注意:这里还是要提醒一下大家,在下图中的v1.0-mini文件夹中,包括各种.josn格式的文件,其中包括lidarseg.json、panoptic.json、category.json三个文件,这三个文件都是从lidarseg和panoptic数据集中复制过来的】

image-20220316204319378

 
 

数据读取✨✨✨

  上文已经下载好了数据集,且文件夹路径配置妥当,现在就可以大展身手,让我们一起来玩转Nuscenes叭⚽⚽⚽
 

导入相关库并加载数据集

  这里的dataroot为数据集存放位置【这里我使用的是相对路径,你也可以使用绝对路径】,运行成功后应出现如下的信息:

%matplotlib inline
from nuscenes import NuScenes
nusc = NuScenes(version='v1.0-mini', dataroot='data\\sets\\nuscenes', verbose=True)

image-20220316210200864

​  可以从结果中看到,我们已经加载了nuscenes-lidarseg和nuscenes-panoptic,这里和上一节加载数据集结果的不同之处就在这里。

 

lidarseg和panoptic数据集的点统计

  • lidarseg

​   让我们通过查看lidarseg数据集中有哪些类以及属于每个类的点数来快速了解一下lidarseg数据集。类将根据点的数量按升序排序(因为下面的sort_by='count');你也可以通过设置sort_by='name'sort_by='index'分别对类名或类索引进行排序。

# nuscenes-lidarseg
nusc.list_lidarseg_categories(sort_by='count')

输出结果:image-20220316211223706

​   使用list_lidarseg_categories,您可以通过查看最左边的列来获得每个类名所属的索引。你也可以使用lidarseg_idx2name_mapping来获取索引所对应的类名。

nusc.lidarseg_idx2name_mapping

输出结果:

  相反,你也可以使用lidarseg_name2idx_mapping来从类名属性中获得索引。

nusc.lidarseg_name2idx_mapping

输出结果:

image-20220316211910288

  • panoptic

  对于nuScenes-panoptic,它与nuScenes-lidarseg共享相同的成员变量lidarseg_idx2name_mappinglidarseg_names2idx_mapping。类似地,您可以从nuScenes-panoptic数据集检查每个语义类别的点数。唯一要做的就是添加gt_from='panoptic'参数。默认情况下,gt_from = ' lidarseg '

# nuscenes-panoptic
nusc.list_lidarseg_categories(sort_by='count', gt_from='panoptic')

输出结果:

image-20220316212528553

  您可能已经注意到某些类别的点数在lidarseg和panoptic数据集之间略有不同。原因是实例之间的重叠点在nuScenes-panoptic中被设置为noise(类别0),你可以看到noise类别的点数增加了,而总点数保持不变。

 
 

panoptic数据集的instance统计

  实例统计信息是专属于全景数据集的。为此,我们提供了list_panoptic_instances()函数。你可以将sort_by设置为[‘count’, ‘index’, ‘name’]之一。该函数将计算每帧的实例数,实例总数(唯一的对象ID)和实例状态(一个实例可能有多个状态)。它还计算每个类别的统计数据,包括一个实例跨越的帧数的平均值和标准偏差,以及每个实例的点数的平均值和标准偏差。

nusc.list_panoptic_instances(sort_by='count')

输出结果:

 
 

获取lidarseg和panoptic的sample token的统计信息⭐⭐⭐

  首先,让我们获取一个sample。

my_sample = nusc.sample[5]

  之后使用get_sample_lidarseg_stats来获取lidarseg的样本统计信息。通过执行sort_by=‘count’,类和它们各自的频率计数将按升序打印;你也可以在这里执行sort_by='name'sort_by='index'

# nuscenes-lidarseg
nusc.get_sample_lidarseg_stats(my_sample['token'], sort_by='count')

输出结果:

image-20220316214616134

  类似地,通过添加gt_from='panoptic',我们可以使用相同的函数来使用panoptic数据集获得类别频率计数。正如在list_lidarseg_categories()中提到的,点计数可能与lidarseg稍有不同,这是因为在nuscens -panoptic中,多个实例的重叠点被设置为noise。

# nuscenes-panoptic
nusc.get_sample_lidarseg_stats(my_sample['token'], sort_by='count', gt_from='panoptic')

输出结果:

image-20220316214920043

 
 

渲染lidarseg标签⭐⭐⭐

​  在最初的nuScenes devkit中,即我们上一节所介绍的数据集中,您可以将一个sample_data_token传递到render_sample_data中,以呈现点云的鸟瞰图。这些点会根据与自我车的距离被着色。现在有了扩展的nuScenes devkit,您所需要做的就是设置show_lidarseg=True来显示pointcloud的类标签。【这里你也可以设置with_anns = Ture,看看和with_anns=False的区别】

sample_data_token = my_sample['data']['LIDAR_TOP']
nusc.render_sample_data(sample_data_token,with_anns=False,show_lidarseg=True)

输出结果:

image-20220317140457773

  但如果你只想专注于特定的类别呢?考虑到前面打印的点云统计信息,假设您只对卡车和汽车感兴趣。你可以从统计数据中看到属于这些类的类索引【汽车的索引为17,卡车的索引为23】,然后将这些索引的数组传递到filter_lidarseg_labels中,如下所示:

nusc.render_sample_data(sample_data_token,with_anns=False,show_lidarseg=True,filter_lidarseg_labels=[17, 23])

输出结果:

image-20220317140803971

  如上图所示,现在只有属于卡车和拖车的点云中的点被过滤出来,以满足您的观看需求。此外,还可以使用show_lidarseg_legend显示一个图例,该图例指示每个类的颜色。

nusc.render_sample_data(sample_data_token,with_anns=False,show_lidarseg=True,show_lidarseg_legend=True)

输出结果:

image-20220317140831089
 
 

渲染panoptic标签⭐⭐⭐

  与lidarseg类似,也使用相同的函数来呈现panoptic标签(全景标签)。参数的区别是show_panoptic=True。默认情况下,show_lidarseg和show_panoptic都被设置为False。如果两者都设置为True,即show_lidarseg=True, show_panoptic=True, lidarseg将会优先渲染。

sample_data_token = my_sample['data']['LIDAR_TOP']
nusc.render_sample_data(sample_data_token,with_anns=False,show_lidarseg=False,show_panoptic=True)

输出结果:

image-20220317141822845

  你可以看到同一类别的不同的车辆实例,会显示不同的颜色。类似地,您可以使用filter_lidarseg_labelsshow_lidarseg_legend=True来显示特定事物和物品类别的全景标签,以及类别图例。注意这两个参数在lidarseg和panoptic数据集之间也是共享的。

# show trucks and car
nusc.render_sample_data(sample_data_token,with_anns=False,show_panoptic=True,filter_lidarseg_labels=[17, 23])

输出结果:

image-20220317141835389

# show stuff category legends
nusc.render_sample_data(sample_data_token,with_anns=False,show_lidarseg=False,show_lidarseg_legend=True,show_panoptic=True)

输出结果:

image-20220317141851317
 
 

在图像中渲染lidarseg和panoptic 标签⭐⭐⭐

  如果你想要将点云叠加到相机对应的图像中,你可以像使用原始nuScenes devkit一样使用render_pointcloud_in_image,但是要设置show_lidarseg=True(记住要设置render_intensity=False)。与render_sample_data类似,您可以使用filter_lidarseg_labels过滤查看特定的类。您可以使用show_lidarseg_legend在渲染中显示一个图例。

# nuscenes-lidarseg
nusc.render_pointcloud_in_image(my_sample['token'],pointsensor_channel='LIDAR_TOP',camera_channel='CAM_FRONT',render_intensity=False,show_lidarseg=True,filter_lidarseg_labels=[17, 23, 24],show_lidarseg_legend=True)

输出结果:

image-20220317142316904

  同样,这个函数支持show_panoptic=True模式,将显示全景标签而不是语义标签。只显示物品类别的图例。【对语义标签和全景标签不清楚的戳传送门了解详情】

# nuscenes-panoptic
nusc.render_pointcloud_in_image(my_sample['token'],pointsensor_channel='LIDAR_TOP',camera_channel='CAM_FRONT',render_intensity=False,show_lidarseg=False,filter_lidarseg_labels=[17, 23, 24],show_lidarseg_legend=True,show_panoptic=True)

image-20220317142640969

 
 

渲染sample(例如lidar、radar and all camera)⭐⭐⭐

​  就像在原始的nuScenes devkit中一样,可以使用render_sample一次渲染所有的传感器。在扩展的nuScenes devkit中,你可以设置show_lidarseg=True来查看lidarseg标签。与上面的方法类似,您可以使用filter_lidarseg_labels只显示您希望看到的类。

# nuscenes-lidarseg
nusc.render_sample(my_sample['token'],show_lidarseg=True,filter_lidarseg_labels=[17, 23])

输出结果:

image-20220317143827612

  要使用render_sample显示panoptic标签,只需设置show_panoptic=True

# nuscenes-panoptic
nusc.render_sample(my_sample['token'],show_lidarseg=False,filter_lidarseg_labels=[17, 23],show_panoptic=True)

输出结果:

image-20220317150857594

 
 

使用lidarseg/panoptic标签为给定的相机传感器渲染场景

  你也可以使用你选择的相机的lidarseg标签来渲染整个场景(filter_lidarseg_labels参数也可以在这里使用)。让我们先选一个场景:

my_scene = nusc.scene[0]

​  然后我们将scene token传递给render_scene_channel_lidarseg,这里设置了filter_lidarseg_labels=[18, 28],表示我们只对建筑车辆和人造物体感兴趣(在这里,我们设置verbose=True来生成一个窗口,让我们可以看到随机的帧)。此外,您还可以使用dpi(调整激光雷达点的大小)和imsize(调整渲染图像的大小)来调整渲染的美学效果。

# nuscenes-lidarseg
import os
nusc.render_scene_channel_lidarseg(my_scene['token'], 'CAM_FRONT', filter_lidarseg_labels=[18, 28],verbose=True, dpi=100,imsize=(1280, 720))

  通过添加show_panoptic=True,这个函数也适用于panoptic标签。

# # nuscenes-panoptic
import os
nusc.render_scene_channel_lidarseg(my_scene['token'], 'CAM_BACK', filter_lidarseg_labels=[18, 24, 28],verbose=True, dpi=100,imsize=(1280, 720),show_panoptic=True)

  需要注意的是,这里的输出结果都是视频,这里不好进行展示,大家自己操作时就明白了。当然,我们可以通过out_folder参数传递一个路径到你想要保存视频的文件夹。

# nuscenes-lidarseg
nusc.render_scene_channel_lidarseg(my_scene['token'],'CAM_BACK',filter_lidarseg_labels=[18, 28],verbose=True,dpi=100,imsize=(1280, 720),render_mode='video',out_folder=os.path.expanduser('video_image'))

 
 

渲染场景的所有cameras与lidarseg/panoptic标签

  你可以用lidarseg标签为所有相机一次性渲染整个场景作为视频。假设在这种情况下,我们对属于driveable surfaces 和 cars【即标签为17、24】的点感兴趣。

# nuscenes-lidarseg
import os
nusc.render_scene_lidarseg(my_scene['token'], filter_lidarseg_labels=[17, 24],verbose=True,dpi=100,out_path=os.path.expanduser('video_image//my_rendered_scene.avi'))

  这和上面的一样都为视频,大家练习时自行观看。

 
 

可视化激光雷达分割预测

  在以上所有函数中,已经渲染的LiDAR点云的标签都是ground truth。如果您已经训练了一个模型来分割LiDAR点云,并在nuScenes-lidarseg数据集上运行它,您也可以使用nuScenes-lidarseg可视化您的模型的预测!你的每个.bin文件应该是numpy.uint8数组。

import osmy_sample = nusc.sample[80]
sample_data_token = my_sample['data']['LIDAR_TOP']
my_predictions_bin_file = os.path.join('data\\sets\\nuscenes\\lidarseg\\v1.0-mini', sample_data_token + '_lidarseg.bin')nusc.render_pointcloud_in_image(my_sample['token'],pointsensor_channel='LIDAR_TOP',camera_channel='CAM_BACK',render_intensity=False,show_lidarseg=True,filter_lidarseg_labels=[22, 23],show_lidarseg_legend=True,lidarseg_preds_bin_path=my_predictions_bin_file)

输出结果:

image-20220317150023998

 
 

可视化激光雷达全景预测

​  类似地,全景预测结果也可以被渲染!每个.npz文件都应该是一个压缩的 numpy.uint16数组

import osmy_sample = nusc.sample[87]
sample_data_token = my_sample['data']['LIDAR_TOP']
my_predictions_bin_file = os.path.join('/data/sets/nuscenes/panoptic/v1.0-mini', sample_data_token + '_panoptic.npz')nusc.render_pointcloud_in_image(my_sample['token'],pointsensor_channel='LIDAR_TOP',camera_channel='CAM_BACK',render_intensity=False,show_lidarseg=False,filter_lidarseg_labels=[17,22, 23, 24],show_lidarseg_legend=True,lidarseg_preds_bin_path=my_predictions_bin_file,show_panoptic=True)

输出结果:

image-20220317150737237

 
 

总结

  最后了,说点什么呢,上面这些东西你看是很难看明白的,自己动手多敲一敲,哪里不明白敲敲代码看看输出的结果,好记性不如烂笔头,加油各位📝📝📝阅读此文章前建议先看看上一节文章:对Nuscenes数据集一无所知,手把手带你玩转Nusences数据集

​  这部分官方是给了参考的代码的,可以再Google colab上直接运行,这里给出官方的链接:Nuscenes使用教程,但是我想大家还是自己敲一敲会印象更加深刻🀄🀄🀄
  
 
​上一篇:对Nuscenes数据集一无所知,手把手带你玩转Nusences数据集
 
 
如若文章对你有所帮助,那就🛴🛴🛴

咻咻咻咻~~duang~~点个赞呗

这篇关于手把手带你玩转Nuscenes数据集2——nuScenes lidarseg and panoptic教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/370850

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X