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

ScanNet项目介绍

ScanNet 是一个大型的 RGB-D 视频数据集,专门用于室内场景的理解和三维重建。简单来说,研究人员用特殊的相机(能同时捕捉彩色图像和深度信息)在 1500 多个不同的室内场景(如办公室、公寓)中进行了扫描,总共收集了 250 万个视角的图像。这个数据集不仅包含原始的视频数据,还提供了处理好的 3D 模型、精确的相机位置信息以及非常详细的物体标注(比如,这个是椅子,那个是桌子)。

📖 ScanNet 是什么?

ScanNet 是一个包含了大量室内场景 RGB-D 视频的数据集。你可以把它想象成一个巨大的三维“相册”,里面有:

  • 250 万个视图:在超过 1500 个不同的室内场景(扫描)中拍摄。
  • RGB-D 视频:每个视频帧不仅有彩色信息(RGB),还有每个像素点的深度(Depth)信息,也就是它离相机的距离。
  • 详细标注:数据集提供了:
    • 3D 相机位姿:每一帧画面拍摄时,相机在三维空间中的精确位置和朝向。
    • 表面重建:利用视频数据生成的完整三维场景模型。
    • 实例级语义分割:在三维模型上,不仅标注出每个物体是什么(语义,如“椅子”),还区分出不同的个体(实例,如“第一把椅子”、“第二把椅子”)。

📥 如何获取数据

要下载 ScanNet 数据集,你需要:

  1. 填写一份 ScanNet 使用条款协议 (ScanNet Terms of Use)
  2. 请务必使用你的机构邮箱(例如,学校或公司的邮箱)。
  3. 将填写好的协议发送到 scannet@googlegroups.com

注意:如果一周内没有收到回复,可能是你的邮件被退回了,请检查后再尝试。请不要回复系统自动发送的 noreply 邮件。你也可以关注 更新日志 (changelog) 来获取数据集的最新更新信息。

📁 数据组织结构

ScanNet 的数据是按“扫描序列”来组织的。每个序列代表一次完整的场景扫描,并存放在一个单独的文件夹里。文件夹的命名格式是 scene<空间ID>_<扫描ID>,或者用代码表示就是 scene%04d_%02d

一个典型的扫描文件夹(我们称之为 <scanId>)包含以下文件:

<scanId> # 这是一个场景的根目录,比如 scene0000_00
|
|-- <scanId>.sens
|   # 这是最原始的传感器数据流文件。
|   # 包含了彩色图像、深度图像、相机位姿等所有原始信息。
|
|-- <scanId>_vh_clean.ply
|   # 高质量的重建三维模型文件。这是最好看的、细节最丰富的版本。
|
|-- <scanId>_vh_clean_2.ply
|   # 一个“清洁”且“精简”过的三维模型。
|   # 它移除了很多不必要的细节,主要用于做语义标注,处理起来更快。
|
|-- <scanId>_vh_clean_2.0.010000.segs.json
|   # 这是对上面那个精简模型的“过分割”文件。
|   # "过分割"就是把模型预先切成很多小碎块,方便后续人工标注时圈选物体。
|
|-- <scanId>.aggregation.json, <scanId>_vh_clean.aggregation.json
|   # 这是实例级语义标注的“聚合”文件,非常重要!
|   # 它记录了哪些小碎块 (segments) 组合起来构成了一个完整的物体(比如椅子、桌子)。
|   # 分别对应低分辨率和高分辨率的模型。
|
|-- <scanId>_vh_clean_2.labels.ply
|   # 这是一个可视化的标注结果文件。
|   # 你可以直接用 3D 查看器打开它,会看到模型上的不同物体被涂上了不同的颜色,非常直观。
|
|-- <scanId>_2d-label.zip, <scanId>_2d-instance.zip
|   # 这是将 3D 标注投影回 2D 图像的结果。
|   # 里面是一系列的 PNG 图片,告诉你原始视频的每一帧中,哪个像素属于哪个物体。
|
|-- <scanId>_2d-label-filt.zip, <scanId>_2d-instance-filt.zip
|   # 这是上面 2D 投影结果的“过滤”版,质量更高一些。

📄 数据格式详解

1. 重建的表面模型文件 (*.ply)

这是一种标准的二进制 PLY 文件格式,用于存储 3D 模型。在这个数据集中,模型的 Z 轴被设定为垂直向上方向。

2. RGB-D 传感器数据流 (*.sens)

这是一种自定义的压缩二进制格式,打包了每一帧的彩色图、深度图和相机位姿。你需要使用官方提供的 ScanNet C++ 工具包 或者 Python 读取工具 来解析它。

3. 表面模型分割文件 (*.segs.json)

这个 JSON 文件定义了模型是如何被“过分割”成小碎块的。

{"params": { ... },     // 分割时使用的各种参数"sceneId": "...",      // 对应的场景 ID"segIndices": [1,1,1,1,3,3,15,15,15,15] // 核心数据!这是一个长数组,// 数组的每个元素对应 3D 模型中的一个顶点,// 值表示该顶点属于哪个分割块 (segment)。// 例如,前 4 个顶点都属于 1 号碎块。
}
4. 聚合语义标注文件 (*.aggregation.json)

这个 JSON 文件是理解标注的关键。它解释了 segs.json 文件里的碎块是如何组成一个个有意义的物体的。

{"sceneId": "...",        // 对应的场景 ID"appId": "...",          // 创建此标注所用工具的 ID 和版本"segGroups": [           // “分割组”列表,每个组代表一个物体{"id": 0,             // 这个物体组的 ID"objectId": 0,       // 物体实例的 ID(用于区分不同的椅子)"segments": [1,4,3], // 核心!表示这个物体是由 1、4、3 号碎块组合而成的"label": "couch"     // 这个物体的语义标签,这里是“沙发”},// ... 其他物体],"segmentsFile": "..."    // 引用的是哪个 *.segs.json 文件
}

简单来说*.ply 文件是 3D 模型 -> *.segs.json 把模型切成小碎块 -> *.aggregation.json 把碎块组合成带标签的物体(如“沙发”)。

🛠️ 相关工具与代码

ScanNet 项目不仅提供了数据,还开源了一整套工具链,方便你使用这些数据。

  • ScanNet C++ Toolkit: 用于读取和处理 .sens 原始数据文件的 C++ 工具。
  • 相机参数估计代码: 用于计算相机内外参数和深度图畸变校正。
  • 网格分割代码: 用于生成 *.segs.json 文件的“过分割”工具。
  • BundleFusion 重建代码: ScanNet 使用 BundleFusion 这个强大的实时三维重建系统来生成 3D 模型。
  • 扫描与管理工具:
    • ScannerApp: 一个 iPad 应用,配合 Structure.io 传感器可以轻松采集 RGB-D 数据。
    • Server & WebUI: 用于接收、处理和管理扫描数据的服务器和网页界面。
  • 语义标注工具: 用于在网页上进行三维模型标注的工具,集成在 SSTK 库中。

🎯 基准测试任务

有了这么好的数据,可以做什么研究呢?官方提供了一些基准测试任务,并给出了训练/测试集划分和代码。

  • 3D 物体分类: 判断一个从场景中分割出来的物体是什么(例如,这是椅子还是桌子?)。
  • 3D 物体检索: 给定一个物体,在数据库中找到所有相似的物体。
  • 语义体素标注: 将三维场景表示为一个个小方块(体素),并预测每个方块属于哪个物体类别。

你可以在 Tasks/Benchmark 目录下找到这些任务的数据划分。

🏷️ 标签说明

在做研究时,统一标签标准很重要。ScanNet 提供了一个标签映射文件 scannet-labels.combined.tsv。这个文件将 ScanNet 自己的物体标签(如 id)映射到了其他常用数据集的标签体系,例如:

  • NYUv2
  • ModelNet
  • ShapeNet
  • WordNet

这使得在不同数据集上训练和比较模型变得更加方便。

📜 其他信息

  • 引用 (Citation): 如果你在研究中使用了 ScanNet,请务必引用他们的论文。
  • 帮助 (Help): 如有任何问题,可以联系 scannet@googlegroups.com
  • 许可证 (License): 数据本身遵循 ScanNet 使用条款,而代码则采用 MIT 许可证发布。
http://www.lryc.cn/news/621979.html

相关文章:

  • Rust 入门 泛型和特征-深入特征 (十五)
  • 从“写代码”到“定义需求”:AI编程工具如何重构软件开发的核心流程?
  • 【Mysql语句练习】
  • PCA降维全解析:从原理到实战
  • epoll发数据学习
  • Flink中的处理函数
  • 【完整源码+数据集+部署教程】小鼠行为识别系统源码和数据集:改进yolo11-RFAConv
  • JavaScript 原型机制详解:从概念到实战(附个人学习方法)
  • Flink中基于时间的合流--双流联结(join)
  • Java集合Map与Stream流:Map实现类特点、遍历方式、Stream流操作及Collections工具类方法
  • Transformer实战(11)——从零开始构建GPT模型
  • 【入门级-算法-6、排序算法:排序的基本概念冒泡排序】
  • 【100页PPT】数字化转型某著名企业集团信息化顶层规划方案(附下载方式)
  • Redis入门和简介
  • LeetCode 刷题【42. 接雨水】
  • 基于51单片机声控灯设计 智能声音+光线控制 楼道灯 声控开关
  • RabbitMQ面试精讲 Day 23:分布式事务与可靠投递
  • 【Redis】分布式系统的演化过程
  • [Oracle数据库] Oracle 常用函数
  • 接口芯片断电高阻态特性研究与应用分析
  • 基于 ArcFace/ArcMargin 损失函数的深度特征学习高性能人脸识别解决方案
  • 解释器模式C++
  • EN 61547照明产品的电磁兼容抗干扰标准
  • 图数据库如何构筑 Web3 风控防线 聚焦批量注册与链上盗转 悦数图数据库
  • eBPF技术介绍
  • 【Java】HashMap的详细介绍
  • YAML:锚点深度解析,告别重复,拥抱优雅的配置艺术
  • 【Java Web 快速入门】十、AOP
  • 「 CentOS7 安装部署k8s」
  • 水环境遥感分析!R语言编程+多源遥感数据预处理;水体指数计算、水深回归分析、水温SVM预测、水质神经网络建模及科研级可视化制图