3D Semantic-NeRF相关

Semantic NeRF(ICCV2021)

Semantic NeRF对原始的NeRF进行扩展,将语义特征融入NeRF MLP,将语义与外观和集合结构联合编码,实现了仅使用少量场景分割注释就可以实现语义标签的预测。Semantic NeRF表明语义预测任务可以受益于原始NeRF学习到的多视角一致性,包括场景的平滑性、连续性和自相似性。Semantic NeRF利用NeRF来完成场景分割任务,不过并非在Open Vocabulary中,而是在封闭类别集合中进行的。

模型架构

Semantic NeRF的输入包括一系列已知相机参数的RGB图像,以及部分图像的(具有噪声)的语义标注。在该输入的条件下,Semantic NeRF同样会学习神经辐射场表示,利用该表示,不仅可以渲染任意视角下的新视图,还可以渲染任意视角下的语义分割结果。

Semantic NeRF对原始的NeRF MLP进行扩展。在引入视角信息之前,就进行语义label概率的输出,即下图中的\(s\)

如公式所示,Semantic NeRF直接利用MLP来预测场景label,并使用类似的体渲染公式得到语义概率渲染图,然后通过softmax转化为多类别的概率,最终得到语义分割预测图。 \[ \mathbf{c} = F_{\Theta}(\mathbf{x}, \mathbf{d}), \quad \mathbf{s} = F_{\Theta}(\mathbf{x}) \] 损失函数方面,除了原始NeRF的渲染光度损失外,还考虑了渲染语义分割预测图以及标注分割图之间的损失。

简单总结

Semantic NeRF本身对NeRF的改进较为简单,只是将语义信息引入NeRF MLP中,但是这项工作通过许多相关实验证明了这个方向的可行性。Semantic NeRF证明了网络有能力同时联合学习场景渲染和语义渲染的任务。Semantic NeRF尝试仅对部分图像提供分割标注,或者对提供的标注进行噪声的添加(包括像素的随机翻转和实例类别的随机翻转),发现网络仍然能够学习到较好的语义分割效果。这是因为NeRF在训练过程中强制执行多视图的一致性,来自部分图像的语义标注能够得到传播,并且其中的噪声也能够被纠正,任何一帧中丢失或者损坏的语义标签都可以通过其他帧的融合来纠正。

Semantic NeRF的项目地址为:Harry-Zhi/semantic_nerf

DFF(NeruIPS2022)

DFF论文全称为“Decomposing NeRF for Editing via Feature Field Distillation”。DFF的目标是通过对NeRF进行语义场景解耦,从而实现对3D场景进行基于查询的编辑。DFF将现有的2D图像特征提取器(例如CLIP-LSeg,DINO)提取的特征融入3D NeRF的训练过程中,来弥合缺少大型3D预训练模型的缺点。DFF最终训练得到的NeRF,会为每个坐标\(\mathbf{x}\)​都分配一个语义特征descriptor,然后以不同的用户查询作为条件,利用该语义特征重新进行处理,而无需重新训练。

DFF虽然也能够进行开放词汇的3D语义分割,但是它的目标并不在此,而是希望做到对神经场景表示进行语义分解,从而进行编辑,侧重点更多在场景编辑上。

模型架构

DFF的整体流程如下图所示。

DFF首先通过扩展NeRF MLP来进行语义特征的引入。类似于Semantic NeRF,DFF同样在MLP中引出一个新的分支用于语义处理。但是不同的是,这个分支输出一个特征向量,而不是输出封闭集合分类概率。给定3D坐标\(\mathbf{x}\)(以及观察方向\(\mathbf{d}\)),网络会同时输出特征向量\(\mathbf{f}(\mathbf{x})\),体密度\(\sigma(\mathbf{x})\)以及颜色\(\mathbf{c}(\mathbf{x}, \mathbf{d})\)。利用体渲染公式,则可以渲染出特征\(\hat{\mathbf{F}}(\mathbf{r})\)。为了监督特征向量的学习,DFF使用教师网络\(\mathbf{f}_{img}\)来对图片进行像素级别的特征提取。使用的教师网络包括CLIP-LSeg,DINO等。当然在正常的光度损失的基础上,还需要增加特征渲染之间的损失。

CLIP-LSeg是一个语言驱动的语义图像分割模型,其训练过程类似于CLIP,使用对比目标进行训练。

经过上面的训练之后,我们可以得到含有语义特征的NeRF。此时已经可以进行基于Query的zero-shot 3D分割了。首先考虑一个query encoder\(\mathbf{f}_q\),我们要进行3D语义分割,实际上就是判断每个点\(\mathbf{x}\)是否属于label l(首先考虑label是一个开放文本),或者说概率\(\mathbf{p}(l|\mathbf{x})\)是多少。计算方式如下: \[ \mathbf{p}(l|\mathbf{x}) = \frac{\exp(\mathbf{f}(\mathbf{x})\mathbf{f}_q(l)^T)}{\sum_{l'\in \mathcal{L}}\exp(\mathbf{f}(\mathbf{x})\mathbf{f}_q(l')^T)} \] 有了上面的计算结果,我们就可以利用该query来识别特定区域。识别到特定区域之后,就可以对场景进行编辑了,具体的编辑方式可以参考论文。

简单总结

DFF扩展了原始NeRF,增加分支来输出语义特征,并使用2D预训练模型来进行语义特征的监督。通过语义特征的渲染,DFF能够做到特定区域的识别,并在此基础上进行场景编辑。

DFF的项目地址为:pfnet-research/distilled-feature-fields

LERF(ICCV2023)

LERF在NERF的基础上构建了一个语义Language Field,它可以将来自于2D预训练语义模型的Embedding融合到NeRF当中,以此实现3D场景中的开放词汇查询。LERF的全称为Language Embedded Radiance Fields。LERF在原始的NeRF MLP中增加了新的语义特征,与颜色,体密度等一起进行联合训练,得到语义场表示。在训练过程中,使用多尺度特征金字塔来进行监督,特征来自于CLIP,同时还使用DINO来进行正则化监督。

模型架构

pipeline

原始NeRF的MLP接收位置\(\mathbf{x}\),观察方向\(d\),输出对应的颜色\(c\)和体密度\(\sigma\)。为了在此基础上融入语义特征,LERF使用语义Embedding \(F_{lang}(\mathbf{x}, s) \in \mathbb{R}^D\)来增强MLP的输出。具体来说,该MLP接收位置\(\mathbf{x}\)以及scale \(s\),额外输出对应的\(D\)维特征向量。LERF认为语义特征不应该随视角变化,类似于体密度。另外,这里的scale \(s\)是另一个参数,它表示的是以位置\(\mathbf{x}\)为中心的立方体,其在世界坐标中的边长。scale的概念类似于MipNeRF中投影出的圆锥台对应实际世界坐标中的不同尺度。

经过对NeRF MLP的增强,我们就可以为每个点得到一个语义Embedding,考虑该语义Embedding来自于CLIP的监督。但是CLIP本质上是一个全局的图像Embedding,不利于做到点的Embedding对齐。为此,LERF在渲染过程中进行改进,对于语义Embedding的渲染,它是基于以样本点为中心的volume进行的。具体来说,该字段的输出是包含该volume所有对应视图,经过裁剪之后得到CLIP特征,然后进行平均得到的。

考虑对于一条光线的体渲染过程,原始的NeRF只需要沿着光线对点进行积分即可。但是LERF是基于volume的场,它需要为光线的每个位置定义一个尺度参数,对应该位置对应的volume大小。对于光线\(\mathbf{r}(t) = o + t\mathbf{d}\),每个t对应的scale按照公式\(s(t) = s_{img} * t/f_{xy}\)来计算,其中\(s_{img}\)是对应像平面的初始比例scale,\(f_{xy}\)则表示焦距。有了每个位置的\(s\)之后,就可以按照类似的积分来进行体渲染,得到语义图。

介绍完语义渲染过程之后,下一步就是如何对语义Embedding进行监督。由于我们只能够查询图像块上的语义Embedding,而无法查询像素上的语义Embedding,所以LERF使用裁切图像的CLIP Embedding来监督这个多尺度的LERF。具体来说,对于一条光线,在给定\(s_{img}\)的条件下,我们可以渲染得到对应图块的语义Embedding,而它对应的监督,则是以光源对应像素为中心,大小为\(s_{img}\)的剪切图片,该图片经过CLIP Encoder之后得到的语义Embedding。

在实现上,由于每次计算一条光线对应的监督Embedding是非常昂贵的,因此LERF预先计算一个多尺度的特征金字塔,其中在存储了不同scale下的裁剪图像对应的CLIP特征。该金字塔包括\(n\)层,每一层对应一个scale,所有的scale则在\((s_{min}, s_{max})\)之间采样得到,采样满足相邻裁剪之间有50%的重叠。根据该方式,我们就可以提前计算出这个多尺度特征金字塔。在训练的时候呢,对于一个输入视图,则均匀随机地采样光线源点,并为每个视图均匀随机选择\(s_{img} \in (s_{min}, s_{max})\)。由于随机选择的\(s_{img}\)可能不会正好落在金字塔中的某一层,因此实际使用的监督Embedding还需要经过插值处理才能得到。

如果仅使用上述CLIP特征进行语义增强,虽然能够做到多视图的一致性,但是最终的结果可能并不能具有较好的边缘。为了缓解这个问题,LERF增加DINO特征进行正则化。具体来说,LERF为MLP额外训练一个输出,对应DINO特征。由于DINO是像素对齐的,因此不需要将scale作为输入。该DINO特征通过体渲染之后可以得到DINO特征图,与对应视角下的DINO特征图进行损失计算,以此来进行正则化。需要注意的是,DINO特征在推理的过程中并没有使用,而是仅在训练过程中充当额外的正则化器,能够做到这一点是因为CLIP特征和DINO特征共享了同一个底层表征(Multi-Scale Hash Embedding)。

DINO(Self-Distillation with No Labels)是一种无监督学习方式,主要应用于视觉学习领域。DINO Feature指的是使用DINO方法训练得到的特征表示,这种方法的核心思想是通过self-distillation的方式来学习图像的特征表示,而不需要使用任何标签信息。

该概念由Meta的论文Emerging Properties in Self-Supervised Vision Transformers首次提出。Mask DINO则使用Mask预测分支来扩展DINO,它支持众多图像分割任务。在语义分割方面,它在数据集ADE20K上进行预训练,能够做到Zero-Shot的语义分割。

上面介绍的是Language Field的训练。LERF认为3D中语义Embedding的优化和场景表示的优化应该是互不影响的,因此LERF使用两个网络分别训练语义Embedding(CLIP特征+DINO特征)和场景表征(颜色+体密度)。CLIP和DINO字段采用多分辨率哈希网格(Multi-Scale Hash Embedding)来表示,然后通过两个小MLP分别得到CLIP和DINO特征,当然在CLIP MLP中还会额外输入scale。

querying

LERF在3D中构建了一个语义场,希望能够处理开放词汇查询的问题。为此,LERF提出了一个基于语义特征的查询方式,该方式也被后续诸多工作借鉴与使用。

LERF训练完成之后,我们实际上可以得到场景任意视角下语义特征的渲染结果。考虑任意的文本查询,我们首先计算它的CLIP Embedding记为\(\phi_{quer}\),对于任意视角和相应scale,我们也可以得到渲染结果的CLIP Embedding,记为\(\phi_{lang}\),另外,LERF还提供了一组规范短语("object", "things", "stuff", "texture"),对应CLIP Embeding记为\(\phi_{canon}^{i}\)。有了这些条件,我们就可以计算文本查询与渲染结果之间的相关性分数: \[ \text{Relevancy Score} = \min_{i}\frac{\exp(\phi_{lang} \cdot \phi_{quer})}{\exp(\phi_{lang}\cdot\phi_{canon}^i) + \exp(\phi_{lang}\cdot \phi_{quer})} \] 该相关性分数表示与规范Embedding相比,渲染Embedding与查询Embedding之间的接近程度。

此外,由于LERF的渲染过程与scale参数有关,必须确定scale才能渲染出特征图。对于每个文本查询,LERF需要确定对应的scale参数的值。LERF的做法是在\((0,2m)\)范围之间进行均匀采样,对于每个采样出来的scale都进行一次渲染,并计算相关性分数,选择其中最大相关性分数对应的scale作为最终选定的scale。

简单总结

LERF在原始的NeRF的基础上构建语义场的表示,通过scale的引入以及MLP的修改,将CLIP Embedding以及DINO的正则化融入NeRF中。此外,LERF还构建了用于测试的数据集,其中包括了13个包含in-the-wild数据的场景。

LERF的项目地址为:kerrj/lerf

3DOVS(NeurIPS2023)

3DOVS以弱监督的方式将预训练的基础模型CLIP和DINO蒸馏到3D NeRF中。具体来说,在给定一系列开放文本查询以及场景多视角图像的情况下,3DOVS会利用CLIP和DINO训练一个NeRF,并且可以渲染出对应的分割图,分割结果对应给定的开放文本查询。

模型架构

3DOVS整体的流程如下图所示。给定场景的多视图图像以及场景中物体的开放词汇文本描述,3DOVS的目标是对重建的NeRF进行分割,以便为每个3D点分类一个相应的类别标签,类别标签来自前面给定的文本描述。(可以认为是一个对应工作,提供开放文本查询类别和多视角图像,输出文本对应的分割)

3DOVS首先利用了CLIP来进行语义特征的提取,但是CLIP产生的是图像级别的特征,并不适合像素级语义分割。因此,3DOVS采用Multi-Scale Multi-Spatial的策略来从图像中提取分层的CLIP特征,然后设计并学习了一个3D Selecton Volume来识别每个3D point的分层级别,从而将CLIP特征与像素级特征进行对齐。该策略的核心思想是像素的语义应该与周围像素基本相同。

具体来说,3DOVS预先定义一系列的scale大小一共\(N_s\)个,每个scale对应不同的patch大小。对于每个像素,按照它周围patch大小进行CLIP特征提取,由于有多scale,因此每个像素提取到的是Multi-Scale的CLIP特征。在实际运行的过程中,并不是按照每像素运行的,而是按照滑动窗口运行,进行Multi-Spatial特征提取。由于滑动窗口的机制,不同像素被计算的次数相互不同,最终在每个scale下,每个像素的特征取Mult-Spatial的平均。同时为了防止标准滑动窗口可能带来的棋盘图案和分割伪影,3DOVS还在窗口大小上引入一定的随机性。在这个机制下,对于每张图像\(I \in \mathbb{R}^{3\times H \times W}\),可以提取出multi-scale并且是像素level的CLIP特征\(F_{I} \in \mathbb{R}^{N_s \times D \times H \times W}\),其中\(D\)​对应CLIP特征维度。

通过上面的过程,已经可以提取到Multi-Scale的CLIP特征图。这样每条光线能够得到一个Multi-Scale的特征\(F(\mathbf{r}) \in \mathbb{R}^{N_s \times D}\)作为监督。

同时考虑NeRF的体渲染过程,在进行光线上点的积分过程中,3DOVS并不是简单的进行累计,而是额外引入了一个3D Selection Volume \(S\)来决定每个3D point的scale级别。具体来说,每个\(\mathbf{x} \in \mathbb{R}^3\)会产生一个选择向量\(S_i \in \mathbb{R}^{N_s}\),同时每个\(\mathbf{x} \in \mathbb{R}^{3}\)还需要输出一个语义特征\(F_{i} \in \mathbb{R}^D\),对应语义图的渲染。输出过程类似Semantic NeRF,通过增强NeRF MLP来进行。因此,体渲染过程就包括了颜色、语义特征以及选择向量的渲染(这里使用softmax使得所有scale的概率总和为1)。 \[ \begin{aligned} \hat{C}(\mathbf{r}) &= \sum_i T_i \alpha_i C_i \in \mathbb{R}^3 \\ \hat{F}(\mathbf{r}) &= \sum_i T_i \alpha_i F_i \in \mathbb{R}^D \\ S(\mathbf{r}) &= \text{Softmax}(\sum_i T_i \alpha_i S_i) \in [0,1]^{N_s} \\ \end{aligned} \] 在损失函数方面,则选择使用渲染的光度损失以及多尺度CLIP特征之间的余弦相似度损失: \[ \mathcal{L}_{supervision} = \sum_{\mathbf{r} \in \mathcal{R}}(|| \hat{C}(\mathbf{r}) - C(\mathbf{r})||_2^2 - \cos <\hat{F}(\mathbf{r}), S(\mathbf{r})F(\mathbf{r})>) \] 通过渲染得到的语义特征,可以被分类成预先提供的开放类别中的某一类。预先提供的文本label经过CLIP的文本Encoder之后,与渲染出来的特征进行余弦相似度的计算,然后选择其中相似度最高的即可。考虑预先提供的文本label有\(C\)个,经过CLIP文本Encoder之后得到文本特征表示\(T \in \mathbb{R}^{C\times D}\)。此时,来自NeRF,经过渲染后每条光线的分割概率则计算如下: \[ P(\mathbf{r}) = \text{Softmax}(\cos<T, \hat{F}(\mathbf{r})>) \in [0,1]^C \] 另一方面,我们可以计算文本特征\(T\)与每张图片的相关性,得到相关图。具体来说,对于给定图片\(I\),通过前面的流程可以得到多尺度CILP特征\(F_I \in \mathbb{R}^{N_s\times D\times H \times W}\),尺度选择向量\(S_I \in \mathbb{R}^{N_s\times H \times W}\),相关图计算如下: \[ R_I= S_I \cos <T, F_I> \in \mathbb{R}^{C\times H \times W} \] 由于原始的CLIP特征并非像素对齐的,直接使用上述计算可能会收到CLIP特征歧义的影响,因此3DOVS将相关图中每个类的相关性独立地标准化到\([0, 1]\),得到处理后的相关图: \[ \bar{R}_I = (R_I - \min(R_I)) / (\max(R_I) - \min(R_I)) \in [0, 1]^{C\times H\times W} \] 3DOVS使用JS散度来衡量归一化相关性图与渲染光线分割概率之间的差异,引入相关性分布对齐(Relevancy-Distribution Alignment, RDA)损失: \[ \mathcal{L}_{RDA} = \sum_{\mathbf{r}\in \mathcal{R}}\sum_{c\in \mathcal{C}}(P(\mathbf{r})_c \log(\frac{P(\mathbf{r})_c}{M_{P\bar{R}}(\mathbf{r})_c}) + \bar{R}(\mathbf{r})_c \log(\frac{\bar{R}(\mathbf{r})_c}{M_{P\bar{R}}(\mathbf{r})_c})) / 2 \] 其中\(M_{P\bar{R}}(\mathbf{r}) = (P(\mathbf{r}) + \bar{R}(\mathbf{r}))/2\)

此外,3DOVS提出了一种新的特征分布对齐(Feature-Distribution Alignment,FDA)损失来从DINO特征中提取对象边界信息。详细的损失函数可以参考原始论文。

简单总结

3DOVS的输入是一组图像和一组开放文本类别,利用这些来训练一个NeRF场景表征,其中扩展出语义特征向量以及尺度选择向量。特征向量的监督则来自图像的多尺度CLIP特征抽取。此外3DOVS还引入了多种损失来进行监督,包括光度损失、CLIP特征损失、相关性分布对齐损失和DINO特征对齐损失。

3DOVS利用到了CLIP和DINO作为特征,这与LERF非常类似。但是与LERF不同的是,开放文本查询也是3DOVS的输入之一,而LERF在训练过程中并没有考虑后续的文本。LERF在完成场景的训练之后,可以处理任意的文本查询,而3DOVS只能处理预先给定的开放文本,对于新的开放文本查询,需要重新训练。开放文本在训练的监督中发挥作用,使得在相同文本下,3DOVS可能能够取得更好的分割效果,当然缺点就是无法在不重新训练的情况下处理任意的开放文本查询。

此外,3DOVS还构建了一个包含10个不同场景的数据集,每个场景都包含了一组拥有不同姿势和背景的long-tail物体。

项目地址为:Kunhao-Liu/3D-OVS


3D Semantic-NeRF相关
http://example.com/2024/04/15/3D-Semantic-NeRF相关/
作者
EverNorif
发布于
2024年4月15日
许可协议