>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
Python

如何将房间照片转换为带纹理的干净3D网格,无杂乱或空洞

如果你尝试过用传统摄影测量法或NeRF和高斯溅射来重建室内场景,你就会知道它们的弱点。摄影测量法在白色墙壁和光泽桌面上经常失效,在网格中产生空洞。高斯溅射能给出漂亮的视口画面,但提取适合Unreal Engine或Blender的带PBR材质的正确多边形网格仍然非常困难。

慕尼黑工业大学(TUM)和华为的研究人员发布了GenRecon,这是一个尝试用不同方式解决问题的项目。他们将生成式3D对象模型与场景重建相结合。

GenRecon Teaser

核心思路

作者没有从零开始基于像素匹配来构建几何,而是采用了微软的生成式模型TRELLIS。TRELLIS本身可以从图像生成高质量的独立3D对象。但你无法直接将其应用于整个房间:分辨率和上下文都不够。

GenRecon将房间空间划分为重叠的空间块(立方体)。对于每个块,网络将相机图像的特征直接投影到3D空间中,并将其输入到生成式扩散管道中。

模型知道椅子、沙发、墙壁和橱柜通常是什么样子。因此,在照片显示眩光或缺失角度的地方,生成器会仔细重建正确的几何形状和材质。在作者的测试中,几何精度比标准方法提高了16%。

管道工作流程

生成过程分为三个阶段:

  1. 稀疏结构(SS)。模型确定整体粗略结构和块空间中的体素占用情况。
  2. 形状SLat。生成器通过潜在表示(结构化潜在变量)细化平滑表面几何。
  3. 纹理SLat。将PBR纹理应用到几何体上,同时考虑光照和原始照片。

之后,所有块被拼接在一起,一个单独的脚本将结果烘焙成带有正确纹理图的单个scene.glb文件。网格可以立即导入任何游戏引擎或3D编辑器。

运行所需条件

这个构建对硬件要求很高。你需要最新版本的PyTorch、CUDA 12.x以及Ampere架构或更新的GPU(RTX 3090、4090、A100),因为Flash-Attention和大量自定义CUDA扩展在底层运行。

使用子模块克隆仓库:

git clone -b main https://github.com/kasothaphie/GenRecon.git --recursive
cd GenRecon

对于环境设置,开发者提供了一个setup.sh脚本。运行前,设置CUDA和芯片架构的路径:

export CUDA_HOME=/usr/local/cuda
export TORCH_CUDA_ARCH_LIST="8.9" # укажите свою архитектуру, например 8.9 для RTX 4090
. ./setup.sh --new-env --basic --flash-attn --nvdiffrast --nvdiffrec --cumesh --o-voxel --flexgemm

如果脚本在编译flash-attn时遇到问题,作者建议从Dao-AILab releases为你的Python和PyTorch组合安装预编译的二进制wheel。

所有三个阶段的预训练权重直接下载:

wget https://kaldir.vc.cit.tum.de/genrecon/sparse_structure.pt
wget https://kaldir.vc.cit.tum.de/genrecon/shape_slat.pt
wget https://kaldir.vc.cit.tum.de/genrecon/texture_slat.pt

场景重建

如果你想处理iPhone或相机视频,首先需要通过COLMAP计算相机姿态。姿态准备就绪后,运行推理:

python reconstruct_scene.py \
  --mode Iphone \
  --path "${WORK_ROOT}" \
  --output_path "${OUT_DIR}" \
  --ss_ckpt "sparse_structure.pt" \
  --shape_ckpt "shape_slat.pt" \
  --tex_ckpt "texture_slat.pt" \
  --num_imgs_per_scene 999 \
  --chunk_size_factor 1.08 \
  --stat_std_ratio 3.0 \
  --radius_nb_points 7 \
  --radius_m 0.2 \
  --pipeline_config configs/pipelines/texture.json \
  --proj_batch_voxels 2048

脚本保存中间块张量。要将它们组装成最终的.glb,调用转换器:

python chunked_to_glb.py \
    --inputs "${OUT_DIR}/to_glb_inputs.pt" \
    --chunk_inputs "${OUT_DIR}/chunk_inputs.pt" \
    --output_dir "${OUT_DIR}"

代码还包含ScanNet++基准测试的现成配置,如果你想复现论文中的科学测量结果。

注意事项

GenRecon代码库是一个学术仓库,包含所有相关的内容。这里没有花哨的GUI或便捷的Web界面——所有旋钮都通过控制台参数和JSON配置来调节。

为自己的微调准备数据需要预渲染并将场景转换为O-Voxel表示。你无法在弱硬件或8-12GB显存的GPU上运行训练;由于密集的体素网格,推理也需要大量显存。

适用人群

对于3D通才、游戏开发者和计算机视觉研究者来说,这个项目值得关注。如果你厌倦了手动清理嘈杂的房间扫描和重新烘焙UV展开,GenRecon通过现成块进行生成的方法似乎是获取可编辑室内网格最实用的方式之一。

相关项目