版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a19990412/article/details/83990236
算法论述
- 风格迁移,就是将两幅画给融合在一起。
如果说是把两幅画融合在一起呢?
现在假设三幅画:
- 一幅画表示的是风格画,设为A
- 一幅画表示的是内容画,设为B
- 一幅画表示的是输出画,设为C
我们要做的其实很简单。
两件事:
- 让C和A的内容很相近。
- 让C和B的风格很相近。
所以说,只需要给出内容差异度和风格差异度两个度量值之后,我们再降低这两个值就好了。
现在难点来了。如何度量呢?
关于内容的差异度:
- 两幅画的每个像素点的数值距离。 (常见的有绝对值,差的平方)
关于风格的差异度:
(这是一个难点,有个大神提出了使用Gram矩阵来解决这个问题。[^1])
- 一张图片在经过卷积网络之后,就可以得到一个特征图,Gram就是在这个图上定义出来的。[^1]
Gram定义:
图片的shape一般是:[C, M, N]
C:
通道数(也有人喜欢称这个为高)M, N
表示是图片的长宽
Gram矩阵计算
- Gram矩阵规模:
[C, C]
- 其实就是每一个色层的图像之间的关系。这是合理的,因为,我们认知的风格这里很大程度上是考虑的是颜色变化的风格。 (要是不想要有特征的方式,那就用别的风格距离的定义呗。)
- Gram(i,j) 就是把这两层的矩阵提出来,即有两个
[M, N]
的矩阵。然后,让这两个矩阵对应的位置做乘法之后,再做加法。(卷积的过程)
其实就是不同色层的卷积来构成的矩阵。
之后,用上面的内容的矩阵的变化方式来计算就好了。
代码
(本来打算也放代码的。但是发现网上的这些代码只用CPU的话实在是太慢了。。)
https://blog.csdn.net/q295684174/article/details/79065032
这个链接上的代码是可以跑的,就是特别慢。