PIFuHD 笔记(单视图人体重建)

PIFuHD 笔记(单视图人体重建)

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 。

为了提升质量和可信度,先在 图像空间 预测 正面和背面 的 法线图,然后把 法线图 作为网络的额外输入。
PIFuHD 笔记(单视图人体重建)_第1张图片

Pixel-aligned 隐式函数(PIFu)

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)=xR2 ,使用正交投影 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 为置信阈值产生等值面。

多层次 Pixel-aligned 隐式函数

使用 1024*1024 的图片作为输入。

我们的模型由两个层次的 PIFu 模块组成:

  1. 一个 coarse 层次(类似 PIFu),专注于整合全局几何信息,输入降采样的 512512 图片,产生 128128 的 backbone图像特征。
  2. 一个 fine 层次,专注于增加更微妙的细节,输入 10241024 的图片,产生 512512 的 backbone图像特征。
    值得注意的是,fine层次模型并不输入绝对深度,而是输入 coarse 层次提取出的 3D embedding。

PIFuHD 笔记(单视图人体重建)_第2张图片

我们将 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} xLR2 表示 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} xHR2 表示 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=XSλf(X)logf{L,H}(X)+(1λ)(1f(X))log(1f{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。

MLP 结构

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×104

使用前面提到的有450个 RenderPeople 的训练集。

实验

消融实验

3D embedding

3D embedding 就是指 coarse 提取出的 Ω \Omega Ω

对比了 fine 输入 Ω \Omega Ω ,与 直接输入z 之间的差别

PIFuHD 笔记(单视图人体重建)_第3张图片
这不是显然,毕竟如果fine不看 Ω \Omega Ω 的话就只能看到一个 patch了,会导致先验定位不准

后面还有一些实验,暂时不看了

你可能感兴趣的:(我的论文笔记,人工智能,深度学习,计算机视觉)