简介
主页:https://repo-sam.inria.fr/fungraph/nerfshop/
端到端的可编辑nerf,自由选择物体进行实时变形
技术点:
- 标准的图像编辑工具以及PointShop
- Instant-NGP
- 具体的几何处理算法,使用C++ library libigl
- TetGen 构建笼子的四面体步骤
- Dear ImGui 来创建交互式窗格
- 通过OpenGL 辅助视觉元素(线框、网格)
PointShop分别为2D和3D内容的操作提供直观的、直接的操作界面
引入了一个基于涂鸦的界面,允许用户轻松地选择空间区域,类似于图像区域选择
论文方法通过创建了一个笼状网格,将这个空间围起来,允许用户操作网格顶点,实现自由形式的变形和编辑,类似于其他内容编辑工具。通过创建一个四面体表,引入了一种gpu友好的两级插值方案,允许交互式更新编辑,编辑完整的场景会带来特定的挑战,因为不一致的颜色和密度工件会在(重新)移动对象后出现,为此引入一种受泊松图像编辑启发的初步基于膜的插值方法,可以减少这些伪影
类似于传统图像编辑工具中的“图层扁平化/导出”,提供了一个“蒸馏”步骤,它折叠所有执行的编辑并保存一个哈希网格NeRF表示,可以加载到已建立的管道中
贡献点:
- 一个基于涂鸦的界面,用于nerf和半自动笼型建筑中的交互式对象选择。
- 一种直接的自由形式的体积操纵方法,由于gpu友好的插值方案是交互式的。
- 一种初步的基于膜的校正方法,减少了由用户编辑产生的颜色和密度伪影,以及一种将编辑“提取”为标准NeRF表示的方法。
实现流程
Cage Building and Geometry Processing
Cage-based deformations 是一种流行和通用的形状编辑工具。基本原理是在对象周围构建一个边界网格(笼),使用户能够修改其顶点并将几何编辑传播到笼体中
{ v 1 , ⋯ , v n } ∈ R 3 \{v_1,\cdots,v_n \} \in R^3 {v1,⋯,vn}∈R3 为笼状顶点的原始位置
为了位移一个点 x,基于笼子的变形依赖于预先计算广义重心坐标 { λ 1 , ⋯ , λ n } \{ \lambda_1,\cdots,\lambda_n \} {λ1,⋯,λn} 来规范化的笼子的顶点
并将其新位置
x
^
\hat{x}
x^ 导出为 𝜆-weighted 移位的笼子顶点之和
v
^
1
,
⋯
,
v
^
n
\hat{v}_1,\cdots,\hat{v}_n
v^1,⋯,v^n
这通常是用广义重心坐标来完成的,它有不同的方法;这里选择使用均值坐标(MVC)进行编辑,因为效率和简单性。
手工创建笼子是一个繁琐且耗时的过程。自动笼型构建算法解决了这个问题,但通常会导致复杂的网格,这导致选择一个更自适应的解决方案,受到边界代理的启发,也采用了自适应笼型网格简化方案。
SELECTION AND SEMI-AUTOMATIC CAGE BUILDING
引入了一个基于涂鸦的界面,允许用户在将被编辑的场景中选择对象(或表示为体素的体积区域)。
用户可以自由扩展选择
然后将其变成一个可以操纵的笼子
笼被用来创建一个四面体结构,它引导体积变形过程
Selection
为了在NeRF场景中选择一个区域进行操作,用户在当前渲染视图中对该区域进行涂鸦
通过射线行进将涂鸦从屏幕空间重新投影到底层体积
射线行进一直持续到累积透过率低于用户定义的阈值
实验中设置为 1 0 − 3 10^{-3} 10−3,在蒸馏去除浮影中使用 0.8 0.8 0.8
重新投影的点(遍历结束的位置)被映射到覆盖场景的二进制占用网格中最近的体素,称之为种子
然后,使用类似于洪水填充的区域增长过程扩展初始的稀疏选择。
调用时,用种子的单元索引填充队列,然后通过将当前选择的所有直接邻居添加到队列并根据密度阈值标记每个单元来迭代进行
用户可以通过连续执行多个可调节的增长步骤来自由决定何时停止扩展
为了允许细粒度控制,NeRFshop提供了一些工具,在用户对当前选择不满意的情况下丢弃单元格。
(a)从种子点(第一张图像中的红点)开始,密度感知区域生长方案通过考虑每个有效网格的直接邻居来迭代进行。
(b)最终选择包含用户想要修改的所有密度。然而,产生的体积对于健壮的四面体化和编辑来说可能太细了。
©执行形态学操作来简化所选体积的形状。
Cage Building
选择的网格单元就绪后,现在构建一个笼子网格,它充当用户的几何编辑界面,其需要两个属性:
- 笼子应该有一个连接的组件
- 应该绑定所选择的区域,同时保持接近所选择的体素
为此,应用了 morphological operators
具体来说,以立方体作为膨胀步骤的结构元素,以球体作为后续侵蚀的结构元素的闭合操作。
这有助于实现无间隙的网格,通过过滤选择的几何和拓扑简化管道的下游步骤(图3c)。
结构元素的大小对于适当简化选择的拓扑结构是至关重要的。
为用户提供了选择膨胀和侵蚀结构元素的可能性,以及它们相应的半径。
这个过程的结果是一个三维二进制网格,表示简化的选择,使用marching cubes 从中提取一个表面网格
但是这样得到的表面网格包含太多的顶点和边,无法进行直观的编辑并确保交互性
因此,设法简化它。然而,直接应用 standard edge collapsing techniques将违反笼包围所选区域的属性。
standard edge collapsing 抽取会得到一个不绑定待编辑区域的网格。设𝑒是一条边(水平虚线),要折叠成顶点v。如果没有约束,网格可能会收缩(橙色区域)。
为了提高抽取方案的稳定性和一致性,增加了三个额外的关于边的条件
- 对正则链接条件进行测试,以确保网格在折叠边时保持流形
- 避免高度连通的顶点,即。因为这些退化的情况往往会导致非直观的编辑行为,并且它们会干扰边塌缩。因此,简单地强制一个上界,实验表明 上界 12 在实践中工作得很好,同时允许用户在NeRFshop内部调整这个值
- 防止三角形变得太薄,这也是为了提高笼子的可用性。测量三角形的紧凑性,并确保没有网格简化步骤会增加所涉及三角形的紧凑性。
通过包含一个线性约束来强制保守边界。
使用MeshFix进行后处理,以避免空洞、自交叉和退化元素。
在某些情况下,这可能会轻微改变笼子的体积,导致网格不能完美地约束选择,但是这一步对于执行一致的插值和四面体化是必不可少的
在极少数情况下,使用MeshFix的后处理会导致问题,用户可以轻松地手动调整笼子
INTERACTIVE VOLUMETRIC EDITING
目标是将 cage 顶点位移传播到封闭密度体积的相应操作中。为此,将笼子四面化
笼子的三角形网格足够坚固,因此可以使用 TetGen 无需修改即可从笼子中提取一个四面体网格
将场景的初始配置称为规范空间,将场景经过用户笼式操作后的配置称为变形空间
应用两级插值方案
(a)四面体网格顶点存储 mvc 插值。
(b)点查询 x 从这些预先计算的四面体值以重心插值。
如上图所示
第一级是在预处理步骤中完成的基于 mvc 的插值
第二级是四面体内部的在线重心插值
后者避免了在渲染具有N个顶点的笼子中每个样本位置时的Ω(𝑁)MVC 计算,进一步很好地映射到 Instant-NGP 的gpu加速渲染管道
两级插值方案支持交互式基于笼子的编辑,并以实时帧率呈现用户编辑的场景
设cage顶点的初始位置 v i ∈ R 3 , i ∈ { 1 , ⋯ , n } v_i \in R^3,i \in \{1,\cdots,n \} vi∈R3,i∈{1,⋯,n},其四面体网格顶点的初始位置为 p j ∈ R 3 j ∈ { 1 , ⋯ , m } p_j \in R^3 j\in \{1,\cdots,m \} pj∈R3j∈{1,⋯,m}, 𝑛 与笼子顶点的位置相同
在预处理步骤中,计算所有
p
j
p_j
pj 关于所有
v
i
v_i
vi 的 MVC系数矩阵
w
j
w_j
wj,i∈R,即计算
w
j
,
i
w_{j,i}
wj,i 使
当用户将笼子顶点更新到新的位置
v
i
∈
R
3
v_i∈R^3
vi∈R3 时,可以使用预先计算的MVC坐标有效地更新四面体顶点,包括内部顶点
除了新编辑的位置
p
j
p_j
pj 外,四面体网格中的每个顶点总是存储其初始位置
p
k
p_k
pk,以便在渲染期间用于查找
当变形每个四面体时,它的局部旋转矩阵用 SVD 估计
以在规范空间和变形空间中具有相应笼子的一次编辑为例
当一个样本 x 位于其变形体积内时,首先确定 x 所在的变形空间四面体
计算出 x 相对于变形四面体顶点 p j p_j pj 的重心坐标 λ k \lambda_k λk
映射并查询正则空间中某个位置的NeRF,该位置由对应的未修改四面体的顶点位置 p j p_j pj 的重心插值计算得到
由于变形而引起的与视图有关的辐射度变化,可以使用局部旋转估计来转换NeRF的视图方向输入
两级插值方案支持叠加编辑,也可以创建一个对象的多个(变形的)副本,通过递归反向映射和按相反顺序测试每个编辑的变形笼的交集来实现的
体渲染公式如下
在进行复制或非复制编辑时,可以包含或跳过与标准笼相交的示例
渲染和编辑需要确定哪个变形的四面体包围了每个视图射线上所有样本的给定3D查询位置
为了契合Instant-ngp,支持分层加速结构将需要额外的每条射线状态(例如,遍历堆栈)来维护多个射线压缩步骤,使用自适应查找表
3D域离散成一个规则的体素网格
每个体素包含一个与它相交的四面体列表,该列表是通过包含测试和四面体的每个三角形的立方体-三角形相交得到的
体素被线性化为一维数组 𝑇,遵循Morton顺序,确保在射线遍历期间传输数据的高局部性和可重用性,而不管视图方向如何
体素包含可变数量的条目,使用一个辅助数组 𝑈 来存储前缀和的结果并执行高效的查找
首先将查询位置映射到其外围网格单元,并查询 𝑈 以获得 𝑇 中的候选四面体索引
每个样本测试的平均四面体数量从粗笼的 2个 到细笼的 7个(分别使用≈50/1k的笼顶点)
这是内存占用和效率之间的一个很好的平衡
MEMBRANE-BASED CORRECTION AND DISTILLATION
Membrane-based Correction
NeRF中移动对象会导致外观不一致,如果笼子很大,并且包含来自支撑物体的表面的密度,这种密度将随着被移位的物体不正确地移动,导致在新位置出现“破碎”的颜色过渡
这些问题与“剪切-粘贴”图像编辑操作有很强的相似性,对此泊松图像编辑(Poisson Image Editing)是标准的解决方案
需要考虑图像中的颜色,体积密度
论文通过Instant Image Cloning,提出基于体积膜(volumetric membrane-based correction method)的颜色和密度校正方法
初步方法使用均值坐标的颜色校正膜近似昂贵的泊松解算器,这与四面体 MVC 插值方案非常吻合,允许高效的计算。
使用下标“In”和“out”在 标准 和 变形笼 的顶点上表示三维空间的数量
这个过程包括三步:前两步分别从其四面体网格的笼子和 顶点 预先计算必要的数量,而第三步在交互式渲染中使用这些数量。考虑了密度 𝜎 和依赖于视图的颜色 c,后者被 baked 到低阶球面谐波(SH)中,避免了交互式渲染期间的NeRF网络评估
Setp 1:
笼型顶点预处理。在每个初始笼顶点位置
v
k
v_k
vk,查询NeRF网络并存储相应的密度
σ
i
n
(
k
)
\sigma^{(k)}_{in}
σin(k) 和 视图依赖的颜色
c
i
n
(
k
)
c^{(k)}_{in}
cin(k)。当用户移动产生新位置的笼子顶点
v
k
v_k
vk 时,在这些位置上计算出相应的新密度
σ
o
u
t
(
k
)
\sigma^{(k)}_{out}
σout(k)和颜色
c
o
u
t
(
k
)
c^{(k)}_{out}
cout(k),它们作为要匹配的外部数量。从这些顶点量,现在为校正膜计算密度加权颜色残差
c
r
e
s
(
k
)
c^{(k)}_{res}
cres(k) ,仅当有足够的密度时鼓励传播
α
i
n
(
k
)
=
1
−
e
x
p
(
−
σ
i
n
(
k
)
δ
c
)
,
α
o
u
t
(
k
)
=
1
−
e
x
p
(
−
σ
o
u
t
(
k
)
δ
c
)
\alpha^{(k)}_{in} = 1- exp(-\sigma^{(k)}_{in} \delta_c),\alpha^{(k)}_{out} = 1-exp(-\sigma^{(k)}_{out}\delta_c)
αin(k)=1−exp(−σin(k)δc),αout(k)=1−exp(−σout(k)δc),
如果
α
o
u
t
(
k
)
\alpha^{(k)}_{out}
αout(k) 是小于
α
o
u
t
(
k
)
\alpha^{(k)}_{out}
αout(k),那么上式中的残差接近原始图像克隆公式
Setp 2:
传播到四面体网格顶点。使用MVC插值将笼点的残差传播到四面体网格的顶点。为了避免从没有密度的顶点插入无意义的颜色,再次使用 𝛼-weighted 插值方案:
对所有四面体网格顶点评估这个公式,并为每个顶点存储
c
r
e
s
,
σ
o
u
t
c_{res},\sigma_{out}
cres,σout和剩余密度
σ
r
e
s
=
σ
o
u
t
−
σ
i
n
\sigma_{res} = \sigma_{out} - \sigma_{in}
σres=σout−σin
Setp 3:
对于呈现期间的每个样例查询,使用四面体重心坐标 𝜆 插值
c
r
e
s
,
σ
o
u
t
,
σ
r
e
s
c_{res},\sigma_{out},\sigma_{res}
cres,σout,σres的值。与标准射线行进不同,在计算最终像素值时需要考虑这些数量。根据体渲染公式的符号,采用校正感知的
α
\alpha
α项
最终校正的颜色
使用了步骤1中定义的
α
o
u
t
\alpha_{out}
αout,体渲染公式为
由于mvc的规范化性质和方向性先验的缺乏,这种方法可能导致密度泄漏。为了避免这种情况,限制了剩余密度,以便将其添加到内部密度中,不会超过该位置的初始外部密度。
NeRF Distillation
提出了一种NeRF蒸馏方法
将用户执行的所有编辑“分解”为 Instant-NGP 的默认哈希网格格式
重新训练场景,但在优化过程中还要考虑用户提供的编辑来向前映射样本
这个过程能够根据原始输入图像进行蒸馏
例如,每个沿着场景中的射线生成的样本 𝑠,检查它是否由编辑 𝑖 转换。如果是,则构成新的映射 s → s i s \rightarrow s_i s→si
s i s_i si 可能再次被编辑 j 转换,映射(例如 s → s i j s \rightarrow s_{ij} s→sij )可以递归出现。如果一个样本仍然在规范空间中,说它只有“默认映射”
在训练过程中,跟踪每条射线上的所有唯一映射
用多个映射重新跟踪每个射线 𝑟,并复制 r ‘ r` r‘,试图将识别的映射应用到 𝑟 沿线的每个样本。每个映射都意味着一个或多个变形,这些变形将复制或重新映射通常发生在规范空间中的更新。
但是,如果 s i s_i si 位于后来编辑 𝑗 的变形笼子内,则映射 s → s i s \rightarrow s_i s→si 可能会被“破坏”,即根据 𝑗 变形空间会覆盖 𝑖 变形的结果。初始光线的映射也可能出现“破碎”,即默认映射不再可能。简单地跳过“破碎的”映射就足以提取出广泛的编辑,然而,更有原则的解决方案更适合于支持任意编辑场景
最后,将该方法应用于颜色合成和梯度计算。一个样本位置可以是共享的,也可以是唯一的映射。共享样本位置只接收来自第一个引用它们的射线的梯度。如果未复制编辑,则必须清除其源上的内容。如果不这样做,就会在留下的空白空间中产生随机的密度或颜色。在映射过程中,在非复制编辑器的未变形笼子中结束的样本是这些清除射线的一部分。它们在各自的位置上积累密度,它们的集成目标是空白空间(零密度)。
通过重新训练和尊重聚集和梯度传播的变形,场景编辑被提炼成一个规则的NeRF表示。初始射线 r 的附加实例将为每个转换映射创建,例如,r ’ 用于(a)中的复制对象;两射线集成样本并根据目标图像像素p计算梯度。共享样本位置(例如,笼外)仅由一个实例更新。对于非复制编辑(b),初始射线r被重新映射,r ’ 清除常规空间笼内的空间。
DISCUSSION AND FUTURE WORK
选择界面是基本的,用户界面可以重新设计,使其更易于使用。此外,实际的选择算法本身可以使用基于外观特征的语义场景分析来改进和简化任务。
目前,不考虑由于编辑导致的灯光不一致。改变NeRF的光照条件仍然是一个悬而未决的问题。纠正阴影、高光和整体照明是未来工作的一个令人兴奋的途径。
提出的基于膜的编辑的首次尝试可以得到改进。一个限制是四面体体积太粗糙,无法进行高质量的类泊松平滑;边界笼的自适应细化方法可能会有所帮助。然而,如何使这种方法足够快以保持交互性是一个公开的挑战。也可以建立更先进的方法,如筛选泊松,将内部和外部密度都考虑在内。
蒸馏方法足以创建许多编辑场景的 Instant-NGP NeRF表示,包括补充视频中显示的所有修改。然而,它可能会在具有破坏性编辑的场景中失败,即当大面积的非空空间被覆盖时。这有效地构成了一个“破碎的”映射:例如,如果一个对象在规范空间中移动到与另一个对象重叠,那么被覆盖对象到自身的默认映射就不再可行。在这些情况下,训练将试图通过在场景的其他地方产生多余的密度和颜色来巩固图像中的信息。这些伪影可以通过一种更复杂的机制来处理“破碎”的样本映射,例如,通过恢复或近似缺失的密度/颜色来沿着射线进行积分。
CONCLUSION
提出了一种新颖的端到端方法,允许使用自由形式的编辑对神经辐射场进行交互式直接操作。
提出了一个完全独立的管道,由基于涂鸦的选择方案组成,然后是用户监督的3D区域增长和精心选择的形态操作。由于有约束的网格抽取,获得了一个用户可以交互操作以执行自由形式编辑的笼子。
为了减少由于这些编辑造成的视觉伪影,提出了一个初步的膜插值校正方案,灵感来自泊松图像处理。在几个合成和真实场景上展示了方法,演示了交互式编辑操作,如复制、平移/缩放/旋转、自由形式的非刚性变形和浮动删除,如补充视频所示。