最近在研究把人脸扭正并替换掉图片中的一些元素相关的问题。生成图片就绕不开GAN,生成人脸就绕不开StyleGAN。开始关于StyleGAN的文章我读得并不是太懂,只知道它能随机生成人脸,于是找了在StyleGAN以前的对于我来说结构简单易懂的DR-GAN来研究。DR-GAN所做的事是可以生成任意角度的人脸,和我的目标还是很相符的,但是经过我的研究与复现,它的整个网络的能力我认为是有限的,生成的图片并不能使人满意。多读了几篇文献,感觉渐渐对图片生成有点模糊的认识了,就又回来重新读StyleGAN的论文了,然后就发现了StyleGAN-Encoder的存在,并且才意识到英伟达本身在StyleGAN2里就提出了一个Projector(为什么当初不好好地读完论文),瞬间觉得之前做的努力大约的确是白费了。StyleGAN生成人脸可以不随机,理论上我觉得StyleGAN-Encoder调调优,应该就能很大程度上解决我现在的问题了,希望能从中找到一些改进空间,让我挤出一篇论文来,别让我的时间再次白费。
本质上生成对抗网络中的Generator + Encoder这种组合就像是图像压缩和解压缩的过程,它考验的是你的编码能力是否足够优秀。一开始我觉得如果把一个网络看作是信道的话,那它总有一个传输信息的极限,这个问题让我想到了之前在b站上看过的一个讲极化码的视频,我又特地回去重看了一遍,然而得到的帮助也不大,因为极化码解决的是有噪声干扰下的信道容量极限的问题,而在神经网络中,信号可以看作是无损传输的(这也让我想到如果是一台模拟计算机而非数字计算机,也许极化码会是抗干扰的关键),那问题就变成了纯粹的编码问题,输入一张图片,压缩,解压缩,输出一张图片。最“无损”的方式自然是像素的一一对应,可以把整张图片的所有像素值理解为一个特征,这个特征保留了图片完整的信息。其次就是当今各种格式的图像编码了(jpg、png之类的),这些编码的具体实现我并不了解,但我认为大体上都是在用尽可能短的编码保留尽可能多的信息,具体上就是两张看起来差不多的图片,一个是MB级的,而另一个可能是KB级的。
上述的这类编码考虑的应该还是像素空间上的问题,比如一个色块中的所有像素的颜色都差不多,那整个色块也许只需要用一个像素值来表示,这样就压缩了编码长度。而神经网络,从这个角度看,能做到的编码长度应该是小的多的,例如StyleGAN的编码,也就相当于是潜在向量$\omega$的大小,是$18 \times 512$,但由它却能生成$1024 \times 1024$大小的图片。这无疑是非常强的压缩比,想要在这种压缩比下保证图像的准确度,就是比较难的问题了。
StyleGAN + Encoder之所以能实现这样强的压缩比,是因为它在试着从特征空间中去重构图片,我觉得可以看作是在试着理解图片。从生成网络的层级结构可以看出,StyleGAN生成图片的过程不是逐个像素的,而是由粗到细的。它首先限定生成的图像是人脸,这样一上来就节省了大量的编码长度,因为人脸是存在模式的,这就相当于给生成器预设了很多信息,在编码时就能省略很多信息。层级由浅至深,先是控制图像的框架,再到调整图像的细节。大的框架首先让图像看起来像目标人脸,小的细节诸如毛孔,发丝等,会增加图像的真实度(我现在不确定这些细节是包含在特征里的还是由噪声生成的,不过无所谓),小的细节人眼只需看到它们的存在,但具体是几个毛孔,几根发丝,是没有人在意的。
但StyleGAN真的和传统的图像编码方式完全是两种思路吗?我觉得也不见得,因为在StyleGAN-Encoder的论文中有这样神奇的案例,那就是通过不断迭代优化$\omega*$,在由人脸训练集训练出来的Generator上,成功生成了狗脸,猫脸,乃至汽车,油画,这些东西和最初的训练集,不能说是没有关系,只能说是毫不相干。这也就是说,StyleGAN的Generator还是学到了一些,在我的理解上,是色块方面的东西。在潜在特征中,存在着一些东西,控制着生成对象的位置,颜色和形状。换个解释方式,随便一张图片,它所包含的信息都可以分成不同的对象,某一个对象的生成,都可以看作是先确定大体框架,然后再逐步完善细节的过程。