0
点赞
收藏
分享

微信扫一扫

Leetcode 3.18

Dylan Chua 和 Anne Lee 开发了一个处理管线,用于对 3D Tiles 中包含的 GL 传输格式 (glTF) 模型进行语义分割。 该管道读取并遍历 3D Tileset,以输出包含元数据的经过转换的划分对象集。 该项目为 3D 语义分割器提供了最小可行产品,作为各种应用程序的概念验证。 他们接受模拟和培训系统中心首席工程师 How Chang Hong 的指导。

1、动机

现实世界的当代 3D 表示通常是手工制作且昂贵。 高保真模型还需要较长的生产时间,从而导致完成已经过时的模型。 新加坡的 3D 表示目前以 OneMap 的形式存在,“

权威的新加坡国家地图,包含新加坡土地管理局开发的最详细、最及时的更新信息”。 尽管OneMap中的模型干净而精致,但它缺乏树木和地形高程,更不用说完全没有桥梁等基础设施。

提取自 OneMap 

随着卫星摄影测量的出现,可以以较低的劳动力和资源成本快速构建逼真的地球 3D 模型。 先前的缺点可以通过这些 3D Tiles 的潜在力量来解决,只需很少的时间投资即可构建。 因此,数字孪生可以保持最新。 创建这些 3D 图块的自动性质会导致元数据很少的网格的嘈杂合并。 这就是开发一种处理和分类这些数据的方法的挑战。

2、现有工作

在3D分割领域,现有的分割方法可大致分为以下几类:

  • 多视角:以不同角度渲染物体的2D图像
  • 体块:转换为二元体素
  • 点云:使用顶点
  • 基于网格:使用网格图元

在上述四种技术中,基于“点云”的技术具有最深入的研究。 然而,由于两个主要考虑因素,并未对此进行探讨:

  • 大规模城市网格

3D语义分割领域的现有文献大多主要关注较小规模,例如区分瓶盖等特征或识别房间中家具的类型。 然而,该项目提供的数据类型需要针对大规模城市网格的独特特征量身定制的解决方案。

  • 数据限制

最先进的城市规模 3D 分割系统通常依赖于丰富的点云,这些点云通常使用移动激光扫描、机载激光扫描或 LiDAR 等 3D 激光扫描技术生成。 然而,给出的数据是通过摄影测量生成的。 因此,提供的网格缺乏生成稳健点云所需的细节水平。 在比较 OneMap 和 Google 地图图块的图像时,这种限制很明显,其中植被和建筑物之间的边界往往会混合在一起,并且车辆等伪影仍然存在于数据中。

因此,探索了新的分割方法(在下面的“方法”部分中介绍)。

3、整体管线

本质上,管道使用根tileset JSON并随后遍历tileset树。 每个 3D 模型 — 一个二进制 glTF (.glb) 文件 — 都会被分段,并且其顶点也会被分类。 体现类的元数据可以存储在tileset JSON 中或.glb 文件中。

4、实现方法

我们探索了两种分割 3D 模型的方法

  • 使用纹理图像
  • 基于网格的分割

4.1 图像分割

考虑到要转换的摄影测量 3D Tileset,包含的 3D 对象是附加有照片级真实感纹理的 .glb 文件。 二维图像分割的研究多种多样,并且存在大量训练有素的计算机视觉模型,尤其是在城市景观方面。 因此,可以对这些纹理执行语义分割。

3D模型示例

遗憾的是,由于该项目的持续时间有限,计算机视觉模型没有接受数据训练。 尽管如此,还是使用了基于 Facebook 的Mask2Former构建的预训练语义分割模型。 据报告,该模型的平均交集 (mIoU) 为 57.7,可以将区域标记为“道路”、“建筑物”和“植被”等。 尽管该模型是在城市景观上进行训练的,但与卫星图像得出的纹理有足够的相似性。 图像分割模型的结果如下所示,其中橙色表示建筑物,紫色表示植被。 目视检查显示分割具有足够的性能,将建筑物和植被的明显区域分开。 尽管如此,还是有一些纹理被错误地标记,并且肯定可以通过专门针对纹理的模型训练来改进。

对 3D 模型的纹理执行语义分割。 橙色:建筑; 紫色:植被

4.2 映射到 3D

要将 2D 分割转换为 3D,必须加载 .glb 文件以检索其顶点、面和纹理坐标。 诸如 trimesh 之类的高级库可以轻松获取这些内容,但这会带来数据压缩损失。 每个顶点都有一个各自的 UV 坐标,即一个包含 0 到 1 两个数字的 2D 矢量,对应于纹理上的像素。 因此,顶点可以根据它们在掩模上各自的值进行分类。

4.3 TUDelft 的语义城市网格分割 (SUMS)

另一种探索的方法是使用 TUDelft 制作的鲜为人知的分割工具。 与上述方法的主要区别在于,除了对纹理图像进行图像分割之外,它还会考虑网格特征(例如几何、上下文信息)。 SUMS 由代尔夫特理工大学 (TUDelft) 的 3D 地理信息研究小组构建。 它是一个开源程序,可以对大规模城市网格进行自动语义分割。 他们的 Github 存储库在这里。

SUMS by TUDelft

它主要用 C++ 实现,并利用 CGAL 和 Easy3D 等开源库。

  • 为什么选择SUMS

它提供了一个在精心注释的网格数据集上训练的预训练语义分割模型。 该数据集跨越 1900 万个三角形,覆盖赫尔辛基 4 平方公里的区域,包含城市环境中常见的六种对象类别:地形、高植被、建筑、水、车辆和船只。 重要的是要承认该数据集与数据集之间的相似程度

提供的数据,测试数据与给定数据越接近,模型性能提高的可能性就越高。 SUMS 还提供了通过使用网格注释工具来细化模型的潜力。

  • SUMS — 引擎盖下

其工作原理和技术细节可以在他们的论文中阅读。 本质上,它对网格进行过度分割以对三角形进行分组,识别平面(即平坦)段并提取特征。 然后将这些特征输入随机森林分类器以进行网格分割。

  • 根据给定的数据

提供的数据最初为.glb 格式,但需要转换为.ply 格式以与SUMS 兼容。

文件转换示意

标记的输出如下所示:

从原始 .glb 文件到转换后的 .ply 文件的转换过程以及颜色编码输出

由于 SUMS 在大型城市网格上进行了训练,因此也在更高级别的网格上进行了测试。

低级和高级网格上的 SUMS 检测

下表显示了 SUM 在两种网格上的性能比较。

与低级网格相比,应用于高级网格时,其性能提高了约 4.5 倍,这主要归因于网格与训练 SUMS 所依据的数据的相似性。 在这些输出表示中,每个三角形面都经过颜色编码以表示

其各自的类别或类别。 每个三角形面都包含三个顶点,每个顶点在 3D 空间内都有自己的一组坐标。 每个顶点都被标记以表示其关联的类。

4.4 元数据

等效的元数据可以存储在 3D 模型本身中,也可以存储在包含它的 JSON 文件中。 分层存储如下图所示。 标记要素和顶点必须位于 .glb 文件内,而更高级别的信息属于 3D Tileset JSON 文件。

具有不同级别元数据的 3D Tiles 结构展示

4.5 在 .glb 文件内

通过 glTF 扩展 EXT_MESH_FEATURES ,每个顶点特征可以包含到 .glb 文件本身中。 附录 C 演示了顶点的类如何打包成字节并可以由加载器检索。

单独的顶点语义元数据可以轻松可视化。 可以使用自定义着色器,根据每个顶点的类别赋予不同的外观,例如颜色。 更多细节稍后将在可视化部分中展开。

4.6 在 3D Tileset JSON 中

为了对图块集进行分段,每个 3D 模型都按类别分为多个 .glb 文件。 通过每个顶点的类别,可以选择并提取模型的面。 面的分类可能取决于朝向每个面的顶点的方法。 如果将面按其顶点的每一类进行分类,则保证所有面都被分组,但可能会出现重叠。 相反,分配给所有顶点共有的一个类可以防止重叠,但可能会导致未分类的面。

3D模型与顶点类的分离

由于一个 .glb 模型现在被拆分为多个文件,因此图块必须包含多个内容,每个内容都标有其所属的类。 3D Tiles 1.1 版新支持语义元数据和每个图块的多个内容,而给定的图块集仍为 1.0 版。 此后,需要一个基于 py3dtiles 的 3D Tiles 读取器和导出器。 拆分为多个内容可以对分段模型进行操作。 也就是说,它允许选择特定的类来渲染网格并与其交互。 例如,可以关闭植被,从其中删除分类网格
现场。

4.7 输出

从单个 .glb 文件到整个图块集,为了完全分割 3D Tiles 数据,需要遍历图块集树以找到要分割的 .glb 文件。 由于 3D 图块内容 URI 可能与图块集 JSON 文件相关,因此遍历器会考虑搜索子图块和 .glb 文件的相对路径。 考虑到 3D 文件较大且数量众多,仅处理了数据的子集。 特定感兴趣区域的提取从超过 75,500 个需要分割的 3D 模型减少到仅 174 个。

提取的 3D 图块区域

该管道在 174 个 .glb 文件上运行,只花了不到 5 分钟,平均每个文件大约需要 1.5 秒。 大部分计算时间都花在了机器学习模型上。 第一种方法每个纹理图像大约需要 1 秒。 第二个模型每个网格和相应的纹理图片大约需要 5 秒。

5、可视化

Cesium 是引入 3D Tiles 的平台,也开发了可视化 3D Tiles 的库。 我们特别关注 Web 版的 CesiumJS 和 Unity 版的 Cesium。 在这两种情况下,本地服务器都会提供图块集数据。 使用 Express 的 Node.js Web 应用程序设置了数据路径作为静态目录,允许应用程序托管文件。

CesiumJS 是 Cesium 提供的开源 JavaScript 库,旨在处理海量数据集,广泛用于创建用于共享地理空间数据的交互式 Web 应用程序。

Node.js 应用程序同时提供 HTML 和 JavaScript 文件以可视化浏览器中的数据,并使用 CesiumJS 来提供基于浏览器的可视化工具。

分割后的 3D Tiles 的可视化是通过将自定义着色器输入 CesiumJS 来完成的,该着色器识别每个顶点的类 ID,并为每个类生成唯一的外观。 可以切换该着色器以显示原始纹理或类的颜色。

CesiumJS 中区分建筑物(蓝色)和植被(绿色)的自定义着色器

Cesium 的 Unity 插件有助于在 Unity 中渲染 3D 图块,从而实现交互性并创建沉浸式 VR 体验。 完成此操作的详细过程可以在项目的 GitHub 存储库中找到。 为了导航和探索地图,按照本教程中提供的说明,将人形头像合并到游戏中。 使用 WASD 键可以控制头像。

新加坡碧山的一个人形头像在 3D Tiles中行走

也可以在 Unity 中选择和查看元数据。

Unity 中元数据显示为文本的示例场景

6、结束语

尽管大规模城市纹理的 3D 网格分割是一个相对较新的新兴领域,但我们对执行分割任务的两种不同方法进行了探索:一种依赖于纹理图像分析,另一种采用基于网格的分割方法。

这些方法可以对每个网格内的顶点和面进行分组,从而有助于添加有价值的元数据以增强数据组织和分析。

举报

相关推荐

0 条评论