ScanNet 数据集常见文件的作用极其读取方式

news2025/1/15 23:32:58

ScanNet 数据集是一个大规模的 RGB-D 视频数据集,它包含了丰富的三维场景理解任务所需的数据,如三维物体分类、语义体素标签和 CAD 模型检索等。数据集中的每个文件都有特定的作用,以下是一些常见文件及其作用的解释:

  1. _vh_clean.ply_vh_clean_2.ply:

    • 这些文件包含高质量的重建表面网格数据。_vh_clean.ply 是原始的高分辨率网格,而 _vh_clean_2.ply 是经过清理和简化的版本,通常用于语义注释。
  2. .aggregation.json:

    • 这个文件包含场景的实例级语义注释。它以 JSON 格式存储,提供了关于不同实例的详细信息,如实例 ID、对象 ID 和所属的原始类别标签。
  3. _vh_clean_2.labels.ply:

    • 这个文件提供了点云中每个点的 NYU40 语义标签。这些标签可以用来进行语义分割任务。
  4. _vh_clean_2.0.010000.segs.json:

    • 这是一个分割文件,包含了点云数据中每个点的分割索引。这些索引与 .aggregation.json 文件中的数据匹配,可以用于划分每个点的标签。
  5. .sens:

    • 这些文件是 RGB-D 传感器流,包含压缩的二进制格式数据,如每帧的颜色、深度、相机姿势等。
  6. _2d-label.zip_2d-instance.zip:

    • 这些文件包含原始的二维投影标注信息,如深度图、实例图、标签图和位置信息。_2d-label.zip 包含带有 ScanNet 标签 ID 的 16 位 PNG 文件,而 _2d-instance.zip 包含原始的 8 位 PNG 实例标注信息。
  7. _2d-label-filt.zip_2d-instance-filt.zip:

    • 这些文件包含经过过滤的二维投影标注信息,与未过滤的版本类似,但经过了某种形式的清洗或选择,以提高数据质量。
  8. scannetv2-labels.combined.tsv:

    • 这是一个标签映射文件,提供了原始类别标签到其他标签系统的对应关系,对于数据的理解和使用非常重要。
  9. .txt 文件(如 scene0000_00.txt):

    • 某些 ScanNet 数据集场景中可能包含的文本文件,可能包含场景的元数据或与场景相关的其他信息。

下面进行详细的解释

_vh_clean_2.ply

这些文件包含高质量的重建表面网格数据。_vh_clean.ply 是原始的高分辨率网格,而 _vh_clean_2.ply 是经过清理和简化的版本

加载场景点云

在这里插入图片描述

with open(
    os.path.join(scan_dir, scan_id, "%s_vh_clean_2.ply" % (scan_id)), "rb"
) as f:
    plydata = PlyData.read(f)  # elements: vertex, face
	points = np.array(
	    [list(x) for x in plydata.elements[0]]
	)  # [[x, y, z, r, g, b, alpha]]
	coords = np.ascontiguousarray(points[:, :3])
	colors = np.ascontiguousarray(points[:, 3:6])

scene0000_00.txt

加载全局的旋转变换矩阵

axisAlignment = 0.945519 0.325568 0.000000 -5.384390 -0.325568 0.945519 0.000000 -2.871780 0.000000 0.000000 1.000000 -0.064350 0.000000 0.000000 0.000000 1.000000 
colorHeight = 968
colorToDepthExtrinsics = 0.999973 0.006791 0.002776 -0.037886 -0.006767 0.999942 -0.008366 -0.003410 -0.002833 0.008347 0.999961 -0.021924 -0.000000 0.000000 -0.000000 1.000000
colorWidth = 1296
depthHeight = 480
depthWidth = 640
fx_color = 1170.187988
fx_depth = 571.623718
fy_color = 1170.187988
fy_depth = 571.623718
mx_color = 647.750000
mx_depth = 319.500000
my_color = 483.750000
my_depth = 239.500000
numColorFrames = 5578
numDepthFrames = 5578
numIMUmeasurements = 11834
sceneType = Apartment

读取方式

if apply_global_alignment:
    # 如果启用全局对齐,代码将读取一个文本文件以获取对齐矩阵,并应用此矩阵变换点云中的每个点。
    align_matrix = np.eye(4)
    with open(os.path.join(scan_dir, scan_id, "%s.txt" % (scan_id)), "r") as f:
        for line in f:
            if line.startswith("axisAlignment"):
                align_matrix = (
                    np.array([float(x) for x in line.strip().split()[-16:]])
                    .astype(np.float32)
                    .reshape(4, 4)
                )
                break
    # Transform the points
    pts = np.ones((coords.shape[0], 4), dtype=coords.dtype)
    pts[:, 0:3] = coords
    coords = np.dot(pts, align_matrix.transpose())[:, :3]  # Nx4
    # Make sure no nans are introduced after conversion
    assert np.sum(np.isnan(coords)) == 0

这段代码的目的是将一个全局的刚体变换(如旋转和平移)应用到点云数据上。在三维图形和计算机视觉中,这种变换通常用于将不同视角的点云数据对齐到一个统一的坐标系中,或者将点云数据与某个参考框架对齐。通过使用齐次坐标,可以在一个简单的矩阵乘法操作中同时应用旋转和平移。

_vh_clean_2.labels.ply

这个文件提供了点云中每个点的 NYU40 语义标签。这些标签可以用来进行语义分割任务

加载 semantic label的示例代码

with open(
    os.path.join(scan_dir, scan_id, "%s_vh_clean_2.labels.ply" % (scan_id)),
    "rb",
) as f:
    plydata = PlyData.read(f)
sem_labels = np.array(plydata.elements[0]["label"]).astype(np.long)
assert len(coords) == len(colors) == len(sem_labels)

# >>> sem_labels
# array([16, 16, 16, ...,  1,  1,  1])

.segs.json

里面主要包含的是 segIndices,是一个数组,其中的每个元素对应点云中的一个点,并给出该点所属的分割的索引,如果 segIndices 中有三个连续的元素都是 5753,这表示在点云数据中,接下来的三个点都属于索引为 5753 的分割。

'sceneId': 'scene0000_00'
'segIndices': [5753, 5753, 5753, 5753, ...]
len(): 3

文件读取

# Map each point to segment id
with open(
    os.path.join(
        scan_dir, scan_id, "%s_vh_clean_2.0.010000.segs.json" % (scan_id)
    ),
    "r",
) as f:
    d = json.load(f)
seg = d["segIndices"]
segid_to_pointid = {}
for i, segid in enumerate(seg):
    # 如果已经存在这个 key,就不改变 item,否则会新建 item
    segid_to_pointid.setdefault(segid, [])
    segid_to_pointid[segid].append(i)

.aggregation.json

.aggregation.json 文件是 ScanNet 数据集中用于存储实例级语义注释的 JSON 文件。这个文件为每个扫描场景中的每个实例提供了详细的标注信息,这些信息可以用来进行实例分割、对象识别和其他三维场景理解任务。

.aggregation.json 文件的结构大致如下:

{
  "sceneId": "scannet.scene0000_00",
  "appId": "Aggregator.v2",
  "segGroups": [
    {
      "id": 0,
      "objectId": 0,
      "segments": [43652, 43832, 43632, 53294, 44062, 44013, 44158, 53070, 53173, 53253],
      "label": "window"
    },
    // 可能还有更多的 segGroups
  ],
  "segmentsFile": "scannet.scene0000_00_vh_clean_2.0.010000.segs.json"
}
  1. sceneId: 这是一个字符串,唯一标识一个扫描场景。

  2. appId: 表示用于创建注释的工具的版本。

  3. segGroups: 这是一个对象数组,每个对象代表场景中的一个标注组。每个 “segGroup” 包含以下字段:

    • id: 分配给该组的唯一的标识符。
    • objectId: 与 “id” 相同,通常用于区分不同的实例。
    • segments: 一个整数数组,包含属于该实例的分割索引。这些索引与 .segs.json 文件中的 “segIndices” 相匹配。
    • label: 表示该实例的语义类别。通常是一个字符串,对应于一个预定义的类别标签集合中的一个。
  4. segmentsFile: 这是一个字符串,指定了包含上述 “segments” 字段中提到的分割索引的文件。这通常指向与 .aggregation.json 文件相同目录下的 .segs.json 文件。

在这个例子中,segGroups 数组中的每个对象都表示场景中的一个实例,并且每个实例都有一个与之关联的语义标签(如 “window”)。

这种注释方式允许研究人员识别和区分场景中的不同对象,即使这些对象属于相同的语义类别。例如,即使两个对象都是窗户,它们也可以通过不同的 “objectId” 来区分。

文件读取,得到每个 point 的 instance label

instance_class_labels = []
instance_segids = []
with open(
    os.path.join(scan_dir, scan_id, "%s.aggregation.json" % (scan_id)), "r"
) as f:
    d = json.load(f)
for i, x in enumerate(d["segGroups"]):
    assert x["id"] == x["objectId"] == i
    instance_class_labels.append(x["label"])
    instance_segids.append(x["segments"])  # 每一个instance包含一些 segments

instance_labels = np.ones(sem_labels.shape[0], dtype=np.long) * -100
for i, segids in enumerate(instance_segids):  # 遍历每一个 instance
    pointids = []
    for segid in segids:  # ! 得到属于这个 seg 的 points
        pointids += segid_to_pointid[segid]
    if np.sum(instance_labels[pointids] != -100) > 0:
        # scene0217_00 contains some overlapped instances
        print(
            scan_id, i, np.sum(instance_labels[pointids] != -100), len(pointids)
        )
    else:
        instance_labels[pointids] = i
        assert (
            len(np.unique(sem_labels[pointids])) == 1
        ), "points of each instance should have the same label"

理解上面两个文件,就要理解 scannet 数据集里的三级关系:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1618000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【八股文】Spring 谈谈你对AOP的理解

AOP AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统 OOP(Object-Oriented Programming,面向对象编程)的补充。 面向对象是纵向继承,面向切面是横向抽取。 OOP思想是一种垂直纵向的继承体…

C# DataSet结合FlyTreeView显示树状模型数据

目录 关于 FlyTreeView DataSet 数据准备 涉及表结构创建脚本 范例运行环境 方法设计 代码实现 方法代码 调用示例 小结 关于 FlyTreeView NineRays.WebControls.FlyTreeView 是 9rays.net 推出的一款功能强大的树状模型数据显示控件,本文将介绍使用其 As…

运营高手都在用的9款办公软件!一定要收藏

最近,运营群里的00后天天都在搞新花样,每天都有新的idea,各种跟热点、做品牌联名、拍好玩的视频、做创意海报……。但奇怪的是,工作量增加了、业绩增长了,却不见有人加班。一问,原来因为用上了办公神器啊&a…

通过使用XShell工具、Nginx环境实现服务器项目构建与发布

前言: 在信息化和数字化的今天,网站和应用的构建与发布已成为企业发展的重要一环。为了确保项目的顺利上线和稳定运行,选择合适的工具和环境至关重要。本文将详细介绍如何通过XShell工具以及Nginx环境来实现服务器项目的构建与发布&#xff0…

数据洞察创新挑战赛之智能运维赛参赛攻略--皮卡丘的皮卡

关联比赛: 数据洞察创新挑战赛之智能运维赛 背景和参赛动机 1.个人背景和专业领域 四川大学本科,中南大学研究生,专业是医学图像处理。目前就职于深信服,主要做云安全相关的业务开发工作。 2.何时开始关注和参与数据科学竞赛&#xff1f…

IDEA插件-通义灵码 VS ChatGPT-EasyCode

智能编码助手新时代:通义灵码 vs ChatGPT-EasyCode 随着人工智能技术的飞速发展,智能编码助手逐渐成为程序员的必备工具。它们可以帮助程序员提高编码效率,降低代码缺陷率,并解放创造力。 目前市场上涌现出了众多智能编码助手&a…

如何在Windows 10中打开和自定义搜索?这里提供详细步骤

使用Windows 10中的搜索功能,你可以快速查找计算机上的文件、应用程序或设置。在本文,你可以学习如何在Windows 10中打开和控制搜索。 打开Windows 10搜索面板 打开Windows 10搜索面板很容易。通常,你可以在任务栏上找到搜索图标。只需单击…

Redis篇:缓存击穿及解决方案

1.何为缓存击穿 缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了(有可能是正好过期了),无数的请求访问会在瞬间给数据库带来巨大的冲击。 常见的解决方案有两种: 互斥锁 逻…

仓库管理存在的问题及改进对策?

大部分人都指导仓库问题会影响一个仓库操作或与之相关的整个流程链的速度、效率和生产力。但在大多数情况下,只有在流程开始甚至完成后才能识别这些错误。 到那时通常已经来不及阻止错误了,甚至可能来不及减少造成的损害。 所以这也是我写这篇内容的目…

C++-DAY1

思维导图 有以下定义,说明哪些量可以改变哪些不可以改变? const char *p; const (char *) p; char *const p; const char* const p; char const *p; (char *) const p; char const* const p; const char *p:指针 p 所指向的内容不可改…

mybatis 生成器,是否功能实现,需写测试类

一、看视频步骤 请按视频流程走 mybatis-18-CSDN直播 二、视频报错 解决思路 网址: 使用配置 | MyBatis-Plus (baomidou.com) 添加代码: 效果图:√ Tests passed: 前面✔,表示正确。 1为最终结果

揭开ChatGPT面纱(1):准备工作(搭建开发环境运行OpenAI Demo)

文章目录 序言:探索人工智能的新篇章一、搭建开发环境二、编写并运行demo1.代码2.解析3.执行结果 本博客的gitlab仓库:地址,本博客对应01文件夹。 序言:探索人工智能的新篇章 随着人工智能技术的飞速发展,ChatGPT作为…

代码随想录训练营Day 29|Python|Leetcode|● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

860.柠檬水找零 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确…

【Python-类型注解】

Python-类型注解 ■ Python-类型注解■ 类型注解■ 数据类型注解■ 容器类型注解 ■ 函数方法■ 方法形参类型注解 (形参名:类型)■ 方法返回值类型注解 ( -> 返回值类型) ■ # type:类型 (在注释中进行类型注解)■ Union类型 &#xff08…

指令和界面【Linux】

指令和界面 前言一、指令 vs 界面交互的需求满足需求的第一阶段——指令满足需求的第二阶段-界面时间 二、指令和界面交互区别为什么要学命令行总结 前言 Linux操作系统提供了丰富的命令行界面和图形用户界面工具,用户可以根据自己的需求选择适合的界面进行操作。命…

使用 ECharts 绘制咖啡店各年订单的可视化分析

使用 ECharts 绘制咖啡店各年订单的可视化分析 在这篇博客中,我将分享一段使用 ECharts 库创建可视化图表的代码。通过这段代码,我们可以直观地分析咖啡店各年订单的情况。 饼图 这段代码包含了两个 ECharts 图表,一个是饼图,用…

【C++庖丁解牛】C++11---右值引用和移动语义

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1 左值引用和右值引用2 左…

手把手教数据结构与算法:有序线性表设计

问题描述 设计一个有序线性表类,要求完成初始化,插入和遍历功能,使得表内元素实现有序排列(从小到大)。同时实现合并功能,使得两个线性表能够合并为一个线性表(可能存在重复元素)。…

Redis中的缓存击穿、缓存穿透、缓存雪崩问题

1.什么是缓存击穿? 客户端恶意访问一个不存在的数据,从而造成穿透缓存,请求直接到达数据库,频繁的发送这一类的请求,直接查询数据库,数据库的压力变大。 1.1如何解决缓存击穿呢? 1&#xff0…