Image-to-Image Translation with Conditional Adversarial Networks

Image-to-Image Translation with Conditional Adversarial Networks

论文主要内容:

1.提出了一种对于gan的理解

对于很多任务,我们都需要自己设计目标函数,来使得网络达到我们想要的任务和目的。而gan网络的出现,使得我们无需再手工设计我们的目标函数,而是利用gan网络来通过数据来“自动生成”我们想要的损失目标。文中提到,对于cnn 网络,能够应用在分类或者检测上,但是依然需要去设计高效的损失去达到目的。如果能够设定一个高级的目标,诸如“生成一张以假乱真的图片”,然后让网络自己学习损失,是文中想要表述的目的。

2.提出了一种image-to-image 的通用框架

类比于语言翻译,这里可以引用到任何的图像之间的翻译转换。

3.提出了Conditional gan 网络

1.逐像素的分类和回归,中对于结构是“看不见的”,这些方法只会认为每一个像素都是条件独立的,彼此之间的联系没有考虑进来。

2.c gan 能够看见结构之间的差异,对于毗连的结构能够起到监督和惩罚作用

3.在生成网络上,提出一种新的网络,U-Net ,

区别:

encoder-decoder : 输入网络,逐渐下采样,然后到了bottomneck,不断上采样,输入和输出,共享的是抽象的特征

U-Net:通过将 第 i层 和第 n-i 层的网络之间进行concatentes ,其中n为总共的网络层数,有助于低级特征,就是更细节的特征进行前后的传输。

4.在判别器网络上,提出一种PatchGan的分类器,能够对缩放的图片进行结构上的监督和惩罚

5.普通gan和cgan之间的差异

c gan公式

 其中 x 是输入图像,z 是噪声向量, y是最终的输出的fake 图像

c gan 的训练流程

 其中cgan 的训练流程和普通gan 的区别在与,cgan的生成器和判别器都能看见输入图像的边界图,也就是上图的x

普通gan的公式如下:

可以看到,这里的判别器只看见 最终丢给他的真图或者生成的假图

另外,文中提出,使用L1损失,对于图像生成的模糊的程度,相比L2损失来说,降低了很多

L1损失公式如下:

最终的目标公式:

如果没有加入噪声z 的问题在于,原先的gan网络会生成确定的输出,因此不能匹配除函数以外的任何分布。

 

6.patchGan的特点

L1损失专注于低频结构,而patchGan的损失专注于高频结构

做法:将图像最后进行缩放成N*N大小的patch,然后对这N*N个单元,进行逐个元素的 real or fack 的判断。判断形式就是二分类的损失函数,对于每一个单元做二分类的交叉损失,来确定,每一个每一个块是不是对应的这么图和假图,因为这样能确认缩放的每一块是不是最终的真图和假图。

patchGan可以认为是一种风格损失,将图像建模为一种马尔科夫随机场,并假设像素之间的独立距离大于一个斑块的直径。

4.实验部分:

L1损失:倾向于使用条件概率密度的中间值来给图片上色

cGan:使颜色分布向着更正确的方向进行激励

cgan的匹配性质的颜色分布,这里的颜色分布是基于Lab色彩空间,分别含有L,a,b分量,(https://zh.wikipedia.org/wiki/Lab%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4)可以看到 L1 损失更加倾向于平均的,灰度的的颜色生成,而增加了cgan的作用在于,使得颜色分布更加接近于真实图像

基于语义分割的实验

将复杂的图输入,生成对应的map图,然后丢给分类器进行分类进行定量分析,结果发现L1损失的效果更好,

实验猜测:对于某些更确定的目的。比如说判断输出是不是更接近于ground truth ,而不是绘图方面,在这方面的的L1损失可能会比cgan要有效。

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

余额充值