3D Semantic-Gaussian相关

LEGaussians(CVPR2024)

LEGaussians是一种基于3D Gaussian的用于开放词汇查询任务的场景表示。论文认为直接将语义特征嵌入到每个Gaussian上,会导致过高的内存需求,降低优化和渲染的效率,因此LEGaussians利用一种特征量化的方式来降低计算和内存成本。另一方面,论文提出了一种方法,用来解决因多视图视觉不一致而导致的语义模糊问题,该方法是基于3D Gaussian的空间位置和语义不确定性进行的。

模型架构

LEGaussians的Pipeline主要可以分为三个过程:

  1. 从多视图图像中提取密集的语义特征
  2. 对高维的语义特征进行量化,为后续的Embedding过程创建紧凑的特征空间
  3. 完成3D Gaussians的语义特征Embedding,在语义特征的学习过程中,会使用到前面的特征空间来作为约束

Dense Language Feature Extraction

LEGaussians的第一步是从多视图图像中抽取密集的语义特征。常用的语义特征抽取模型包括CLIP,DINO等。CLIP将图像编码为全局语义,而DINO更加偏向语义细节。

LEGaussians首先使用类似于3DOVS的分层随机裁剪技术来提取CLIP特征。但是从CLIP中提取的特征仅提供不同语义区域的粗略边界,这会导致3D场景的语义嵌入模糊并且不准确。为此,LEGaussians使用DINO来进行特征的补充,增强语义特征的提取。

对于每个视角下的图像,都利用CLIP和DINO分别抽取出特征,然后进行特征的拼接。考虑从图片\(I\)中抽取的CLIP特征\(\mathbf{F}^{CLIP}_{I,x,y} \in \mathbb{R}^{d_{CLIP}}\)和DINO特征\(\mathbf{F}^{DINO}_{I,x,y} \in \mathbb{R}^{d_{DINO}}\),将其经过特征拼接得到混合特征\(\mathbf{F}_{I,x,y} \in \mathbb{R}^d\): \[ \mathbf{F}_{I,x,y} = \mathbf{F}^{CLIP}_{I,x,y}\oplus \mathbf{F}^{DINO}_{I,x,y} \] 因此经过特征提取这个环节之后,对于多视角的每张图,都有一个混合语义特征图\(\mathcal{F} \in \mathbb{R}^{H \times W \times d}\),每个像素的特征是\(\mathbf{F} \in \mathbb{R}^d\)

Quantization of Language Features

直接将语义特征嵌入每个Gaussian上需要大量内存的使用,这会降低优化和渲染的效率。为此,LEGaussians使用quantization量化的方式来降低内存的占用。

考虑原始的语义特征\(\mathbf{F} \in \mathbb{R}^{d}\),我们首先会构造一个Feature集合,记为\(S = \{ \mathbf{f}_i \in \mathbb{R}^d | i = 1, 2, \dots, N\}\),对于每个原始的语义特征\(\mathbf{F}\),则可以使用一个整数index \(m \in \{1, 2, \dots, N \}\)来近似代表,通过\(m, S\),我们可以计算原始语义特征\(\mathbf{F}\)的近似版本\(\mathbf{\hat{F}}\),计算方式如下: \[ \mathbf{\hat{F}} = \sum_{i}^{N}\mathbf{f}_i \cdot \text{onehot}(m)_i \] 其中\(\text{onehot}(m) \in \mathbb{R}^d\),是由整数\(m\)派生出来的one-hot向量。这种量化方案实际上就是将原始原始的连续语义特征空间压缩为离散基,这能够有效去除原始语义特征嵌入中的过多冗余信息,压缩率则可以通过调整\(N\)的大小来进行调整。

确定了Base Feature集合\(S\)之后,要找到原始语义特征\(\mathbf{F}\)的对应整数index \(m\),使用的是最大相似度搜索,有如下过程: \[ \begin{aligned} \mathcal{D}(\mathbf{F}, \mathbf{f}_i) &= \cos(\mathbf{F}^{CLIP}\cdot \mathbf{f}_i^{CLIP}) + \lambda_{DINO} \cos(\mathbf{F}^{DINO}\cdot \mathbf{f}_i^{DINO}) \\ m &= \text{argmax}_i(\mathcal{D}(\mathbf{F}, \mathbf{f}_i)) \end{aligned} \] 经过量化过程之后,原始的混合特征语义图就可以降维到语义索引图,得到\(\mathcal{M} \in \mathbb{R}^{H\times W \times 1}\)

在执行量化的过程中,LEGaussians同时会优化Base Feature集合的选取,为此构造了两个损失,第一个是原始语义特征\(\mathbf{F}\)和量化语义特征\(\mathbf{\hat{F}}\)之间的余弦相似度损失,第二个是负载均衡损失。后者是为了防止量化崩溃并确保空间中每个特征的最大化利用。 \[ \begin{aligned} \mathcal{L}_{cos}(\mathbf{F}_i) &= (1 - \cos(\mathbf{F}_i^{CLIP}\cdot \mathbf{\hat{F}}_i^{CLIP})) + \lambda_{DINO}(1 - \cos(\mathbf{F}_i^{DINO}\cdot \mathbf{\hat{F}}_i^{DINO})) \\ \mathcal{L} _{lb} &=\sum^{N} (\mathbf{r} \circ \mathbf{p}) \end{aligned} \] 其中\(\mathbf{r} \in \mathbb{R}^N\)表示对每个特征的利用率,\(\mathbf{p} \in \mathbb{R}^N\)表示对每个特征的平均选择概率。最终的优化损失则是这两个损失的加权和: \[ \mathcal{L}_q = \lambda_{cos} \mathcal{L}_{cos} + \lambda_{lb}\mathcal{L}_{lb} \]

Language Embedded 3D Gaussians

经过上面的量化过程之后,我们得到了Base Feature集合\(S\)以及多视角的语义索引图\(\mathcal{M}\)​。接下来就是将压缩的语义特征嵌入到3D Gaussian中,以实现开放词汇场景理解。

对于每个3D Gaussian,LEGaussians为其添加代表语义索引的特征向量。但是直接将语义索引\(m\)添加到Gaussian上会容易导致错误的渲染结果,这是因为原始的语义索引是离散的,并不在连续空间中。因此LEGaussian并不是直接嵌入语义索引,而是学习另一个连续并且紧凑的语义特征向量\(\mathbf{s}_G \in \mathbb{R}^{d_s}\),其中\(d_s\)可以用来控制语义存储能力,同时也能够控制增加语义特征之后的内存占用,论文中设置\(d_s=8\)

每个3D Gaussian额外添加一个语义特征向量\(\mathbf{s}_G\),这些特征向量在执行光栅化渲染之后可以得到2D特征图。2D特征图要转化为语义索引图,则再经过一个MLP Decoder: \[ \hat{\mathcal{M}} = \text{softmax}(D_{MLP}(R_s(\mathcal{G};p_{cam}))), \quad R_s(\mathcal{G};p_{cam}) \in \mathbb{R}^{H\times W\times d_s}, \quad \hat{\mathcal{M}} \in \mathbb{R}^{H\times W \times N} \] 在训练过程中,会同时优化MLP Decoder以及语义特征,通过如下的交叉熵损失: \[ \mathcal{L}_{CE} = \text{CrossEntropy}(\mathcal{\hat{M}}, \mathcal{M}) \] 在实际情况中,由于视角、光照、镜面等条件,多视角图像中同一空间位置对应语义特征可能会出现较大差异。LEGaussians引入了一种平滑策略,来限制不确定性。具体来说,首先为每个Gaussian记录一个语义不确定性\(u \in [0,1]\)\(u\)越高表示语义特征在优化过程中表现得越不稳定。不确定性与语义特征进行联合优化,首先将上面的损失进行改造: \[ \mathcal{L}_{CE} = \frac{\sum \text{CrossEntropy}(\mathcal{\hat{M}}, \mathcal{M}) \circ (1 - R_u(\mathcal{G};p_{cam}))}{H \times W}, \quad R_u(\mathcal{G};p_{cam}) \in \mathbb{R}^{H\times W\times 1} \] 同时为了避免结果收敛到所有不确定性为1的平凡解,增加对于不确定性的正则化: \[ \mathcal{L}_{u} = \frac{\sum R_u(\mathcal{G};p_{cam})}{H\times W} \] 最终优化3D Gaussian语义特征和MLP Decoder的损失如下。在训练开始时将不确定性值初始化为0,而优化期间不一致的语义特征索引会导致不确定性值\(u\)的增加。 \[ \mathcal{L}_s = \lambda_{CE} \mathcal{L}_{CE} + \lambda_u \mathcal{L}_{u} \] 另外,LEGaussians观察到,空间相邻位置通常共享相似的语义特征,因此在训练过程中,LEGaussians有意地降低嵌入语义特征的空间频率,尤其是在具有高不确定性的位置。这一点是通过MLP的归纳偏差做到的,MLP偏向于学习目标信号的低频表示,通过MLP来对3D Gaussians的语义特征进行正则化。

首先,LEGaussians通过将每个3D Gaussian的位置输入到一个小的MLP中来计算平滑的语义特征,其中\(\mathbf{p} \in \mathbb{R}^{3}\),PE表示位置编码。 \[ \mathbf{s}_{MLP} = \text{MLP}(\text{PE}(\mathbf{p})) \] 然后,通过如下损失来实施空间平滑正则化,其中平滑程度根据学习到的不确定性值来进行自适应控制,其中\(*\)表示梯度停止算子,\(w_s\)表示语义平滑项的最小权重。 \[ \mathcal{L}_{smo} = ||\mathbf{s}_{MLP} - \mathbf{s}_{G}^* ||_2 + \max(\mathbf{u}_G^*, w_s) || \mathbf{s}_{MLP}^* - \mathbf{s}_G||_2 \] 最终,语义特征、语义不确定性以及MLP的组合损失如下所示: \[ \mathcal{L} = \lambda_s \mathcal{L}_s + \lambda_{smo} \mathcal{L}_{smo} \] 完成优化之后,每个Gaussian上就会有一个代表语义索引的特征,该特征经过光栅化渲染得到特征图,特征图经过MLP Decoder得到索引图,索引图根据Base Feature集合就能得到对应的语义特征图。

简单总结

LEGaussians提出了一种基于3D Gaussian的用于开放词汇查询任务的场景表示。

首先,LEGaussians通过从多视图图像中抽取CLIP和DINO语义特征,再将其量化之后得到Base Feature集合以及多视角的混合语义特征索引图;然后LEGaussian为每个Gaussian上添加代表语义索引的特征以及表征不确定性的特征,不确定性特征用于解决多视图视觉不一致带来的语义歧义,而由语义特征光栅化后渲染出来的特征图可以被MLP Decoder解码为索引图。LEGaussians在训练阶段采用三类损失来进行监督,分别是索引图之间的交叉熵损失,对于不确定性的正则化以及空间平滑正则化。

完成优化之后,每个Gaussian上就会有一个代表语义索引的特征,经过与训练基本相似的pipeline,就能得到对应视角下的语义特征图。

LEGaussians的项目地址是:buaavrcg/LEGaussians

Feature 3DGS(CVPR2024)

Feature 3DGS面向的任务是在3D Gaussians中增加语义描述。它提出了一种通用的Pipeline,可以通过特征蒸馏的方式来集成大型2D基础模型,在语义方面增强3D Gaussians。此外,Feature 3DGS在下游任务中,还提供基于点Prompt或者Box Prompt来进行3D场景操作的方式。

模型架构

Feature 3DGS的整体Pipeline如下图所示:

为了在3D Gaussians上融合语义特征,Feature 3DGS在每个Gaussian的参数上进行扩展,融入语义特征\(f_i\),即每个Gaussian的特征包括了\(\Theta_i = \{x_i,q_i,s_i,\alpha_i,c_i,f_i\}\),分别表示每个Gaussian的位置、旋转四元数、缩放向量、不透明度、颜色和语义特征向量。对于一个由众多Gaussian组成的场景,我们可以根据与原始3D Gaussian相同的光栅化方法分别渲染得到场景图和特征图,并且都是像素级别的。因此,我们也可以使用来自2D基础预训练语义模型(例如SAM和CLIPLSeg)来获取图片的2D语义特征,以此作为逐像素的监督。

在优化阶段,Feature 3DGS使用的是联合优化,而非先优化好3D Gaussians的基础参数之后,再优化语义特征。最终渲染出来的场景图和特征图长和宽保持一致,维度上有所不同。优化阶段的损失函数则结合了渲染的光度损失和语义特征图之间的损失: \[ \begin{aligned} \mathcal{L} &= \mathcal{L}_{rgb} + \gamma \mathcal{L}_f \\ \mathcal{L}_{rgb} &= (1 -\lambda)\mathcal{L}_1(I, \hat{I}) + \lambda \mathcal{L}_{D-SSIM}(I, \hat{I}) \\ \mathcal{L}_f &=|| F_t(I) - F_s(\hat{I}) ||_1 \end{aligned} \] 其中\(F_t(I)\)表示从2D基础模型导出的监督特征图,\(F_s(\hat{I})\)表示渲染得到的特征图。

论文中提到这种联合优化的方式是有益的。高维语义特征的参加有助于场景理解并增强对场景物理属性的描述,例如对Gaussian不透明度和位置的优化。

考虑融入Gaussian上的语义特征为\(f \in \mathbb{R}^N\),对应渲染得到特征图\(F_s(\hat{I}) \in \mathbb{R}^{H\times W\times N}\),而从2D基础模型中导出的监督语义特征图为\(F_t(I) \in \mathbb{R}^{H\times W \times M}\)。在非常理想的情况下,有\(N = M\)。但是对于3D Gaussian来说,如果在每个Gaussian上增加较高维度的语义特征,这会对内存造成很大压力,影响优化和渲染的效果,因此每个Gaussian上的语义特征通常是较低维度的;而对于2D基础模型来说,通常特征维度\(M\)是较高的。因此在实际情况中,通常是\(N \ll M\),因此需要一种手段来弥合维度上的差距。

Feature 3DGS引入Speed-up module来解决维度差异。该模块由一个轻量级卷积Decoder构成,使用kernel size为\(1\times 1\)的卷积核对特征通道进行上采样,直到渲染特征图的特征维度与监督特征图的特征维度相匹配。该模块可以用于提升Gaussian语义特征的表示。在训练时需要使用该模块来匹配损失函数,在推理的时候该模块则是可选的,可以直接使用原始的\(N\)维特征作为输出的特征图,也可以使用经过Speed-up module提升后的\(M\)​维特征作为输出的特征图。

经过优化之后,我们就可以得到包含语义的场景3D Gaussian表示。考虑某个prompt或者query,我们想要定位该prompt或者query相关的Gaussian,只需要将其先经过Encoder得到特征空间内的特征描述,然后与每个Gaussian的语义特征计算即可得到每个Gaussian的激活分数。这也是下面一系列下游任务的基础。

下游任务

基于一个包含语义场景的3D Gaussian表示,我们可以完成许多下游任务。包括语义分割、类似SAM的分割、语言驱动的场景编辑等。

给定任意新视角,我们可以将每个Gaussian上的语义特征渲染成新视角下的语义分割图,即完成语义分割任务。

类SAM的分割指的是提供像SAM一样,基于prompt的分割功能。由于在进行特征蒸馏的时候,我们可以选择SAM来作为2D基础模型,因此场景渲染出来的特征图实际上与SAM得到的特征图是处于同一个特征空间的,因此可以直接将其与prompt同时输入SAM的Decoder,来得到分割结果。

语言驱动的场景编辑,顾名思义,就是利用语言文本来对3D场景进行修改。简单来说,我们可以通过上面计算激活分数的方式来得到每个Gaussian与该文本的相关性,从而确定操作所涉及的Gaussian。由于Gaussian是一种显式表达,在确定了所涉及的区域后,只需要对这些Gaussian进行相关的操作即可,包括区域提取、区域删除、颜色修改等。

简单总结

Feature 3DGS同样利用2D基础语义模型来为Gaussian的语义特征进行监督,同时为了弥合较低的Gaussian语义特征与较高的基础模型语义特征之间的维度差距,Feature 3DGS使用了由轻量级卷积Decoder构成的Speed-up Module来完成。

Feature 3DGS的项目地址为:ShijieZhou-UCLA/feature-3dgs

LangSplat(CVPR2024)

LangSplat基于3D Gaussian构建了一个3D的语义Language Field,用于在3D空间内进行精确、高校的开放词汇查询。LangSplat主要有两个贡献,第一个是使用自动编码器来学习CLIP Embedding和语义特征,降低融合语义特征后3D Gaussian对内存的占用;第二个是使用SAM来获得分层特征,以此获得对象之间清晰的边界。

模型架构

LangSpalt的整体pipeline如下所示,其中左半部分表示基于SAM的分层语义特征学习,右半部分表示利用自动编码器的3D Gaussian语义融合。

Learning Hierarchical Semantic with SAM

在介绍具体pipeline之前,我们可以先回顾现有相关方法存在的问题。

为了构建3D Language Filed,目前常用的思路都是使用基于2D的基础语言模型获取特征,然后将特征投影或者融合到3D表示中。最常用的基础语言模型就是CLIP。但是CLIP特征是图像对齐的,而不是像素对齐的,这导致训练后的3D Language Field缺乏清晰的边界,并且包含大量噪声。尽管可以通过学习像素对齐的DINO特征来缓解,但是仍然不能得到很好的结果。我们希望获得的是像素对齐的Embedding \(\mathbf{L}_t \in \mathbb{R}^{D \times H \times W}\),其中\(D\)表示特征维度。

另一方面,有了像素对齐的Embedding之后,还会面临点歧义(point ambiguity)的问题,因为对象上的一个点可能会对应多种语义级别。举例来说,场景中的猫耳朵上的某个点,就会同时对应如下语义级别,包括猫耳朵、猫头部、整只猫,因此我们希望这个点的语义特征能够同时被这些不同语义级别的查询激活。为了解决这个问题,大多数现有的方法采用Multi-Scale的裁剪方法来提取分层的CLIP特征。对于某个像素来说,它的分层CLIP特征即为不同大小scale的裁剪图像的对应特征。这种方式存在两个局限,首先裁剪出的图像并不是精确的,它们通常包含额外的上下文对象信息,这将会导致Language Field过于平滑,对象边界不明确;其次在推理过程中,需要在不同scale下进行渲染,进行多种scale的尝试,以找到最佳scale,这显著地降低了推理速度。

LangSplat解决上面问题的思路是使用SAM进行分层语义特征提取。在给定point proposal的情况下,SAM可以给出对应物体的准确mask,并且SAM还可以为point proposal生成三个不同的mask,分别代表整体(whole),部分(part)和子部分(subpart)这三个不同的层级。LangSplat使用SAM来获取精确的对象Mask,用于获取像素对齐的特征,同时通过显示地建模SAM的语义层次,来解决点歧义问题。这样,通过SAM就能够捕获3D场景中对象的语义层次结构,为每个输入图像提供准确的多尺度分割图。

具体来说,对每张图像,LangSplat使用\(32\times 32\)的规则网格作为proposal,将其输入SAM,获得三个在不同语义级别下的mask集合,\(\mathbf{M}_0^s,\mathbf{M}_0^p,\mathbf{M}_0^w\),分别对应语义层级subpart、part和whole。然后根据重叠、IoU分数、stability score等进行过滤,我们可以得到不同语义级别下的全图分割mask图,即\(\mathbf{M}^s,\mathbf{M}^p,\mathbf{M}^w\)​。这些分割图在对应语义层级上精确地描绘了对象的边界,将场景图像有效地划分成了有意义的区域。借助这些分割结果,我们可以进行CLIP特征的提取,考虑图像\(\mathbf{I}_t\)中的像素\(v\),它在三个语义层级下都具有相应的特征,特征计算如下,其中\(V(*)\)表示利用CLIP模型对图像进行特征提取,\(\mathbf{M}^l(v)\)表示像素\(v\)所在的\(l\)层级下的mask区域。 \[ \mathbf{L}_t^l(v) = V(\mathbf{I}_t \odot \mathbf{M}^l(v)), \quad l \in \{s, p, w\} \] 经过上面的处理,我们对每一张图像都能够获得在三个语义层级下的像素对齐特征图。得益于SAM的分割结果,特征图会拥有清晰的边界。另一个优点是这种方式拥有预定义的语义层级,即subpart、part和whole。

3D Gaussian Splatting for Language Fields

经过上面的步骤,可以获取一系列2D的语义特征图\(\{\mathbf{L}_t^l, | t=1, ..., T\}\),接下来则需要考虑如何为3D Gaussian进行特征增强。LangSplat为每个Gaussian进行语义特征增强,为其添加特征\(\{\mathbf{f}^s, \mathbf{f}^p, \mathbf{f}^w\}\)。由于每个Gaussian都具有了语义特征,因此可以使用类似颜色渲染的光栅化操作来得出语义图的渲染结果: \[ \mathbf{F}^l(v) = \sum_{i \in \mathcal{N}} \mathbf{f}_i^l \alpha_i \prod_{j=1}^{i-1}(1-\alpha_j), \quad l \in \{s,p,w\} \] CLIP特征本身是一个高维度的特征,但是直接使用高维度特征进行增强会导致3D Gaussian内存占用过高,降低训练和渲染的效率。为了减少内存消耗并提高效率,LangSplat引入场景语义的AutoEncoder,该AutoEncoder将场景的CLIP特征映射到低维度的潜在空间,从而减少内存需求。原始的CLIP在非常多的图片文本对下进行训练,它得到的特征维度\(D\)属于高维,并难以继续压缩。但是对于论文中的任务,由于仅考虑当前的特定场景,语言特征的压缩是可以做到的。

具体来说,LangSplat会训练一个AutoEncoder,其中的Encoder \(E\)\(D\)维的CLIP特征\(\mathbf{L}_t^l(v) \in \mathbb{R}^D\)压缩到\(\mathbf{H}_t^l(v) = E(\mathbf{L}^l_t(v)) \in \mathbb{R}^d\),其中\(d \ll D\);然后Decoder\(\Psi\)将压缩后的特征还原到CLIP特征。AutoEncoder的Loss则定义如下,其中\(d_{ae}(*)\)表示距离衡量,论文中使用L1和余弦距离损失。 \[ \mathcal{L}_{ae} = \sum_{l \in \{s, p, w\}} \sum_{t=1}^T d_{ae}(\Psi(E(\mathbf{L}_t^l(v))), \mathbf{L}_t^l(v)) \] 在AutoEncoder的作用下,我们就可以将高维的CLIP特征空间\(\{\mathbf{L}_t^l\}\)转化到低维度的空间\(\{\mathbf{H}_t^l\}\),而每个3D Gaussian上的语义特征也在低维度的特征空间中进行学习。我们使用\(d\)作为每个3D Gaussian语义特征的维度,即\(\mathbf{f}^l \in \mathbb{R}^d\),在论文中,有\(d=3\)。在低维度空间中学习每个3D Gaussian上的语义特征,使用的Loss如下: \[ \mathcal{L}_{lang} = \sum_{l \in \{s,p,w\}} \sum_{t=1}^T d_{lang}(\mathbf{F}_t^l(v), \mathbf{H}_t^l(v)) \] 在完成训练之后,每个Gaussian上就包含3个\(d\)维的语义特征,通过光栅化得到低维度的特征图后,使用Deocder\(\Psi\)将其恢复到CLIP特征空间中,得到\(\Psi(\mathbf{F}_t^l) \in \mathbb{R}^{D\times H \times W}\)

有了语义特征的渲染图之后,就可以采用与LERF类似的Open-Vocabulary Querying方式来进行开放词汇查询。

与LERF相似的查询方式意味着LangSplat首先会渲染出给定视角下的特征图,然后在特征图中进行相似度计算,从而得到开放词汇分割结果。

简单总结

LangSplat构建了一个基于3D Gaussian的3D开放语义表征。首先,LangSplat基于SAM来对图像进行三种语义级别(subpart、part、whole)的分割,并利用CLIP进行特征提取;之后训练一个基于场景的AutoEncoder,将高维度的CLIP语义特征压缩到更低的维度,3D Gaussian上的语义特征在这个更低维度的特征空间上进行学习,以此降低众多3D Gaussian对内存的占用,提高训练和渲染效率。

LangSplat使用基于3D Gaussian的场景表示,这使得语义图像的渲染变得非常快速,在整个pipeline中,渲染是非常快的,大部分时间花费在Decoder的部分。

另外在实验方面,LangSplat使用了LERF数据集和3DOVS数据集。为了使LERF数据适用于开放词汇语义分割,LangSplat还手动注释了文本查询的真实mask。

LangSplat的项目地址为:minghanqin/LangSplat

FMGS

FMGS完成的工作同样是将2D基础预训练模型嵌入合并到3D Gaussian中,以此实现开放词汇查询。FMGS是Foundation Model Embedding 3D Gaussian Splatting的缩写。与其他方法类似,FMGS使用3D Gaussian上的语义特征,然后将其渲染为语义特征图,语义特征图的监督则来自2D基础预训练模型CLIP和DINO。此外,为了确保高质量和快速训练,FMGS集成了3D Gaussian和HashEncoding。

模型架构

对于一个场景,FMGS首先对其训练一个3D Gaussian的表示,该表示将作为后续语义处理的基础。最简单的为3D Gaussian增加语义的方式就是在每个Gaussian上增加特征向量来表示语义,但是不进行任何处理直接添加会导致非常大的内存占用,为了解决空间的问题,FMGS采用Multi-Resolution Hash Embedding(MHE)来解决这个问题,思想来源于InstantNGP。

场景空间被划分为Multi-Scale的Grids,特征向量则存储在Grid上的每个角点上。对于每个Gaussian来说,通过其位置\(\mathbf{X}\)利用三线性插值后来查询对应的特征,将所有Scale下的特征拼接后得到输出\(\mathbf{q}\),该输出再经过一个MLP,得到最终的输出。这样对于每个Gaussian,我们就能查询并计算出它的语义特征。FMGS采用了两类特征,分别是CLIP和DINO,以此来获得像素对齐的特征提取。利用每个Gaussian上的语义特征,就能够利用光栅化进行渲染,得到两种语义特征图\(\hat{\mathbf{F}} \in \mathbb{R}^{W\times H\times D},\hat{\mathbf{D}} \in \mathbb{R}^{W \times H \times L}\),前者表示生成的CLIP语义图,后者则表示生成的DINO语义图,其中\(D,L\)代表特征图的维度。

语义特征图的监督则来自于2D基础模型CLIP和DINO。对于CLIP的特征图,采用类似于LERF中使用的多尺度特征金字塔方法得到CLIP监督\(\mathbf{F}\);对于DINO的特征图,直接将不缩放的图片输入DINO Encoder得到DINO监督\(\mathbf{D}\)。CLIP和DINO的Loss如下: \[ \begin{aligned} \mathcal{L}_{CLIP} &= \left\{ \begin{array}{ll} 0.5 | \hat{\mathbf{F}} - \mathbf{F} |^2, & if\ |\hat{\mathbf{F}} - \mathbf{F}| < \delta\\ \delta \cdot (|\hat{\mathbf{F}} - \mathbf{F}| -0.5 \cdot \delta), & otherwise \end{array} \right. \\ \mathcal{L}_{DINO} &= |\hat{\mathbf{D}} - \mathbf{D}|^2 \end{aligned} \] FMGS还提出了一种损失来对齐CILP和DINO的损失。该损失主要希望得到的CLIP和DINO特征相互之间相差不大。为此,FMGS在每个像素周围定义一个\(K\times K\)的kernel窗口,计算该窗口内的CLIP和DINO特征之间的差距,损失函数如下,其中\(\mathcal{P}\)表示图片下的每个像素。 \[ \mathcal{L}_{pixel} = \frac{1}{K^2-1} \sum_{i\in \mathcal{P}} \sum_{j\in \mathcal{N}(i), j\neq i} | \hat{\mathbf{d}_i}^T\hat{\mathbf{d}_j} - \hat{\mathbf{f}_i}^T\hat{\mathbf{f}_j} | \]

另外为了缓解内存限制,FMGS根据Gaussian的不透明度和2D半径等指标选择大约10%的Gaussian参与语义特征训练。

简单总结

FMGS利用CLIP和DINO来提供语义特征的监督,并且使用Multi-Scale Hash Embedding来降低内存的占用,并提高训练和渲染效率。

Semantic Gaussians

Semantic Gaussians是一种基于3D Gaussian的新型开放词汇场景理解方式。Semantic Gaussians提出了一种多功能投影方式,将来自各种2D Image预训练Encoder的语义特征映射到3D Gaussian上;同时基于投影结果进行蒸馏,构建了一个3D语义网络,可以直接从原始3D Gaussian中预测每个Gaussian的语义特征。与基于NeRF的方法相比,Semantic Gaussians无需额外训练,就可以将语义特征融入3D Gaussian。

模型架构

Semantic Gaussians的目标在于为场景的每个Gaussians赋予一个语义特征,它的思想在于利用来自2D Image的各种预训练Encoder对场景图像进行语义特征的抽取,然后将其投影到3D Gaussian上。

考虑已经有了一个针对某个场景训练好的3D Gaussian以及该场景的一系列2D图像(得益于3D Gaussian逼真的渲染质量,这些2D图像也可以通过渲染得来)。对于每个2D图像\(\mathbf{I}\),我们可以利用现有的预训练2D Image Encoder进行语义特征的抽取,获取像素级别的语义图\(s \in \mathbb{R}^{H\times W \times C}\)

Senmantic Gaussians考虑可以使用各种预训练的2D Feature,可用的模型类型包括:

  • pixel-level segmentation network:例如OpenSeg、LSeg
  • instance-level recognition network:例如Grounding DINO、VLPart
  • image-level classification network:例如CLIP

Senmantic Gaussians采用SAM来处理这些不同的2D Feature,最终得到像素级别的语义图\(s\)

  • 对于pixel-level segmentation network,我们已经有基础的像素级别的语义图。论文采用SAM来细化分割边界。对于每张图片,采用SAM的Everything模式得到该图片的\(N\)个Binary Mask \(M_1, M_2, ..., M_N\),然后将其对应到基础语义图上。对于每个Binary Mask,将其对应像素位置上的特征设置为Mask范围内所有特征的平均池化结果
  • 对于instanc-level recognition network,我们有图片的实例分割结果,但是缺乏语义特征。论文采用实例分割结果对应的Bounding Box作为SAM的Prompt,得到实例的更加细化的分割结果,然后对于每个实例区域,采用CLIP进行特征提取,该区域像素位置上的特征均设置为CLIP实例特征
  • 对于image-level classification network,则首先采用SAM的Everything划分图片中可能的分割结果,对于每个分割区域,则赋予经过该image-level classification network网络之后得到的特征

总之,经过上述过程之后,我们可以得到\(N\)个像素级别的语义图\(s \in \mathbb{R}^{H\times W \times C}\)。该语义图类似于实例分割的结果,每个实例区域具有相同的语义特征。

接下来的步骤则是从2D到3D的特征投影与融合。对于2D图的每个像素,可以利用相机内外参数进行2D到3D的投影。经过投影之后,每个像素将对应空间中的一束光线。首先可以利用3D Gaussian渲染出对应视角的深度图,然后利用深度图,将2D像素投影到3D空间中的表面点。每张图都完成上述的操作,那么3D空间中表面的3D Gaussian就会具有来自2D的语义特征\(s^{2D}\)。可能会存在来自多视角的2D特征均投影到同一个3D Gaussian上,此时的语义特征为经过平均池化的特征。

Semantic Gaussians第二个贡献是构建了一个3D Gaussian Network,它接受3D Gaussian点云作为输入,每个点云上的特征是Gaussian的颜色、不透明度、协方差矩阵等。它的输出则是每个Gaussian的语义特征。该网络采用上述投影过程获得的语义Feature进行监督,损失则采用余弦相似度: \[ \begin{aligned} s^{3D} = f^{3D}(\mathbf{G}), \quad L = 1 - \cos(s^{3D}, s^{2D}) \end{aligned} \] 在实际使用中,Semantic Gaussians采用了MinkowskiNet,这是一个专门为点云设计的3D稀疏卷积网络。当然,3D语义网络的语义预测特征可以与投影得到的语义特征相结合,进一步提高Gaussian语义特征的质量。

利用具有语义特征的3D Gaussians,可以完成后续的下游任务,例如开放词汇分割,场景语义分割等。首先将文本query或者语义标签通过CLIP进行特征抽取,得到文本Embedding,比较该文本Embedding与3D Gaussian语义特征的相似度,分配其中相似度高的标签给对应的3D Gaussians,最终通过3D Gaussian的渲染过程,即可得到不同的分割结果。

简单总结

Senmantic Gaussian介绍了一种如何将语义特征融入3D Gaussians的过程。它利用预训练的2D Encoder从2D图像中提取出语义特征,然后将其通过2D-3D的投影,将其投射到3D空间中表面的Gaussians上。另外,论文还构建了一个3D Gaussian语义推测网络,通过Gaussian的其他特征来预测语义特征。

CoSSegGaussians

CoSSegGaussians是一种利用3D Gaussian来进行3D场景分割的模型。它的输入是多视角的RGB图像,经过处理后可以得到以3D Gaussian为基元的场景表征,并且可以得到不同视角下的分割结果(语义分割/实例分割)。

论文发现,一些基于3D Gaussian的3D分割模型生成的Mask不够紧凑,会存在碎片和割裂(类似于Floater),这可能是由于它们将分割特征直接分配给每个Gaussian,但是缺乏跨视图一致的2D监督。于是CoSSegGaussian设计了一个双特征融合网络(Dual Feature Fusion Network)来表示3D Gaussian分割特征场,而不是让分割特征特征在每个Gaussian上进行独立优化。

模型架构

pipeline

CoSSegGaussian分为两个阶段,分别是Gaussian Locating Stage和Segmentation Stage。

首先第一个阶段Gaussian Locating Stage,与原始的3D Gaussian类似,通过多视图图像的输入完成Gaussian的初始训练,此时我们得到的是用来表征场景的众多Gaussian,每个Gaussian都包含已经学习好的参数\(\mathbf{c},\mathbf{x},\Sigma,\alpha\)

第二阶段Segmentation Stage,主要通过论文设计的Dual Feature Fusion Network来学习出每个Gaussian上的分割特征\(\mathbf{s} \in \mathbb{R}^K\),其中\(K\)表示最终的分割结果有K类。有了这个分割特征之后,我们就可以用扩展的3D Gaussian可微光栅化渲染得到分割输出(对应图中的Segmentation Gaussian Rasterizer),主要就是将原公式中的颜色特征\(c\)替换成分割特征\(\mathbf{s}\)。具体来说,对于每个像素\(p\),我们可以找到覆盖在该像素上,并按照深度排序的Gaussian集合\(\mathcal{N}\),然后按照如下公式计算对应像素对每个类别的预测概率: \[ \mathbf{S}(p) = \sum_{i\in\mathcal{N}} \mathbf{s}_i \alpha'_i(p) \prod_{j=1}^{i-1}(1-\alpha'_j(p)) \] 对于每个像素都进行该操作,我们就可以在给定视角下渲染出一张Mask图。

那么接下来的重点就是这个双特征融合网络是如何工作的。

考虑此时我们已经有了表征场景的众多Gaussian。双特征融合网络的输入是一张训练集中的图像,以及该图像对应视角视锥中的所有\(N\)个Gaussian,输出则是这\(N\)个Gaussian的分割特征,每个特征的维度为\(K\)。双特征融合网络分为三个部分,第一个部分是Multi-scale DINO Feature Unprojection,该部分主要通过DINO-Based的模型来对2D图像进行特征抽取,得到多尺度的2D DINO Feature,然后将这些Feature反投影到对应的Gaussian上;第二个部分是Spatial Feature Extraction,该部分主要是通过现有的基于点的模型来对Gaussian点云提取空间特征Spatial Feature;第三个部分是Feature Aggregation,该部分将DINO Feature和Spatial Feature进行聚合,通过多层MLP构成的解码器来得到最终的Segmentation Feature输出。

Multi-scale DINO Feature Unprojection利用DINO-Based模型来对2D图像进行特征抽取,论文使用的模型为Mask DINO。Mask DINO可以对提取出多层(\(n\)层,在论文中\(n=4\))的特征,对应图中的Block n。每个尺度的特征都可以被反投影到对应的Gaussian上。考虑第\(i\)个Gaussian,第\(n\)层的特征经过反投影后得到该Gaussian对应的DINO Feature \(\mathbf{f}_{d_n,i}\),计算公式如下, \[ \mathbf{f}_{d_n,i} = \sum_{p} \alpha'_i(p) * \prod_{j=1}^{i-1}(1 - \alpha'_j(p)) * \mathbf{f}_{d_n}(p), \quad n=1,\dots,4 \] 其中对像素\(p\)进行求和,求和的像素包含所有被这第\(i\)个Gaussian所影响的像素。公式后面的连乘项表示需要将其他Gaussian对所考虑像素的影响也考虑在内。

Spatial Feature Extraction模块利用基于点的模型来对Gaussian点云提取空间特征Spatial Feature。这里使用的是RandLA-Net,这是一个用于大场景点云语义分割的高效方式。

Feature Aggregation模块则拼接了每个Gaussian不同层级的DINO Feature和Spatial Feature,将其分别送入解码器的不同层级,最终解码出Gaussian的Segmentation Feature。所有的Gaussian都有了对应的Segmentation Feature之后,我们就可以使用分割Gaussian的光栅化操作来输出场景的Mask预测。

损失函数

在第一个阶段Gaussian Locating Stage,使用的损失函数就是原始3D Gaussian Splatting的损失函数,包括L1 Loss和SSIM Loss。

在第二个阶段Segmentation Stage,我们可以通过上面的pipeline得到给定视角下的Mask预测,同时我们可以通过Mask DINO来对2D图像进行Zero Shot的语义分割结果,作为第二阶段训练的监督信号。不过需要注意的是,这里经过Mask DINO生成的语义分割结果,会额外经过一个Mask Association模块进行多视角一致性的增强。在这里,论文将多视图图像视作一个视频序列,然后通过一个Zero-Shot的Tracker来完成对应。

有了预测的Mask结果\(\mathbf{S}\)和由Mask DINO构造的监督Label,我们就可以使用NCE Loss来指导参数更新,不过需要注意的是,在Segmentation Stage,我们只更新解码器MLP中的参数,前面的特征提取网络参数则不进行改变。 \[ \mathscr{l}_s = -\sum_p \sum_{k\in K} k_r[k] \log (\mathbf{S}(p)[k]) \]

简单总结

CoSSegGaussians主要通过Dual Feature Fusion Network的设计来学习每个Gaussian上的分割特征,然后进行Mask的预测。这种方式能够生成更加紧凑的预测结果,并且相比于之前基于NeRF的方法,具有更快的训练和渲染速度。

CLIP-GS

CLIP-GS希望做到的目标是在3D Gaussians中添加语义。为了解决直接学习高维度语义特征导致的效率降低问题,CLIP-GS提出了一种语义紧凑性方法(SAC,Semantic Attribute Compactness),可以获取语义特征的紧凑表示,从而实现高效的渲染。此外,为了解决CLIP特征图本身固有的多视图不一致,CLIP-GS引入了3D Coherent Self-Training(3DCS)的训练策略,利用来自3D模型的多视图一致性来缓解该问题。

模型架构

CLIP-GS的总体Pipeline如下,接下来将逐一进行介绍。

Semantic Attribute Compactness

将语义信息融入3D Gaussians中的常见思路是在每个Gaussians上嵌入一个语义特征,然后使用来自2D预训练基础模型(e.g.CLIP)得到的特征图来进行监督。遵循此类方法的流程,需要克服的问题是嵌入的语义维度无法做到很高,因为会大大增加内存占用,影响训练和渲染效率。目前的解决方案有量化、AutoEncoder、Grids Hash Encoding、卷积Decoder等。

CLIP使用Semantic Attribute Compactness来解决该问题。SAC的主要思想是利用对象内自然统一的语义来简化表示,简单说,SAC通过利用SAM生成的Mask来捕获每个对象的单个代表性特征,以此作为所有相关像素的语义特征。通过学习代表性的语义特征来表示每个对象,最大限度地减少了对象内冗余相似特征的学习,同时保留了有效特征。然后,使用索引图来表征这些高维度语义特征,嵌入Gaussians的特征则只需学习相关索引即可。

具体来说,考虑某张训练图像\(I_k\),首先可以利用CLIP(遵循某种像素对齐的方式)得到原始的语义特征图\(\overline{S}_k \in \mathbb{R}^{D\times H \times W}\),其中\(D\)表示CLIP的特征维度。然后,利用SAM对\(I_k\)进行处理,可以得到一系列区域Mask \(R_k = \{R_k^q\}^M_{q=1}\)。每个Mask对应一个区域,对于每个区域,可以计算该区域所有CLIP特征在空间维度上的加权平均,得到该区域的单个代表性统一特征表示。通过这种方式,我们就可以得到代表性语义特征\(\hat{S}_k \in \mathbb{R}^{D\times M}\)。需要注意的是,由SAM切割出来每张图的Mask并不会很多,所以会有\(M \ll H\times W\)

基于代表性语义特征\(\hat{S}_k\),我们可以构造出一个语义索引图\(M_k \in \mathbb{R}^{1\times H\times W}\)。这张图上的每个像素对应一个语义index,用于查询代表性语义特征。于是,有了代表性语义特征和语义索引图之后,我们就可以计算得到全面语义特征图\(\overline{S} = \hat{S} \circ M\)。这一步骤相当于压缩了Gaussians的学习目标,与量化有异曲同工之处。

这一步是否需要一个Mask对齐的操作?对齐不同图之间得到的语义索引?

接下来我们需要构建一个训练目标。首先可以给定一系列文本描述,分别对应\(C\)个类别。这些文本描述经过CLIP Text Encoder之后得到文本特征\(T\)。对于每张图,我们都可以提前得到一个代表性语义特征\(\hat{S}\)以及语义索引图\(M\),计算得到全面语义特征图之后,则可以计算每个像素的语义特征与文本特征之间的余弦相似度,利用argmax得到一个target目标索引图\(\widetilde{S}\),即\(\widetilde{S} = \text{argmax}(\cos[(M \circ \hat{S}), T]) \in \mathbb{R}^{1\times H \times W}\)。注意这里的target目标索引图都是可以提前offline计算的。

有了训练目标之后,就可以进行损失函数的构造了。上面的训练目标图相当于给每张图的每个像素一个类别index,并且该index属于给定的C个文本描述类别之一。我们在每个Gaussians上添加一个语义特征\(f_i \in \mathbb{R}^{d},(d=3)\),按照Gaussians的渲染过程得到语义图\(\in \mathbb{R}^{d \times H \times W}\)。通过一个可训练的轻量级卷积层来进行维度提升,得到\(S \in \mathbb{R}^{C\times H \times W}\)。维度对齐之后,就可以利用交叉熵损失作为损失函数,即\(\mathcal{L}_s^{2D} = \mathcal{L}_{ce}(S, \widetilde{S})\)

中间的语义索引图在整个过程中起到什么样的作用?SAC真的压缩了占用吗?从训练的角度来看,就像是使用了卷积进行维度提升而已。

3D Coherent Self-Training

CLIP提取出的特征图存在一个硬伤,就是CLIP本身具有视图之间的不一致性。因此如果始终使用多视图不一致的CLIP特征图来监督Gaussians语义的监督,可能会导致模糊错误的渲染结果。CLIP-GS则提出了3D Coherent Self-Training方式,该方式利用3D模型表示固有的3D一致性,以解决语义歧义并强制不同视图之间遵循连贯的语义一致性。

考虑已经在上面的损失函数下进行了一段时间的训练,我们已经得到了场景3D Gaussians表征的大体雏形。CLIP-GS将多视图训练图像视作一系列连续帧,于是我们就可以利用zero-shot的tracker模型(DEVA)来关联和对齐相邻视图的相关Mask(由SAM分类得到的)。假设目前需要优化视图\(I_k\),经过Gaussians渲染得到的语义图为\(S_k\)。3D Coherent Self-Training的目的是得到一个增强的,多视图一致的监督目标\(\mathcal{S}\),而不是仍然沿用原来的\(\widetilde{S}\),因为原来的\(\widetilde{S}\)是通过多视图不一致的CLIP特征导出的。

首先,我们可以先利用现有的Gaussians来渲染得到前后帧的语义图\(S_{k-1}, S_{k+1}\)。考虑在训练视图\(I_k\)上经过SAM切割得到的第\(q\)个区域Mask \(R_k^q\),我们能够对齐相邻视图的相关Mask,因此我们可以得到前后帧上对应的Mask\(R_{k-1}^q,R_{k+1}^q\),然后利用这些Mask去相应的语义图\(S_{k-1},S_{k+1}\)上截取语义,将其融合到当前视图对应的语义特征\(S_k\)当中,这样我们就将渲染出来的语义图\(S_k\)进行了融合增强。为了得到新的监督目标\(\mathcal{S}\),CLIP-GS利用区域Mask来强制进行区域一致性的正则化。具体的计算方式如下: \[ \mathcal{S}_k^q = \text{argmax}_c \sum_{v\in R_k^q} \mathbb{1}\{\text{argmax}(\sigma(\mathcal{C}(S_k^{q_v})))=c\} \] 实际上,就是需要使得\(\mathcal{S}\)中与区域Mask对应的区域具有统一的label,具体这个label是多少,则是由对应区域中的像素渲染结果进行投票决定的。对于每个区域,我们都执行上面的一致性正则化,于是就可以得到视图\(I_k\)下新的优化目标\(\mathcal{S}_k\)。我们使用这个更加多视图一致监督信号来继续训练Gaussians,同样使用交叉熵损失\(\mathcal{L}_s^{3D} = \mathcal{L}_{ce}(S, \mathcal{S})\)

Overall Training

CLIP-GS的训练大致分为两个阶段,第一个阶段使用基于SAC得到的监督信号来监督,第二个阶段使用增强的更加多视图一致的监督信号来监督。在经过\(\mathcal{T}\)轮的迭代之后,进行阶段的转化,损失函数也相应进行改变。

同时为了调节Gaussinas的数量并且提高效率,同时保持高质量的场景表示,CLIP-GS引入了渐进致密调节策略。该策略在早期使用较低的图像分辨率和较低的致密化频率来进行优化,随后分辨率和致密化频率在训练迭代期间逐渐增加,直到达到初始分辨率和默认致密化频率。这种方式可以防止过度关注细节而导致在早期致密化出现大量Gaussians。

简单总结

CLIP-GS将语义融入了Gaussians,但是解决的并不是传统意义的Open Vocabulary问题,而是类似于3DOVS,文本描述在训练过程中就已经参与进来了。

CLIP-GS利用SAC来压缩语义空间,将紧凑的语义信息添加大到3D Gaussians中。此外,为了解决CLIP特征图本身的跨视图不一致,提出了3D Conherent Self-Training方式,获得更加准确的3D分割结果。

CLIP-GS的项目地址为:gbliao/CLIP-GS

OpenGaussian

OpenGaussian完成的任务是基于3D Gaussians来进行3D点级别的开放词汇理解。3D Gaussians下的词汇理解有两种text query策略,第一种方式将含有语义特征的Gaussians渲染成特征图,然后在特征图中进行文本相似度的查询,最终得到文本对应的结果(例如LangSplat);第二种方式是每个Gaussian上具有一个语义特征,直接在点级别层面上进行文本相似度的查询,得到相关Gaussians,然后将这些Gaussians渲染成图片,得到文本对应的渲染结果。OpenGaussian关注的则是第二种方式。

OpenGaussian认为,之前的方法(LEGaussian、LangSplat、...)等基于第一种query方式虽然能够达到较好的效果,但是不同对象Gaussian之间的特征缺乏区分性,并且同一对象内部一致性较低。论文将其归结为两个原因,第一个是特征表征能力不足,如果在每个Gaussian上附加较高维度的语义特征将会导致训练和渲染的低效率,因此相关方法会采取蒸馏、量化等方式进行降维,但是这不可避免地损害了特征等表示能力和区分性;第二个是2D-3D之间不准确的对应,对特征维度采取alpha混合,像素上的颜色是通过不透明度作为权重累积的,这可能会损害2D和3D之间的一一对应关系。

针对这两个问题,OpenGaussian首先提出相关损失来获取区分性高的实例特征;进一步采用由粗到细的codebook来离散化实例特征,产生离散的3D实例簇;最后通过基于IoU和特征距离的关联方法来将高维无损的CLIP特征与3D Gaussian点相关联,从而实现开放词汇3D场景理解。

模型架构

下面是OpenGaussian的完整Pipeline。

3D Consistency-Preserving Instance Feature Learning

首先,OpenGaussian为每个Gaussian引入一个低维度的实例特征\(f \in \mathbb{R}^6\),用于表征实例属性。需要注意的是,这个属性主要作用就是区分场景实例,其中并不包含开放词汇信息。论文采用SAM Mask来监督实例属性的训练,但是与相关方法不同,这里并不需要2D Mask跨帧之间的一致性,而是使用3D Gaussian的多视图全局一致性来约束实例特征。OpenGaussian的出发点是,来自同一对象的Gaussian渲染特征应该接近,而来自不同对象的Gaussian渲染特征应该相互远离。这一点是通过两种损失来完成的。

具体来说,每个Gaussian上会附加一个实例特征\(f\in \mathbb{R}^6\),在给定视角下可以渲染出特征图\(M \in \mathbb{R}^{6\times H \times W}\);对于给定的训练视图,将其通过SAM得到一系列Mask,\(B_i \in \{0,1\}^{1\times H \times W}\)表示得到的第\(i\)个Mask。在Mask的基础上,我们可以计算出每个Mask的平均特征,即\(\bar{M} = (B_i \cdot M) / \sum B_i \in \mathbb{R}^6\)

为了确保每个Mask内的特征接近其平均值(保证对象内部的一致性),论文引入Mask内平滑损失: \[ L_s = \sum_{i=1}^m \sum_{h=1}^H \sum_{w=1}^W B_{i,h,w} \cdot || M_{:,h,w} - \bar{M_i} || ^2 \] 为了促进不同实例之间的特征多样性,来增加Mask之间的平均特征距离,论文引入Mask间对比损失: \[ L_c = \frac{1}{m(m+1)} \sum_{i=1}^m \sum_{j=1,j\neq i}^m \frac{1}{|| \bar{M_i} - \bar{M_j}||^2} \] 在这两种损失函数的支持下,我们可以训练出具有跨视图一致性的实例特征。

Two-Level Codebook for Discretization

尽管经过上面的步骤,我们的特征能够体现一定的实例区分性和一致性,但是由于特征图渲染过程中采用的是alpha混合,这会导致权重的累积,仍然可能会出现来自同一实例的Gaussian表现出不同的特征,来自不同实例的Gaussian却表现出相似的特征。为了改善这一问题,论文提出了两阶段的CodeBook来进行实例的离散化,确保来自同一实例的Gaussian具有相同的特征,而非仅仅是相似的特征。

首先对于场景中的所有Gaussian上的实例特征\(F \in \mathbb{R}^{n\times 6}\),从中随机挑选\(k(=64)\)个特征作为量化codebook \(C \in \mathbb{R}^{k\times 6}\)。有了Codebook,每个实例特征可以对应一个最近的codebook特征,所有实例特征\(F\)就可以转化成索引向量\(I \in \mathbb{R}^{n \times 1}\)。在实际特征图渲染和损失计算的前向过程中,使用codebook \(C\)和索引向量\(I\)来计算,在反向梯度传播的时候,则更新原始的实例特征\(F\)。然后迭代根据\(I\)\(F\)来更新Codebook \(C\)。Codebook实际上就对应的场景的离散化。

这一阶段仅仅是初步的离散化,仍然不能完整地解决问题。一方面,由于遮挡和距离的存在,两个对象可能永远不会共享相同的视角,因此无法通过对比损失进行优化以确保它们的特征是不同的;另一方面,\(k=64\)表示场景中仅区分64个对象,但是这仍然有些局限,不足以区分场景中所有对象,降低了实例特征的独特性。论文通过实验证明,单纯地提升\(k\)的值并不能达到很好的结果,因此OpenGaussian进行下一阶段的离散化。

具体来说,我们将实例特征\(F\)与Gaussian的3D坐标\(X \in \mathbb{R}^{n\times 3}\)进行拼接进行Codebook的构建,从实现位置相关的聚类。然后在每个粗粒度的簇中再仅根据实例特征进一步进行离散化,整个过程可以表示为: \[ \left\{ \begin{array}{ll} [F\in \mathbb{R}^{n\times 6};X \in \mathbb{R}^{n\times 3}] \mapsto \{C_{coarse} \in \mathbb{R}^{k_1 \times (6+3)}, I_{coarse} \in \{1, ..., k_1\}^n \}, \quad coarse,k_1=64\\ F\in \mathbb{R}^{n\times 6} \mapsto \{C_{fine} \in \mathbb{R}^{k_1\times k_2 \times 6}, I_{fine} \in \{1, ..., k_2\}^n\}, \quad fine,k_2 = 10\\ \end{array} \right. \] 当然在这个步骤中,Gaussian的位置仅参与Codebook的构造,而不会参与优化,从而保留了预训练Gaussian模型的几何结构。

Codebook构建过程,我们得到了更加独特的实例特征\(F\),这些特征可以作为更强的监督。经过Codebook构建阶段的实例特征我们称为pseudo GT feature,此时我们可以替换前面基于Mask的两类损失为更强的监督损失: \[ L_p = || M_p - M_c ||^1 \] 其中\(M_p\)是由pesudo GT feature渲染得来的,而\(M_c\)是由量化feature渲染得来的。

Instance-Level 2D-3D Association without Depth Test

经过上面的训练过程,我们已经可以为场景中的每个Gaussian学习一个实例特征,并且这个实例特征可以保证同一对象内相同,不同对象之间相距大。但是正如在开头所提到的,这种实例特征只用来区分场景实例,而不具有开放词汇相关特征。为了进一步实现更加自然的交互,则需要将3D Gaussian与语义特征进行关联。这种关联方式通常有两种,第一种是将CLIP等语义特征压缩或者提取到低维度来训练3D Gaussian语义场,但是压缩后的特征可能会模糊原始语义;第二种是使用相机内外参数来建立3D点到2D像素之间的关联,但是需要深度信息来进行遮挡测试。

OpenGaussian提出了一种实例级别的3D-2D关联方法,该方法可以保留高维度无损的语义特征,同时避免基于深度的遮挡测试。具体来说,考虑一张输入视图,我们首先在给定视角下渲染出每个实例的实例特征图\(M_i \in \mathbb{R}^{6\times H \times W}\),其中\(i\)表示量化阶段的索引,其范围为\((1,k_1\cdot k_2)\)。同时利用SAM对该输入视图进行分割,得到多个Mask分割\(B_j \in \{0,1\}^{1\times H \times W}\)。直观上,我们可以通过IoU来找到与实例相关联的Mask,但是考虑到遮挡关系,这种方式并不是总是生效,因此我们还使用特征距离来找到关联实例。对于SAM的每个Mask,我们利用前面的pseudo GT feature \(M_p\)来填充,得到\(P_j \in \mathbb{R}^{6\times H \times W}\),额外考虑渲染出的实例特征和填充的Mask特征之间的距离,以此来解决遮挡等问题。具体评估相关性分数为: \[ S_{ij} = IoU(M_i, B_j) \cdot (1 - ||M_i -P_j||^1) \] 得分最高的Mask将被分配给对应的Instance,经过多视图的集成,每个Instance的Gaussian将被分配到对应的CLIP特征。

简单总结

OpenGaussian关注的问题是基于3D Gaussian的点级别开放词汇理解。首先利用基于SAM Mask的两类损失来学习实例特征,希望能够做到mask内特征相近、mask之间特征分离;之后利用从粗到细的Codebook构建策略进一步提升实例特征的内部一致性以及相互之间的独特性;最后用一个基于IoU和特征距离的映射方式来得到无损的CLIP特征。

OpenGaussian整个方法比较像是把基于点云的方法拿到了Gaussian中来使用,遵循点云聚类+特征映射的操作流程。


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