G5、Pix2Pix详解
- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
- 🚀 文章来源:K同学的学习圈子
本周任务:
📌 基础任务:
- 了解并学习Pix2Pix算法
- 画出本文代码中Pix2Pix的生成器网络结构(可参考图5)
问题由来¶
在前几周的学习中,我们介绍可用作图像的生成,它在MNIST数据集上取得了非常好的效果。GAN的一个问题是它无法对生成模型生成的数据进行控制,为了解决这个问题,条件GAN(Conditional GAN,CGAN)提出了将在生成模型和判别模型中都加入条件信息来引导模型的训练,实现了生成内容的可控。这里要介绍的 Pix2Pix 是一个以CGAN为基础,用于图像翻译(Image Translation)的通用框架,旨在将一个图像域中的图像转换成另一个图像域中的图像,它实现了模型结构和损失函数的通用化,并在诸多图像翻译数据集上取得了令人瞩目的效果(图1),是进阶GAN,入门图像翻译必读的一篇文章。z合并作为隐含层表达;而在判别器D中,条件信息y则与原始数据x合并作为判别函数的输入。
一、理论基础¶
1、 图像翻译¶
在介绍图像翻译的概念前,我们需要先理解图像内容(Image Content)、图像域(Image Domain)与图像翻译这三个概念。
- 图像内容:指的是图像的固有内容,它是区分不同图像的依据
- 图像域:指在特定上下文中所涵盖的一组图像的集合,这些图像通常具有某种相似性或共同特征。图像域可以用来表示一类具有共同属性或内容的图像。在图像处理和计算机视觉领域,图像域常常被用于描述参与某项任务或问题的图像集合
- 图像翻译:是将一个物体的图像表征转换为该物体的另一个表征,例如根据皮包的轮廓图得到皮包的彩色图。也就是找到一个函数,能让域A的图像映射到域B,从而实现图像的跨域转换
2、CGAN¶
条件生成对抗网络(CGAN)是在生成对抗网络(GAN)的基础上进行了一些改进。对于原始GAN的生成器而言,其生成的图像数据是随机不可预测的,因此我们无法控制网络的输出,在实际操作中的可控性不强。 针对上述原始GAN无法生成具有特定属性的图像数据的问题,Mehdi Mirza等人在2014年提出了条件生成对抗网络,通过给原始生成对抗网络中的生成器G和判别器D增加额外的条件,例如我们需要生成器G生成一张没有阴影的图像,此时判别器D就需要判断生成器所生成的图像是否是一张没有阴影的图像。条件生成对抗网络的本质是将额外添加的信息融入到生成器和判别器中,其中添加的信息可以是图像的类别、人脸表情和其他辅助信息等,旨在把无监督学习的GAN转化为有监督学习的CGAN,便于网络能够在我们的掌控下更好地进行训练。CGAN网络结构如图1所示
由图2的网络结构可知,条件信息y作为额外的输入被引入对抗网络中,与生成器中的噪声z合并作为隐含层表达;而在判别器D中,条件信息y则与原始数据x合并作为判别函数的输入。这种改进在以后的诸多方面研究中被证明是非常有效的,也为后续的相关工作提供了积极的指导作用。
3、U-Net¶
U-Net是一个用于医学图像分割的全卷积模型(图3)。它分为两个部分,其中左侧是由卷积和降采样操作组成的压缩路径,右侧是由卷积和上采样组成的扩张路径,扩张的每个网络块的输入由上一层上采样的特征和压缩路径部分的特征拼接而成。网络模型整体是一个U形的结构,因此被叫做U-Net
分割任务是图像翻译任务的一个分支,因此U-Net也可以被用作其它的图像翻译任务,这里要介绍的Pix2Pix便是采用了U-Net作为主体结构。
二、Pix2Pix解析¶
在Pix2Pix中,图像翻译任务可以建模为给定一个输入数据 x 和随机噪声 z ,生成目标图像 y ,即 G:{x,z}→y。与传统的CGAN不同的是,在Pix2Pix中判别器的输入是生成图像 G(x)(或者是目标图像 y )和源图像 x ,而生成器的输入是源图像 x 和随机噪声 z ,如图4所示
1、损失函数¶
因为Pix2Pix和CGAN的输入数据不同了,所以它们的损失函数也要对应的进行调整,CGAN的损失函数可表示为式(3) $\mathcal{L}_{\mathrm{cGAN}}(G, D)=\mathbb{E}_{x, y}[\log D(x, y)]+\mathbb{E}_{x, z}[\log (1-D(x, G(x, z)))]$
如[5]中所介绍的,我们可以在损失函数中加入正则项来提升生成图像的质量,不同的是Pix2Pix使用的是L1正则和不是[5]中使用的L2正则,如式(4)。使用L1正则有助于使生成的图像更清楚。 $\mathcal{L}_{L 1}(G)=\mathbb{E}_{x, y, z}\left[\|y-G(x, z)\|_{1}\right]$
我们最终目标是在正则约束情况下的生成器和判别器的最大最小博弈,如式(5) $G^{*}=\arg \min _{G} \max _{D} \mathcal{L}_{c G A N}(G, D)+\lambda \mathcal{L}_{L 1}(G)$ 之所以在生成数据中加入随机噪声 z ,是为了使生成模型生成的数据具有一定的随机性,但是实验结果表明完全随机的噪声并不会产生特别有效的效果。在这里,Pix2Pix是通过在生成器的模型层中加入Dropout来引入随机噪声的,但是Dropout带来输出内容的随机性并没有很大。
2、模型结构¶
Pix2Pix使用了CNN中常用的卷积 + BN + ReLU的模型结构,它们的具体细节介绍如下
2.1 生成器¶
对于图像翻译这类任务来说,经典的编码器-解码器结构是最优的选择。Pix2Pix的官方源码是使用Lua实现的,这里我们通过它的官方源码给出Pix2Pix的具体结构,如图5。需要注意如下几点细节:
- Pix2Pix使用的是以U-Net为基础的结构,即在压缩路径和扩张路径之间添加一个跳跃连接;
- Pix2Pix的输入图像的大小是256×256
- 每个操作仅进行了三次降采样,每次降采样的通道数均乘以2,初始的通道数是64;
- 在压缩路径中,每个箭头表示的操作是卷积核大小为 4×4 的相同卷积+BN+ReLU,它根据是否降采样来控制卷积的步长;
- 在扩张路径中,它使用的是反卷积上采样;
- 压缩路径和扩张路径使用的是拼接操作进行特征融合
2.2 判别器(PatchGAN)¶
传统GAN的一个棘手的问题是它生成的图像普遍比较模糊,一个重要的原因是它使用了整图作为判别器的输入。不同于传统的方法,将整个图像作为判别器判别的目标(输入),Pix2Pix提出了将输入图像分成 N×N 个图像块(Patch),然后将这些图像块依次提供给判别器,因此这个方法被命名为PatchGAN,PatchGAN可以看做针对图像纹理的损失。表1的实验结果表明,当 N=70 时模型的表现最好,但是从图6的生成图像来看,N 越大,生成的图像质量越高。其中 1×1 大小的图像块的判别器又被叫做PixelGAN
对于不同大小的N,我们需要根据N的值来调整判别器的层数,进而得到最合适的模型感受野,我们可以根据表2给出的层数计算出模型的感受野,进而选择Patch的大小和层数的关系
3、代码运行¶
直接运行pix2pix.py即可
4、总结¶
Pix2Pix是图像翻译必读的文章之一,它的核心技术有三点:基于CGAN的损失函数,基于U-Net的生成器和基于PatchGAN的判别器。Pix2Pix 能够在诸多图像翻译任务上取得令人惊艳的效果,但因为它的输入是图像对,因此它得到的模型还是有偏的。这里的有偏指的是模型能够在与数据集近似的 x 的情况下得到令人满意的生成内容,但是如果输入 x 与训练集的偏差过大,Pix2Pix 得到的结果便不那么理想了
dd