chapter 7 图像风格迁移

本章主要讲解了两个内容:1)图像风格迁移的原理;2)利用tensorflow实现图像风格迁移项目;

一、图像风格迁移原理

(一)原始图像风格迁移原理

所谓图像风格迁移,是将一种image1的图像风格应用于另外的image2中,使image2,具有与image1一样的图像风格。
比如,将毕加索著名的画作“星空”的风格,应用于一张普通的image中,如下图所示:

下面主要讲述一下原始的图像风格迁移原理:
图像风格迁移的实现分两步进行:
1、图像内容的生成;
2、图像风格的生成;

假设在我们讲述的例子中,使用“预训练VGGNet网络”实现风格迁移。
**首先,我们先来实现图像内容的生成。**假设待生成的图像为x,想要生成的图像为y。图像y经VGGNet网络后,其特征为f(y)。为了使待生成的图像x尽可能与y相似,应使图像x经VGGNet网络后的特征f(x)尽量接近f(y)。因此,在图像内容生成这一部分,我们可以如下定义待求解参数,以及损失函数:
待求解参数:图像x(初始值随机初始化);
损失函数:最小化 ||f(x) - f(y) ||2
**第二,实现图像风格迁移。**这里假设想要实现图像p的风格。在实现风格迁移之前,我们首先要了解“风格”的定义,以及“风格”如何表示。
所谓“图像风格”,我们可以将其看作是image输入CNN后,某一个或多个layer中,各个channel之间所呈现的相关度。具体来讲,假设某一layer的output为(a,b,c),分别代表(height,width,channel),我们可以将该layer的每个channel看作是a*b的一维向量,则不同channel ,c1,c2之间的相关度即可用内积 c1 * c2 表示。假设该layer的所有channel向量为(c1,c2,…,ci),则,我们可以用(c1,c2,…,ci)形成的Gram矩阵来表示图像的风格。要想使待生成图像x,具有图像p的风格,则应使二者经过VGGNet网络后,output layer中各个channel构成的Gram矩阵尽可能的接近。因此,我们可以如下定义待求解参数,以及,损失函数:
待求解参数:图像x(初始值随机初始化)
损失函数:假设图像x经由VGGNet网络,其output layer 各个channel向量形成的Gram矩阵为Gx。图像p经由VGGNet网络后,形成的Gram矩阵为Gp。则,损失函数应定义为 :最小化 ||Gx - Gp||2
因此,在实现图像风格迁移时,假设x为待求解image,y为想要生成的image content,p为想要生成的image style,则有:
待求解参数:图像x(初始值随机初始化);
损失函数:最小化 Ltotal = alpha * ||f(x) - f(y) ||2 + beta * ||Gx - Gp||2
其中,两个超参数alpha 和 beta 分别决定了 要实现 image content 和 image style的强度;

这种原始的图像风格迁移技术,在实际应用,运行速度较慢,下面,介绍一种“快速图像风格迁移技术”。

(二)快速图像风格迁移原理

在“原始图像风格迁移技术”中,其损失函数为“内容损失”+“风格损失”,求解目标为image。
在“快速图像风格迁移技术”中,其损失函数同“原始图像风格迁移技术”,但是,其求解对象为“图像生成网络”,而不是“image”,下面,简要介绍其原理:
下图所示,为其网络结构,分为两个部分:左半部分为“图像生成网络”,右半部分为“损失网络”(采用的是预训练的VGGNet网络)。
input image送入“图像生成网络”后,生成output image。output image(y’),style target(ys),content target(yc)送入“损失网络”后,分别形成若干输出,如下图所示,image送入VGGNet后,会形成4个输出:relu1_2,relu2_2,relu3_3,relu4_3。我们将y’ 和 yc 的relu3_3 output的L2范式定义为“内容损失”。将y’ 和 ys的(relu1_2,relu2_2,relu4_3)output 的L2范式之和定义为“风格损失”。其最终的损失函数依然为:alpha * Lcontent + beta * Lstyle

在“快速图像风格迁移技术”中:
待求解对象为:图像生成网络的参数weight;
损失函数为:L(y’,yc,ys) = “内容损失”+“风格损失”;
值得一提的是,在整个训练过程中,一般只固定使用一种风格ys,而input image一般等于yc
通过训练,求解出图像生成网络后,如果想要对image x做风格迁移,即可直接将其输入“图像生成网络”,其output即为所求的风格迁移图像。

下面给出“原始图像风格迁移原理”和“快速图像风格迁移原理”的异同点:

二、训练自己的‘图像生成网络’

在本节中,只给出训练“图像生成网络”的大体思路,具体code参见train.py
在该实例中,使用的是“快速图像风格迁移原理”,来训练自己的“图像生成网络”。其中,损失网络使用的是预训练好的VGG16,在实际训练中,我们只针对“图像生成网络”的参数进行训练。
step1:将training_image输入初始化后的图像生成网络,得到generated_image;
step2:将training_image,style_image和generated_image都输入损失网络,得到损失网络各个layer的output;
step3:利用预先定义好的损失网络中的content_layer和style_layer,求解“内容损失”和“风格损失”,对二者加权,得到最终的损失total_loss;
step4:针对“图像生成网络”中的参数,对total_loss进行优化(在code中使用的是Adam梯度下降算法);
step5:优化结束后,即可求得“图像生成网络”中各个参数的值;
step6:可以利用最终的“图像生成网络”,来对一个test image进行图像风格迁移,具体可见eval.py

猜你喜欢

转载自blog.csdn.net/u014765410/article/details/86594059