0
点赞
收藏
分享

微信扫一扫

3D场景编辑方法——CustomNeRF

梦想家们 04-17 14:00 阅读 3
3d

文章目录


摘要

本周主要阅读了CVPR文章,Customize your NeRF: Adaptive Source Driven 3D Scene Editing via Local-Global lterative Training。一种将文本描述和参考图像统一为编辑提示的CustomNeRF框架,可以通过微调预训练的扩散模型将参考图像中包含的特定视觉主体V∗嵌入到混合提示中,从而满足一般化和定制化的3D场景编辑要求。除此之外,还学习了简单的Transformer代码的学习。

Abstract

This week, I mainly read the CVPR article, “Customize your NeRF: Adaptive Source Driven 3D Scene Editing via Local-Global Iterative Training.” It introduces a CustomNeRF framework that unifies text descriptions and reference images into editing cues. By fine-tuning a pre-trained diffusion model, the framework can embed specific visual subjects V∗ contained in the reference image into the mixed cues, thus satisfying the requirements of generalized and customized 3D scene editing. Additionally, I also studied the basics of Transformer code.


文献阅读:3D场景编辑方法——CustomNeRF

Title: Customize your NeRF: Adaptive Source Driven 3D Scene Editing via Local-Global lterative Training
Author:Runze He, Shaofei Huang, Xuecheng Nie, Tianrui Hui, Luogi Liu, Jiao Dai, jizhong Han, Guanbin Li, Si Liu
From:2024 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)

1、研究背景

自2020年神经辐射场(Neural Radiance Field, NeRF)提出以来,将隐式表达推上了一个新的高度。作为当前最前沿的技术之一,NeRF快速泛化应用在计算机视觉、计算机图形学、增强现实、虚拟现实等领域,并持续受到广泛关注。有赖于易于优化和连续表示的特点,NeRF在3D场景重建中有着大量应用,也带动了3D场景编辑领域的研究,如3D对象或场景的纹理重绘、风格化等。为了进一步提高3D场景编辑的灵活性,近期基于预训练扩散模型进行3D场景编辑的方法也正在被大量探索,但由于NeRF的隐式表征以及3D场景的几何特性,获得符合文本提示的编辑结果并非易事。

2、提出方法

为了让文本驱动的3D场景编辑也能够实现精准控制,论文提出了一种将文本描述和参考图像统一为编辑提示的CustomNeRF框架,可以通过微调预训练的扩散模型将参考图像中包含的特定视觉主体V∗嵌入到混合提示中,从而满足一般化和定制化的3D场景编辑要求。为了实现仅对图像前景区域进行准确编辑,该论文提出了一种局部-全局迭代编辑(LGIE)的训练方案,在图像前景区域编辑和全图像编辑之间交替进行。该方案能够准确定位图像前景区域,并在保留图像背景的同时仅对图像前景进行操作。此外,在由图像驱动的3D场景编辑中,存在因微调的扩散模型过拟合到参考图像视角,所造成的编辑结果几何不一致问题。对此,该论文设计了一种类引导的正则化,在局部编辑阶段仅使用类词来表示参考图像的主体,并利用预训练扩散模型中的一般类先验来促进几何一致的编辑。

3、CustomNeRF

3.1、整体框架步骤

  • 首先,在重建原始的3D场景时,CustomNeRF引入了额外的mask field来估计除常规颜色和密度之外的编辑概率。如下图(a) 所示,对于一组需要重建3D场景的图像,该论文先使用 Grouded SAM 从自然语言描述中提取图像编辑区域的掩码,结合原始图像集训练 foreground-aware NeRF。在NeRF重建后,编辑概率用于区分要编辑的图像区域(即图像前景区域)和不相关的图像区域(即图像背景区域),以便于在图像编辑训练过程中进行解耦合的渲染。
  • 其次,为了统一图像驱动和文本驱动的3D场景编辑任务,如下图(b)所示,该论文采用了Custom Diffusion 的方法在图像驱动条件下针对参考图进行微调,以学习特定主体的关键特征。经过训练后,特殊词 V∗ 可以作为常规的单词标记用于表达参考图像中的主体概念,从而形成一个混合提示,例如 “a photo of a V∗ dog”。通过这种方式,CustomNeRF能够对自适应类型的数据(包括图像或文本)进行一致且有效的编辑。
  • 在最终的编辑阶段,由于NeRF的隐式表达,如果使用SDS损失对整个3D区域进行优化会导致背景区域发生显著变化,而这些区域在编辑后理应与原始场景保持一致。如下图(c)所示,该论文提出了局部-全局迭代编辑(LGIE)方案进行解耦合的SDS训练,使其能够在编辑布局区域的同时保留背景内容。

在这里插入图片描述

3.2、对特定问题的解决

  1. 实现仅对图像前景区域进行准确编辑:
    提出了一种局部-全局迭代编辑(LGIE)的训练方案,在图像前景区域编辑和全图像编辑之间交替进行。该方案能够准确定位图像前景区域,并在保留图像背景的同时仅对图像前景进行操作。
  2. 编辑结果几何不一致问题:
    设计了一种类引导的正则化,在局部编辑阶段仅使用类词来表示参考图像的主体,并利用预训练扩散模型中的一般类先验来促进几何一致的编辑。

4、实验结果

下图展示了CustomNeRF与基线方法的3D场景重建结果对比,在参考图像和文本驱动的3D场景编辑任务中,CustomNeRF均取得了不错的编辑结果,不仅与编辑提示达成了良好的对齐,且背景区域和原场景保持一致。
在这里插入图片描述
下图展示了CustomNeRF在图像、文本驱动下与基线方法的量化比较,结果显示在文本对齐指标、图像对齐指标和人类评估中,CustomNeRF均超越了基线方法。
在这里插入图片描述

5、总结

本论文创新性地提出了CustomNeRF模型,同时支持文本描述或参考图像的编辑提示,并解决了两个关键性挑战——精确的仅前景编辑以及在使用单视图参考图像时多个视图的一致性。该方案包括局部-全局迭代编辑(LGIE)训练方案,使得编辑操作能够在专注于前景的同时保持背景不变;以及类引导正则化,减轻图像驱动编辑中的视图不一致,通过大量实验,也验证了CustomNeRF在各种真实场景中,能够准确编辑由文本描述和参考图像提示的3D场景。


简单Transformer的实现

# 定义多头注意力机制模块  
class MultiHeadAttention(nn.Module):  
    def __init__(self, d_model, num_heads):  
        super(MultiHeadAttention, self).__init__() # 调用父类(nn.Module)的构造函数  
        self.num_heads = num_heads  # 设置多头注意力的头数  
        self.d_model = d_model  # 输入特征的维度  
          
        # 确保d_model可以被num_heads整除  
        assert d_model % self.num_heads == 0  
          
        # 计算每个头的维度  
        self.depth = d_model // self.num_heads  
          
        # 定义线性变换层,用于计算查询、键和值的表示  
        self.wq = nn.Linear(d_model, d_model)  
        self.wk = nn.Linear(d_model, d_model)  
        self.wv = nn.Linear(d_model, d_model)  
          
        # 定义线性变换层,用于最后的输出变换  
        self.dense = nn.Linear(d_model, d_model)  
          
    # 将输入张量分割成多个头  
    def split_heads(self, x, batch_size):  
        # 重塑张量以准备分割  
        x = x.reshape(batch_size, -1, self.num_heads, self.depth)  
        # 置换张量的维度,以便后续的矩阵乘法  
        return x.permute(0, 2, 1, 3)  
      
    # 前向传播函数  
    def forward(self, v, k, q, mask):  
        batch_size = q.shape[0]  # 获取批次大小  
          
        # 通过线性变换层计算查询、键和值的表示  
        q = self.wq(q)  # 查询(batch_size, seq_len, d_model)  
        k = self.wk(k)  # 键(batch_size, seq_len, d_model)  
        v = self.wv(v)  # 值(batch_size, seq_len, d_model)  
          
        # 将查询、键和值分割成多个头  
        q = self.split_heads(q, batch_size)  # (batch_size, num_heads, seq_len_q, depth)  
        k = self.split_heads(k, batch_size)  # (batch_size, num_heads, seq_len_k, depth)  
        v = self.split_heads(v, batch_size)  # (batch_size, num_heads, seq_len_v, depth)  
          
        # 计算缩放点积注意力  
        scaled_attention, attention_weights = self.scaled_dot_product_attention(q, k, v, mask)  
          
        # 将注意力输出的维度重新排列并合并回原始维度  
        scaled_attention = scaled_attention.permute(0, 2, 1, 3).contiguous()  
        new_context_layer_shape = scaled_attention.shape[:-2] + (self.d_model,)  
        scaled_attention = scaled_attention.reshape(new_context_layer_shape)  
          
        # 通过线性变换层得到最终的输出  
        output = self.dense(scaled_attention)  
        return output, attention_weights  
      
    # 计算缩放点积注意力  
    def scaled_dot_product_attention(self, q, k, v, mask):  
        # 计算查询和键的点积  
        matmul_qk = torch.matmul(q, k.transpose(-2, -1))  # (batch_size, num_heads, seq_len_q, seq_len_k)  
        dk = torch.tensor(self.depth, dtype=torch.float32).to(q.device)  # 获取每个头的维度  
        # 缩放点积注意力分数  
        scaled_attention_logits = matmul_qk / dk  
          
        # 如果提供了掩码,则将其应用于注意力分数  
        if mask is not None:  
            scaled_attention_logits += (mask * -1e9)  # 将掩码位置的值设置为一个非常小的负数  
          
        # 应用softmax函数得到注意力权重  
        attention_weights = F.softmax(scaled_attention_logits, dim=-1)  # (batch_size, num_heads

总结

本周主要阅读了CVPR文章,Customize your NeRF: Adaptive Source Driven 3D Scene Editing via Local-Global lterative Training。一种将文本描述和参考图像统一为编辑提示的CustomNeRF框架,可以通过微调预训练的扩散模型将参考图像中包含的特定视觉主体V∗嵌入到混合提示中,从而满足一般化和定制化的3D场景编辑要求。除此之外,还学习了简单的Transformer代码的学习。下一周继续学习

举报

相关推荐

0 条评论