Reading Learning Locally Editable Virtual Humans

论文地址:https://files.ait.ethz.ch/projects/custom-humans/paper.pdf

作者:Hsuan-I Ho, Lixin Xue, Jie Song, Otmar Hilliges。ETH

发表: CVPR23

链接: https://custom-humans.github.io/


Why:

  1. 3D数字人现在很热门
  2. 传统方法中,重建好一个3D数字人之后,不知道怎么编辑和定制它
  3. 所以想搞一个方法,既能创建3D数字人,又能在创建完成后对它进行定制化

What:

  1. 这个方法允许在不同的3D人之间部分地迁移几何和外貌细节,还能在改变人的姿势的时候保留一致的局部细节
  2. 具体一点说,是把NeRF和LBS-articulated(铰接)的mesh模型的优点结合起来:NeRF很灵活,有很强的建模能力;mesh模型可以变形,并且可以被完全显式地控制
  3. 再具体一点,是提出了一个混合的3D人体representation,允许跨不同主体进行局部编辑;然后提出了一整套的生成这种3D数字人的流程,既能拟合没见过的3D扫描人数据,也能随机采样生成新的个体;另外还提出一个大尺度高质量3D扫描人体数据集

How:

  1. 混合的3D人体representation:

    1. 有一个可学习的特征codebook,包含\(M\times 2F\)个特征,其中\(F\)个是几何特征,另外\(F\)个是外貌特征。给定一个human mesh,mesh有M个顶点(M很大,一万多),每个顶点跟codebook中的特征显式地一一对应。

    2. 当NeRF渲染时,给定空间中一个query点,提取局部的特征:

      image-20231212173121173
      image-20231212173121173
      1. 找出mesh顶点中离它最近的3个顶点,对这3个顶点对应的特征用barycentric interpolation(重心插值法?)得到插值后的特征
      2. 还需要把全局坐标转换成局部坐标,这么做是为了让局部与全局解耦,方便在后续更改人体pose的时候不影响局部的细节。转换方式:还是根据mesh顶点中离它最近的3个顶点组成的三角形,直接用\((u,v)\)表示query点投影到三角形平面上的点在三角形中的位置,然后再加上一个\(d\)表示query点距离三角形平面的距离,以及一个\(\textbf n\)表示距离的方向
      3. decoder,或者说renderer,不是单独一个NeRF,而是分成了两个独立的,一个是SDF field,一个是rgb field。论文里说这样能方便用3D loss显式地监督这两个网络。后面的实验证明如果不解耦这两个网络的话,效果会差很多
      4. 那么最后给到这两个neural fields的输入,就是\(\textbf f_s/\textbf f_c,(u,v,d),\textbf n\),分别是几何特征或者颜色特征、局部坐标、方向
  2. 采样个体样本时,有两种方式:

    1. 直接采样已有的个体样本。训练的时候,针对每个个体样本,都是单独学习一个codebook。假如有N个ground truth人体,那codebook实际上是有\(N\times M\times 2F\)这么多维度。想要采样其中一个个体,直接从N个样本中取一个entry就好了
    2. 生成全新的样本?用PCA。具体说,是创建一个新的D维的codebook(\(D\times 2MF\)),这D个维度是对N个人体样本拟合出的PCA系数。生成随机新人体样本的时候,只要简单随机生成D个PCA参数,然后乘以利用这个新codebook算好的特征向量就好了
  3. 训练过程

    1. 给定一个扫描的3D人体(高质量、很细节的mesh),用其他现有工具把一个SMPL mesh和它对齐,得到相应的pose和shape参数。
    2. 用M个扫描的3D人体,分别训练特征codebook的M个entries。
    3. 三方面的loss:
      1. 3D loss,包括rgb loss和sdf loss;
      2. 2D adversarial loss,这里是用前面提到的PCA采样方法,得到随机生成的人体,渲染成2D图像;然后用相同的相机视角用任意gt 3D人体扫描得到2D图像,然后用StyleGAN辨别这两张真假图像。这里的用意是,不需要严格相同的gt监督,就可以对PCA得到的生成样本进行监督,这样的监督又能传播到全部训练样本上,应该是能很好地提升模型的泛化性能。实验结果看这个loss还挺重要的。
      3. 简单的对特征的正则项,让特征符合高斯分布
  4. 一些编辑方式

    image-20231212175622543
    image-20231212175622543
    1. 初始化:采样一个3D数字人样本。也就是前面提到的两种采样方式,可以采样已有的,也可以采样全新生成的

    2. optimize特征,拟合一个3D扫描人体。用到的是3D loss

    3. 跨个体的特征编辑:简单粗暴,先用Blender选择人体局部对应的顶点,然后把想要的样本的codebook中的那部分特征交换到目标的codebook来

    4. 绘制材质:拿到渲染后的2D图像后,可以直接对2D图像进行一些绘制,然后再用它监督训练codebook。后面的实验结果看上去效果还不错,但limitation说不能很好地拟合过于高精度的细节

      image-20231212180508779
      image-20231212180508779
    5. 更换人体姿势:这个representation本身是由一个SMPL mesh加一个codebook组成的;只要对SMPL mesh的参数进行修改,就能直接改变姿势了

  5. 实验

    1. 用了自己提出的CustomHumans以及THuman2.0数据集来训练模型;用SIZER数据集来测试对没见过的人体扫描的拟合性能
    2. 用chamfer distance、normal consistency、f-score来衡量拟合性能;结果挺好
    3. 展示了编辑性能,看起来挺好
    4. ablation study:值得深究image-20231212175727556