tensorflow风格迁移网络训练与使用

风格迁移原理解释

卷积神经网络实现图像风格迁移在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研习社】

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181115G1N9LJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券