Image-to-Image Translation with Conditional Adversarial Networks 论文翻译

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

源论文标题:Image-to-Image Translation with Conditional Adversarial Networks

源论文链接:https://phillipi.github.io/pix2pix/


【摘要】

        我们调研了使用条件对抗网络,做为图像到图像转换的通用解决方案。这个网络不仅学习到图像到图像的映射,还学习了一个损失函数来训练这个映射。这使得之前那些需要不同损失函数的问题,采用通用方法来解决成为可能。我们证明了这种方法在用标签图合成照片,用边缘图重建物体,将黑白图像色彩化等任务上是有效的。做为一个通用方案,我们不用手动设计映射函数,不用手动设计损失函数,就能得到一个合理的结果。


        计算机图像学和计算机视觉中的很多问题,可以被认为是将输入图像“翻译”成相应的输出图像。正如一个概念可以被使用英语或法语来表达,一个场景也可以被呈现为RGB图像,梯度场,边缘图,语义标签等。与语言的自动翻译类似,我们定义自动图像翻译为,在有足够的训练数据情况下,将场景的一种表示,转换成另一种可能的表示。(如图1所示,原来不同的图像转换问题,需要不同的算法。但这些问题有一个共同点,就是像素到像素的映射。基于条件对抗网络的方案,我们可以使用同样的网络架构来处理这些问题,只是需要不同的训练数据)



        语言翻译困难的原因之一是,语言之间的映射很少是一对一的。类似的,图像翻译问题,可能是多对一,比如将图片映射为边缘,片段或语义标签;也可能是一对多,比如将标签,用户的稀疏输入映射为逼真图像。传统上,这些问题都是用单独的“专用设备”来解决,尽管这些“设备”有共同的“配置”:从像素到像素的预测。本文的目标是为这些问题提供一个共同的解决框架。


        卷积神经网络是目前图片预测领域最主要的解决方法。虽然CNN的学习过程是自动的,但CNN需要花很大的功夫在设计有效的损失函数上。换句话说,就是我们仍然需要告诉CNN我们想要最小化的东西。就像Midas(希腊神话中的国王,拥有点石成金的能力)一样,我们必须小心我们所希望的。如果我们采用幼稚的方法,要求CNN去最小化预测像素和真实像素之间的欧几里德距离,它往往会产生模糊的结果。这是因为欧式距离通过平均所有可能的输出来达到最小化,这会导致模糊。通过损失函数来迫使CNN输出我们真正想要的东西,比如清晰,逼真的图像,是一个开放的问题,往往需要专业的知识。


         如果我们只需要指定一个高层目标,比如“让输出和现实无法区分”,然后自动学习出一个适合于这个目标的损失函数,那将是非常理想的。幸运的是,这正好是最近提出的生成对抗网络(GANs)在做的事情。GAN学到了一个试图区分输出图像是真还是假的“损失”,同时训练生成模型去最小化这个“损失”。由于GAN学习到了与数据相适应的“损失”,因此可以将其应用在传统上需要不同损失函数的各种任务上。


        在本文中,我们探索了有条件设置下的生成对抗网络,正如GANs学习了一个生成数据模型,条件GANs(cGANs)学习了一个有条件的生成模型。这意味着,cGANs适用与图像到图像的“翻译”任务。在这种情况下,我们接受输入图像的条件,并生成相应的输出图像。


        GANs在过去两年里得到大力研究,本文中我们探索的许多技术已经被提出。尽管如此,早期的论文主要集中在特定的应用领域,如何应用到图像翻译上还是不清楚。我们的主要贡献是证明了在大量的问题上,cGANs会产生合理的结果。我们的第二个贡献是提出了一个足以取得良好结果的简单框架,并分析了选择几个重要架构的影响。


【1、相关工作】


图像模型的结构化损失


        图像到图像的转换问题,通常被表述为按像素的分类或回归。这些表述将输出空间视为非结构化的,每个输出像素被认为是有条件的独立于输入图像的所有其它像素。不同的是,cGANs学习了结构化损失。结构化损失会惩罚输出中的“联合组态”。大量的文献已经考虑了这种损失,比如条件随机场,SSIM度量,特征匹配,非参数损失,卷积伪先验和基于匹配协方差统计的损失。我们条件生成对抗网络不同之处在于损失是学习到的,所以理论上可以惩罚任何的导致输出和目标有差异的结构。


有条件的生成对抗网络


        我们不是第一个在有条件下应用GAN,之前的工作在离散的标签,文本,图像上也应用了cGANs,图像的条件模型已经解决了图像预测,未来帧预测和风格转移等问题。每一个这些方法都是针对性设计的,我们的不同之处在于没有任何的特定性,这使得我们的步骤简单很多。


        我们的方法也不同于以前的生成器和鉴别器的结构。我们的生成器使用“u-net”架构,鉴别器使用卷积的“PatchGAN”分类器,它只会在“图片块”尺度上进行惩罚。为了获得局部的风格统计,以前也提出过类似的Patch-GAN结构。我们在这里表明了这种结构在大量问题上都是有效的,并且我们探讨了选择不同块大小带来的影响。


【2、方法】


GANs的生成模型,学习从随机噪声向量z到输出图像y的映射,G(z)-> y。相反的,条件GANs学习从被观察图像x和随机噪声向量z到y的映射,G(x,z)-> y。生成器G被训练去产生图像,这些图像和真实图像无法被鉴定器D区分出来。鉴定器D则被训练去尽可能区分出是生成器G的“造假”图像。这个训练过程如下图2。



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、付费专栏及课程。

余额充值