ScanNet项目介绍

发布于:2025-08-16 ⋅ 阅读:(20) ⋅ 点赞:(0)

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)映射到了其他常用数据集的标签体系,例如:

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

📜 其他信息

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

网站公告

今日签到

点亮在社区的每一天
去签到