【paper reading】SfSNet: Learning Shape, Reflectance and Illuminance of Faces in the Wild
这篇文章是CVPR’ 18上的一篇工作。SfS(Shape from Shading)是通过分析单张图像中的明暗信息来判断物体表面的法线方向,从而恢复表面形状的方法。
1.简介
这个工作的目的就是输入一张在真实世界中拍摄的环境不受限的128*128大小的RGB人脸图像,在朗伯假设下,将图像分解为形状,反射和光照三方面的信息。形状信息就是法向图,反射信息由于已经采用朗伯假设,反射信息表示为反照率(Albedo),简单的理解就像3D游戏建模里的纹理贴图。光照信息表示成一个三通道,每个通道9参数的矩阵,总共27个光照参数。
2.背景知识
光照信息理想状态下需要收集整个场景中四面八方,各个方向上射过来的光线的强度,如果在实验中测量的话就是拿一个全反射的光滑金属球在正面和反面拍摄两张照片,拼合成整个球面的信息。
但是显然我们使用SfS方法肯定不可能得到这么精细的信息,只能得到一些低频的信息。因此就借鉴图形渲染领域的方法,对周围环境光的简化,将光照表示为球谐函数的几个系数。
光照是在球面坐标系中表示的,而球面调谐函数是球面坐标系中的一组正交基底函数,类似于小波分解,所有函数都能表示成这组函数的组合。用到的阶数越高,越能表示高频的信息。只用第0阶就只能表示全局光照,加上第1阶的函数就能表示点光源,可以这么理解,当用到所有阶的函数时,就是刚刚看到的理想的光照了。实际中一般用到第2阶就行了,总共是 1 + 3 + 5 = 9 1+3+5=9 1+3+5=9个函数,有9个系数,RGB三个通道分别表示就是 3 ∗ 9 = 27 3*9=27 3∗9=27个光照系数了。更多关于球谐光照的信息可以参考简单理解spherical harmonic lighting(球谐光照).
左边是真实的光照表示,只不过是用包围盒,不是用包围球表示的,展开成十字形,右边就是二阶球面谐波函数对光照的近似。
3.训练数据
SfSNet通过输入一张人脸图像,从中恢复形状,反射和光照这三方面的信息。这就涉及到了使用的数据的问题。基于学习的SfS或者内在图像分解方法的一个主要障碍就是可用的Ground-Truth训练数据十分有限,就算收集大量的人脸是没问题的,但是还需要和它相匹配的三维模型,不仅如此,更需要记录每张脸的反照率和每次拍摄时的光照参数,这个就比较困难了。
因此作者使用了虚拟数据,即3D建模捏出来了各种脸,记录了它们的Ground-Truth normal, albedo 和 lighting,生成了25万张人脸图像。同时也用到了真实的人脸图像CelebA dataset,也是20多万张真实的人脸图像,但CelebA中只有RGB图像,没有GT的形状,反射,和光照信息。通过对这种混合数据的训练,网络可以从合成数据中学习面部几何,反射和光照的低频变化。但是合成数据比较简单,顶多就是酒窝,而皱纹、胡子、雀斑这些现实中常见而有挑战性的因素都没有,因此就通过重建损失使用阴影线索了解真实数据中的高频细节。
这就会引起一些问题。这些数据的结构不同,合成数据是有GT的,真实数据没有,如何一起来用?对于loss来讲,合成数据有GT,loss就是预测出的这三部分信息与GT的差异。而真实数据的loss,最直观的做法就是利用网络恢复出的这三部分信息重新重建原始的图像,比较重建图像与原始图像的差异,越小越好。但是我们输入只有一张图像,而要从中分解出三方面的信息,形状,光照,反照率。这个问题的解肯定不是唯一的。例如对任何图象,我们都可以认为它的形状就是一个平面,反照率就是图像本身,光照是一个全局关照,那最后的重建图像就能确保和原始图像一模一样,但是肯定这不是我们想要的。
而对于这种图像分解问题,输入是图像,输出也是图像,一种最直观的方法就是使用编码-解码器网络来进行处理,然后加上跳跃连接保护高频信息不丢失,作者确实在第一步也是这样做的。作者最后的做法是
- 在有标签的合成数据上训练一个简单的基于跳跃连接的编码—解码网络。
- 将此网络应用于真实数据,以获得法向,反照率和照明估计。 这些元素将在下一阶段用作“伪监督”。
- 用带有GT标签的合成数据和带有“伪监督”标签的真实数据训练SfSNet。 损失除了法向,反照率和光照的监督损失,还有重建损失,其旨在最小化原始图像和重建图像之间的误差。
重建损失在使用颜色线索从真实数据中学习起着关键作用,而“伪监督”标签则防止了产生分解的解决方案时由于解不唯一性而失败。类似于许多SfS方法中,使用参考模型来补偿低频变化,然后利用阴影线索来获得高频细节。
4.SfSNet
首先输入一张图像,通过卷积神经网络提取出图像的feature map。这里作者引入了两个残差块Normal Residual Blocks和Albedo Residual Blocks,这两个残差块的作用就是从图像的feature map中学习分解出法向和反照率两方面的信息。经过残差块后,通过法向、反照率以及图像特征来回归光照参数。这个SH light就是最终的球谐光照。然后法向特征与反照率特征分别经过卷积后生成最终的Normal和Albedo。这里Normal和光照经过渲染后生成Shading图像,这个图像就是生成的三维形状的白模在光照下的情况,Shading本来是灰色图像的,但因为分解出的光照偏蓝色,所以这个Shading图像也就有了颜色。最终通过形状,光照,反照率生成重建的图像。
整体的Loss是:
L
o
s
s
=
λ
r
e
c
o
n
E
r
e
c
o
n
+
λ
N
E
N
+
λ
A
E
A
+
λ
L
E
L
Loss = \lambda_{recon}E_{recon}+\lambda_{N}E_{N}+\lambda_{A}E_{A}+\lambda_{L}E_{L}
Loss=λreconErecon+λNEN+λAEA+λLEL
E
r
e
c
o
n
E_{recon}
Erecon是重建图像与原图像之间的差异,
E
N
E_{N}
EN是预测法向与GT或者“伪监督”法向的差异,
E
A
E_{A}
EA是预测反照率与GT或者“伪监督”反照率的差异,
E
L
E_{L}
EL是预测光照与GT或者“伪监督”光照的差异。
λ
r
e
c
o
n
=
λ
N
=
λ
A
=
0.5
\lambda_{recon}=\lambda_{N}=\lambda_{A}=0.5
λrecon=λN=λA=0.5,
λ
L
=
0.1
\lambda_{L}=0.1
λL=0.1。
这个网络的主要特点在于没有使用带有跳跃连接的编码-解码器网络结构,而是使用残差块结构。作者的解释是在编码-解码器结构中,大多数高频信息通过跳跃连接从编码器传递到解码器,因此网络不需要推断皱纹和胡须等高频变化是来自法向还是反照率。 同样在这些网络中,仅从图像特征直接估计光照,并且仅通过重建损失连接到法线和反照率。 然而,由于可以通过求解过度约束的方程组从图像,法线和反照率来估计光照,因此从图像,法线和反照率特征预测光照更有意义。
5.实验结果
后面是作者将SfSNet与其他方法进行实验的对比,这个是光照迁移实验的结果。它的意思是计算出最左侧源图像的光照,然后用源图像的光照去替换目标图像的光照,替换的结果是中间的第三列。这个实验的目的主要是为了验证光照计算的正确性,原图像是由白色光照亮的,而目标图像是由橙色光照亮的。SfSNet能够将这两种光照基本正确的分解出来,生成的替换结果不会偏黄,而另外Neural Face方法对于光照没有很好的计算,无法摆脱目标图像的橙色光照。
这是在另一个比较小的真实数据集Photoface database上比较的结果。这个数据集找了261个人,在不同的表情,光照下拍摄了有7000多张人脸图片,数据集比较小,但是它在实验环境下拍摄的,有GT的法向,反照率和光照数据,因此便于定量比较。上面的三个网络都没有在这个数据集上训练过,下面四个网络是在这个数据集上训练过的。SfSNet-ft就是上面的SfSNet finetune后的结果。第一列是法线的平均角度误差,后面几列是各种角度误差阈值下像素的百分比。在finetune之前变化不算是太明显,但在finetune后角度误差和其他方法相比基本上减少了一半。
这是在之前说的CelebA dataset上的实验结果,与MoFA方法的比较。生成的结果和MoFA方法相比更加精细。尤其可以注意的是这些人的酒窝这里,虽然理想情况下这一块的阴影是由于表面遮挡引起的,只在Shading上出现,Albedo上其实应该是没有酒窝的,但是总体而言,能做到这个效果已经不错了。
这是另外的一些结果,上边四行是效果比较好的情况,下边四行是效果比较差的情况。可以看到最容易处理的表面光滑或没有表情,并且光照主要是全局光照。 重建很差的图像基本上都是具有大量的投射阴影,镜面反射和遮挡。
另外值得一说的情况就是对于皱纹的处理,尤其是在这一张图上特别明显,之前说过了在酒窝上的处理还不错,但是对于眼角皱纹或者抬头纹这些皱纹就基本上没有处理,直接平滑了,与其他方法相比差很多。作者说原因可能是他的这个SfSNet是在 128 × 128 128\times128 128×128大小的图像上进行训练的,另外的Pix2Vertex是在 512 × 512 512\times512 512×512大小图像上训练的,因此他们能捕获更多的细节。
最后是作者对自己训练方法以及网络结构的优越性进行对比,验证训练方法的有效性。
SkipNet-syn网络结构就是之前说的带有跳跃连接的编码-解码器网络结构,syn指代在合成数据上进行训练。SfSNet-syn就是之前的SfSNet,只不过只在合成数据上进行训练。SfSNet是使用之前提到的训练方法得到的网络,即合成数据用GT训练,真实数据用‘伪监督’信息训练。
为了评估估计照明的质量,在MultiPIE数据集上进行测试,这个数据集是250个人在19种不同的照明条件下拍摄得到的。前两列很好理解,就是重建误差。后面三列是对图像进行分类,看网络能否将图像分到正确的照明条件下。结果表明,作者的这种训练方法有显着改善,表明成功使用了阴影在重建中添加细节的信息。
最后是在网络结构上进行的对比。SkipNet+和上面的SkipNet大体相似,一个解码器,两个编码器分别预测法向和反照率,另外有一个全连接层预测光照,编码-解码器间有跳跃连接相连,但是中间就没有之间的全连接层了。将这两个网络都用混合数据进行训练。最后结果虽然重建的误差基本一样,但是SfSNet预测的光照比“SkipNet +”更好。
这种改进的性能可归因于SfSNet学习反照率和法线的信息潜在子空间这一事实,其进一步与图像特征一起用于估计照明。 而在基于跳过连接的网络的情况下,潜在空间不提供信息,因为高频信息直接从绕过潜在空间的输入传播到输出。 因此,仅从图像编码器的潜在空间估计的照明参数不能捕获照明变化。