论文阅读: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[logD(x,y)]+Ex,z[log(1D(x,G(x,z)))]

  • 判别器 D(x,y):输出的值表示它认为这个图像对是否真实的概率。
  • 生成器 G(x,y):试图让 D(x,G(x,z)) 尽可能接近1。
  • 判别器 D 的目标是最大化该损失函数,它希望尽量分清楚真实图像 y 和生成的伪造图像 G(x,z)。
  • 生成器 G 的目标是最小化该损失函数,它希望生成的图像尽可能逼真,欺骗判别器。
  • z 表示随机噪声向量,它是从某个预定义的概率分布(如高斯分布或均匀分布)中采样得到的。
  • D(x, y) 值大:判别器认为输入的图像是真实的。
  • D(x, G(x, z)) 值大:生成器生成的图像质量高,足以欺骗判别器。
  • D(x, G(x, z)) 值小:生成器的图像质量差,判别器成功识别出它是伪造的。
  • L c G A N ( G , D ) L_{cGAN}(G, D) LcGAN(G,D)越大: 判别器 D 在识别生成器 G 的假图像方面做得更好;生成器 G 还需要进一步改进,以生成更逼真的图像。
  • L c G A N ( G , D ) L_{cGAN}(G, D) LcGAN(G,D)越小:生成器 G 的图像质量足够好,以至于判别器 D 很难区分真实图像和生成图像。
  • E \mathbb{E} E 代表 期望值(Expectation),即随机变量取不同值的加权平均。

其中,生成器 G 尝试最小化这个目标函数,而判别器 D 尝试最大化它,即:
G ∗ = arg ⁡ min ⁡ G max ⁡ D L c G A N ( G , D ) G^* = \arg\min_G \max_D L_{cGAN}(G, D) G=argGminDmaxLcGAN(G,D)

  • arg ⁡ \arg arg 表示取得某个函数最优值(最小值或最大值)时的输入参数。

无条件GANs:
L G A N ( G , D ) = E y [ log ⁡ D ( y ) ] + E x , z [ log ⁡ ( 1 − D ( G ( x , z ) ) ) ] L_{GAN}(G, D) = \mathbb{E}_{y}[\log D(y)] + \mathbb{E}_{x,z}[\log(1 - D(G(x, z)))] LGAN(G,D)=Ey[logD(y)]+Ex,z[log(1D(G(x,z)))]

将GAN的目标与更传统的损失(如L2距离)结合起来是有益的。生成器不仅需要欺骗判别器,还需要在L2意义上接近真实输出:
L L 1 ( G ) = E x , y , z [ ∥ y − G ( x , z ) ∥ 1 ] L_{L1}(G) = \mathbb{E}_{x,y,z}[\|y - G(x, z)\|_1] LL1(G)=Ex,y,z[yG(x,z)1]
最终目标:
G ∗ = arg ⁡ min ⁡ G max ⁡ D ( L c G A N ( G , D ) + λ L L 1 ( G ) ) G^* = \arg \min_G \max_D \left( L_{cGAN}(G, D) + \lambda L_{L1}(G) \right) G=argGminDmax(LcGAN(G,D)+λLL1(G))

没有随机变量 z z z 会生成确定性输出,但生成器很容易学会忽略噪声。
本文模型中,噪声仅通过 dropout 的形式引入,应用于生成器的多个层级,且在训练和测试时都使用。
尽管存在 dropout 噪声,但网络输出的随机性较小。

3.2 Network architectures——网络体系结构


生成器和判别器都使用卷积BatchNorm ReLu形式的模块。

3.2.1 Generator with skips——带有跳跃连接的生成器


  • 借鉴 U-Net

许多图像转换问题,输入和输出之间共享大量低级信息,因此直接传递这些信息会更为理想。
例如,在图像上色的情况下,输入和输出共享显著边缘的位置。

本文添加了跳跃连接,在每一层 i 和第 n - i 层之间添加了跳跃连接,其中 n 是总层数。
每个跳跃连接简单地将层 i 的所有通道与层 n - i 的通道进行级联。

3.2.2 Markovian discriminator (PatchGAN)——马尔可夫鉴别器(PatchGAN)


image.png

L2 损失以及 L1 损失(见图 3),能准确捕捉低频信息,无法捕捉高频信息。
所以,对于低频的正确性,L1 损失已经足够了。
这促使本文将 GAN 判别器限制为仅建模高频结构,并依赖 L1 项来强制低频的正确性(公式 5)。

对于高频信息,限制关注局部图像块中的结构是足够的。
本文设计了一种判别器架构——PatchGAN,它仅对图像块级别的结构进行惩罚。
这个判别器试图判别图像中的每个 N×N 块是否真实。在图像上以卷积方式运行这个判别器,对所有响应进行平均以提供最终的 D 输出。
N 可以比图像的全尺寸小得多,仍能产生高质量的结果。较小的 PatchGAN 参数更少,运行速度更快。

判别器有效地将图像建模为马尔可夫随机场,将图像的复杂性简化为局部结构的依赖。

马尔可夫性:图像中的像素只与其邻近像素直接相关,而与较远的像素是条件独立的。即一个像素的状态(如颜色或强度)只依赖于其局部邻域(Patch)中的像素,而不直接依赖于远处的像素。

局部依赖性和条件独立性

3.3 Optimization and inference——优化与推理


优化:

在判别器 D 上进行一次梯度下降步骤,然后在生成器 G 上进行一次该步骤。
用小批量的随机梯度下降(SGD)并应用 Adam 优化器 。

推理:

以与训练阶段完全相同的方式运行生成器网络。
在测试时应用了 dropout,并使用测试批次的统计数据进行批量归一化,而不是使用训练批次的汇总统计数据。
当批量大小设置为1时,这种批量归一化方法被称为“实例归一化”。
本文实验使用了1到10之间的批量大小。

4. Experiments


在所有情况下,输入和输出仅为1-3通道图像。

4.1 Evaluation metrics——评估指标


首先,本文在 Amazon Mechanical Turk (AMT) 上进行“真实 vs 假”感知研究。该方法更符合人类观察者的合理性。
其次,衡量合成的城市景观是否足够逼真,使得现成的识别系统能够识别其中的对象。

AMT perceptual studies——AMT知觉研究


Turkers 会被呈现一系列对比试验,展示由我们的算法生成的“假”图像与“真实”图像。
在每次试验中,每张图像显示1秒,之后图像消失,Turkers 会有无限时间来选择哪张是假的。每个会话的前10张图像是练习,Turkers 会收到反馈。在正式实验的40次试验中不再提供反馈。每次会话只测试一种算法,且 Turkers 不允许完成多个会话。
所有图像都以 256 × 256 分辨率展示。
没有设置警觉性试验。

FCN-score——FCN评分


采用 FCN-8s 语义分割架构,并在 cityscapes 数据集上对其进行训练。
通过生成照片的分类准确率,来对这些照片根据其来源标签进行评分。

4.2 Analysis of the objective function——目标函数分析


  1. 比较 L1 项和 GAN 项的影响;
  2. 比较基于输入条件的判别器与非条件判别器的影响。

image.png

单独使用 L1 会得到合理但模糊的结果。
单独使用 cGAN(设置λ=0)会得到更清晰的结果,但在某些应用中会引入视觉伪影。
将这两个项相加(λ=100)可减少这些伪影。

在 cityscapes 标签→照片任务上使用 FCN 评分量化观察结果:

image.png

基于 GAN 的目标取得了更高的分数,表明合成的图像包含了更多可识别的结构。
测试去除判别器条件的效果(标记为 GAN)。在这种情况下,损失loss不会惩罚输入和输出之间的不匹配;它只关心输出是否看起来真实。这种变体表现非常差,结果显示,生成器在输入照片不同的情况下几乎生成相同的输出。
显然,损失衡量输入和输出之间的匹配质量非常重要,确实,cGAN的表现比GAN好得多。
添加 L1 项也鼓励输出符合输入,因为 L1 损失会惩罚 ground truth 输出(正确匹配输入)与 synthesis 输出(可能不匹配)的距离。因此,L1+GAN 在创建符合输入标签图的真实渲染方面也很有效。
结合所有项,L1+cGAN 的表现也同样优秀。

Colorfulness——色彩度:

cGANs 的一个显著效果是,它们能生成清晰的图像,即使在输入标签图中不存在空间结构时也会进行“幻觉”生成。
人们可能会认为 cGANs 在光谱维度上也有类似的“锐化”效果——使图像更具色彩感。
对抗损失原则上可以意识到灰色输出不现实,并鼓励匹配真实的颜色分布。

L1 损失在不确定边缘具体位置时会鼓励模糊,当不确定像素应采用哪个可能的颜色值时,它也会鼓励选择一种平均的、灰色的颜色。L1 损失会通过选择可能颜色的条件概率密度函数的中位数来最小化。

图表显示了 Lab 色彩空间中输出颜色值的边际分布:
image
Ground truth 分布用虚线表示。
L1 损失导致的分布比真实分布更窄,确认了 L1 鼓励平均灰色颜色的假设。
cGANs 能将输出分布推向更接近真实分布。

4.3 Analysis of the generator architecture——生成器结构分析


图 4 比较了 U-Net 和编码器-解码器在城市景观生成中的表现:

image.png

4.4 From PixelGANs to PatchGans to ImageGANs——从像素到PatchGans再到ImageGANs


判别器接收场 patch 大小 N 的变化效果:
image.png

FCN 评分量化了这些效果:
image.png

本文中所有实验均使用 70 × 70 的 PatchGAN,而在本节中所有实验都使用了 L1+cGAN 损失。
PixelGAN 对空间清晰度没有影响,但确实增加了结果的色彩丰富性。
颜色直方图匹配是图像处理中的一个常见问题,PixelGAN 可能是一个有前景的轻量级解决方案。

Fully-convolutional translation——全卷积平移:

卷积式地应用生成器,然后在比训练时更大的图像上进行测试。
在 256×256 图像上训练生成器后,在 512 × 512 图像上进行了测试:

image.png

4.5 Perceptual validation——感知验证


地图↔照片任务上的 AMT 实验结果:
image.png

地图↔照片任务本模型显著高于 L1 基线。
照片→地图任务偏低的原因可能是在地图中,轻微的结构错误由于其严格的几何形状更加明显,而在更加混乱的航拍照片中则不太显眼。

彩色化任务实验结果:
image.png

cGANs 的得分与 L2 变体相似,但未能达到完整方法的水平,后者是专门为彩色化任务设计的。

4.6 Semantic segmentation——语义分割


在 cityscape 数据集上训练了一个 cGANs(有/无 L1 损失),用于从照片生成标签:
image.png
image.png

未使用 L1 损失训练的 cGANs 在一定程度上能够解决该问题。
这是第一次展示 GAN 成功生成“标签”而非“图像”,前者几乎是离散的,而后者具有连续值的变化。

4.7 Community-driven Research——社区推动研究


image.png

5. Conclusion


cGANs 对于许多图像到图像转换任务来说是一个很有前景的方法,尤其是涉及高度结构化图形输出的任务。
这些网络学习了一种适应特定任务和数据的损失函数,这使得它们可以应用于多种场景。

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

余额充值