美文网首页
论文剖析:Unsupervised Diverse Colori

论文剖析:Unsupervised Diverse Colori

作者: HellyCla | 来源:发表于2018-09-17 21:29 被阅读120次

论文地址

背景

向着convert sketch/gray to image的方向搜索论文与资料,发现当前sketch-to-image的研究中还原效果很差,轮廓模糊,种类少而简单,单个物品训练转换,至多训练了50多种,不符合我预先设想的复杂任意场景的有效还原,后又看到colorization相关的论文,为grayscale-to-RGB/YUV image转换,目测效果还不错,因此想复现一下论文尝试用自己搜集的复杂数据集做一下测试。

已阅论文

Colorization

Unsupervised Diverse Colorization via Generative Adversarial Networks是近期阅读论文中看起来效果还很不错的一篇,于是仔细研究一下论文和代码。

基本网络结构

下面是基本的利用GAN网络来解决此问题的框架结构:Generator 的两个输入是 灰度图+随机noise z,经过Generator网络产生UV分量,与Y分量(即输入的灰度图)合并得到Generated color image, Discriminator即用来鉴别该图与原始的彩色图像。


传统的基本的GAN结构(针对自上色问题)

论文中的创新点总结:

  • 不采用encoder-decoder的结构,只使用卷积层,不使用反卷积层,并将卷积核的stride全部调为1,以避免在卷积过程中数据规模减小,保持空间信息,在上色过程中空间信息是很重要的。
  • 在Generator中每一层都与第一层直接相连(从U-Net改进而来),使得生成图像时局部的空间信息指导更为详细,色块分界更清晰。


    对比图
  • 对于传统的在初始的单层输入Noise z做法加以改进为多层输入z, 即将前半部分网络每一层都与第一层联结起来,实现noise的多层输入,效果是增加了上色风格的多样性diversity。
  • 对输入图像YUV与RGB格式加以对比,YUV因只需预测UV两个通道,损失函数表达简洁,网络的稳定性及生成的图像风格多样性表现更好。RGB因需要预测三个通道,损失函数需要增加额外的L1损失惩罚项来加以限制。


    增加的L1损失项
    RGB损失函数

论文中采用的网络结构

Generator && Discriminator
细节
  • 生成器:
    除了输出层用tanh函数,其他所有层都用的是lrelu(leaky-relu);
    最后一层输出2 channels,即UV两通道
  • 鉴别器:
    h0~h3层均采用lrelu+batchnorm,最后两层用linear,并reshape为一维向量,最后求平均作为D(y,z)值

代码部分

在公布的一份简陋的代码中,仍存在许多问题,需要我们自己根据自己的库、版本以及需求来修正。
微修正的实现代码
存在的问题有:

  1. 代码中:visualize,multi-z,multi-conditiontransform等参数均未实现对应功能代码。multi-z的作用是concat 多层 noise,multi-condition即concat multi-layer condition.
  2. improve_GAN主要用于增加梯度惩罚项,系数默认为10,体现在d_loss中。可用可不用,可以在测试对比损失函数效果时用,使用此项时优化函数用Adam。
    3.noise z在代码中并未单独处理concat问题,将noise也与灰度图做统一处理,使用了生成器网络,若想实现论文效果,需另外重写输入noise时的网络结构。
  3. test_z_fixed.pkl这个序列化文件应该是对noise z做了调整,具体结构内容未知。

算法流程

算法流程

在实现中Kd=5, Kg=1.在迭代中不断更新参数值。

关键代码
多层联结的生成器卷积网络是这个GAN网络创新的核心部分,实现如下:

  def generator_colorization(self, z, image_Y, config=None):
        with tf.variable_scope("generator") as scope:
            # project z
            h0 = linear(z, config.image_size * config.image_size, 'g_h0_lin', with_w=False)
            # reshape 
            h0 = tf.reshape(h0, [-1, config.image_size, config.image_size, 1])
            h0 = tf.nn.relu(batch_norm(h0, name='g_bn0'))
            # concat with Y
            h1 = tf.concat([image_Y, h0], 3)
            # print 'h0 shape after concat:', h0.get_shape()
            h1 = conv2d(h1, 128, k_h=7, k_w=7, d_h=1, d_w=1, name='g_h1_conv')
            h1 = tf.nn.relu(batch_norm(h1, name='g_bn1'))

            h2 = tf.concat([image_Y, h1], 3)
            h2 = conv2d(h2, 64, k_h=5, k_w=5, d_h=1, d_w=1, name='g_h2_conv')
            h2 = tf.nn.relu(batch_norm(h2, name='g_bn2'))

            h3 = tf.concat([image_Y, h2], 3)
            h3 = conv2d(h3, 64, k_h=5, k_w=5, d_h=1, d_w=1, name='g_h3_conv')
            h3 = tf.nn.relu(batch_norm(h3, name='g_bn3'))

            h4 = tf.concat([image_Y, h3], 3)
            h4 = conv2d(h4, 64, k_h=5, k_w=5, d_h=1, d_w=1, name='g_h4_conv')
            h4 = tf.nn.relu(batch_norm(h4, name='g_bn4'))

            h5 = tf.concat([image_Y, h4], 3)
            h5 = conv2d(h5, 32, k_h=5, k_w=5, d_h=1, d_w=1, name='g_h5_conv')
            h5 = tf.nn.relu(batch_norm(h5, name='g_bn5'))

            h6 = tf.concat([image_Y, h5], 3)
            h6 = conv2d(h6, 2, k_h=5, k_w=5, d_h=1, d_w=1, name='g_h6_conv')
            out = tf.nn.tanh(h6)

            print('generator out shape:', out.get_shape())

            return out

测试结果:待更新。

笔记们

略多。列表见好了。

相关文章

网友评论

      本文标题:论文剖析:Unsupervised Diverse Colori

      本文链接:https://www.haomeiwen.com/subject/ypwlnftx.html