004_SSSS_ Image-to-Image Translation with Conditional Adversarial Networks

本文介绍了一种基于条件对抗网络的图像到图像转换方法——Pixel2Pixel。该方法使用条件生成对抗网络(cGAN),通过结合GAN损失和L1损失,有效地实现了如语义分割和灰度图着色等任务。实验表明,这种方法能够产生清晰且细节丰富的输出。

Image-to-Image Transation with Conditional Adversarial Networks

这篇文章一般被称作Pixel2Pixel, 本文提出了一种Conditional GAN(cGAN)来作为image-to-image Translation任务的framework. 不同于传统的GAN的Generator输入只有噪声, cGAN的输入除了噪声还有条件图像x, 而在优化目标方面每个条件图像x都有与之对应的ground_truth图像可以用来约束输出.

Image-to-Image Translation任务, 比如真实图到语义图的语义分割, 灰度图到彩色图的着色任务等等

在这里插入图片描述

1. Introduction

在图像处理, 计算机图形学, 计算机视觉等诸多领域, 很多任务都可以被视作是image-to-image Translation的任务. 如果只是用简单的欧氏距离, 也就是常用的L1或者L2的损失优化CNN来实现image-to-image Translation的任务, 通常会得到比较模糊的结果, 这是因为优化欧氏距离一般要最小化所有输出的平均值, 但是欧氏距离在学习低频的信息上有比较好的效果, 所以作者的基本思路就是通过GAN损失来学习高频的信息, 同时加入L1的损失来学习低频信息.
本文的主要有两个主要的贡献, 第一个是提出了一种可以基于条件输入, 给出相应输出的Conditional GAN, 并且证明在很多问题上可以有比较好的结果. 第二个是基于Conditional GAN的框架应用于不同的Image-to-Image Translation问题.

2. Conditional GAN(cGAN)

2.1 网络结构

GAN网络包含两个部分, Generator和Discriminator.
本文的Generator采用了Unet结构, 并加入了skip connection.

在这里插入图片描述

之前的很多网络都采用了Encoder-Decoder的结构, 也就是通过一系列Encoder层, 将输入图像不断降采样直到bottleneck, 然后再通过Decoder层不断上采样得到输出. 在这样的网络结构中, 图像的信息会串行的通过所有的层. 但是对于image Translation问题, 许多low-level的信息在输出图像中要和输入图像保持大概的相似, 比如对于着色任务, 图像的所有的边缘信息是需要完全保留下来的, 那么直接将这些信息从Encoder层传到对应的Decoder层会更好一些. 所以作者采用了一种skip connection将Encoder的结果直接传送到相应的Decoder然后concatenate起来.

Discriminator采用了PatchGAN Discriminator结构.
作者希望通过GAN损失来约束高频的信息, 所以作者设计了这种PatchGAN从而只约束patch级别的结构信息. PatchGAN Discriminator将图像分成NxN个patch, 然后判断每个patch的真假.

2.2 优化目标

优化的目标包含两个部分, 第一个部分是GAN的损失, 用来约束高频的信息, 第二个部分是输出图像与输入条件x对应的Ground_truth图像的L1损失, 用来约束低频的信息.

在这里插入图片描述

第二部分的L1损失如下所示, 形式很简单不再赘述

在这里插入图片描述

第一部分的GAN损失, 作者测试了两种形式, 第一种的Discriminator的输入中不包含条件图像x, 作者将其称作GAN损失

在这里插入图片描述

第二种的Discriminator的输入中包含了条件图像x, 这种作者将其称作cGAN损失

在这里插入图片描述

作者指出, 第二种加入了条件图像x的损失, 达到的效果要比第一种好.

3. 实验结果

首先是不同的损失得到的结果

在这里插入图片描述

在这里插入图片描述

可以看出L1和cGAN损失得到的效果最好

作者还测试了Encoder-Decoder结构的生成器与skip connection Unet的生成器的效果

在这里插入图片描述
更多的实验结果请参考原文.

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

余额充值