可以随意转载!Update 2022.03.28

此论文因为pytorch的版本问题,代码无法复现

前言

本论文来自香港中文大学的潘新钢等。论文的标题是《DO 2D GANS KNOW 3D SHAPE? UNSUPERVISED 3D SHAPE RECONSTRUCTION FROM 2D IMAGE GANS》

原作者视频 (需要注册登录)

摘要

众所周知,图片是3D物体在2D平面上的投影。尽管GAN在生成高质量图片上很牛,它是否能像人一样捕获(认知)图片中的3D形状呢?这个问题目前尚不清楚。本文尝试从简单的GAN中挖掘3D几何线索。通过我们的研究发现预训练的GAN确实包含丰富的3D形状,因此可以无监督的从2D图像中恢复3D形状。本算法核心是迭代探索GAN图片中不同视角和光照的变化。算法不依赖2D关键点或3D标注作为输入,也不假设物体对称性。它可以成功恢复人脸、汽车、建筑物等的高精度3D形状。生成的形状还可以继续进行编辑,如:重新照明和旋转。我们还定量地证明了算法在3D形状重建和人脸旋转方面的有效性。代码地址:https://github.com/XingangPan/GAN2Shape

一、简介

GAN可以高保真的为2D图像建模。回想一下,图片其实是3D形状在2D平面上的投影。理想的2D GAN应该反映3D的几何属性。比如GAN生成结果可以旋转(如人脸),是因为GAN能建模视角方向。这一发现让我们思考:是否用能用GAN从单张图片重建3D形状。前人有一些尝试,但它们都依赖训练中的3D建模和渲染(比如3D体函数、3D模型)。因为渲染过程中需要消耗大量内存等问题,生成的3D形状质量明显弱于GAN的2D效果。无监督3D学习的另外一个方向,用的所谓“合成分析”推断视角和形状。尽管这些方法都不错,但是他们都假定了物体是基本对称的,因此很难推广到像建筑这样的图片重建上。

我们相信2D GAN已经包含了足够的信息让我们重建3D形状。常识中3D物体的形状可以通过视角和光照来观测,我们的想法是从2D GAN捕捉的变化中创造出这些变量。手工标注视角和光照数据是不现实的,无监督的方式控制视角和光照是本文的主要挑战点。

我们从经验中发现,采用椭球型作为初始值,生成伪样本,并采用不同的视角和光照来生成一系列伪样本。然后用GAN算法重建这些伪样本,生成投影样本。它们作为GT数据来优化渲染作为初始值椭球型(可微分)。反复迭代从椭球型生成的3D形状以生成3D细节,如下图:

从初始椭球反复迭代出3D面部细节

用我们提出的GAN2Shape,现有的预训练的GAN算法就可以重建出3D形状,例如人脸、汽车、建筑。我们算法的有点是无需2D形状关键点标记和3D标签数据。改进后的GAN逆映射策略,我们的算法不仅仅适用于GAN样本,而且适用于普通的图(比如互联网下载的图)。在BFM 基准中我们的算法胜出了,在人脸旋转精细度方面我们的算法也胜出了。

我们的贡献:

  1. 我们首次用GAN预训练模型来生成3D形状,并证明是可行的
  2. 算法不依赖于对形状对称性的假设
  3. 算法没用到任何外部的3D模型作为辅助

二、相关工作

三、方法

GAN初探

3.1 从2D GAN到三维形状

为了在GAN变换中挖掘视角和光照反映的线索,我们需要明确地建模这些因子。在这里,我们遵循论文(Wu, 2020)的照片几何自动编码设计。照片 I∈ R3×H×W,我们采用了一个函数,该函数被设计用于预测四个因素(d,a,v,l),包括深度映射 d∈ RH×W,反照率图像 a∈ R3×H×W,视角 v∈ R6和光照方向 l∈ S2。因此,该功能由四个相应的子网络(D、A、V、L)实现,如下图中(a)Step1所示

这四个因子通过渲染过程Φ被重新组合成原始图像I,渲染过程Φ包括以下照明∧和重投影∏步骤:

此处∧使用反照率a、深度映射d和光照方向l进行着色,而∏执行视角变化并生成从视角v观看的图像。视角变化通过可微渲染器实现(Kato,2018)。我们在附录中提供了更多细节。

第一步:使用弱先验3D形状(椭球形)

我们的目标是探索图像中同一物体在新的视角和光照下的图像,因此我们希望寻找视点和照明变化的hint以指导探索。为了实现这一点,我们观察到许多物体,包括人脸和汽车,它们都是凸形状。因此我们使用椭球形作为弱样本。

具体来说,如上图(a)Step1所示,给定来自GAN的图像样本I,我们初始化椭球形状深度映射 d。使用现成的场景解析模型(Zhao et al.,2017),我们把椭球形大致对齐图像样本I中的物体。然后利用重建目标L(I,ˆI)优化反照率网络A,其中ˆI通过等式(1)计算,L是L1损失和感知损失的加权组合(Johnson等人,2016)。视角v和光照l使用规范设置进行初始化,即v0=0,光照从前面开始。这允许我们对四个因子d0、a0、v0、l0进行初步猜测,其中d0是之前的弱形状。

第二步:采样并映射到GAN图像

使用上一步生成形状初始化,我们可以通过对多个随机视角{vi | i=1,2,…,m}和光照方向{li | i=1,2,…,m}进行采样来创建“伪样本”。具体来说,我们使用{vi}和{li}以及d0和a0通过等式(1)呈现伪样本{Ii}。{vi}和{li}是从一些先验分布中随机抽样的,比如多变量正态分布。如上图(b)Step2所示,尽管这些伪样本具有非自然的扭曲和阴影,但它们提供了面部如何旋转以及光线如何变化的线索。

为了利用这些线索在GAN变换中引导新视角和光照方向探索,我们对这些伪样本执行GAN逆映射,即:使用GAN生成器G重建它们(参考资料)。具体而言,我们训练一个编码器e,该编码器学习预测每个样本的中间潜势向量wi。与之前直接预测潜在向量的工作不同,在我们的设置中,原始样本I的潜在向量w是已知的,因此编码器E只需要预测偏移量∆wi=E(Ii),对伪样本Ii和原始样本I之间的差异进行编码,这要容易得多。因此优化目标是:

其中m是样本数,θE是编码器E的参数,λ1是正则化系数,L′是图像的距离度量(Pan,2020年),我们采用了鉴别器特征距离L1为L′的距离度量,这种做法已经被证明对GAN样本更有效。正则化||E(Ii)||2是为了防止潜在偏移量在训练期间增长过大。

如上图(b)Step2所示,为了更好的重建投影样本{Ii=G(E(Ii)+w}应具有与伪样本{Ii}相似的视点和照明变化。同时,生成器G可以正则化投影样本,使其位于自然图像变换中,从而修复伪样本中的非自然扭曲和阴影。在下一步中,我们将讨论如何利用这些投影样本来推断3D形状。

第三步:学习3D形状

上述投影样本{Ii}提供了多个视点和照明条件的图像,同时具有几乎相同的对象内容,例如面部识别。这样的“单实例多视图和照明”设置可以通过上述照片几何自动编码模型学习底层3D形状。如上图(c)Step3所示,视角网络V和光照网络L预测每个样本I的特定实例的视角Ṽi和光照l̃,将样本I输入深度网络D和反照率网络A输出共享ii深度ṽ和反照率ã。四个网络联合优化,重建目标如下:

其中θD,θA,θV,θL分别是网络D,A,V,L的参数,以及Lsmooth(D(I))是一个平滑度术语,定义方式参考(Zhou,2017)。请注意,我们还重建了原始样本I,即使用I作为额外的̃Ii,以防止推断的因素偏离原始样本。在这里,我们在第2步中不使用采样的{vi}和{li},因为投影样本的视点和照明方向可能无法精确匹配伪样本,因此我们学习使用V和L来预测它们。

只有在正确推断出底层深度、反照率以及所有样本的视角和光照方向时,上述重建损失才会减少。如上图(c)Step3所示,通过深度参数化的对象形状确实会向真实的底层形状移动,例如人脸的形状。在重建过程中,伪样本中存在的非自然扭曲和阴影得到了缓解。

迭代优化

虽然上述三个步骤生成的3D对象形状比之前的形状更精确,但它可能会遗漏一些细节,例如面部的皱纹。这是因为投影样本{Ii}可能无法准确保留I中原始实例的所有语义,因为伪样本是从近似的弱形状先验中获得的。幸运的是,我们可以多次重复这三个步骤的循环,将前一个循环中经过优化的3D形状和训练的网络视为新循环中的初始化形状和网络。这使我们能够逐步细化3D形状和投影样本。在我们的实验中,我们使用这三个步骤的四个循环,除非另有说明。

3.2 讨论

四、实验

4.1 无监督3D形状重建

4.2 3维图像处理

五、总结

六、代码实现

此论文因为pytorch的版本问题,代码无法复现。

6.1 安装pytorch 1.2

pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu112

6.2 安装neural_renderer_pytorch

这个模块是论文《Neural 3D Mesh Renderer》的pytorch实现。

pip install neural_renderer_pytorch

6.3 安装mmcv

它是一个基于pytorch的视觉学习library

pip install mmcv

6.4 安装其他依赖库

scikit-image matplotlib opencv pyyaml tensorboardX

6.5 下载预训练数据

https://github.com/XingangPan/GAN2Shape/releases/download/v1.0/data.tar.gz

https://github.com/XingangPan/GAN2Shape/releases/download/v1.0/x00

https://github.com/XingangPan/GAN2Shape/releases/download/v1.0/x01

https://github.com/XingangPan/GAN2Shape/releases/download/v1.0/x02

https://github.com/XingangPan/GAN2Shape/releases/download/v1.0/x03

6.6 合并与解压缩

执行scripts/download.sh 后面的部分,得到data和checkpoints两个数据目录

6.7 编译styleGAN

cd gan2shape/stylegan/stylegan2-pytorch/op
python setup.py install
cd ../../../..