@gzm1997
2018-01-02T23:08:29.000000Z
字数 2707
阅读 3429
树媒技术基础作业
这次我们使用的是快速图像风格迁移算法,跟论文里面的prisma算法有所不同,(因为快速图像风格迁移算法更快一点,所以我们选择这个算法来实现)
prisma算法
快速图像风格迁移算法
解释快速图像风格迁移算法
几个关键结构:
Image transform net图像风格迁移网络
是一个等待训练的卷积神经网络,训练的结果(也就是这个卷积神经网络的各个参数)使用tensorflow的saver类型保存在我们的checkpoint-dir/style_name.ckpt文件中,当需要风格迁移的时候再使用saver把ckpt文件中的神经网络参数还原出来
下面是训练风格图像部分声明风格迁移网络结构,其后将训练的好的参数使用tensorflow的saver存进ckpt文件中,位于transform.py文件中
def net(image):
conv1 = _conv_layer(image, 32, 9, 1)
conv2 = _conv_layer(conv1, 64, 3, 2)
conv3 = _conv_layer(conv2, 128, 3, 2)
resid1 = _residual_block(conv3, 3)
resid2 = _residual_block(resid1, 3)
resid3 = _residual_block(resid2, 3)
resid4 = _residual_block(resid3, 3)
resid5 = _residual_block(resid4, 3)
conv_t1 = _conv_tranpose_layer(resid5, 64, 3, 2)
conv_t2 = _conv_tranpose_layer(conv_t1, 32, 3, 2)
conv_t3 = _conv_layer(conv_t2, 3, 9, 1, relu=False)
preds = tf.nn.tanh(conv_t3) * 150 + 255./2
return preds
下面是风格转移的时候从ckpt文件中恢复数据到内存中,位于evaluate.py文件中
preds = transform.net(img_placeholder)
saver = tf.train.Saver()
if os.path.isdir(opts.checkpoint):
ckpt = tf.train.get_checkpoint_state(opts.checkpoint)
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
else:
raise Exception("No checkpoint found...")
else:
saver.restore(sess, opts.checkpoint)
深度卷积神经网络vgg19
图中显示为vgg16标准的深度卷积神经网络,我们实际上是使用的vgg19深度卷积神经网络,这个网络是由Imagenet训练出来的,保证了隐藏层具有的高级语义特征。这个过程只需要一次前向传播获得特征层的feature map.输入图像x也就是yc将输入风格迁移网络fW获得y^,再把y^输入固定的VGG-19分别和ys和yc的指定特征层算loss.算法的目标函数是最小化这个loss和来训练fW这个网络。
我们下载的vgg19
使用python加载mat文件里面的深度卷积神经网络,加载出来是dict类型
总共大体三部分:
layers包含各个卷积层,relu层,池化层的参数,长度为43,对应vgg19的43个层的各个参数
src/vgg.py作用:声明vgg19的各层结构,并且使用从imagenet-vgg-verydeep-19.mat加载得到的数据初始化各层参数
声明神经网络各层的名字,形成结构
#声明神经网络各层的名字,形成结构
layers = (
'conv1_1', 'relu1_1', 'conv1_2', 'relu1_2', 'pool1',
'conv2_1', 'relu2_1', 'conv2_2', 'relu2_2', 'pool2',
'conv3_1', 'relu3_1', 'conv3_2', 'relu3_2', 'conv3_3',
'relu3_3', 'conv3_4', 'relu3_4', 'pool3',
'conv4_1', 'relu4_1', 'conv4_2', 'relu4_2', 'conv4_3',
'relu4_3', 'conv4_4', 'relu4_4', 'pool4',
'conv5_1', 'relu5_1', 'conv5_2', 'relu5_2', 'conv5_3',
'relu5_3', 'conv5_4', 'relu5_4'
)
从imagenet-vgg-verydeep-19.mat文件中加载vgg19数据
#从imagenet-vgg-verydeep-19.mat文件中加载vgg19数据
data = scipy.io.loadmat(data_path)
mean = data['normalization'][0][0][0]
mean_pixel = np.mean(mean, axis=(0, 1))
weights = data['layers'][0]
net = {}
current = input_image
for i, name in enumerate(layers):
kind = name[:4]
if kind == 'conv':
kernels, bias = weights[i][0][0][0][0]
kernels = np.transpose(kernels, (1, 0, 2, 3))
bias = bias.reshape(-1)
current = _conv_layer(current, kernels, bias)
elif kind == 'relu':
current = tf.nn.relu(current)
elif kind == 'pool':
current = _pool_layer(current)
net[name] = current
使用Adam算法的优化器
train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)
每次训练输入大小为12g的train2004压缩包中的训练图像
test_feed_dict = {
X_content:X_batch
}
使用Adam算法优化器优化fW的每一层神经网络层的参数
train_step.run(feed_dict=feed_dict)