论文阅读:Image-to-Image Translation with Conditional Adversarial Networks

Abstract


本文贡献:

  • 研究条件对抗网络作为一个通用的解决图像到图像的翻译问题的方案。
  • 不仅学习从输入图像到输出图像的映射,而且学习一个损失函数来训练这种映射。

结果:

  • 使得对传统上需要不同的损失公式的问题采用相同的普遍方法成为可能。

1. Introduction


  • 将自动的图像到图像翻译定义为,在给定足够训练数据的情况下,将场景的一种可能表示转换为另一种可能表示的问题。

image.png

  • predict pixels from pixels
  • CNN 学习最小化损失函数,即对结果质量进行评分的目标——尽管学习过程是自动的,但仍需要大量手动工作来设计有效的损失。迫使 CNN 做我们真正想要的损失函数——例如,输出清晰、逼真的图像。
  • GANs学习一个损失,试图分类输出图像是真是假,同时训练生成模型,以尽量减少这种损失。由于GANs学习的是与数据相适应的损失,因此它们可以应用于传统上需要不同类型的损失函数的大量任务。
  • cGANs学习条件生成模型。这使得cGAN适合于图像到图像的转换任务,其中对输入图像进行条件处理并生成相应的输出图像。

2. Related work


Structured losses for image modeling——图像建模中的结构损失:

  • 传统Image-to-image translation方法将输出空间视为“非结构化”的,即每个输出像素被视为有条件地独立于所有其他像素。
  • cGANs是结构化损失。结构化损失对输出的联合配置进行惩罚。
  • 大量文献考虑了此类损失,方法包括条件随机场、SSIM度量、特征匹配、非参数损失、卷积伪先验和基于匹配协方差统计的损失。
  • cGANs的不同之处在于,损失是学习的,理论上,GAN可以惩罚输出和目标之间任何可能存在差异的结构。

Conditional GANs——条件GANs:

  • 本文框架的不同之处在于没有特定于应用程序的内容。这使得设置比大多数其他设置简单得多。
  • 本文的生成器使用了基于“U-Net”的架构 ,判别器则使用了卷积“PatchGAN”分类器,它只对图像块级别的结构进行惩罚。
  • 类似的PatchGAN架构曾被提出,旨在捕捉局部风格统计信息。
  • 本文展示了这种方法在更广泛的问题上是有效的,并探讨了改变块大小的影响。

3. Method


  • GANs 学习从随机噪声向量z到输出图像y的映射,表示为 G : z → y G: z \rightarrow y G:zy
  • cGANs 学习从观测到的图像x和随机噪声向量z到图像y的映射,表示为 G : { x , z } → y G: \{x, z\} \rightarrow y G:{ x,z}y
  • 生成器G被训练生成的输出不能被对抗性训练的判别器D区分为“假”图像,而判别器D则被训练尽可能准确地检测出生成器的“伪造”图像。

image.png

3.1 Objective——目标


cGANs的目标函数:
L c G A N ( G , D ) = E x , y [ log ⁡ D ( x , y ) ] + E x , z [ log ⁡ ( 1 − D ( x , G ( x , z ) ) ) ] L_{cGAN}(G, D) = \mathbb{E}_{x,y}[\log D(x, y)] + \mathbb{E}_{x,z}[\log(1 - D(x, G(x, z)))] LcGAN(G,D)=Ex,y[log

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]) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值