本文对基于深度学习的非参数化三维人体重建算法之一-PIFu做一个简要的介绍。如有错误,欢迎评论指正。
一.算法流程
PIFu包含图像特征提取和预测输出两大模块,其中图像特征提取模块用于从图像中提取逐像素的特征,然后该特征与深度结合后经过预测输出模块得到人体的sdf值(几何)或RGB值(纹理),最后sdf值经过marching cube算法处理后即可得到三角网格模型。
注:该附图来自论文,里面纹理模块引入几何模块特征的箭头有误,下面会说明。
二.具体步骤
数据
- 1.数据集
RenderPeople:共计4000多个带纹理的3d人体网格模型(商用数据需购买,只提供了几个免费模型)
BUFF:3男3女、两种衣着、每人4-9s 60fps的带纹理的3d人体网格模型序列,共计13632个
DeepFashion:800000多个服装图片数据集,每个服装有所属不同类别、描述属性和关键点的标注(该数据集用于测试算法)
- 2.数据集处理
从带纹理的3d人体模型中,得到三类数据:①三角网格表达转为sdf表达作为输出gt(注: 实际上只取了0, 1两个数值,0.5处认为是表面); ②渲染得到不同角度、不同光照的彩色图作为输入,角度很好理解,而光照利用了PRT[4]的方法计算了光照模型的球谐系数③渲染时的相机投影矩阵信息。
输入与输出
输入: 去除背景的包含人体的彩色图
输出: sdf值(进一步用marching cube算法在0.5处提取可得到网格模型),rgb值
网络结构
- 1.整体模块
式1中:
X X X为人体网格上的3d点,是通过ray tracing算法直接在人体网格上采样得到,并且作者采用了两种采样策略:①均匀采样:在人体网格的bbox内均匀采样;②随机采样:随机在网格表面采样,并对其 x , y , z x,y,z x,y,z施加 N ( 0 , σ ) \mathcal{N}(0,\sigma) N(0,σ)的偏移; z ( X ) z(X) z(X)表示在相机坐标系下的深度;
x = Π ( X ) x=\Pi(X) x=Π(X)为弱透视下的2d投影点;
F ( x ) = g ( I ( x ) ) F(x)=g(I(x)) F(x)=g(I(x))为 x x x处的图像特征(注: 由于投影点是连续的,所以是通过由双线性插值得到的,具体实现是利用torch.nn.functional.grid_sample实现的);
g g g为图像特征提取模块,需采用全卷积类网络,对每个像素学习一个特征,即所谓pixel-aligned image features(注: 也就是说维度取决于卷积通道数了);
f f f为为MLP,用于输出预测输出sdf值 s s s(几何模块是sdf值,如为纹理模块输出的是RGB值)。
- 2.图像特征提取模块
几何模块采用的是stacked hourglass ,纹理模块采用的是CycleGAN(注:具体结构就不介绍了)。输入图像,输出逐像素的卷积特征。
- 3.预测输出模块
简单的MLP。输入像素特征(注: 维度 ( B , C f e a t u r e , N ) (B,C_{feature},N) (B,Cfeature,N), B B B为batch数, N N N为采样点个数, C f e a t u r e C_{feature} Cfeature为特征提取模块最后的通道数)和深度(注: 维度 ( B , 1 , N ) (B,1,N) (B,1,N)),输出sdf值或RGB值。
注:训练时时计算loss, 不只用了最后一层的特征,中间层也使用了,误差取的平均。
损失函数
式2为几何模块L2损失函数,用于计算预测的sdf值 f v f_v fv与gt sdf值 f v ∗ f_v^* fv∗差异;
式3为纹理模块L1损失函数, X i ′ X_i' Xi′表示对 Z ( X i ) Z(X_i) Z(Xi)施加了 N ( 0 , σ ) \mathcal{N}(0,\sigma) N(0,σ)的扰动,用于计算预测的RGB值 f c f_c fc与gt RGB值 C C C的差异。
注: n n n均为采样点个数。
训练
先训练几何模块,然后训练纹理模块,并纹理模块的训练加入了几何模块的训练得到的卷积特征。
注:论文的附图是错误的,论文附图的意思是将几何模块特征和图片级联送入纹理模块的图像特征提取模块,实际上是将几何模块的提取特征和纹理模块的提取特征连接到一起,也就是增加了通道数[8](注:见apps/train_color.py 123行 和 lib/model/ResBlkPIFuNet.py 81行))
三.实现
1.项目提供了关于从带纹理的3d人体模型中渲染得到不同角度、不同光照的彩色图的代码,效果如下所示:
2.多视角输入的处理
每个视角下的所有采样点经过 f 1 f_1 f1即式1)后输出可得到一个 n n n维的sdf特征向量 Φ i \Phi_i Φi(注: n n n为采样点个数),然后经过平均池化 m e a n ( Φ i ) mean({\Phi_i}) mean(Φi)得到融合后的特征向量 Φ ‾ \overline\Phi Φ(注: 因为对应的是空间中的同一个点),然后再经过预测输出模块 f 2 f_2 f2输出sdf值或RGB值。
注:当前开源的代码和模型是在均为单视角的版本,多视角版本需要自行修改代码,可参考[9],[10],[11]。
四.其它
后续有一些改进方法,如PIFuHD[5]、Geo-PIFu[6]、StereoPIFu[7]、PaMIR[12],感兴趣的读者可自行研究下。
五.参考
[1]PIFu: Pixel-Aligned Implicit Function for High-Resolution Clothed Human Digitization
[2][GitHub - shunsukesaito/PIFu: This repository contains the code for the paper "PIFu: Pixel-Aligned Implicit Function for High-Resolution Clothed Human Digitization"](https://github.com/shunsukesaito/PIFu)
[3][PIFu: Pixel-Aligned Implicit Function for High-Resolution Clothed Human Digitization (ICCV 2019)](https://www.youtube.com/watch?v=S1FpjwKqtPs&t=140s)
[4][PRT(Precomputed Radiance Transfer)&球谐光照(Spherical Harmonic Lighting)](https://blog.csdn.net/pizi0475/article/details/50471259)
[5][https://github.com/facebookresearch/pifuhd](https://github.com/facebookresearch/pifuhd)
[6][GitHub - simpleig/Geo-PIFu: This repository is the official implementation of Geo-PIFu: Geometry and Pixel Aligned Implicit Functions for Single-view Human Reconstruction.](https://github.com/simpleig/Geo-PIFu)
[7][https://github.com/CrisHY1995/StereoPIFu_Code](https://github.com/CrisHY1995/StereoPIFu_Code)
[8][Collection of questions · Issue #85 · shunsukesaito/PIFu](https://github.com/shunsukesaito/PIFu/issues/85)
[9][https://github.com/shunsukesaito/PIFu/issues/13](https://github.com/shunsukesaito/PIFu/issues/13)
[10][https://github.com/shunsukesaito/PIFu/issues/45](https://github.com/shunsukesaito/PIFu/issues/45)
[11][https://github.com/shunsukesaito/PIFu/issues/31](https://github.com/shunsukesaito/PIFu/issues/31)
[12][SelfRecon: Self Reconstruction Your Digital Avatar from Monocular Video](https://github.com/ZhengZerong/PaMIR)