4K 超高清 NeRF 重建算法
现有各类 NeRF 方法主要针对低分辨率场景(<=1K)设计,在更高分辨率的场景上就会出现渲染模糊,细节丢失,推理速度缓慢等问题。4K-NeRF 是针对超高分辨率(4K)场景设计的,在超高分辨率上可以取得相比现有方法明显的效果提升。
  • 模型资讯
  • 模型资料

Clone with HTTP

 git clone https://www.modelscope.cn/DAMOXR/cv_nerf-3d-reconstruction-4k-nerf_damo.git

背景介绍

NeRF(Neural Radiance Fields)是一种最新的三维新视角合成技术。其核心利用物理体渲染(Volume rendering)方程结合各类隐式表征的方式,使模型根据三维物体或场景的二维多视角彩色图像即可完成高质量的三维重建。

模型概述

现有各类 NeRF 方法主要针对低分辨率场景(<=1K)设计,在更高分辨率的场景上就会出现渲染模糊,细节丢失,推理速度缓慢等问题。4K-NeRF 是针对以上问题设计的,在超高分辨率上可以取得相比现有方法明显的效果提升。

4K-NeRF 将 NeRF 结构改进为编码-解码器结构,采用显式表示的 NeRF 模型作为编码器,主要学习低分辨下的几何信息;而为了高效的恢复渲染高分辨细节,解码器则采用预训练的图像恢复卷积网络。同时采用基于邻域的光线采样方式结合基于图像感知的损失函数。

效果展示

以下分别是在 nerf_llff_datanerf_synthetic 上 4K-NeRF 与 baseline 的渲染效果对比。

使用范围与方式

使用范围

当前支持两种数据类型,分别是nerf-synthesisnerf_llff_data

  • nerf-synthesis 数据集是人工合成的多视角数据,包含 8 个物体的 360 度多俯仰角环拍图像
    下载及更多信息请参考NeRF三维重建数据集
  • nerf_llff_data 数据集是各种设备拍摄的真实场景数据,包含 8 个场景的小于 180 度多俯仰角拍摄图像
    下载及更多信息请参考NeRF-LLFF真实场景数据集

目标场景

  • 希望重建后的渲染分辨率能满足超高清(4K)需求
  • 需要对单一静态物体进行三维重建
  • 需要对某一静态场景的小范围视角进行重建

运行环境

  • 模型只支持在 GPU 上运行,具体效率与 GPU 性能相关
  • GPU 显存要求大于等于 16 G

使用方式

模型推理

在 ModelScope 框架上,调用训练好的 4K-NeRF 模型即可通过简单的 pipeline 来推理(仅支持 GPU 运行)。

以 nerf_llff_data 的 fern 场景为例,在构建 pipeline 时需要指定 enc_ckpt_path 和 dec_ckpt_path 分别为训练好的 encoder 和 decoder 的模型路径。除此之外,pipeline 构建完成后需要输入 data_dic 来提供数据集相关的参数。具体示例可以参考以下代码,该代码可直接运行:

import os
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
from modelscope.msdatasets import MsDataset
# 
model_id = 'DAMOXR/cv_nerf-3d-reconstruction-4k-nerf_damo'
data_dir = MsDataset.load(
    'DAMOXR/nerf_llff_data',
    subset_name='default',
    split='test',
    # download_mode=DownloadMode.FORCE_REDOWNLOAD
).config_kwargs['split_config']['test']
nerf_llff = os.path.join(data_dir, 'nerf_llff_data')
scene = 'fern'
data_dir = os.path.join(nerf_llff, scene)
render_dir = 'exp'
data_dic = dict(
    datadir=data_dir,
    dataset_type='llff',
    load_sr=1,
    factor=4,
    ndc=True,
    white_bkgd=False)

render_dir = 'exp'
### now we use llff dataset, when use nerf-synthesis dataset, data_type should specify as 'blender'
nerf_recon_4k = pipeline(
    Tasks.nerf_recon_4k,
    model=model_id,
    data_type='llff',
    )

nerf_recon_4k(
    dict(data_cfg=data_dic, render_dir=render_dir))
### render results will be saved in render_dir

模型训练

训练代码和训练方式请参考 [github]

相关论文

4K-NeRF: High Fidelity Neural Radiance Fields at Ultra High Resolutions

Zhongshu Wang, Lingzhi Li, Zhen Shen, Li Shen, Liefeng Bo

Alibaba Group

[Project Webpage]