相信很多人都用过Prisma这个app,可以将普通照片转换为想要的风格。其背后的原理,就是通过神经网络学习某个图像的风格,然后再将这种风格应用到其他图像上。
最近看了相关论文,A Neural Algorithm of Artistic Style还有Perceptual Losses for Real-Time Style Transfer and Super-Resolution,又参考了一些github上的相关项目,自己用tensorflow也实现了一个类似的网络。
网络结构
网络结构几乎完全按照论文中的描述实现,不同的是将论文中的Batch Norm全部换成了Instance Norm,原因是这样做以后,生成的图像效果更好。同时,deconvolution(transposed convolution)也全部换成了resize-convolution,理由就和我的上一篇文章中说的一样,可以防止棋盘格纹理的产生。再者,通常的zero padding被reflect padding取代,为了减少边界效应。另外,在我参考的github实现当中,我发现其residual block中没有BN或IN,这一点是和论文不同的,我自己加上以后,发现对最后结果影响不大,但是学习率和loss function等需要仔细调整,否则训练容易发散。
Loss Functions
要实现快速的风格转换,关键是使用Perceptual Losses。一个训练好的CNN,每一层特征抽象程度是不同的,层数越深,其学得的特征就越抽象,对图像的表达就越高层。Perceptual Loss就利用了CNN的这个特点。将一副普通照片输入我们的网络生成一副图像,再将该图像输入一个预训练的网络中(称为损失网络,loss net),我们希望生成的图像在loss net高层的特征尽可能和原始照片一致(保留原始照片的内容和结构),而较低层的特征尽可能和风格图像一致(保留风格图像的色彩和纹理)。这样,通过不断的训练,我们的网络能同时兼顾以上两个要求,从而实现了照片风格的转换。
论文中的Perceptual Losses主要由3部分组成,第一部分被称为feature loss或content loss,它度量了生成的图像与原始照片在类容结构上的一致性。
其中