@gzm1997
2018-01-02T15:08:29.000000Z
字数 2707
阅读 3757
树媒技术基础作业
这次我们使用的是快速图像风格迁移算法,跟论文里面的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./2return 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_imagefor 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)