图像风格迁移原理
所谓图像风格迁移,指利用算法学习著名画作的风格,然后把这种风格应用到另外一张图片上的技术。著名的图像处理应用Prisma是利用风格迁移技术,将普通用户的照片自动转换为具有艺术家风格的图片。
图片风格迁移的原理
一般的分类模型都是输入图片,提取特征,输出类别,但是图像风格迁移正好相反,输入的是特征,输出对于这种特征的图片,具体来说,风格迁移使用卷积层的中间特征还原出对于这种特征的原始图像。经过VGGnet计算后得到各个卷积层的特征,接下来,更具这些特征,还原出对于这种特征的原始图像。我们使用不同层深的卷积层进行还原,会发现,浅层的欢迎效果比较好,卷积诚征基本保留了所以原始图像中的形状,位置,颜色,纹理等信息;深层对应的还原图像丢失了部分颜色和纹理信息,但大体保留原始图像中形状和位置。
还原方法是梯度下降算法,将还原的图片与原始图片的差距作为损失,然后进行优化。除了优化图像原始的内容,我们还希望还原图像的’风格‘,一种方法是使用图像的卷积层特征的Gram矩阵。Gram矩阵是关于一组向量的内积的对称矩阵。目前有三种方式还原图像内容。第一种是利用内容损失还原图像内容。第二种是利用风格损失还原图像风格。第三种就是将内容损失和风格损失组合起来,在还原一张图片的同时还原另一张图像的风格。这种方式也是图像风格迁移的基本算法。
## 快速图像风格迁移的原理
原始的图像风格迁移用一个损失来衡量是否成功组合了内容以及风格,然后用优化函数为目标,使用梯度下降进行逐步迭代。因为在生成图像的时候逐步迭代,所以速度很慢。快速图像风格迁移的方法是,不使用优化的方法来逐步迭代生成图,而实使用一个神经网络直接生成,整个系统又两个神经网络组成,左边是图像生成网络。右边是损失网络。损失网络使用VGG,这与原始的风格迁移是一致的,用损失函数来训练网络生成图片。图像生成网络的任务是生成某一种风格的图像,它的输入是一个图像,输出同样是一个图像,由于生成图像只需要在生成网络中计算一次,所以速度比原始图像风格迁移提高了很多。
在tensorflow上实现快速风格迁移
爱德华 蒙克《呐喊》版
梵高版《星空》
训练自己的模型
首先先准备两个工作,第一是下载VGG模型,第二是准备COCO数据集。然后训练模型。
路径如下所示
训练指令
python train.py -c conf.wave.yml
该指令的含义是利用已经写好的conf/wave.yml文件训练模型。
style_image: img/wave.jpg # targeted style image
naming: "wave" # the name of this model. Determine the path to save checkpoint and events file.
model_path: models # root path to save checkpoint and events file. The final path would be <model_path>/<naming>
content_weight: 1.0 # weight for content features loss
style_weight: 220.0 # weight for style features loss
tv_weight: 0.0 # weight for total variation loss
image_size: 256
batch_size: 4
epoch: 2
loss_model: "vgg_16"
content_layers: # use these layers for content loss
- "vgg_16/conv3/conv3_3"
style_layers: # use these layers for style loss
- "vgg_16/conv1/conv1_2"
- "vgg_16/conv2/conv2_2"
- "vgg_16/conv3/conv3_3"
- "vgg_16/conv4/conv4_3"
checkpoint_exclude_scopes: "vgg_16/fc" # we only use the convolution layers, so ignore fc layers.
loss_model_file: "pretrained/vgg_16.ckpt" # the path to the checkpoint
我们在训练的过程中可以使用tensorboard进行监控,在本项目中,只需要训练图像生成网络中的变量,而不需要训练损失网络中的变量,在将model保存为checkpoint是。也只需要保存生成网络中的变量。这个项目的学习很有意思,通过机器学习一种画家风格,实现风格迁移,感兴趣的小伙伴可以一起学习~