《PIFuHD: Multi-Level Pixel-Aligned Implicit Function for High-Resolution 3D Human Digitization》
主页:https://shunsukesaito.github.io/PIFuHD/
论文:https://arxiv.org/abs/2004.00452
这里有一篇解读
【三维重建】PIFuHD:Multi-Level Pixel-Aligned Implicit Function for High-Resolution 3D Human Digitization_Swocky的博客-CSDN博客
差不多就是翻译了一下,感觉还有点机翻,有些地方他自己也没读太懂,不用太仔细看
感觉原文也写的不咋样,同一个东西非要换好几种名字来表述,表述不清晰,逻辑不清晰,重要线索分散在文章各处,看得难受。
目标是 单视角图片 重建三维人体。
看起来这个方法只生成三维网格,不能渲染出材质,(不过想做材质估计也不难)
相机视角永远保持正面,不管是训练还是推理。这感觉有点像是 PIFu 只是一个深度场
先用 pix2pixHD 产生正面和背面的法线图,然后输入 pixel-aligned 的深度预测器。(具体看图)
感觉完全是靠 pixel-aligned特征 来推测三维结构的(不过也确实,毕竟是单视角输入,感觉上也没别的特征能用了)
隐式函数输入的时候没有做位置编码,是直接把 z 输到网络里的。不过即使要编码,也就 z 需要编码,xy都用来提 pixel-aligned特征了,MLP 压根不知道 xy 是多少。
当前很多模型在重建细节时效果都不好,我们认为这来源于两种冲突的需求:
正确的预测需要较大的上下文,精确的预测需要高分辨率。
由于内存限制,先前的工作都使用了低分辨率的图像,所以生成的3D模型分辨率不高。
我们提出了一种端到端的多层次的可学习架构。
coarse层次观察到低分辨率的完整图像,并专注于整体的结果。coarse层次为 fine层次提供上下文。fine层次观察到高分辨率的图像,并预测非常细节的几何。
我们的方法通过充分利用1k分辨率的图像,在单视角人体形状重建上取得了 SOTA (2020年4月)
单视图的三维人体数字化是一个病态问题。为了克服这一点,参数化模型 [5, 27, 18, 33] 经常被用于将估计限制到少量的一组参数,将求解空间限制到一个特定的参数化人体模型 [7, 22, 20, 46, 33, 47] 。然而,由于模型都是不带衣服的,这限制了模型的表达能力。虽然可以用一个单独的参数化模型来缓解有限的形状变化 [6] ,但是大的形变和拓扑变化还是处理不了。
也有研究者提出了不用参数化人体模型的方法。有一些算法用 体积表征 [42] 。与该方法特别相关的还有 DeepHuman [51] ,在该方法中,网络以越来越高的分辨率和细节产生 离散体积表征。额外的细节使用 表面法线 在最后一个层次贴上去。尽管这个方法产生了令人印象深刻的结果,但是 离散体素表征 使用的立方级的内存,使得其无法通过简单的增加输入图片的分辨率来达到更高的分辨率。
PIFu [35] 回归了一个函数来确定任意位置的占用率。与 使用全局特征向量 [29, 32, 10] 的 隐式表面表征 不同,PIFu 使用 全卷积图像特征 ,保留了输入图像中存在的局部细节。
最近许多方法利用 纹理图的表征 [48,41,23] 来重建高质量的三维纹理和几何图形,然后在此基础上估计几何细节和色彩细节。
特别的,Tex2Shape [3] 通过在 展开的UV空间 中对 位移 进行回归,来重建高质量的3D几何。然而,这种方法最终受限于 模板网格的拓扑结构(在表示不同的拓扑时会出现问题,比如不同的发型风格和裙子)和 参数化UV时选择的拓扑结构(例如,纹理接缝周围的可见接缝伪影)。最近的方法利用神经网络模型来预测 中间纹理 或 深度表征,然后用来重建最终的三维几何输出 [36, 49]。
用了两个图像特征提取器,一个输入 512512 输出 128128 ,一个输入 10241024 输出 512512 。
为了提升质量和可信度,先在 图像空间 预测 正面和背面 的 法线图,然后把 法线图 作为网络的额外输入。
PIFu 的目标是建立一个函数 f ( X ) f(X) f(X) 对三维相机空间中的任意一个点 X = ( X x , X y , X z ) ∈ R 3 X=(X_x,X_y,X_z)\in \mathbb{R}^3 X=(Xx,Xy,Xz)∈R3 ,实现以下功能:
f ( X , I ) = { 1 若 X 在网格内部 0 otherwise f(\mathbf{X}, \mathbf{I})= \left\{\begin{array}{ll} 1 & \text { 若 } \mathbf{X} \text { 在网格内部 } \\ 0 & \text { otherwise } \end{array}\right. f(X,I)={10 若 X 在网格内部 otherwise
其中 I I I 是单张 RGB 图像。
PIFu 使用神经网络对 f f f 进行建模,使用端到端的方式训练。
定义投影函数 π ( X ) = x ∈ R 2 \pi(\mathbf{X})=\mathbf{x} \in\mathbb{R}^{2} π(X)=x∈R2 ,使用正交投影 x = π ( X ) = ( X x , X y ) \mathbf{x}=\pi(\mathbf{X})=\left(\mathbf{X}{x}, \mathbf{X}{y}\right) x=π(X)=(Xx,Xy) 。
定义图像特征提取函数 Φ ( x , I ) \Phi(\mathbf{x}, \mathbf{I}) Φ(x,I)
于是有:
f ( X , I ) = g ( Φ ( x , I ) , Z ) f(\mathbf{X}, \mathbf{I})=g(\Phi(\mathbf{x}, \mathbf{I}), Z) f(X,I)=g(Φ(x,I),Z)
其中 Z = X z Z=\mathbf{X}_{z} Z=Xz 是射线方向的深度,由投影函数定义。
注意到同一条射线上的所有点的 Φ ( x , I ) \Phi(\mathbf{x}, \mathbf{I}) Φ(x,I) 是相同的,因此 g g g 应该关注 Z 的变化,以消除歧义。
使用大型数据集 Renderpeople [34] (由数百个高质量扫描的3D人体网格渲染),以端到端的方式训练 f f f
在推理时,在空间内均匀采样,并使用 marching cubes [28] 算法,以 0.5 为置信阈值产生等值面。
使用 1024*1024 的图片作为输入。
我们的模型由两个层次的 PIFu 模块组成:
我们将 coarse 层次定义为:
f L ( X ) = g L ( Φ L ( x L , I L , F L , B L , ) , Z ) f^{L}(\mathbf{X})=g^{L}\left(\Phi^{L}\left(\mathbf{x}_{L}, \mathbf{I}_{L}, \mathbf{F}_{L}, \mathbf{B}_{L},\right), Z\right) fL(X)=gL(ΦL(xL,IL,FL,BL,),Z)
其中 I H , F H , B H \mathbf{I}_{H}, \mathbf{F}_{H}, \mathbf{B}_{H} IH,FH,BH 表示 512*512 分辨率下的输入图片、正面法线图、背面法线图。
x L ∈ R 2 \mathbf{x}_{L} \in \mathbb{R}^{2} xL∈R2 表示 X \mathbf{X} X 在 I L \mathbf{I}_L IL 上的投影位置。
fine 层次定义如下:
f H ( X ) = g H ( Φ H ( x H , I H , F H , B H , ) , Ω ( X ) ) f^{H}(\mathbf{X})=g^{H}\left(\Phi^{H}\left(\mathbf{x}_{H}, \mathbf{I}_{H}, \mathbf{F}_{H}, \mathbf{B}_{H},\right), \Omega(\mathbf{X})\right) fH(X)=gH(ΦH(xH,IH,FH,BH,),Ω(X))
其中 I H , F H , B H \mathbf{I}_{H}, \mathbf{F}_{H}, \mathbf{B}_{H} IH,FH,BH 表示 1024*1024 分辨率下的输入图片、正面法线图、背面法线图。
x H ∈ R 2 \mathbf{x}_{H} \in \mathbb{R}^{2} xH∈R2 表示 X \mathbf{X} X 在 I H \mathbf{I}_H IH 上的投影位置。在本例中, x H = 2 x L \mathbf{x}_{H}=2 \mathbf{x}_{L} xH=2xL 。
Ω ( X ) \Omega(\mathbf{X}) Ω(X) 是 coarse层次提取出的 3D embedding ,实际上就是 g L g^L gL 的中间层输出。
Φ L \Phi^L ΦL 和 Φ H \Phi^H ΦH 的一个关键区别是, Φ H \Phi^H ΦH 的感受野不能覆盖整张图片,因为使用了全卷积结构,可以看作是一个滑动窗口。
因为 fine层次 从 coarse 层次的中间层获取 3D embedding,理论上 全局重建质量 不会由于感受野减小而退化(因为 coarse 已经看过全局了,最差也应该和 coarse 一样,毕竟已经拥有了coarse后续推理的所有信息,而且还多了一些局部高分辨率的信息,理应更好)。
另外,fine层次不需要处理 normalization (我估计就是说让每个 patch 之间深度的数量级一致) ,因此不需要看到整个图像,这允许我们使用 裁剪后的图像来训练,可以省内存,这对高分辨率来说是必要的。
从正面推测背面是一个病态问题。由于歧义和问题的多模态本质(这啥?),模型往往会预测出平滑且没什么特征的背面。
我们发现,如果我们将部分推理问题转移到特征提取阶段,网络可以产生更清晰的重构几何。于是,我们预测法线图,并且将其输入到 pixel-aligned预测器。
我们使用 pix2pixHD [44] 来预测正面和背面的法线,将RGB映射为法线图。
与最近的方法 [30, 11, 39] 相似,我们发现只要问题的领域限制的足够小(比如预测穿衣服的人的背面),这个方法就能生成看起来可信的结果。
使用的损失函数对最终的重建细节影响很大。
相比于 PIFu 中使用一个平均 L1 或 L2 损失,我们在一系列采样点上使用一个 extended Binary Cross Entropy (BCE) loss [51] (也就是在 DeepHuman 中使用的)
L o = ∑ X ∈ S λ f ∗ ( X ) log f { L , H } ( X ) + ( 1 − λ ) ( 1 − f ∗ ( X ) ) log ( 1 − f { L , H } ( X ) ) \begin{aligned}\mathcal{L}_{o} &=\sum_{\mathbf{X} \in \mathcal{S}} \lambda f^{*}(\mathbf{X}) \log f^{\{L, H\}}(\mathbf{X}) \\&+(1-\lambda)\left(1-f^{*}(\mathbf{X})\right) \log \left(1-f^{\{L, H\}}(\mathbf{X})\right)\end{aligned} Lo=X∈S∑λf∗(X)logf{L,H}(X)+(1−λ)(1−f∗(X))log(1−f{L,H}(X))
其中 S \mathcal{S} S 表示采样点的集合,
λ \lambda λ 表示 在 S \mathcal{S} S 中处于表面之外的点的数量(能反应体积),
f ∗ ( ⋅ ) f^{*}(\cdot) f∗(⋅) 表示该位置的 ground truth 的占用率
f { L , H } ( ⋅ ) f^{\{L, H\}}(\cdot) f{L,H}(⋅) 表示每个 Pixel-aligned 隐式函数
与 PIFu 相同,在训练时混合使用 均匀体积采样 和 重要性采样(在均匀采样得到的表面周围用高斯分布采样)。我们发现用 高斯分布采样 比用 表面距离的倒数 分布采样,能产生更锐化的结果。
事实上,在表面混合的高斯球在高曲率的区域附近有更高的采样密度(达到高斯球半径的倒数)。由于曲率是表面几何的二阶导数,基于曲率的重要性采样可以显著提高细节和真实性。
(大概意思应该就是,高斯分布的采样 会在拐角处多采一些,从而让边缘更锐化)
高分辨率和低分辨率的图像编码器都是用的 stacked HourGlass 网络 [31] 。
高分辨率有 1 个 stack,低分辨率有 4 个 stack,使用 [16] 中建议的修改,把 BN 改成了 GN 。
注意 fine 编码器中移除了下采样操作以达到更大的输出尺寸。
coarse编码器的输出是128128256 。
fine编码器的输出是51251216。
coarse的 MLP 的结构是 (257*,* 1024*,* 512*,* 256*,* 128*,* 1) ,在 3,4,5 层有残差连接(注意,输入尺寸257是编码器256维+深度z的1维)。第 4 层的输出 会作为 Ω \Omega Ω 输入到 fine 的 MLP 里。
fine 的 MLP 的结构是 (272*,* 512*,* 256*,* 128*,* 1) ,在 2,3 层有残差连接(注意,输入尺寸272维是编码器16维+coarse给的 Ω \Omega Ω 的256维)。
coarse PIFu 使用预训练, batch size = 8,输入图片被 resize 到 512*512
fine PIFu 训练时,batch size = 8,输入图片被 crop 到 512*512
使用 RMSProp 优化器,weight decay 每 10个epoch 衰减 0.1(这句不一定看懂了)。
与 PIFu 相同,使用 8000 个采样点,其中重要性采样在coarse的标准差为5cm ,在fine的标准差为3cm 。
表面法线推理使用了 [17] 的网络结构(什么玩意,之前你明明说是用的pix2pixHD好吗,哇我真的服了,只能理解为他只是把这个用作感知损失吧)(话说这个 [17] 在 keypoint NeRF里面也用了,用来提了pixel-align特征),包括 9 个残差块和4个下采样层。
预测正面和背面使用两个独立的网络。
损失函数为: L N = L V G G + λ l 1 L l 1 \mathcal{L}_{N}=\mathcal{L}_{V G G}+\lambda_{l 1} \mathcal{L}_{l 1} LN=LVGG+λl1Ll1
其中 VGG 损失使用的是 [17] 中提出的感知损失, λ l 1 \lambda_{l1} λl1 为 0.5
使用 Adam 优化器,学习率为 2.0 × 1 0 − 4 2.0\times 10^{-4} 2.0×10−4
使用前面提到的有450个 RenderPeople 的训练集。
3D embedding 就是指 coarse 提取出的 Ω \Omega Ω
对比了 fine 输入 Ω \Omega Ω ,与 直接输入z 之间的差别
这不是显然,毕竟如果fine不看 Ω \Omega Ω 的话就只能看到一个 patch了,会导致先验定位不准
后面还有一些实验,暂时不看了