风格迁移又称风格转换,直观的说就是给输入的图像假滤镜,但是又不同于传统滤镜。风格迁移基于人工智能,但是每个风格都是由真正的艺术家作品训练。只要给定原始图片,并且选择艺术家的风格图片,就能把原始图片转换成相应的艺术家风格的图片。
风格迁移的要求:
1:要求生成的图片在内容,细节上尽量与输入图片相似。
2:要求生成图片在分割上尽可能与风格图片相似。
因此我们定义两个损失函数 content loss 和 style loss 分别衡量着两个指标。
图像的内容和风格含义广泛,并且没有严格的数学定义,具有很大程度的主观性,因此很难表示。
content loss 使用逐像素计算差值,又称pixel-wise loss,追求生成的图片和原始的图片逐像素的差值尽可能的小。这种做法有很多不合理的地方,还有一种感知损失(perceptual loss).可以参考这个博客:https://blog.csdn.net/stdcoutzyx/article/details/54025243
在执行风格迁移时,我们并不要求生成图片的像素和原始图片中的每个像素都一样,我们最求的是生成图片和原图片具有相同的特征,因此我们使用中间层作为我们的目标,希望原图片和风格迁移后的目标图片尽可能相似。即将深层模型中的某些层的输出作为图像的知觉特征。
我们使用Gram矩阵来表示图像的风格特征。对于每一张图片C X H X W
C表示卷积核的通道数
H X W 卷积核通过学习后输出的H X W代表这张图片的feature map
格拉姆矩阵可以看做feature之间的偏心协方差矩阵(即没有减去均值的协方差矩阵),在feature map中,每个数字都来自于一个特定滤波器在特定位置的卷积,因此每个数字代表一个特征的强度,而Gram计算的实际上是两两特征之间的相关性,哪两个特征是同时出现的,哪两个是此消彼长的等等,同时,Gram的对角线元素,还体现了每个特征在图像中出现的量,因此,Gram有助于把握整个图像的大体风格。有了表示风格的Gram Matrix,要度量两个图像风格的差异,只需比较他们Gram Matrix的差异即可。总之, 格拉姆矩阵用于度量各个维度自己的特性以及各个维度之间的关系。内积之后得到的多尺度矩阵中,对角线元素提供了不同特征图各自的信息,其余元素提供了不同特征图之间的相关信息。这样一个矩阵,既能体现出有哪些特征,又能体现出不同特征间的紧密程度[2]。
该论坛最后还说明
Activation maps就是在feature maps后加一个激活函数
参考【3】
其中上图第一个公式中的 F(i,j)表示第 i 个 feature map的第k 个像素点
关于Gram矩阵还有以下三点值得注意:
1 Gram矩阵的计算采用了累加的形式,抛弃了空间信息。一张图片的像素随机打乱之后计算得到的Gram Matrix和原图的Gram Matrix一样。所以认为Gram Matrix所以认为Gram Matrix抛弃了元素之间的空间信息。
2 Gram Matrix的结果与feature maps F 的尺寸无关,只与通道个数有关,无论H,W的大小如何,最后Gram Matrix的形状都是CXC
3 对于一个C X H X W的feature maps,可以通过调整形状和矩阵乘法运算快速计算它的Gram Matrix。即先将F调整到 C X (HW)的二维矩阵,然后再计算F 和F的转置。结果就为Gram Matrix
Gram Matrix的特点:
注重风格纹理,忽略空间信息
参考博客及书籍:
1 深度学习框架pytorch入门及实践 陈云
2 https://www.zhihu.com/question/36514939/answer/67810216
3 https://www.zhihu.com/question/49805962?from=profile_question_card