https://arxiv.org/pdf/1611.07004.pdf
github tensorflow实现代码:
https://github.com/yenchenlin/pix2pix-tensorflow
背景知识:
U-Net: Convolutional Networks for Biomedical
Image Segmentation
生成网络:
生成网络的目的是,将输入高分辨率图像,映射得到输出高分辨率图像.对于生成网络结构,许多之前的方法都为encoder-decoder结构,如下图所示.首先将图像downsample,得到一个特征向量,之后逆过程,upsample,得到输出图像.
文献认为,输入图像和输出图像有相同的底层结构,仅仅在表层外貌上不同.例如在image colorizaton中,输入和输出图像具有相同的局部边缘结构信息.因此,文章采用了U-Net网络结构,如下图所示.U-Net网络将downsample得到的底层特征串联到upsample中,即将layer i的特征向量与layer n-i的特征向量串联,n为U-Net网络总的层数.
具体结构对比
encoder-decoder结构为:
encoder:
C64-C128-C256-C512-C512-C512-C512-C512
decoder:
CD512-CD512-CD512-C512-C512-C256-C128-C64
U-Net decoder:
CD512-CD1024-CD1024-C1024-C1024-C512-C256-C128
Dropout-ReLU layer,dropout为0.5.decoder的最后一层之后接一个卷积层,output channels为3(彩色图像),之后再接一个tanh激活函数层.在第一个卷积层C64没有使用batch norm,encoder 中所有的激活函数relu为leaky,slope值为0.2,decoder中激活函数为relu.
U-Net结构与encoder是相同的,除了在encoder的每个层 i 以及decoder的 n-i 中使用skip connections. skip connections 串联从第i层到第n-i层的激活值.遮盖边了decoder中的channels的数量.
U-Net decoder:
CD512-CD1024-CD1024-C1024-C1024-C512
-C256-C128
生成网络代码如下:
def generator(self, image, y=None): with tf.variable_scope("generator") as scope: s = self.output_size s2, s4, s8, s16, s32, s64, s128 = int(s/2), int(s/4), int(s/8), int(s/16), int(s/32), int(s/64), int(s/128) # image is (256 x 256 x input_c_dim) e1 = conv2d(image, self.gf_dim, name='g_e1_conv') # e1 is (128 x 128 x self.gf_dim) e2 = self.g_bn_e2(conv2d(lrelu(e1), self.gf_dim*2, name='g_e2_conv')) # e2 is (64 x 64 x self.gf_dim*2) e3 = self.g_bn_e3(conv2d(lrelu(e2), self.gf_dim*4, name='g_e3_conv')) # e3 is (32 x 32 x self.gf_dim*4) e4 = self.g_bn_e4(conv2d(lrelu(e3), self.gf_dim*8, name='g_e4_conv'))