《Image-to-Image Translation with Conditional Adversarial Networks》论文笔记

            Image-to-Image Translation with Conditional Adversarial Networks

 

重点:提出了一种用于图像翻译任务的通用框架——CGAN用于图像翻译(Pixel2Pixel)。

                                               (paired data)

结构:生成器

判别器:PatchGAN——捕捉高频细节,L1距离(欧式距离)捕捉低频细节

        (N*N patch远小于一张图片的大小:本实验中70*70最佳,更小PatchGAN原因:有更少的参数,运行速度快,可以应用于任何大型数据集。应用:texture和style loss)

目标函数:

        对于图像翻译任务而言,G的输入和输出之间其实共享了很多信息,比如图像上色任务,输入和输出之间就共享了edges信息。因而为了保证输入图像和输出图像之间的相似度。还加入了L1 Loss

具体应用:

  1. 从label maps中合成图像;
  2. 从edge maps中重构图像;
  3. 图像上色;
  4. 语义分割

 


 

实验结果:

  1. 目标函数的ablation study

仅使用L1,可以得到合理的结果,但是会很模糊;仅使用cGAN,可以得到更加清晰的结果但引入了人工的痕迹,L1+cGAN可以减少人工痕迹,图像的清晰度仍然不够。而且在FCN-scores上,L1+cGAN取得了最好的结果,仅使用GAN损失函数的结果最差。

  1. 生成器和判别器的ablation study

1*1为pixelsGAN,286*286为imageGAN,其余为patchGAN。实验证明当patch大小为70*70时,可以获得最佳的实验结果。后期的实验结果显示,pixelGAN能获得更丰富的色彩显示,但对空间清晰度没有什么作用。PatchGAN优点就是固定尺寸的判别器能应用于任意尺寸的图像,比如在256*256图像上训练生成器,在512*512图像上测试。

从上图中可以看到,生成器添加了skip connection后,可以获得更高的成像质量。

  1. 其它应用

基于条件生成对抗网络,对其它图像翻译任务同样适用,比如图像着色、、照片修复、进行语义分割、图像背景移除、素描照片生成等,并且都能取得不错的结果。

 


 

分析

论文提出了一种用于图像翻译任务的通用框架——生成器为U-net、判别器为PatchGAN的cGAN,目标函数中引入了L1距离,可以提升图片的低频细节。并对部分图像翻译任务进行了实验,结果也显示所提出的结构的有效性。但是也有一些问题,比如图片的清晰度不够,纹理不够逼真,生成的图片多样性缺乏;若有人工的痕迹加入,会导致结果的偏差等。但对图像翻译任务来说,是一个重要的启发,也广泛的用在了图像任务上,并通过不断的改进适应,取得了很好的效果。

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

余额充值