读 Self-Supervised 3D Mesh Reconstruction from Single Images

论文地址:https://openaccess.thecvf.com/content/CVPR2021/papers/Hu_Self-Supervised_3D_Mesh_Reconstruction_From_Single_Images_CVPR_2021_paper.pdf

作者:Tao Hu, Liwei Wang, Xiaogang Xu, Shu Liu, Jiaya Jia

发表: CVPR 2021

Github链接: https://github.com/dvlab-research/SMR


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

Why:

  1. 对于单视角3D重建模任务,最直观的是用3D层面的标注进行监督学习。但是3D标注还是挺麻烦的,如果可以只用2D标注就好了。
  2. 现在也不是没有光靠2D标注实现的。但是如果没有3D层面的监督,这些工作的效果还不是很理想。
  3. 所以这篇文章想提出一个仅靠2D层面的mask标注,就能实现3D重建模的模型,而且效果很好

What:

  1. 提出一个自监督 3D Mesh 重建方法(Self-supervised Mesh Reconstruction, SMR)
  2. SMR只需要轮廓 mask 作为标注,就可以重建自然界的物体,比如鸟、牛、自行车
  3. 这个方法在多个数据集上,都提升了有监督和无监督的对2D图像进行3D重建模的效果
  4. 这个方法还可以迁移到其他图像合成任务上,比如新视角生成、形状转换、材质转换等等

读前疑问:

  1. 自监督是怎么应用在这里的?处处运用了自监督……一个是对于2D层面,可以把 原始图像 作为 生成的3D模型再渲染成的2D图像 的拟合目标;第二个是可以把 生成的3D模型 作为 生成的3D模型再渲染成的2D图像再生成的3D模型 的拟合目标;第三个是可以把 landmark的分类 作为 根据landmark对应的2D图像像素特征所预测出的分类 的自监督拟合目标……🪆🪆🪆🤡🪆🪆🪆🪆
  2. landmark 是什么?用途是什么?我不知道landmark翻译成中文的什么词比较好,这好像也阻碍了我对它的理解……文中landmark就是3D mesh模型中的每个顶点。文中认为只要是同一类物体的mesh模型,那么它们的每个landmark的语义含义应该都是一样的。所以根据这个道理,设计了一个Landmark Consistency,让模型重建的结果在local层面更加精细了。
  3. 我猜这里是不是使用插补和预测的方法,根据2D标注生成了3D标注呢?是也不是……的确是通过插补的方法,生成了新的标注,扩充了数据集,但具体过程是通过线性插补生成了一些新的2D图像。也的确是通过2D标注生成了3D标注,但这个生成的过程正是整个模型需要训练的部分。总的来说,不是我一开始想象中那么简单的……

How:

image-20211024232421890
image-20211024232421890

a. SMR的提出

  1. 传统的单视角3D物体重建方法一般都是给3D先验模型调参(比如3DMM给脸的 SMPL给人的),这样又贵又耗时,所以不能很快应用到多种多样其他物体上。
  2. 深度学习领域,可以用监督学习来实现3D重建,效果比较好。一般都需要3D标注,也有很多通过2D监督来做的方法,因为2D属性比3D属性更好识别。本质上2D标注用的方法基本上都是可微分渲染(differentiable render,后面有介绍),把3D空间映射到2D图像上。
  3. 光是2D监督的话,不能保证3D层面属性的准确性。也有研究(ARCH)显示了2D和3D监督结合起来可以进一步提升效果。所以这篇文章提出,能不能光靠2D标注来实现3D层面的重建呢?
  4. SMR的2D部分和其他2D监督方法类似,重建的3D模型又被渲染回了2D图像,作为输入;3D属性部分采用了2个新的自监督方法:插补的一致性(Interpolated Consistency)和landmark的一致性(Landmark Consistency)。
    1. IC:在自监督训练的时候,通过插补两个3D模型,生成新的3D模型,作为3D层面的标注。跟其他方法(original or randomly augmented attribute)比,这个方法可以从更多视角、几何结构、外观的角度渲染图像
    2. LC:如果3D物体的landmark具有一致性,那每个local的细节部分会更好。mesh模型中的点作为landmark,然后对每个landmark的特征进行分类。这样既能保证每个landmark的特殊性,又能提升每个小部分的建模效果。
image-20211024234148377
image-20211024234148377

b. 3D到2D - 可微分渲染 Differentiable Rendering

可微分渲染 Differentiable Rendering 本质上是一个不用任何训练、可以直接用的公式,实现在特定的相机视角和光线的条件下,把3D物体映射到2D图像中。

一点一点说明公式:\(X=R(A)=R([C,L,S,T])\)

  1. 3D mesh 物体表示为:\(O(S,T)\),S是shape,包括mesh点和面;T是texture,为UV map。
  2. 渲染相机表示为:\(C = (a,e,d)\)\(a\in [0\degree,360\degree]\)是azimuth,地平经度/方位角;\(e\in [-90\degree,90\degree]\)是elevation,仰角;\(d\in (0,+\infin]\)是distance,距离。
  3. \(L\in R^l\)是光线,通过 球谐 Spherical Harmonics方法建模。
    1. 代码里的lights是 of shape \((batch\_size,9)\),所以是用9个参数模拟环境光函数 参考 kaolin 文档
    2. 参考 球谐光照(Spherical Harmonics Lighting)及其应用-实验篇:球谐函数的主要作用就是用简单的系数表示复杂的球面函数。通过采样,可以估算出球谐函数。这里用9个参数可以得到前3阶球谐函数,已经可以很好地拟合光照函数了。
    3. 参考 kaolin 里的spherical_harmonic_lighting 源码,从代码里可以看出来,最后对图像进行渲染的时候,是把球谐建模得到的光照一一作用在每个像素上,得到 lighting effect
  4. \(A=[C,L,S,T]\) 就是一个3D属性,包括了3D物体\(O(S,T)\)和特定的相机视角C和光线L。
  5. \(X=[I,M]\)是2D属性。这里I是image,RGB图像;M是mask,轮廓掩膜。
  6. R就是可微分渲染器 Differentiable rederer 了,本质上就是一个不需要训练的可微分的操作。它可以把3D属性映射成3D属性。

c. 2D到3D - 3D 重建模的公式

3D重建就很好理解了,是反过来训练一个encoder E,本质上是R的反函数,实现\(A=[C,L,S,T]=E(X)\)

这篇论文里,整体encoder E也分成了四个子encoder,\(E_c\) for camera, \(E_l\) for light, \(E_s\) for shape, \(E_t\) for texture。

  1. 其中\(E_c\) 是一个4维向量,包括\([a_x,a_y,e,d]\)。e是elevation,仰角;d是distance,距离。这里\(a_x,a_y\)可以换算成azimuth:\(a=atan2(a_x,a_y)\)。为什么用这个呢,是为了避免原本的a的定义域造成的不连续回归的问题。
  2. \(E_s\)也做了一点变换,实际上是真实形状相对于一个球体mesh的偏移量\(\Delta s\)
  3. \(E_t\),先预测了一个 2D flow map,然后通过空间变换(spatial transformation)生成UV map。
  4. \(E_l\),没什么变化,直接是 Spherical Harmonics 模型表示的l维向量

d. SMR模型细节

精髓都在这个图上了
精髓都在这个图上了
  1. 3D 监督:图3(a)里的情况:如果 3D 属性已经有了,那啥也不用管,直接让模型学它。对应下面这个公式,即如果图片i的3D ground truth \(A_i^{gt}\) 是已有的,就直接通过回归来训练模型E的参数\(\theta\),让\(E_\theta(X_i)\) ,即模型预测的属性值\(A_i\),拟合真值 \(A_i^{gt}\)
image-20211026140522984
image-20211026140522984
  1. 2D监督生成3D属性:图3(b)里对应这个情况。首先模型\(E_\theta\)可以根据2D属性\(X_i\)生成一个3D属性\(A_i\),即\(A_i=E_\theta(X_i)\),然后用可微分渲染R,再把这个生成的\(A_i\)给映射回2D……即得到\(R(E_\theta(X_i))\)。然后就可以让这个\(R(E_\theta(X_i))\)去拟合原2D图像\(X_i\)了。这里的loss用的是 image distance 和silhouette distance loss 的加权和,文章说这是比较常用的loss。
image-20211026141659535
image-20211026141659535
  • Image Distance loss:用L1距离(曼哈顿距离)来衡量。公式如下,圈圈点表示的是逐元素乘法。
image-20211026143006851
image-20211026143006851
  • Silhouette Distance loss:即两张图片的mask的交并比IoU。
image-20211026143821564
image-20211026143821564

仅仅用上述的方式来实现2D监督的3D建模,效果是远远不够的。所以本文的核心其实在后面提出的两个一致性上,它们利用了特定类别的3D mesh模型的特性,提升了3D监督的效果。

3. 第一个是插补一致性(Interpolated Consistency)。

  1. 首先提出 Cycle Consistency,如图3(c)。首先,\(A_i=E_\theta(X_i)\),是模型生成的3D属性。然后,通过可微分渲染R,就又可以把\(A_i\)渲染到2D图像层面,得到\(R(A_i)\)了。然后再套娃🪆一次,对\(R(A_i)\)再通过模型Encode变成3D的\(E_\theta(R(A_i)))\),就可以把\(A_i\)作为这个\(E_\theta(R(A_i)))\)的3D标注,进行自监督回归了😳!说起来好绕,看公式好像容易理解一点: \(\theta = arg\ min_\theta \frac{1}{N}\sum^N_{i=1}||E_\theta(R(E_\theta(X_i)))-E_\theta(X_i)||_1\)。这个公式是和前面的公式4(我写在d. 2 2D监督生成3D属性里的)一起optimize的。
  2. 现在的问题是:模型生成的3D属性数量不太够,可能会导致重建模过拟合或者退化。
  3. 所以提出了 Interpolation Consistency,通过线性插值,获得大量新的3D标注,相当于扩充了数据集。如图3(d)。\(A_i\)\(A_j\)是模型分别基于两张图像生成的两个3D物体属性集,回顾前文知道一个3D物体属性集包括相机、光线、形状和材质,即\(A=[C,L,S,T]\)。这里就首先随机生成一个4维向量\(\alpha=[\alpha_c,\alpha_l,\alpha_s,\alpha_t]\),其中每个维度的值都是0-1之间的随机数。然后新生成的3D物体属性集就是\(A_{ij}^\alpha = (1-\alpha)\cdot A_i+\alpha \cdot A_j\)。下图表示了插值生成的3D标注的效果:image-20211026172529831
  4. 新生成的这些\(A_{ij}^\alpha\)都可以拿来像\(A_i\)一样用了,即通过可微分渲染得到对应的2D属性:\(X_{ij}^\alpha = R(A_{ij}^\alpha)\),然后又可以用模型E来预测出3D属性\(E_\theta (X_{ij}^\alpha)\)了。
  5. 于是,利用这些线性插值生成的新标注,通过自回归来训练模型E的 IC loss诞生了:image-20211026173601185

4. 第二个是 Landmark 一致性

其实我觉得前面这些步骤弄完之后,生成的图片效果已经非常不错了,哈哈哈哈。但是作者还是觉得不够,在图片细节上还可以更精细。所以又提出了一个Landmark Consistency,仍然是一个自监督的方法。

从图2截的Landmark Consistency这部分
从图2截的Landmark Consistency这部分
  1. LC背后的原理是:如果把3D Mesh模型的每一个顶点看作一个landmark,那同一类物体的3D mesh模型,其每一个landmark的语义含义应该是一致的。(比如说一个3D模型的第k个landmark表示一只鸟的左眼中心,那另一只鸟的3D模型应该也是一样。)然后把什么作为语义含义呢?就是把每个landmark投影到2D图像上,简单通过一个神经网络提取出其对应的像素特征。
  2. 对每一个输入的图像,都通过一个U-Net \(E_f\),来提取出像素级别的特征图F。
  3. 然后,把3D mesh模型的每一个点投影到2D图像上,作为一个landmark。
  4. 计算出landmark的位置\(l_k\),通过空间转换(spatial transformation),从特征图F中得到这个位置\(l_k\)的特征:\(f_k=F(l_k)\)
  5. 用一个多层感知器(MLP)\(D_\Phi\)\(\Phi\)是权重)来预测每个landmark的索引分类 \(D_\Phi (f_k)\)
  6. \(D_\Phi (f_k)\)需要拟合的恰好就是k,这样就是一个自监督landmark分类过程了
  7. 表示这个过程的 LC loss 公式如下。V是mesh模型中顶点的数量。\(v_k\)表示这个点是否可见,\(y_k\)是一个one-hot向量,选择第k个值。 image-20211026180514413

最后,整个模型的loss就是上述所有loss的加权和: \[ L=\lambda_{2D}L_{2D}+\lambda_{IC}L_{IC}+\lambda_{LC}L_{LC} \] 其中, \[ L_{2D}=\lambda_{img}L_{img}+\lambda_{sil}L_{sil} \]

e. 实验

  1. 进行比较使用的单视角3D重建模数据集:ShapeNet BFM CUB-200-2011
  2. 也在一些特定类别的wild数据上测试了效果
  3. 正好利用线性插值 + 可微分渲染,SMR还可以做一些图像合成的事,比如改变光线、相机视角、物体形状和质地等等😯

理解有误的地方敬请批评!!