Image-to-Image Translation with Conditional Adversarial Networks

本文介绍了一种使用条件生成对抗网络(condition GAN)进行图像到图像转换的方法。该方法不仅能够学习输入图像到输出图像的映射关系,还能学习用于训练映射关系的loss函数。通过在多个任务和数据集上的实验验证了条件GAN的有效性和通用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Image-to-Image Translation with Conditional Adversarial Networks

论文简介:

本文研究将条件生成对抗网络作为图像转换问题的通用解决方案。该网络不仅可以学习输入图像到输出图像的映射关系,还能够学习用于训练映射关系的loss函数。

网络结构

在这里插入图片描述
GANs是一个学习随机噪声向量z到输出图像y的映射的生成模型:G:z→y。相反的,条件GANs学习观察到的图像x和随机噪声向量z到y的映射:G:{x,z}→y。训练生成器G产生判别器D无法辨别真伪的图像,训练判别器D尽可能检测出生成器的“伪造”图像。

生成器,使用基于“U-Net”的体系结构,判别器,使用卷积的“PatchGAN”分类器,它只惩罚patch规模下的惩罚结构。

带有跳线的生成器
在这里插入图片描述
在生成器中,用U-net结构代替encoder-decoder
U-net与encoder-decoder相比主要是多了skip connection. 使得网络的表达能力更强。
在encoder-decoder网络中,输入经过几层下采样,到达瓶颈层(bottleneck layer),然后逆转之前的过程。这种网络需要所有信息流通过所有的层结构。但是对于许多图像转换问题,在输入和输出之间存在很多可以共享的低级信息,在网络中直接传递这些信息可能会有所帮助。
  为了使生成器避开这样的信息瓶颈问题,本文模仿“U-Net”增加了跳线连接。特别的,我们在每第i层和第n−i层之间添加跳线,其中n是网络的总层数。每根跳线简单的将第i层和第n−i层的特征通道连接在一起。

使用PatchGAN作为Discriminator
通常判断都是对生成样本整体进行判断,比如对一张图片来说,就是直接看整张照片是否真实。而且Image-to-Image Translation中很多评价是像素对像素的,所以在这里提出了分块判断的算法,在图像的每个N×N块上去判断是否为真,最终平均给出结果。

目标函数:

条件GAN的目标函数可以表示为:在这里插入图片描述
训练模型D要最大概率地分对真实样本,而生成模型G要最小化,即最大化D的损失。
在这里插入图片描述

为了测试条件对判别器的重要性,本文比较了没有判别器没有x输入的变体形式:
在这里插入图片描述
条件GAN先前的方法发现使用传统的loss(比如L2距离)有利于混合GAN目标方程:加入了L1约束项,使生成图像不仅要像真实图片,也要更接近于输入的条件图片(使用L1距离而不是L2距离,因为L1鼓励更少的模糊)
在这里插入图片描述

最终的目标函数:
在这里插入图片描述

目标函数分析:

loss函数(方程4)中哪个成分更重要?本文进行了模型简化测试(Ablation Study),单独分出L1 loss项,GAN loss项,还比较了加条件(cGAN)/不加条件(GAN)的判别器的情况。

在这里插入图片描述

从上图的结果可以看出,只使用L1 loss会产生图片模糊的问题。只使用cGAN(λ=0)的情况下,生成的图片细节确实更好,但是在一些情况下会有不自然的问题。将两种loss结合(方程4中λ=100)起来能够减轻这种现象。

在这里插入图片描述
使用FCN分数来评价街景标签↔相片的任务(上表所示)。基于GAN的loss函数得到了更高的分数,这表明合成出来的图像包含更多可识别的结构。我们也测试了移除判别器上条件(标记为GAN)的影响。这种情况下。loss没有惩罚输入和输出中不匹配的地方,它只关心生成的图片是否真实,所以结果非常差。L1加上GAN之后可以产生真实且尊重输入的结果,L1+cGAN得分是最高的。

实验及评估

为了探索条件Gans的通用性,本文在各种任务和数据集上测试了该方法,包括图形任务(如照片生成)和视觉任务(如语义分割)。
评估指标:AMT 感知调查、FCN分数
AMT:
简单说就是让人对生成的图像给出主观评价
Turkers接受了一系列试验,将“真实”图像与本文的算法生成的“虚假”图像进行了比较
FCN:
经典的语义分割网络
采用流行的FCN-8s体系结构进行语义分割,并在城市景观数据集上对其进行训练。然后,根据合成照片的标签对合成照片的分类准确率进行评分。

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

余额充值