《Image-to-Image Translation with Conditional Adversarial Networks》翻译

基于条件对抗网络的图像间转换

 

Phillip Isola    Jun-Yan Zhu    Tinghui Zhou    Alexei A. Efros

Berkeley AI Research (BAIR) Laboratory, UC Berkeley

{fisola,junyanz,tinghuiz,efrosg}@eecs.berkeley.edu

 

图1:图像处理,图形和视觉中的许多问题涉及将输入图像转换成相应的输出图像。这些问题通常使用特定于应用程序的算法来处理,即使设置始终相同:将像素映射到像素。有条件的对抗性网络是一种通用的解决方案,似乎可以很好地解决各种各样的问题。这里我们展示几种方法的结果。在每种情况下,我们使用相同的架构和目标,并简单地训练不同的数据。

摘要

我们研究条件对抗网络作为图像到图像转换问题的通用解决方案。这些网络不仅学习从输入图像到输出图像的映射,还学习了用于训练该映射的损失函数。这使得可以对传统上需要非常不同的损失方程的问题应用相同的通用方法。我们证明了这种方法可以有效地合成标签贴图中的照片,从边缘贴图重建对象,以及着色图像等。事实上,自从与本文相关的pix2pix软件发布以来,大量互联网用户(其中许多是艺术家)已经在我们的系统中发布了自己的实验,进一步证明了其广泛的适用性和易于采用,而无需参数调整。作为一个社区,我们不再手工设计我们的绘图功能,这项工作表明我们可以在不手工设计损失函数的情况下获得合理的结果。

 

  1. 介绍

图像处理,计算机图形和计算机视觉中的许多问题可以表现为将输入图像“转换”成相应的输出图像。正如概念可以用英语或法语表达一样,场景可以呈现为RGB图像,渐变场,边缘图,语义标签图等。与自动语言翻译类似,我们定义自动图像 -  在给定足够的训练数据的情况下,将图像转换作为将场景的一种可能表示转换为另一种的任务(参见图1)。 传统上,这些任务中的每一个都使用单独的专用机器(例如[16、25、20、9、11、53、33、39、18、58、62])进行处理,尽管设置总是相同的:从像素预测像素。 我们在本文中的目标是为所有这些问题开发一个通用框架。

社区已经朝着这个方向迈出了重要的一步,卷积神经网络(CNNs)成为各种图像预测问题背后的共同主力。CNNs学会将损失函数降至最低 - 这是一个评估结果质量的目标 - 尽管学习过程是自动的,但很多手动工作仍然需要设计有效的损失。换句话说,我们仍然必须告诉CNN我们希望它最小化。但是,就像King Midas一样,我们必须小心我们的期望!如果我们采取天真的方法并要求CNN最小化预测和地面真实像素之间的欧几里德距离,它将倾向于产生模糊的结果。这是因为通过平均所有合理的输出来最小化欧几里德距离,这会导致模糊。提出损失功能迫使CNN做我们真正想要的事情 - 例如,输出清晰,逼真的图像 - 是一个开放的问题,通常需要专业知识。

         如果我们只能指定一个高级别目标,例如“使输出与现实无法区分”,然后自动学习适合于满足此目标的损失函数,那将是非常可取的。 幸运的是,这正是最近提出的生成对抗网络(GANs)所做的。如果输出图像是真实的或假的,GAN会学习一种损失,试图对其进行分类,同时训练生成模型以最小化这种损失。模糊的图像是不容忍的,因为它们看起来很明显是伪造的。 因为GANs学习了适应数据的损失,所以它们可以应用于传统上需要非常不同类型的损失函数的大量任务。

         在本文中,我们在条件设置中探索GANs。 就像GANs学习数据的生成模型一样,条件GANs(cGANs)学习条件生成模型。这使得cGAN适用于图像到图像转换任务,其中我们对输入图像进行调节并生成相应的输出图像。

         GAN在过去两年中得到了大力研究,我们在本文中探索的许多技术都是先前提出的。尽管如此,早期的论文主要关注具体的应用,目前还不清楚图像条件GAN如何作为图像到图像转换的通用解决方案。我们的主要贡献是证明在有各种各样的问题上,有条件的GAN产生了合理的结果。我们的第二个贡献是提供一个足以取得良好结果的简单框架,并分析几个重要架构选择的影响。代码位置:https://github.com/phillipi/pix2pix。

 

  1. 相关工作

在图像转换问题中,图像建模中的结构损失通常是通过像素分类或回归来表示的。(例如, [39, 58, 28, 35, 62]). 这些公式将输出空间视为“非结构化”,即在给定输入图像的情况下,每个输出像素被视为与所有其他像素有条件地独立。CGAN学习结构化损失。结构化损失将惩罚输出图像的构造节点。大量的文献都考虑过这种损失,使用包括条件随机字段的方法[10],SSIM结构相似性度量,特征匹配[15],非参数损失[37],卷积伪先验[57],以及基于匹配协方差统计的损失[30]。条件GAN的不同之处在于,损失是可以学习的,理论上,它可以惩罚输出和目标之间任何可能的结构。

图2:训练条件GAN以映射边缘->照片。判别器D学习在假(由发生器合成)和真实(边缘,照片)元组之间进行分类。发生器G学会愚弄判别器。 与无条件GAN不同,生成器和判别器都观察输入边缘映射。

我们不是第一个在条件设置中应用GAN的人。 先前和并发的工作已经在离散标签,文本以及实际上图像上调整了GAN。图像条件模型已经处理了来自法线贴图,未来帧预测,产品照片生成以及稀疏注释的图像生成的图像预测(对于相同问题的自回归方法,参见[47])。其他几篇论文也使用GAN进行图像到图像的映射,但只是无条件地应用GAN,依赖于其他术语(如L2回归)来强制输出以输入为条件。这些论文在修复,未来状态预测,用户约束引导的图像处理,样式转移和超分辨率方面取得了令人瞩目的成果。每种方法都是针对特定应用而定制的。 我们的框架不同之处在于没有特定于应用程序 这使我们的设置比大多数其他设置简单得多。

  我们的方法也与先前的工作不同,在发生器和判别器的几种架构选择中。 与以前的工作不同

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值