读 DeepHuman: 3D Human Reconstruction from a Single Image

论文地址:https://openaccess.thecvf.com/content_ICCV_2019/html/Zheng_DeepHuman_3D_Human_Reconstruction_From_a_Single_Image_ICCV_2019_paper.html

作者:Zerong Zheng, Tao Yu, Yixuan Wei, Qionghai Dai, Yebin Liu

发表: ICCV2019

Code: https://github.com/ZhengZerong/DeepHuman


如果你去做这个任务,会怎么做?作者做的方法和你想的有什么差异?

Why:

  1. 现在的人体重建模工作大多需要多视角图像或者多temporal图像,从单张图像重建人体仍然是具有挑战性的工作。
  2. 单张图像重建模的工作,就算是利用人体template(SMPL)的,最好的效果也只是重现形状和姿势,但是在服装层面上的呈现效果很差。BodyNet已经尝试了,但是效果也很差。
  3. 现在的公开数据集都没有大分辨率的、包含普通服饰的表面特征的3D人体数据集。所以只好自己搞了一个。

What:

  1. 提出了DeepHuman,体到体(volume to volume)的3D人体重建模
  2. 将从SMPL模型生成的 稠密语义表示 作为额外的输入,来让重建的物体表面更清晰,甚至还能重建不可见的部分
  3. 通过体积特征变换(volumetric feature transformation),把不同尺度的图像特征融合起来,得以恢复精确的表面;然后通过正则提炼网络(normal refinement network)进一步细化表面
  4. 顺便提出了THuman数据集

读前疑问:

  1. SMPL模型是哪来的?震惊,是需要利用HMR之类的方法先生成一个SMPL人体模型,然后再和图像一起作为输入,所以这篇论文是跟前半部分工作——生成SMPL模型——一点关系没有的🤔
  2. 不是自监督吧?不是的,是有3D mesh ground truth的
  3. 看起来效果很好,模型中应该利用了一些bottom-up的人体结构先验知识吧?我猜是不是先用的SMPL构建人体,然后再额外增加一部分网络结构,把人体表面重建得更好呢?没错。
  4. normal refinement network是啥呢?normal是法线啦,我理解这个其实就是一个简单的UNet网络,把法线贴图upsample成两倍大小
  5. 不同scale的图像特征是怎么利用的?这里提出了一个VFT来把图像特征融合进volume特征里。图像特征怎么来的,简单的conv+relu。volume特征怎么来的,一个立体改良版UNet。所以具体做法就是,在UNet的downsample过程中的每一层,都进行一次VFT,把图像特征融合进volume特征里面。
  6. THuman数据集好用吗?我看这篇论文有一百多的引用,是因为大家都用上了这个数据集吗?不知道诶……

How:

  1. 服装层面的重建模要做好,需要分解成两方面:
    1. 可视区域的变形自由度要被限制,不然人体结构会被破坏。 为此,这篇文章提出除了原始图像以外,还额外加上两种参数化的人体模型,包括3D语义体+对应的2D语义map
    2. 模型要能提取出几何信息,比如服装风格和皱纹。 为此,提出了多尺度体积特征转换。 最后再通过法线投影层,连接生成网络和精炼网络
  2. 总的来说,分成3个子任务:
    1. 输入图像 -> 参数化人体模型
    2. 图像+人体模型 -> 表面重建
    3. 图像 -> 可视表面再度精细化
  3. THuman数据集,包括7000个穿着230种服装的随机姿势的人体mesh

模型:

image-20211217121247234
image-20211217121247234
  1. 对于每个三维模型顶点,生成一个包含3个维度的语义码,包含其空间坐标+姿势信息,映射到二维图像I上,得到语义map Ms
  2. 体素化smpl模型,然后把语义码传播到对应体素中,得到语义体Vs
  3. 定义一个128*192*128的3d占据空间(occupancy volume) Vo,其中表面以内的所有体素值设为1,以外的为0。通过一个图像导向的体到体翻译网络,靠I和Ms的协助,把Vs重建模为Vo
  4. 因为体素体的像素有限,所以最后再用一个UNet,直接把Vo投影成一个2D法线贴图(Normal map) N,也就相当于是可视的表面
  5. 总的来说,模型由三部分组成
    1. 图像编码G
    2. 体到体转换网络vol2vol
    3. 法线精炼网络R

图像编码 G

结合I和Ms,得到多尺度的2D特征maps \(M_f^{(k)}(k=1,...,K)\)

体特征转换 volumetric feature transformation VFT

image-20211217121317806
image-20211217121317806

VFT这个东西把前面通过图像编码得到的多尺度的2D特征maps \(M_f^{(k)}(k=1,...,K)\)融合到vol2vol网络中

  1. 通过一个卷积+激活,把特征map \(M_F^{(k)}\)映射到模块化参数\((\alpha_k, \beta_k)\)
  2. 因为此时\((\alpha_k, \beta_k)\)是二维的,而语义体\(V_f^{(k)}\)是三维的,所以这里是把\(V_f^{(k)}\)在z轴上分成高度为1的一层一层的切片,然后分别跟\((\alpha_k, \beta_k)\)做仿射变换(理解成线性变换+平移)
  3. 仿射变换:\(VFT(V_f^{(k)}(z_i))=\alpha_k\bigodot V_f^{(k)}(z_i) + \beta_k\)。最后就能得到转换后的Vf了

相比于直接把特征连接起来,VFT的好处就是说它可以更好地保存形状特征,而且更快更灵活。

vol2vol

  1. 是一个3D的Unet,以Vs和\(M_f^{(k)}(k=1,...,K)\)为输入,Vo为输出
  2. 在encoder阶段用VFT把Mf信息融合进Vf来;然后利用skip- connection,这个VFT的变换信息也是可以直接传递到decoder阶段的

体到法线贴图的投影层 R

这是一个可微分的体积到法线的投影层,可以根据占据空间直接计算出法线贴图,实现人体表面细节的呈现。

image-20211217121336401
image-20211217121336401
  1. 根据占据空间生成一个深度图depth map,上图4是生成depth map的步骤:
    1. 4(a)中,蓝色圆是输入的模型,从 \(p=(x_p,y_p)\) 点开始,沿着z轴扫描每一个体素点的占据情况,就能得到图4(b)
    2. 找到最近的被占据的体素点,即是深度值\(D(p)\),如图4(c)
    3. 这个方法虽然很直观,但是直接来算并不好算,所以实际上是采用一种对体素模型进行变换然后再求值的数学方法算的
  2. 将depth map转化成顶点图vertex map,然后用数学方法计算出法线图normal map
    1. 根据图像中的位置,把x和y坐标赋值给深度像素
    2. 然后用 Sobel 算子来计算顶点map沿x和y方向的方向导数:\(G_x=S_x*M_v,G_y=S_y*M_v,\)
    3. 像素点 \(p=(x_p,y_p)\)的法线就可以直接计算出来:\(N^{(x_py_p)}=G_x(p)\times G_y(p)\)
  3. 最后用一个 Unet 把 normal map Upsample到两倍大小

Loss functions

  1. 3D占据空间的重建模误差,用Binary Cross-Entropy (BCE)表示: \[ L_V = -\frac{1}{|\hat V_o|}\sum_{x,y,z} \gamma \hat V_o^{(xyz)} logV_o^{(xyz)}+(1-\gamma)(1-\hat V_o^{(xyz)})log(1-V_o^{(xyz)}) \] \(\hat V_o\)是占据空间真实值,\(V_o^{(xyz)}\) \(\hat V_o^{(xyz)}\)都是在坐标\((x,y,z)\)的体素点,\(\gamma\) 是一个权重

  2. 2D剪影(silhouette)的重建模误差,是一个多视角重投影loss: \[ L_{FS} = -\frac{1}{|\hat S_{fv}|}\sum_{x,y} \hat S_{fv}^{(xy)}log S_{fv}^{(xy)}+(1-\hat S_{fv}^{(xy)})log(1-S_{fv}^{(xy)}) \] \(L_{FS}\)是前视角(front-view)的剪影重投影loss,\(S_{fv}\)\(V_o\)的剪影重投影,\(\hat S_{fv}\)是相应的真实投影,$ S_{fv}^{(xy)}$ \(\hat S_{fv}^{(xy)}\)是在坐标\((x,y)\)的相应像素值。

    侧面视角的loss \(L_{SS}\)的定义如出一辙。

  3. 法线图的精炼误差,用余弦距离: \[ L_N = \frac{1}{|\hat N|}\sum_{x,y} 1-\frac{<N^{(xy)},\hat N^{(xy)}>}{|N^{(xy)}|\cdot |\hat N^{(xy)}|} \]

  4. 总loss: \[ L = L_V +\lambda_{FS}L_{FS} +\lambda_{SS}L_{SS}+\lambda_{N}L_{N} \]

THuman数据集

  1. 用DoubleFusion方法捕捉3D人体mesh模型
  2. 数据集中包括7000个数据项,每一项有:表面包含了材质的mesh模型 + RGBD图像 + 对应的SMPL模型

实验

image-20211217121419341
image-20211217121419341

跟这几个比:HMR BodyNet SiCloPe

效果好极了

讨论

limitation:

  1. 必须依赖HMR和SMPLify来为输入图像估计一个SMPL模型
  2. 不可见的地方被过度平滑了
  3. 手只能表示成一团,面部表情也不能刻画