pix2pix算法原理与实现

介绍Pix2pix算法,一种基于条件对抗性网络的图像到图像转换技术,利用U-Net和PatchGAN解决图像翻译问题。

一、算法名称

Pix2pix算法(Image-to-Image Translation,图像翻译)
来源于论文:Image-to-Image Translation with Conditional Adversarial Networks

二、算法简要介绍、研究背景与意义

2.1介绍
图像处理、图形学和视觉中的许多问题都涉及到将输入图像转换为相应的输出图像。这些问题通常使用特定于应用程序的算法来处理,尽管设置总是相同的:将像素映射到像素。条件对抗性网(cGAN)是一种通用的解决方案,它似乎能很好地解决各种各样的此类问题。本文介绍基于cGAN的pix2pix模型算法,针对不同的图片生成任务进行测试。
图像处理、计算机图形学和计算机视觉中的许多问题都可以归结为将输入图像“翻译”成相应的输出图像。正如一个概念可以用英语或法语表达一样,一个场景可以被渲染成RGB图像、梯度场、边缘图、语义标记图等。类比自动语言翻译,同样可以定义image-to-image翻译作为翻译的一个可能表示的任务场景到另一个,得到足够的训练数据。
卷积神经网络(CNNs)已经成为各种图像预测问题背后的常用工具,cnn学会了将损失函数最小化,这是一个衡量结果质量的目标,尽管学习过程是自动的,但设计有效损失仍然需要大量的手工努力。换句话说,我们仍然需要告诉CNN我们希望它最小化什么。如果要求CNN最小化预测像素和真实像素之间的欧几里德距离,就会产生模糊的结果。这是因为欧氏距离是通过平均所有可能的输出而最小化的,这会导致模糊。提出损失函数来迫使CNN做我们真正想做的事情。
如果我们只指定一个高级目标,比如“使输出与现实难以区分”,然后自动学习一个适合于满足这个目标的损失函数,那将是非常可取的。这正是最近提出的生成式对抗网络(GANs)所做的。GANs学习了一种损失,它试图对输出图像的真伪进行分类,同时训练生成模型来最小化这种损失。模糊的图像是不能容忍的,因为它们看起来很明显是假的。由于GANs学会了适应数据的损失,他们可以应用于许多任务,而这些任务在传统上需要非常不同的损失函数。条件GANs (cGANs)学习的是条件生成模型。这使得cGANs适合于图像到图像的转换任务,其中对输入图像设定条件并生成相应的输出图像。本报告主要介绍一种条件生成对抗网络延申模型pix2pix,并解释相关原理与计算公式,测试数据并展示。

2.2研究背景与意义
图像到图像的转换问题通常用像素分类或回归来表述,这些公式将输出空间视为“非结构化”,即每个输出像素被认为是有条件地独立于给定输入图像的所有其他像素。相反,有条件GANs学会了结构性损失。结构化损失会影响输出的联合配置。已经存在大量文献考虑了这类损失,方法包括条件随机场、SSIM度量、特征匹配、非参数损失、卷积伪先验、基于匹配协方差统计的损失。有条件GAN的不同之处在于损失是可习得的,并且在理论上可以惩罚输出和目标之间任何可能的不同结构。以前和现在的作品都将GANs限制在离散标签,文本,以及图像上。图像条件模型处理了法线映射的图像预测,未来帧预测,产品照片生成,以及稀疏标注的图像生成。同样也有几篇论文使用了GANs来进行图像到图像的映射,但只是应用了普通的GAN技术,依赖于其他法则(如L2回归)来强制输出以输入为条件。每一种方法都是为特定的应用量身定做的。Pix2pix框架的不同之处在于,没有什么是特定于应用程序的。这使得设置比大多数其他设置简单得多。在生成器和鉴别器的几种架构选择上,本次实验的方法也与之前的工作有所不同。pix2pix模型生成器使用基于“U-Net”的架构,而鉴别器使用卷积的“PatchGAN”分类器,它只在图像patch的尺度上对结构进行惩罚。之前提出了一个类似的PatchGAN建筑来获取当地的风格统计。在本次实验结果中展示了这种方法在更广泛的问题上是有效的。

三、问题描述

在这里插入图片描述
                                            图1
如图1所示,训练一个cGAN将轮廓图映射为照片。鉴别器D学习对假图片(由生成器合成)和真实图片组进行分类。生成器G,学会欺骗鉴别器。与普通GAN不同,生成器和鉴别器都观察输入的轮廓图与生成图片或真实图片,普通GAN直接输入生成图片或真实图片。

四、算法设计与步骤

4.1目标函数
条件GAN的目标函数,一般的cGAN的目标函数如下,生成器 G 不断的尝试minimize下面的目标函数,而D则通过不断的迭代去maximize这个目标函数,即G∗= arg minG maxD LcGAN (G, D):
在这里插入图片描述

同时也比较一个无条件变量,其中判别器不观察x:

在这里插入图片描述

将GAN目标与更传统的损失混合是有益的。鉴别器的工作保持不变,但生成器的任务不仅欺骗鉴别器,而且在L2意义上接近地面真值输出。我在本测试实验中选择使用L1距离而不是L2,因为L1可以减少模糊:
在这里插入图片描述

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

没有z,网络仍然可以学习从x到y的映射,但会产生确定性的输出,因此无法匹配除脉冲函数以外的任何分布。输入图像用y表示,输入图像的边缘图像用x表示,pix2pix在训练时需要成对的图像(x和y)。x作为生成器G的输入(随机噪声z在图中并未画出,去掉z不会对生成效果有太大影响,但假如将x和z合并在一起作为G的输入,可以得到更多样的输出)得到生成图像G(x),然后将G(x)和x基于通道维度合并在一起,最后作为判别器D的输入得到预测概率值,该预测概率值表示输入是否是一对真实图像,概率值越接近1表示判别器D越肯定输入是一对真实图像。另外真实图像y和x也基于通道维度合并在一起,作为判别器D的输入得到概率预测值。因此判别器D的训练目标就是在输入不是一对真实图像(x和G(x))时输出小的概率值(比如最小是0),在输入是一对真实图像(x和y)时输出大的概率值(比如最大是1)。生成器G的训练目标就是使得生成的G(x)和x作为判别器D的输入时,判别器D输出的概率值尽可能大,这样就相当于成功欺骗了判别器D。

4.2网络结构
在这里插入图片描述

                                           图2
如图2所示,生成器可选择两种经典架构,在本次实验中我所选择的是U-Net结构,生成器和鉴别器都使用卷积形式的模块。
4.2.1生成器

在这里插入图片描述

                                           图3
生成器网络结构图如图3所示,U-Net是德国Freiburg大学模式识别和图像处理组提出的一种全卷积结构。和常见的先降采样到低维度,再升采样到原始分辨率的编解码(Encoder-Decoder)结构的网络相比,U-Net的区别是加入skip-connection,对应的feature maps和decode之后的同样大小的feature maps按通道拼(concatenate)一起,用来保留不同分辨率下像素级的细节信息。U-Net对提升细节的效果非常明显。图像到图像转换问题的一个定义特征是它们将高分辨率输入网格映射到高分辨率输出网格。另外,对于本次实验考虑的问题,输入和输出在表面外观上是不同的,但都是相同的底层结构的渲染。因此,输入中的结构大致与输出中的结构对齐。围绕这些考虑因素来设计生成器架构。在U-Net网络中,输入经过一系列层,逐步向下采样,直到瓶颈层,在此过程反转。这样的网络要求所有的信息流通过所有的层,包括瓶颈。对于许多图像翻译问题,输入和输出之间有大量的低级信息共享,因此直接通过网络传输这些信息是可取的。

4.2.2判别器
利用马尔科夫性的判别器(PatchGAN),pix2pix采用的策略是,用重建来解决低频成分,用GAN来解决高频成分。一方面,使用传统的L1 loss来让生成的图片跟训练的图片尽量相似,用GAN来构建高频部分的细节。
在这里插入图片描述

另一方面,使用PatchGAN来判别是否是生成的图片。PatchGAN的思想是,既然GAN只用于构建高频信息,那么就不需要将整张图片输入到判别器中,让判别器对图像的每个大小为N x N的patch做真假判别就可以了。因为不同的patch之间可以认为是相互独立的。pix2pix对一张图片切割成不同的N x N大小的patch,判别器对每一个patch做真假判别,将一张图片所有patch的结果取平均作为最终的判别器输出。具体实现的时候,本次实验使用的是一个NxN输入的全卷积小网络,最后一层每个像素过sigmoid输出为真的概率,然后用BCEloss计算得到最终loss。这样做的好处是因为输入的维度大大降低,所以参数量少,运算速度也比直接输入一张快,并且可以计算任意大小的图。

五、实验设计与实验结果

1.实验环境
XiaoXin-15IIL 2020
处理器:Intel® Core™ i5-1035G1 CPU @ 1.00GHz 1.19 GHz
机带RAM:16.0 GB (15.8 GB可用)
系统类型:64位操作系统基于x64的处理器
显卡:MX 350

训练:对于建筑物生成任务训练了20个批次,用时10分钟,对于食物上色任务训练了10个批次,用时10分钟。
2.数据集
2.1建筑物生成数据集
采用公共数据集Facades
在这里插入图片描述

                                           图4

在这里插入图片描述

                                           图5
如图4所示,训练数据集中共包含400组类似图片组,左边的图片作为真实图片带入判别器训练,右边图片作为带标签的条件图片,即图片轮廓图,分别带入生成器和判别器进行带标签的训练,测试数据集如图5所示,将右侧图片带入训练完毕后的生成器,生成相应的图片,与左侧的真实图片进行比较,最后输出为一个html文件将测试轮廓图、生成图片和真实图片进行整合查看测试结果。

2.2食物上色数据集

在这里插入图片描述

                                           图6

在这里插入图片描述

                                           图7
如图6所示,训练数据集中共包含7472张彩色实物图,右边为实物图,我将右边的彩色图RGB三通道数据全部转为灰度图数据,左边的图片为灰度图数据,将灰度图作为带标签的条件图片,即图片轮廓图,分别带入生成器和判别器进行带标签的训练,右边图片作为真实图片带入判别器训练,测试数据集如图5所示,将左侧图片带入训练完毕后的生成器,生成相应的图片,与右侧的真实图片进行比较,最后输出为一个html文件将测试轮廓图、生成图片和真实图片进行整合查看测试结果。
3.评价指标
观察生成图片与原图对比,对于建筑物生成实验,若能够生成完整建筑图并且能够与原图相近,则视为结果效果比较好。对于食物上色实验,若能够生成完整的上色食物图,且能够接近与原图颜色则视为效果比较好。

4.实验结果分析(实验结果可查看附件测试图片文件夹或html文件)
4.1建筑物生成
在这里插入图片描述

                                           图8
如图8所示,左边一竖图片为标签图,右边一竖图片为原图,中间为测试结果,根据测试结果可知,已能够初步还原建筑图,随着训练批次的增加,效果可能更加明显。(建筑物生成图测试结果可在文件夹facades_test中查看,所有测试数据量过大,附件中只给出了十组对比图)

4.2食物上色
在这里插入图片描述

                                           图9
如图9所示,左边一竖图片为标签图,右边一竖图片为原图,中间为测试结果,根据测试结果可知,已能够初步还原食物原图,随着训练批次的增加,效果可能更加明显。(食物上色图测试结果可在文件夹colorlization_food_test中查看,所有测试数据量过大,附件中只给出了十组对比图)

六、算法优化(可选)

pix2pix能够解决一类“图像翻译”问题。但是pix2pix模型要求训练样本必须是“严格成对”的,这种样本往往比较难以获得。如果采用改进算法cycleGAN则不必使用成对样本也可以进行“图像翻译”。
在这里插入图片描述

                                           图10
如图10所示,有一些你想转换风格的真实图片,这两种图片是没有任何交集的。在之前提到的Pix2Pix方法的关键是提供了在这两个域中有相同数据的训练样本。CycleGAN的创新点在于能够在源域和目标域之间,无须建立训练数据间一对一的映射,就可实现这种迁移。主要是运用了两个判别器,改写相关loss函数如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关算法设计不再做解释,本次实验主要针对pix2pix算法做研究与实验,cycleGAN可作为下一阶段的研究目标。

八、总结与展望

pix2pix巧妙的利用了GAN的框架来为“Image-to-Image translation”的一类问题提供了通用框架。利用U-Net提升细节,并且利用PatchGAN来处理图像的高频部分。但同时训练需要大量的成对图片,比如白天转黑夜,则需要大量的同一个地方的白天和黑夜的照片。本次实验中采用了大量标签数据,这在现实生活中应用效果不一定好,采用cycleGAN的话可以有效解决数据标签的问题,实现由一个类别转换为另一个类别的图片翻译,接下来的任务是对cycleGAN进行研究,总结相关算法。

06-24
### Pix2Pix 模型简介 Pix2Pix 是一种基于条件生成对抗网络(cGAN)的图像到图像转换模型。它主要用于将输入图像转换为具有特定风格或结构的输出图像。例如,它可以将草图转换为逼真的图像,或将语义分割图转换为照片。 #### 模型架构 Pix2Pix 模型由两个主要部分组成:生成器和判别器。 - **生成器**:通常使用 U-Net 架构,该架构包括编码器和解码器。编码器负责提取输入图像的特征,而解码器则负责生成目标图像。 - **判别器**:通常使用 PatchGAN,它对图像的每个局部区域进行分类,而不是整个图像。这种方法能够更好地保留细节。 #### 损失函数 Pix2Pix 使用两种损失函数来训练模型: - **对抗损失**:通过判别器来衡量生成器生成的图像真实图像之间的差异。 - **L1 损失**:用于确保生成的图像目标图像在像素级别上尽可能相似。 #### 数据准备 为了训练 Pix2Pix 模型,需要准备成对的图像数据集。每对图像中的一张是输入图像,另一张是对应的目标图像。例如,在草图转照片的任务中,输入图像是草图,目标图像是对应的彩色照片。 #### 训练过程 训练过程中,生成器试图生成尽可能接近目标图像的图像,而判别器则试图区分生成的图像和真实的目标图像。通过不断迭代,生成器逐渐学会生成更逼真的图像。 #### 使用方法 以下是一个简单的 Pix2Pix 模型实现示例,使用 TensorFlow 和 Keras: ```python import tensorflow as tf from tensorflow.keras import layers, Model # 定义生成器 def make_generator(): inputs = tf.keras.Input(shape=[256, 256, 3]) down_stack = [ downsample(64, 4, apply_batchnorm=False), # (batch_size, 128, 128, 64) downsample(128, 4), # (batch_size, 64, 64, 128) downsample(256, 4), # (batch_size, 32, 32, 256) downsample(512, 4), # (batch_size, 16, 16, 512) downsample(512, 4), # (batch_size, 8, 8, 512) downsample(512, 4), # (batch_size, 4, 4, 512) downsample(512, 4), # (batch_size, 2, 2, 512) downsample(512, 4), # (batch_size, 1, 1, 512) ] up_stack = [ upsample(512, 4, apply_dropout=True), # (batch_size, 2, 2, 1024) upsample(512, 4, apply_dropout=True), # (batch_size, 4, 4, 1024) upsample(512, 4, apply_dropout=True), # (batch_size, 8, 8, 1024) upsample(512, 4), # (batch_size, 16, 16, 1024) upsample(256, 4), # (batch_size, 32, 32, 512) upsample(128, 4), # (batch_size, 64, 64, 256) upsample(64, 4), # (batch_size, 128, 128, 128) ] initializer = tf.random_normal_initializer(0., 0.02) last = layers.Conv2DTranspose(3, 4, strides=2, padding='same', kernel_initializer=initializer, activation='tanh') # (batch_size, 256, 256, 3) x = inputs skips = [] for down in down_stack: x = down(x) skips.append(x) skips = reversed(skips[:-1]) for up, skip in zip(up_stack, skips): x = up(x) x = layers.Concatenate()([x, skip]) x = last(x) return Model(inputs=inputs, outputs=x) # 定义判别器 def make_discriminator(): initializer = tf.random_normal_initializer(0., 0.02) gamma_init = tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.02) inp = tf.keras.Input(shape=[256, 256, 3], name='input_image') tar = tf.keras.Input(shape=[256, 256, 3], name='target_image') x = layers.concatenate([inp, tar]) # (batch_size, 256, 256, channels*2) down1 = downsample(64, 4, False)(x) # (batch_size, 128, 128, 64) down2 = downsample(128, 4)(down1) # (batch_size, 64, 64, 128) down3 = downsample(256, 4)(down2) # (batch_size, 32, 32, 256) zero_pad1 = layers.ZeroPadding2D()(down3) # (batch_size, 34, 34, 256) conv = layers.Conv2D(512, 4, strides=1, kernel_initializer=initializer, use_bias=False)(zero_pad1) # (batch_size, 31, 31, 512) batchnorm1 = tfa.layers.InstanceNormalization(gamma_initializer=gamma_init)(conv) leaky_relu = layers.LeakyReLU()(batchnorm1) zero_pad2 = layers.ZeroPadding2D()(leaky_relu) # (batch_size, 33, 33, 512) last = layers.Conv2D(1, 4, strides=1, kernel_initializer=initializer)(zero_pad2) # (batch_size, 30, 30, 1) return Model(inputs=[inp, tar], outputs=last) # 下采样层 def downsample(filters, size, apply_batchnorm=True): initializer = tf.random_normal_initializer(0., 0.02) gamma_init = tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.02) result = tf.keras.Sequential() result.add(layers.Conv2D(filters, size, strides=2, padding='same', kernel_initializer=initializer, use_bias=False)) if apply_batchnorm: result.add(tfa.layers.InstanceNormalization(gamma_initializer=gamma_init)) result.add(layers.LeakyReLU()) return result # 上采样层 def upsample(filters, size, apply_dropout=True): initializer = tf.random_normal_initializer(0., 0.02) gamma_init = tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.02) result = tf.keras.Sequential() result.add(layers.Conv2DTranspose(filters, size, strides=2, padding='same', kernel_initializer=initializer, use_bias=False)) result.add(tfa.layers.InstanceNormalization(gamma_initializer=gamma_init)) if apply_dropout: result.add(layers.Dropout(0.5)) result.add(layers.ReLU()) return result ``` #### 应用场景 Pix2Pix 模型可以应用于多种图像到图像的转换任务,包括但不限于: - **图像修复**:填补图像中的缺失部分。 - **风格迁移**:将一张图像的风格应用到另一张图像上。 - **图像增强**:提高图像的质量或分辨率。 #### 注意事项 - 在实际应用中,数据集的大小和质量对模型性能有很大影响。 - 超参数的选择(如学习率、批量大小等)也需要根据具体任务进行调整。 - 训练过程中应定期保存模型,并监控验证集上的表现以防止过拟合。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值