Image-to-Image Translation with Conditional Adversarial Networks

本文介绍了使用Conditional Adversarial Networks进行Image-to-Image Translation的方法,重点探讨了U-Net网络结构在生成网络中的优势,以及如何通过结合L1约束改善生成图像的质量。文章详细阐述了生成网络、判别网络的设计,以及损失函数的改进,旨在生成与真实图像相似的高质量图像。
摘要由CSDN通过智能技术生成

参考文献:

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

Ck表示Convolution-BatchNorm-ReLU,k个滤波,CDk表示Convolution-BatchNorm-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'))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
image-to-Image Translation with Conditional Adversarial Networks(条件对抗网络的图像到图像转换)是一种用于图像转换的深度学习方法。它通过训练一个生成器网络和一个判别器网络来实现图像的转换。生成器网络将输入图像转换为目标图像,而判别器网络则试图区分生成的图像和真实的目标图像。 这种方法的关键是使用对抗性训练。生成器网络和判别器网络相互竞争,以提高生成器网络生成逼真图像的能力。生成器网络通过最小化判别器网络对生成的图像的判别误差来学习生成逼真的图像。判别器网络则通过最大化对生成的图像和真实图像的判别能力来学习区分真实图像和生成图像。 在条件对抗网络中,生成器网络和判别器网络都接收额外的条件输入,以指导图像转换的过程。这个条件输入可以是任何与图像转换任务相关的信息,例如标签、语义分割图或其他图像。 通过训练生成器网络和判别器网络,条件对抗网络可以实现各种图像转换任务,例如将黑白图像转换为彩色图像、将马的图像转换为斑马的图像等。 这是一个使用条件对抗网络进行图像到图像转换的示例代码: ```python import tensorflow as tf from tensorflow.keras import layers # 定义生成器网络 def build_generator(): # 定义生成器网络结构 generator = tf.keras.Sequential() generator.add(layers.Conv2DTranspose(64, (4, 4), strides=(2, 2), padding='same', input_shape=(256, 256, 3))) generator.add(layers.BatchNormalization()) generator.add(layers.ReLU()) generator.add(layers.Conv2DTranspose(32, (4, 4), strides=(2, 2), padding='same')) generator.add(layers.BatchNormalization()) generator.add(layers.ReLU()) generator.add(layers.Conv2DTranspose(3, (4, 4), strides=(2, 2), padding='same', activation='tanh')) return generator # 定义判别器网络 def build_discriminator(): # 定义判别器网络结构 discriminator = tf.keras.Sequential() discriminator.add(layers.Conv2D(64, (4, 4), strides=(2, 2), padding='same', input_shape=(256, 256, 3))) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(128, (4, 4), strides=(2, 2), padding='same')) discriminator.add(layers.BatchNormalization()) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(256, (4, 4), strides=(2, 2), padding='same')) discriminator.add(layers.BatchNormalization()) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(1, (4, 4), strides=(1, 1), padding='same')) return discriminator # 定义条件对抗网络 class cGAN(tf.keras.Model): def __init__(self, generator, discriminator): super(cGAN, self).__init__() self.generator = generator self.discriminator = discriminator def compile(self, g_optimizer, d_optimizer, loss_fn): super(cGAN, self).compile() self.g_optimizer = g_optimizer self.d_optimizer = d_optimizer self.loss_fn = loss_fn def train_step(self, real_images, labels): # 生成器网络生成假图像 with tf.GradientTape() as tape: fake_images = self.generator([real_images, labels], training=True) # 判别器网络判别真实图像和假图像 real_output = self.discriminator([real_images, labels], training=True) fake_output = self.discriminator([fake_images, labels], training=True) # 计算生成器和判别器的损失 g_loss = self.loss_fn(fake_output, tf.ones_like(fake_output)) d_loss_real = self.loss_fn(real_output, tf.ones_like(real_output)) d_loss_fake = self.loss_fn(fake_output, tf.zeros_like(fake_output)) d_loss = d_loss_real + d_loss_fake # 更新生成器和判别器的参数 g_gradients = tape.gradient(g_loss, self.generator.trainable_variables) d_gradients = tape.gradient(d_loss, self.discriminator.trainable_variables) self.g_optimizer.apply_gradients(zip(g_gradients, self.generator.trainable_variables)) self.d_optimizer.apply_gradients(zip(d_gradients, self.discriminator.trainable_variables)) return {"g_loss": g_loss, "d_loss": d_loss} # 创建生成器和判别器 generator = build_generator() discriminator = build_discriminator() # 创建条件对抗网络 cgan = cGAN(generator, discriminator) # 编译条件对抗网络 cgan.compile( g_optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5), d_optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5), loss_fn=tf.keras.losses.BinaryCrossentropy(from_logits=True) ) # 训练条件对抗网络 cgan.fit(dataset, epochs=100) # 使用生成器网络进行图像转换 input_image = ... label = ... output_image = generator([input_image, label]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值