风格迁移原理解释
卷积神经网络实现图像风格迁移在2015的一篇论文中最早出现。实现了一张从一张图像中提取分割,从另外一张图像中提取内容,叠加生成一张全新的图像。早前风靡一时的风格迁移APP – Prisma其背后就是图像各种风格迁移、让人耳目一新。其主要的思想是对于训练好的卷积神经网络,其内部一些feature map跟最终识别的对象是特征独立的,这些特征当中有一些是关于内容特征的,另外一些是关于风格特征的,于是我们可以输入两张图像,从其中一张图像上提取其内容特征,另外一张图像上提取其风格特征,然后把它们叠加在一起形成一张新的图像,这个就风格迁移卷积网络。最常见的我们是用一个预先训练好的卷积神经网络,常见的就是VGG-19,其结构如下:
其包含16个卷积层、5个池化层、3个全链接层。其中:
表示内容层为:relu4-2
表示风格层为:relu1_1, relu2_1, relu3_1, relu4_1, relu5_1
越高阶的层图像内容越抽象,我们损失的像素信息越多,所有选用relu4-2层作为内容层而忽略低阶的内容损失,对于风格来说,它是从低阶到高阶的层组合。所以选用从低到高不同层组合作为风格[relu1_1, relu2_1, relu3_1, relu4_1, relu5_1]
迁移损失
风格迁移生成图像Y,
要求它的内容来自图像C,
要求它的风格来自图像S。
Y是随机初始化的一张图像,带入到预训练的网络中会得到内容层与风格层的输出结果
C是内容图像,带入到预训练的网络中得到内容层Target标签
S是风格图像,带入到预训练的网络中得到风格层Target标签
这样总的损失函数就是内容与标签的损失,此外我们希望最终生成的图像是一张光滑图像,所有还有一个像素方差损失,这三个损失分别表示为 :
Loss(content)、 Loss(style) 、 Loss(var)
最终总的损失函数为:
Total Loss = alpha * Loss (content) + beta * Loss (Style) + Loss (var)
其中alpha与beta分别是内容损失与风格损失的权重大小
代码实现:
获取内容图像C与风格图像S的标签
随机初始化Y图像
计算内容损失
计算风格损失
添加smooth损失
训练风格迁移
运行结果
输入图像(右下角为风格图像),输出图像
欢迎大家扫码加入【OpenCV研习社】
领取专属 10元无门槛券
私享最新 技术干货