ScanNet项目介绍
ScanNet 是一个大型的 RGB-D 视频数据集,专门用于室内场景的理解和三维重建。简单来说,研究人员用特殊的相机(能同时捕捉彩色图像和深度信息)在 1500 多个不同的室内场景(如办公室、公寓)中进行了扫描,总共收集了 250 万个视角的图像。这个数据集不仅包含原始的视频数据,还提供了处理好的 3D 模型、精确的相机位置信息以及非常详细的物体标注(比如,这个是椅子,那个是桌子)。
📖 ScanNet 是什么?
ScanNet 是一个包含了大量室内场景 RGB-D 视频的数据集。你可以把它想象成一个巨大的三维“相册”,里面有:
- 250 万个视图:在超过 1500 个不同的室内场景(扫描)中拍摄。
- RGB-D 视频:每个视频帧不仅有彩色信息(RGB),还有每个像素点的深度(Depth)信息,也就是它离相机的距离。
- 详细标注:数据集提供了:
- 3D 相机位姿:每一帧画面拍摄时,相机在三维空间中的精确位置和朝向。
- 表面重建:利用视频数据生成的完整三维场景模型。
- 实例级语义分割:在三维模型上,不仅标注出每个物体是什么(语义,如“椅子”),还区分出不同的个体(实例,如“第一把椅子”、“第二把椅子”)。
📥 如何获取数据
要下载 ScanNet 数据集,你需要:
- 填写一份 ScanNet 使用条款协议 (ScanNet Terms of Use)。
- 请务必使用你的机构邮箱(例如,学校或公司的邮箱)。
- 将填写好的协议发送到
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 许可证发布。