[关闭]
@gzm1997 2018-01-02T15:08:29.000000Z 字数 2707 阅读 3322

快速图像风格迁移

树媒技术基础作业


这次我们使用的是快速图像风格迁移算法,跟论文里面的prisma算法有所不同,(因为快速图像风格迁移算法更快一点,所以我们选择这个算法来实现)

prisma算法
image_1c2rbn0b31d6lmqmep11jds9bq9.png-314.4kB

快速图像风格迁移算法
image_1c2rbnlqp70a1ica18rf4ci19dim.png-64.7kB


解释快速图像风格迁移算法
几个关键结构:

Image transform net图像风格迁移网络
image_1c2rci0dulhgfpq7l211o1k6r13.png-11.7kB

是一个等待训练卷积神经网络,训练的结果(也就是这个卷积神经网络的各个参数)使用tensorflow的saver类型保存在我们的checkpoint-dir/style_name.ckpt文件中,当需要风格迁移的时候再使用saver把ckpt文件中的神经网络参数还原出来

下面是训练风格图像部分声明风格迁移网络结构,其后将训练的好的参数使用tensorflow的saver存进ckpt文件中,位于transform.py文件中

  1. def net(image):
  2. conv1 = _conv_layer(image, 32, 9, 1)
  3. conv2 = _conv_layer(conv1, 64, 3, 2)
  4. conv3 = _conv_layer(conv2, 128, 3, 2)
  5. resid1 = _residual_block(conv3, 3)
  6. resid2 = _residual_block(resid1, 3)
  7. resid3 = _residual_block(resid2, 3)
  8. resid4 = _residual_block(resid3, 3)
  9. resid5 = _residual_block(resid4, 3)
  10. conv_t1 = _conv_tranpose_layer(resid5, 64, 3, 2)
  11. conv_t2 = _conv_tranpose_layer(conv_t1, 32, 3, 2)
  12. conv_t3 = _conv_layer(conv_t2, 3, 9, 1, relu=False)
  13. preds = tf.nn.tanh(conv_t3) * 150 + 255./2
  14. return preds

下面是风格转移的时候从ckpt文件中恢复数据到内存中,位于evaluate.py文件中

  1. preds = transform.net(img_placeholder)
  2. saver = tf.train.Saver()
  3. if os.path.isdir(opts.checkpoint):
  4. ckpt = tf.train.get_checkpoint_state(opts.checkpoint)
  5. if ckpt and ckpt.model_checkpoint_path:
  6. saver.restore(sess, ckpt.model_checkpoint_path)
  7. else:
  8. raise Exception("No checkpoint found...")
  9. else:
  10. saver.restore(sess, opts.checkpoint)

深度卷积神经网络vgg19
image_1c2rcin2voabvrb75us5i83420.png-18.6kB

图中显示为vgg16标准的深度卷积神经网络,我们实际上是使用的vgg19深度卷积神经网络,这个网络是由Imagenet训练出来的,保证了隐藏层具有的高级语义特征。这个过程只需要一次前向传播获得特征层的feature map.输入图像x也就是yc将输入风格迁移网络fW获得y^,再把y^输入固定的VGG-19分别和ys和yc的指定特征层算loss.算法的目标函数是最小化这个loss和来训练fW这个网络

我们下载的vgg19
image_1c2reeh6cvpkbli9f937n9kg5b.png-4.4kB

使用python加载mat文件里面的深度卷积神经网络,加载出来是dict类型
image_1c2rd2utv1041n8tdvu1fvo18j52q.png-8.1kB

总共大体三部分:

image_1c2rde3bk1l5r1rjo1i4310ij1q6k3k.png-119.1kB

layers包含各个卷积层,relu层,池化层的参数,长度为43,对应vgg19的43个层的各个参数
image_1c2rdiipu10nb16r3g7r1vo71lqg4u.png-591.9kB

src/vgg.py作用:声明vgg19的各层结构,并且使用从imagenet-vgg-verydeep-19.mat加载得到的数据初始化各层参数

声明神经网络各层的名字,形成结构

  1. #声明神经网络各层的名字,形成结构
  2. layers = (
  3. 'conv1_1', 'relu1_1', 'conv1_2', 'relu1_2', 'pool1',
  4. 'conv2_1', 'relu2_1', 'conv2_2', 'relu2_2', 'pool2',
  5. 'conv3_1', 'relu3_1', 'conv3_2', 'relu3_2', 'conv3_3',
  6. 'relu3_3', 'conv3_4', 'relu3_4', 'pool3',
  7. 'conv4_1', 'relu4_1', 'conv4_2', 'relu4_2', 'conv4_3',
  8. 'relu4_3', 'conv4_4', 'relu4_4', 'pool4',
  9. 'conv5_1', 'relu5_1', 'conv5_2', 'relu5_2', 'conv5_3',
  10. 'relu5_3', 'conv5_4', 'relu5_4'
  11. )

从imagenet-vgg-verydeep-19.mat文件中加载vgg19数据

  1. #从imagenet-vgg-verydeep-19.mat文件中加载vgg19数据
  2. data = scipy.io.loadmat(data_path)
  3. mean = data['normalization'][0][0][0]
  4. mean_pixel = np.mean(mean, axis=(0, 1))
  5. weights = data['layers'][0]
  6. net = {}
  7. current = input_image
  8. for i, name in enumerate(layers):
  9. kind = name[:4]
  10. if kind == 'conv':
  11. kernels, bias = weights[i][0][0][0][0]
  12. kernels = np.transpose(kernels, (1, 0, 2, 3))
  13. bias = bias.reshape(-1)
  14. current = _conv_layer(current, kernels, bias)
  15. elif kind == 'relu':
  16. current = tf.nn.relu(current)
  17. elif kind == 'pool':
  18. current = _pool_layer(current)
  19. net[name] = current

训练部分

使用Adam算法的优化器

  1. train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)

每次训练输入大小为12g的train2004压缩包中的训练图像

  1. test_feed_dict = {
  2. X_content:X_batch
  3. }

使用Adam算法优化器优化fW的每一层神经网络层的参数

  1. train_step.run(feed_dict=feed_dict)
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注