想看原理的可以看这篇文章:https://blog.csdn.net/weixin_41108515/article/details/103650964
本文主要参考:https://blog.csdn.net/weixin_41108515/article/details/103651784
一、效果
在正式开始前,先看看效果。
风格图:(style文件中的painting.jpg)
我想要进行风格迁移的图:(content中的qd.jpg)
效果图:(output文件夹里)
二、实操
在看完成果之后,我们开始进入实操部分。
1.获取模型
网盘:链接:https://pan.baidu.com/s/1Z3TvZvGUyTsMGQoaQv4kdQ 密码:xgwc
下载完成后,将其拖入工程文件中
2.写代码
2.1 我们要在工程文件下建名为「style」「content」「output」的文件夹,这些文件夹与代码文件的位置如图
2.2 正式写代码
新建models.py
import tensorflow as tf
import numpy as np
import settings
import scipy.io
import scipy.misc
class Model(object):
def __init__(self, content_path, style_path):
self.content = self.loadimg(content_path) # 加载内容图片
self.style = self.loadimg(style_path) # 加载风格图片
self.random_img = self.get_random_img() # 生成噪音内容图片
self.net = self.vggnet() # 建立vgg网络
def vggnet(self):
# 读取预训练的vgg模型
vgg = scipy.io.loadmat(settings.VGG_MODEL_PATH)
vgg_layers = vgg['layers'][0]
net = {
}
# 使用预训练的模型参数构建vgg网络的卷积层和池化层
# 全连接层不需要
# 注意,除了input之外,这里参数都为constant,即常量
# 和平时不同,我们并不训练vgg的参数,它们保持不变
# 需要进行训练的是input,它即是我们最终生成的图像
net['input'] = tf.Variable(np.zeros([1, settings.IMAGE_HEIGHT, settings.IMAGE_WIDTH, 3]), dtype=tf.float32)
# 参数对应的层数可以参考vgg模型图
net['conv1_1'] = self.conv_relu(net['input'], self.get_wb(vgg_layers, 0))
net['conv1_2'] = self.conv_relu(net['conv1_1'], self.get_wb(vgg_layers, 2))
net['pool1'] = self.pool(net['conv1_2'])
net['conv2_1'] = self.conv_relu(net['pool1'], self.get_wb(vgg_layers, 5))
net['conv2_2'] = self.conv_relu(net['conv2_1'], self.get_wb(vgg_layers, 7))
net['pool2'] = self.pool(net['conv2_2'])
net['conv3_1'] = self.conv_relu(net['pool2'], self.get_wb(vgg_layers, 10))
net['conv3_2'] = self.conv_relu(net['conv3_1'], self.get_wb(vgg_layers, 12