3D高斯泼溅原理及实践【3DGS】

人工智能可能是我们这个时代的主要领域之一,它几乎可以用于从驾驶汽车到医疗保健甚至能够预防失明等所有领域,最近提出了一种新的 3D 重建方法。SNGULAR 及其人工智能团队希望了解有关 3D 重建技术的最新更新的更多信息。

目前可用于 3D 重建的许多 SOTA 方法需要大量 CPU/GPU 使用率来处理场景或渲染场景,其中一些甚至需要两者兼而有之。SIGGRAPH 2023 Gaussian Splatting 上提出的新方法可以节省推理和渲染的时间。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

过去几年,我们看到了大量关于 3D 重建的文章,例如 NeRF(神经辐射场)方法,该方法实现了非常好的 3D 重建,具有高度精确的场景和模型,可用于虚拟旅游、沉浸式游戏和建筑可视化等众多领域。然而,这是有代价的,NeRF 耗时,需要大量内存和存储空间,并且仅限于静态场景。高斯泼溅(Gaussian Splatting)解决了其中一些问题,使其成为当今最好的 3D 重建方法。

本文旨在将此方法应用于室内重建的特定领域,我们的主要目标是:

  • 了解 3D 重建和高斯泼溅的工作原理。
  • 运行一个小型演示,无需离开家即可重建你自己的场景。

所以,跟我一起深入研究如何对你的家进行 3D 重建。

1、了解 3D 重建

重建始于用相机从场景的不同视角拍摄的几张照片。这些图像将作为重建的输入数据。重建的主要目的是恢复场景的空间结构,并使我们能够从任何角度查看它。

3D 重建中最重要的关键概念之一是特征匹配,其中在多个视图中识别和匹配 2D 图像中的独特点或特征。使用两幅图像之间的对应关系可以估计相机的相对位置,从而计算这些特征的 3D 位置的三角测量。高斯 Splatting 使用来自另一种称为运动结构 (SfM) 的方法的云点,该方法通过分析相机随时间的运动来估计相机姿势和 3D 结构。

3D 重建广泛应用于各个领域。在考古学中,它可以帮助研究人员记录和分析历史遗迹和文物。在建筑学中,它有助于创建精确的建筑模型,用于设计和翻新。医学成像依靠 3D 重建来可视化复杂的解剖结构。娱乐行业将其用于逼真的 CGI 和视频游戏开发。此外,3D 重建在自主机器人技术中起着至关重要的作用,使机器人和无人机能够感知和导航其环境。随着技术的不断进步,3D 重建有望彻底改变我们与物理和数字世界的互动方式,为虚拟和增强现实、制造业等开辟新的可能性。

2、高斯泼溅简介

在 SNGULAR 中,我们决定让人们稍微了解一下这项革命性的新技术。

高斯泼溅是一种革命性的 3D 重建新方法,它试图解决其他方法存在的一些问题,例如处理时间长。对于这种方法,他们的方法不是将场景表示为体积或网格,而是将世界用作 3D 画布,绘制小笔触,直到场景看起来像输入图像。这种方法的主要优点之一是它不仅可以重建静止图像,还可以重建移动场景:

它从点云开始,为每个点创建一个小笔画,然后慢慢改变每个笔画的大小、位置、旋转和颜色,每次迭代都使用随机梯度下降技术优化这些参数,以减少笔画和输入图像之间的误差。但这还不够,因为有些区域可能需要更多或更少的笔画才能正确绘制,因此每 100 次迭代就会应用一次密集化过程,在需要更多细节的区域中拆分笔画,并在不再需要笔画的区域中将其移除。

一旦优化达到官方存储库中获得的代码中的 7000 和 30000 次迭代,默认情况下将创建一个新的 ply 文件,其中包含表示场景所需的所有笔触,我们只需将文件加载到兼容的可视化工具中即可完成!

3、高斯泼溅的优点

现在我们对高斯泼溅的工作原理有了大致的了解,我们可以总结这种方法的优点。

  • 训练时间短:一个场景可以在一个小时的计算时间内完成训练。
  • 高渲染 fps:高斯溅射能够以高达 100 fps 的速度实时渲染场景。
  • 动态场景:不仅像其他方法一样可以重建静态场景,高斯泼溅还可以重建移动场景。

4、用高斯泼溅重建自己的家

在这个小教程中,我们将使用 Ubuntu 20.04。需要支持 CUDA 的显卡,我们使用了 GTX 1080。

第一步是获取图像。最简单的方法是制作你想要重建的区域的视频。

尝试:

  • 获取不太大或太短的视频,大约 1 分钟即可。
  • 尝试从不同角度进行流畅的动作。
  • 使用大约 1920x1080 的分辨率。
  • 聚焦于一个物体并转动它,确保背景也出现。
  • 在良好的照明条件下进行,否则很难获得软件匹配。

一旦我们有了视频,我们就可以使用 ffmpeg 提取帧。为此,我们将在终端中执行:

ffmpeg -i <Path to video file> -r X Example/input/image%03d.jpg

你需要将 -r 中的 X 替换为一个数字,具体取决于视频的长度,您可以使用此参数,直到获得理想的 100 到 300 张图像。图像越多,点云的质量就越高,但您还需要具有更多 VRAM 的图形卡。对于我们的视频,我们使用了 2 的 X,因此最终命令将是:

ffmpeg -i video.mp4 -r 2 Example/input/image%03d.jpg

几秒钟后,我们的图像就可以进行处理了。

如前所述,Gaussian Splatting 将使用 SfM 计算的云点与图像一起作为输入;他们建议使用 Colmap 或 NeRF 来实现这一点。使用 Colmap 是一种非常简单的方法。为此,在 ubuntu 中,我们只需使用 apt 下载 Colmap 即可。

sudo apt-get install colmap

如果你在服务器中运行(没有屏幕),则可能需要从头开始构建 colmap,你可以在此处找到如何操作的说明。

安装 colmap 后,我们可以继续生成点云,Gaussian Splatting 存储库提供了一个可以轻松执行此操作的脚本,因此首先我们将使用 git 下载存储库。

如果你的系统中未安装 git,可以使用以下命令执行此操作:

sudo apt-get install git

然后我们可以运行:

git clone https://github.com/graphdeco-inria/gaussian-splatting - recursive

下载完成后,我们开始准备环境,我们将使用 conda,如果你没有安装,可以在这里找到它。

我们安装 Gaussian Splatting 的要求:

cd gaussian-splatting
conda env create - file environment.yml

完成后,我们可以激活环境:

conda activate gaussian_splatting

然后我们开始处理点云:

python convert.py -s <PATH>/<Foldername>/

一旦完成,我们将有一个类似于这样的目录树:

<location>
    | — -input
    |	 	| — -<image 0>
    | 		| — -<image 1>
    | 		| — -…
    | — -distorted
    | — -database.db
    | — -sparse
    | — -0
    | — -…

然后我们可以使用以下命令开始训练!

python train.py -s <path to COLMAP or NeRF Synthetic dataset>

这个过程需要一段时间,完成后,我们将在文件夹 output 中得到结果,将有两个文件夹,分别包含迭代 7000 次和 30000 次的结果。然后,我们可以继续使用可视化工具可视化结果。

最简单的方法是使用“camenduru”制作的 colab笔记本

你只需运行该单元,打开类似“https://.trycloudflare.com”的 http 链接,然后拖动在输出文件夹中找到的 point_cloud.ply 文件。运行后,就可以看到重建的家了!


原文链接:3DGS三维重建实战 - BimAnt

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-07 14:18:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-07 14:18:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-07 14:18:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-07 14:18:02       20 阅读

热门阅读

  1. 生活中优秀学习习惯

    2024-06-07 14:18:02       9 阅读
  2. rust的类型转换和一些智能指针用法(四)

    2024-06-07 14:18:02       8 阅读
  3. vue3之基于el-image实现图片预览

    2024-06-07 14:18:02       9 阅读
  4. GUI-demo(不含DB)

    2024-06-07 14:18:02       13 阅读
  5. 技术速递|使用主构造函数重构 C# 代码

    2024-06-07 14:18:02       10 阅读
  6. C#知识|封装典型的SQLServer数据库查询方法。

    2024-06-07 14:18:02       8 阅读
  7. Webpack基本配置

    2024-06-07 14:18:02       7 阅读
  8. 【运维】如何停止某个端口相关的所有服务

    2024-06-07 14:18:02       7 阅读
  9. ES6中如何使用class和extends关键字实现继承?

    2024-06-07 14:18:02       8 阅读
  10. 深耕低代码,技术赋能企业转型业务

    2024-06-07 14:18:02       8 阅读
  11. MySql什么时候表锁or行锁?

    2024-06-07 14:18:02       9 阅读