<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>TwistedW's Home</title>
    <link>http://www.twistedwg.com/</link>
    <description>喜欢跑步，经常跑5公里。喜欢在夜晚长跑，忘记一切烦恼和压力。</description>
    
      <item>
        <title>NVIDIA针对数据不充分数据集进行生成改进，大幅度提高Cifar10数据生成</title>
        <link>http://www.twistedwg.com//2020/06/24/ADA.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2020/06/24/ADA.html</guid>
        <pubDate>Wed, 24 Jun 2020 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;生成对抗网络因其优异的生成质量而得到广泛的关注，然而想要得到高质量的生成结果往往需要大批量的训练数据进行加持才能训练出逼真的生成结果，这点在各大主流优秀的生成对抗网络模型下得到验证。一旦训练数据不足的情况下能否得到优秀的结果，能否让判别器不去过度拟合训练样本呢？这个问题由来自NVIDIA的研究者付诸行动并给出了一定的解决方案，本文将共同来阅读论文&lt;a href=&quot;https://arxiv.org/abs/2006.06676&quot;&gt;“Training Generative Adversarial Networks with Limited Data”&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;庞大的数据集在背后推动着生成模型的发展，然而为特定应用收集足够大的图像集是存在挑战的，这要求数据要对主题类型，图像质量，地理位置，时间段，隐私，版权状态等施加限制，就比如CelebA数据集，在人脸位置、质量和图像的大小都存在着严格的要求，这个要求一旦施加在上十万张图像数据集下就是很庞大的工作量。&lt;/p&gt;

&lt;p&gt;而GAN训练的样本量往往是在$10^5 \sim 10^6$量级，这对于医学图像和小样本的数据训练是困难的，往往导致的是判别器过度拟合训练数据，此时判别器对生成器的反馈就会变得毫无意义，并且导致训练出现分歧。文章中做了在不同量级下数据集对生成质量的影响，结果如图1所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gg3pnffy0lj31gc0lkk3j.jpg&quot; height=&quot;300&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图1.不同量级下数据集对生成质量的影响
&lt;/p&gt;

&lt;p&gt;图1a显示了FFHQ不同子集的基线结果，在每种情况下，训练都以相同的方式开始，但是随着训练的进行，FID开始上升。训练数据越少，越早发生。图1b，c显示了训练过程中真实图像和生成图像的判别器输出分布。分布最初是重叠的，但随着判别器变得越来越有把握，它们会保持漂移，FID开始恶化的点与分布之间失去足够的重叠是一致的。由图1c可以看到，当判别器过分拟合训练数据时，即使是真实图像的验证集也会判别和生成数据分布一致，这就是判别器过度拟合到了训练数据上的有力说明。&lt;/p&gt;

&lt;p&gt;既然过拟合问题出现了，而且是由于数据集不足导致的，那能不能扩充数据集（旋转、加噪声）进行解决呢？&lt;/p&gt;

&lt;p&gt;然而扩充数据集往往在训练分类器这样的判别语义信息任务是有效的，但是简单的扩充数据集在GAN中将会导致“泄漏”，这主要是由于数据集的扩充会导致GAN学习生成扩充的数据分布。本文要介绍的论文&lt;a href=&quot;https://arxiv.org/abs/2006.06676&quot;&gt;Training Generative Adversarial Networks with Limited Data&lt;/a&gt;利用多样的数据扩充来防止判别器过度拟合的同时确保扩充不会”泄漏”到生成的图像中。总结一下ADA方法在生成模型上的优势：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ADA可以实现少样本数据下的较好质量的生成&lt;/li&gt;
  &lt;li&gt;ADA可以保证数据扩充前提下防治数据的”泄漏”&lt;/li&gt;
  &lt;li&gt;自适应的判别器增强保证了模型不轻易出现过拟合，模型更加稳定&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;数据不充分下生成改进&quot;&gt;数据不充分下生成改进&lt;/h1&gt;

&lt;p&gt;数据不充分的情况下进行数据扩充无疑是最直接了当的解决方式，传统的GAN训练数据集的任何扩充都将继承到生成的图像，这无疑是数据扩充不希望得到的结果，如何解决呢？&lt;/p&gt;

&lt;h2 id=&quot;数据扩充&quot;&gt;数据扩充&lt;/h2&gt;

&lt;p&gt;平衡一致性正则化（bCR）提出了应用于同一输入图像的两组扩增应产生相同的输出，为判别器损失上添加一致性正则项，也为真实图像和生成的图像实施判别器一致性，而训练生成器时则不应用增强或一致性损失，这部分直观的理解如图2a所示。然而，bCR中生成器可以自由生成包含扩充的图像而不会受到任何惩罚，这就导致了”泄漏”的进一步增强，文章在后面实验部分也验证了bCR确实导致了”泄漏”的发生。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gg3pnzcx43j31g40iy1bp.jpg&quot; height=&quot;280&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图2.bCR与DA下生成模型设计
&lt;/p&gt;

&lt;p&gt;文章设计了一种新的扩充方式，与bCR相似也是对输入到判别器的图像应用了增强。但是，该方法并没有使用单独的CR损失项，而是仅使用增强图像来评估判别器，并且在训练生成器时也要这样做（图2b）。文章称之为判别器增强（discriminator augmentation，DA），这种方法看上去非常简单，甚至你在乍一看都会质疑它是否可以正常工作，是不是会怀疑判别器从未看到训练图像的真实外观的情况下，能否可以正确地指导生成器（图2c）。为此，文章研究了在何种情况下DA不会泄漏对所生成图像的增强。&lt;/p&gt;

&lt;h2 id=&quot;设计不会泄漏的数据扩充da&quot;&gt;设计不会”泄漏”的数据扩充（DA）&lt;/h2&gt;

&lt;p&gt;[1]考虑了训练GAN时的类似问题，并表明只要隐含的过程由数据空间上概率分布的可逆转换来表示，训练就隐式地消除了损坏并找到了正确的分布，称这种增强算子为非泄漏。这些可逆变换的功能在于，它们可以通过仅观察扩充的集合来得出有关基础集合的相等性或不平等性的结论。&lt;/p&gt;

&lt;p&gt;在图2b中，我们可以看到DA设计的时候在数据增强上（数据增强这里可以理解为数据扩充），做了增强概率$p$的设计，以$p &amp;lt;1$的概率进行数据的增强，此时的数据增强将不是绝对的改变数据（旋转、翻转和缩放、色彩增强等），这样生成模型将看到的是更多正常的图像，然而一些数据增强是不会影响最后的生成结果，例如各向同性图像缩放，文章也是利用实验对其它情况进行直观的解释，整个过程如图3所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gg3pocspp4j31gc0nu1kx.jpg&quot; height=&quot;320&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图3.不同增强下p对“泄漏”的影响
&lt;/p&gt;

&lt;p&gt;在图3中，通过三个实际示例来验证我们的分析，上方的图像代表着对应不同$p$的时候，模型生成的图像，这也通过FID进行可视化展示。在a中进行各向同性图像缩放，无论p的值如何，其均不会泄漏。但是在图3b中，当$p$太高时，生成器无法知道生成的图像应面向哪个方向并最终随机选择一种可能性。实际上，由于有限采样，网络的有限表示能力，归纳偏差和训练动态，当p保持在$0.85$以下时，生成的图像始终正确定向。在这些区域之间，生成器有时会最初选择错误的方向，然后向正确的分布部分漂移。对于一系列连续的色彩增强，也具有相同的观察结果（图3c）。该实验表明，&lt;strong&gt;只要$p$保持在0.8以下，实际上就不太可能发生”泄漏”。&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;文章采用的数据扩充方式&quot;&gt;文章采用的数据扩充方式&lt;/h2&gt;

&lt;p&gt;文章借鉴了RandAugment [9]在图像分类任务中的成功，考虑了18种变换的流水线，这些变换分为6类：像素层（x翻转，90°旋转，整数平移），更一般的几何变换，颜色变换，图像空间滤波，加性噪声和抠图。由于在训练生成器时，也会执行增强，这要求增强是可区分的。&lt;/p&gt;

&lt;p&gt;在训练过程中，使用一组固定的预定义变换来处理图像给判别器，增强的强度控制在$p \in [0，1]$控制，在DA设计上，对于所有转换，始终使用相同的p值。随机化是针对每个扩展和一个小批量中的每个图像分别进行，只要p保持在实际安全极限以下，就引导发生器仅产生清晰的图像。&lt;/p&gt;

&lt;p&gt;文章通过对不同的扩充类别和数据集大小对$p$进行详尽的扫描来研究DA的有效性，整个实验结果如图4所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gg3pop6bwdj31g80iwwlx.jpg&quot; height=&quot;280&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图4.不同增强下实验结果
&lt;/p&gt;

&lt;p&gt;在许多情况下，DA可以显着改善结果，最佳增强强度在很大程度上取决于训练数据的数量，绝大多数来自像素层和几何变换上的增强，颜色转换适度有益，而图像空间过滤，噪点和裁切并不是特别有用。曲线还表明，当$p \to 1$时，某些增强会泄漏。对于10k的训练集，$p$的较高值则会起到不好的结果，而对于140k，所有增强都是有害的。根据这些结果，文章最后选择在模型设计上&lt;strong&gt;仅采用像素层，几何和颜色转换&lt;/strong&gt;。图4d显示，&lt;strong&gt;虽然较强的增强会减少过度拟合，但也会减慢收敛速度。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;实际上，当固定增强控制$p$时，对数据集大小的敏感性往往需要进行昂贵的网格搜索，依靠任何固定的p可能不是最佳选择，文章进一步就此问题设计了自适应$p$来解决这些问题。&lt;/p&gt;

&lt;h2 id=&quot;自适应判别器增强ada&quot;&gt;自适应判别器增强（ADA）&lt;/h2&gt;

&lt;p&gt;文章的设计目的是希望避免手动调整增强强度$p$，而是根据过拟合的程度动态控制它。量化过度拟合的标准方法是使用单独的验证集（真实图像数据但是并不在训练集中），并观察其相对于训练集的行为，这个表示方式已经在图1的b和c中体现。当过度拟合开始时，&lt;strong&gt;验证集开始表现得越来越像生成的图像&lt;/strong&gt;。这是可量化数据增强的效果，但这也带来了一问题，就是稍微奢侈了些，尤其是真实样本已经很少了，还要分出来一部分作为验证集。&lt;/p&gt;

&lt;p&gt;训练集$D_{train}$，验证集$D_{validation}$和生成图像$D_{generated}$表示判别器的输出，以及它们在$N$个连续小批处理中的平均值$E [·]$。在实验上，使用$N = 4$，它对于Bitchsize为64时候，也就是处理$4 \times 64 = 256$个图像。文章对图1的观察结果转换为两种可能的过度拟合启发式公式：&lt;/p&gt;

\[r_v = \frac{\mathbb E[D_{train}]-\mathbb E[D_{validation}]}{E[D_{train}]-\mathbb E[D_{generated}]} \space \space \space \space \space r_t = \mathbb E[sign(D_{train})]\]

&lt;p&gt;对于这两种启发式方法，由上述分析我们已经知道当过度拟合开始时，&lt;strong&gt;验证集开始表现得越来越像生成的图像&lt;/strong&gt;，也就是当$r = 0$表示没有过度拟合，而当$r = 1$表示完全过度拟合，文章的目标是调整增强概率$p$，以使所选的启发式方法与合适的目标值匹配。第二个启发式算法$r_t$估计训练集中获得正向判别器输出的部分。&lt;/p&gt;

&lt;p&gt;将$p$初始化为零，并根据所选的过拟合试探法（$r_v,r_t$的值）每四个小批量调整一次其值，如果试探法表明过度拟合或过度拟合过小，通过将$p$递增/递减固定量来应对，通过对$p$从0到1足够快地上升，但是例如在500k图像（数据量很大），每一步之后，$p$都被限制为0，将这种变化称为自适应判别器增强（ADA），文章也进行了实验比对，结果如图5和图6所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gg3poz6gx1j31fy0m6ak3.jpg&quot; height=&quot;300&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图5.自适应判别器增强评估实验
&lt;/p&gt;

&lt;p&gt;在图5a，b中，可以观察到$r_v$和$r_t$都可以有效防止过度拟合，并且它们都比使用网格搜索找到的最佳固定$p$改善了结果，文章也确定了在后续实验中$r_t$的初始值设置为0.6。图5d显示了具有自适应vs固定$p$的$r_t$的演变，表明固定$p$在开始时往往太强，而在结束时往往太弱。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gg3pp9kjaij31fy0jiaxu.jpg&quot; height=&quot;280&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图6.ADA验证实验
&lt;/p&gt;

&lt;p&gt;图6使用ADA重复了图1的设置，可以看到无论训练集的大小如何，&lt;strong&gt;都可以实现收敛，并且不再发生过度拟合&lt;/strong&gt;。 如果不进行扩充，随着时间的流逝，生成器从判别器接收到的梯度将变得非常简单，判别器开始仅关注少数功能，并且生成器可以自由创建其他无意义的图像。 同时使用ADA时，梯度场保持更详细，从而避免情况的恶化。&lt;/p&gt;

&lt;h1 id=&quot;实验与评估&quot;&gt;实验与评估&lt;/h1&gt;

&lt;p&gt;文章在FFHQ和LSUN CAT进行实验，有趣的是ADA和bCR的优势在很大程度上是可加的，图7给出了实验结果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gg3ppmfypsj31fu0nck47.jpg&quot; height=&quot;280&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图7.FHQ和LSUN CAT下进行实验
&lt;/p&gt;

&lt;p&gt;为进一步定量说明，文章和PA-GAN [2]，WGAN-GP [3]，zCR [4]，auxiliary rotations[5]和spectral normalization[6]进行定量比对，结果如图8，不得不说的是ADA在Cifar10数据集下取得了非常好的结果这在之前的生成模型上是看不到的，这个进步是很大的。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gg3ppvj2v1j31fq0lywnk.jpg&quot; height=&quot;250&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图8.定量对比实验
&lt;/p&gt;

&lt;p&gt;在迁移学习上，ADA也展示了优越的结果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gg3pq6oij0j31g40isn5n.jpg&quot; height=&quot;250&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图9.ADA在迁移学习下的表现
&lt;/p&gt;

&lt;p&gt;最后放一下在小型数据集Cifar10数据集下，ADA模型展示的可怕的生成效果：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gg3pqidrgij30u00zku10.jpg&quot; height=&quot;1000&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图10.ADA在Cifar10数据集下定性结果
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;ADA展示了在训练数据短缺时，自适应判别器扩充可以稳定且有效的训练并极大地提高结果质量。 但是也要指出扩充数据集并不能替代真实数据，相同数据量下肯定是真实数据越多得到的生成效果越好的。自适应增强的设计也展示了NVIDIA科研上的严谨，更值得说的是，NVIDIA这样的不太在乎算力资源的研究者能专心在少数据样本的训练上展开研究本身就是很值得敬佩的。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] A. Bora, E. Price, and A. Dimakis. AmbientGAN: Generative models from lossy measurements. In &lt;em&gt;Proc. ICLR&lt;/em&gt;, 2018.&lt;/p&gt;

&lt;p&gt;[2] D. Zhang and A. Khoreva. PA-GAN: Improving GAN training by progressive augmentation. In &lt;em&gt;Proc. NeurIPS&lt;/em&gt;, 2019.&lt;/p&gt;

&lt;p&gt;[3] I. Gulrajani, F. Ahmed, M. Arjovsky, V. Dumoulin, and A. C. Courville. Improved training of Wasserstein GANs. In &lt;em&gt;Proc. NIPS&lt;/em&gt;, pages 5769–5779, 2017.&lt;/p&gt;

&lt;p&gt;[4] Z. Zhao, S. Singh, H. Lee, Z. Zhang, A. Odena, and H. Zhang. Improved consistency regularization for GANs. &lt;em&gt;CoRR&lt;/em&gt;, abs/2002.04724, 2020.&lt;/p&gt;

&lt;p&gt;[5] T. Chen, X. Zhai, M. Ritter, M. Lucic, and N. Houlsby. Self-supervised GANs via auxiliary rotation loss. In &lt;em&gt;Proc. CVPR&lt;/em&gt;, 2019.&lt;/p&gt;

&lt;p&gt;[6] T. Miyato, T. Kataoka, M. Koyama, and Y. Yoshida. Spectral normalization for generative adversarial networks. In &lt;em&gt;Proc. ICLR&lt;/em&gt;, 2018.&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>近年图像翻译先进模型小结</title>
        <link>http://www.twistedwg.com//2020/05/26/img_trans.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2020/05/26/img_trans.html</guid>
        <pubDate>Tue, 26 May 2020 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;计算机视觉下的任务纷繁庞大，除了熟悉的目标检测、图像识别、图像分类等常见的视觉应用，还有着图像翻译、图像分割和图像超分辨率等十分具有研究和应用价值的方向。本文就近年（2019和2020年）图像翻译下的先进模型进行典型性介绍，一起梳理下图像翻译的发展和未来研究的趋势。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;图像翻译的发展&quot;&gt;图像翻译的发展&lt;/h1&gt;

&lt;p&gt;图像翻译旨在通过设计端到端的模型将源域图像转换到目标域图像，通常源域提供图像的内容，目标域提供图像的“风格”(可以是图像属性或图像风格)，在源域内容下实现目标域的“风格”化，从而实现源域图像到目标域图像的转换。说的通俗点图像翻译可以是标签图到场景图的转换、线条轮廓到色彩图像转换、图像的风格转换，春夏场景的变换，人脸的属性变换，也可以是白昼交替的转换。只要符合上述端到端转换的任务，都可以通过图像翻译实现。引用&lt;a href=&quot;https://arxiv.org/abs/1611.07004&quot;&gt;pix2pix&lt;/a&gt;[1]中的经典插图，一起看下图像翻译的实际应用。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gf5xvk9zbxj31jj0leqv5.jpg&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图1.图像翻译的不同任务场景
&lt;/p&gt;

&lt;p&gt;图像翻译自深度学习应用下便得到了快速的发展，尤其是随着生成对抗网络（GAN）的提出，大大加速了图像翻译的演进。从早期的pix2pix、&lt;a href=&quot;https://arxiv.org/abs/1703.10593&quot;&gt;CycleGAN&lt;/a&gt;[2]、&lt;a href=&quot;https://arxiv.org/abs/1703.00848&quot;&gt;UNIT&lt;/a&gt;[3]到较为成熟的&lt;a href=&quot;https://arxiv.org/abs/1711.09020&quot;&gt;StarGAN&lt;/a&gt;[4]都是图像翻译在上几年较为成功和经典的模型。这些模型实现了从源域图像到目标域图像的转换，但这往往需要一定的标签参与或者需要建立源域和目标域各自的生成器，同时任务往往实现的是单目标域的转换。随着发展到&lt;a href=&quot;https://arxiv.org/abs/1804.04732&quot;&gt;MUNIT&lt;/a&gt;[5]、&lt;a href=&quot;https://arxiv.org/abs/1905.01270&quot;&gt;DRIT&lt;/a&gt;[6]以及&lt;a href=&quot;https://arxiv.org/abs/1907.10830&quot;&gt;UGATIT&lt;/a&gt;[7]则进一步实现了由源域到多目标域的转换，也有利用语义mask图像实现无条件图像翻译的&lt;a href=&quot;https://arxiv.org/abs/1903.07291&quot;&gt;SPADE&lt;/a&gt;[8]。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/1812.04948&quot;&gt;StyleGAN&lt;/a&gt;[9]实现了高质量的图像风格转换，这无疑于StyleGAN的细致的架构，逐步分辨率的阶段性生成、自适应实例正则化（AdaIN）和风格空间的应用，&lt;a href=&quot;https://arxiv.org/abs/1912.04958&quot;&gt;StyleGAN2&lt;/a&gt;[10]在StyleGAN的基础上进一步对AdnIN进行修正，demodulation操作应用于每个卷积层相关的权重，并且通过skip generator代替progressive growing，实现了更为细致的图像转换。这些基础性的图像转换架构对于近年来的图像翻译任务提供价值性的指导。&lt;/p&gt;

&lt;p&gt;近年来，图像翻译实现了更加细致的任务实现，&lt;a href=&quot;https://arxiv.org/abs/1912.01865&quot;&gt;StarGAN v2&lt;/a&gt;[11]在StarGAN的基础上实现了多源域到多目标域的图像转换；&lt;a href=&quot;https://arxiv.org/abs/2004.04467&quot;&gt;ALAE&lt;/a&gt;[12]将自编码器拓展到高精致的图像转换；&lt;a href=&quot;https://arxiv.org/abs/2003.08791&quot;&gt;HiDT&lt;/a&gt;[13]提供了多域图像转换下对图像翻译下的网络逻辑和损失函数做了细致的总结；&lt;a href=&quot;https://arxiv.org/abs/2003.11512&quot;&gt;ConSinGAN&lt;/a&gt;[14]代表了一众单幅图像训练的先进模型，实现了单幅图像训练下的图像转换任务。本文将以这4篇论文进行介绍，对近年图像翻译模型进行分析和小结。&lt;/p&gt;

&lt;h1 id=&quot;图像翻译模型&quot;&gt;图像翻译模型&lt;/h1&gt;

&lt;h2 id=&quot;stargan-v2&quot;&gt;StarGAN v2&lt;/h2&gt;

&lt;p&gt;StarGAN v2针对StarGAN存在的仅能在单目标域下转换和需要标签信息参与的两个问题，提出了目标域下多风格图像的转换。如何实现多目标域的转换呢？StarGAN v2设计了Mapping Network用于生成风格编码，从而为目标域下提供多类型的风格表示而不需要额外的标签，模型的整体结构如图2所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gf5xx0ub8xj30ns0c2n0n.jpg&quot; height=&quot;300&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图2.StarGAN v2模型整体结构
&lt;/p&gt;

&lt;p&gt;可以看出StarGAN v2由四部分组成，生成器$G$，映射网络$F$，风格编码器$E$判别器$D$。我们先捋一下整个过程，首先映射网络学习到目标域图像的风格编码$\hat s = F_{\hat y}(z)$，其中$\hat y \in \mathcal Y$，这是映射网络学习到的目标域图像的风格编码，而作为参照真实目标域图像的风格编码由风格编码器得到$s=E_y(y)$，得到了风格编码$\hat s$结合源域输入图像$x$便可送入到生成器，生成器输出的就是转换后的目标域图像$G(x, \hat s)$，而判别器则为了区分生成的目标域图像是否是真实来源于真实目标域。&lt;/p&gt;

&lt;p&gt;StarGAN v2中映射网络、风格编码器和判别器的输出都是多分支的，因为文章的目的是进行多目标域的转换，这里的多分支就是不同的目标域的表示，对于映射网络和风格编码器，多分支表示的是多个目标域图像的风格表示，对于判别器多分支则是代表不同目标域的判别真假情况，作者在附录中用$N$表示分支数。&lt;/p&gt;

&lt;p&gt;图3展示了StarGAN v2的较为详细的网络设计。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gf5xxpt6faj30ja0iqjvh.jpg&quot; height=&quot;600&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图3.StarGAN v2模型设计结构
&lt;/p&gt;

&lt;p&gt;至于损失函数上，值得一提的是风格表示上的风格重构损失\(\mathcal L_{sty} = \mathbb E_{x, \hat{y}, z} [\Vert \hat{s} - E_{\hat{y}}(G(x, \hat{s})) \Vert_1]\)和映射网络丰富化的\(\mathcal L_{ds} = \mathbb E_{x, \hat{y}, z_1, z_2}[\Vert G(x,\hat{s}_1) - G(x, \hat{s}_2) \Vert]\)（使得目标风格表示之间边界分明，产生多目标转换结果，最大化\(\mathcal L_{ds}\)），还有就是较为熟悉的对抗损失\(\mathcal L_{adv}\)和循环一致损失\(\mathcal L_{cyc}\)，在最终的损失优化上：&lt;/p&gt;

\[\mathcal L_D = - \mathcal L_{adv}\]

\[\mathcal L_{F,G,E} = \mathcal L_{adv} + \lambda_{sty} \mathcal L_{sty} - \lambda_{ds} \mathcal L_{ds} + \lambda_{cyc} \mathcal L_{cyc}\]

&lt;p&gt;实验上，在图像转换上展示了优越的效果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gf5yatonkgj31ai0r2hdu.jpg&quot; height=&quot;350&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图4.StarGAN v2定性对比结果
&lt;/p&gt;

&lt;h2 id=&quot;alae&quot;&gt;ALAE&lt;/h2&gt;

&lt;p&gt;自编码器能否具有像GAN那样的生成能力呢？ALAE给出了肯定的答案，ALAE算是建立在StyleGAN基础之上，具备与 GAN 相当的生成能力，且能够学习解耦表征，在人脸属性变换上展示了优越的效果。&lt;/p&gt;

&lt;p&gt;ALAE采用自编码器架构，将GAN中的生成器和判别器分解为两个网络，生成器对应着$G$和$F$，判别器对应着$D$和$E$，先从整体架构来看一下ALAE模型。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gf5yonfscqj30p60a6dhi.jpg&quot; height=&quot;210&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图5.ALAE模型结构
&lt;/p&gt;

&lt;p&gt;在训练阶段，随机噪声$z$经过网络$F$，将随机噪声映射到数据的潜在空间$w$，网络$G$则负责将数据潜在空间$w$和风格变量$\eta$映射到数据空间。此时输入的$z$经过$F$和$G$得到图像输出$G(w, \eta)$，判别部分由网络$E$和$D$组成，网络$E$将数据编码到潜在空间$q_E(w)$并且与$z$投影得到的$p_F(w)$做分布拉近，理想状态下$q_E(w) = p_F(w)$。&lt;/p&gt;

&lt;p&gt;网络$F$是个新颖的设计，它并没有严格的目的性也就是并没有强调和约束数据的潜在空间分布，而是由全局优化下自动学习数据的潜在空间。也正因为存在了数据的潜在空间的刻画，ALAE才可以说是建立在自编码器下结构下的模型。&lt;/p&gt;

&lt;p&gt;在测试阶段，由网络$E$和$G$构成了自编码器的编码器和解码器，构成Encoder-Decoder的结构，由$\eta$可以控制图像属性从而实现图像翻译任务。&lt;/p&gt;

&lt;p&gt;损失设计上除了对抗损失，还有就是潜在空间分布下的拉近$\min_{E,G}\Delta(F \Vert E \circ G \circ F)$，这也是文章称为为对抗性潜在自动编码器（ALAE）的原因。ALAE在设计上借鉴了StyleGAN的结构并称之为StyleALAE，整体的架构如图6所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gf5y1yyyzqj30fs0dkac1.jpg&quot; height=&quot;380&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图6.StyleALAE网络架构
&lt;/p&gt;

&lt;p&gt;作者使用 MNIST 数据集训练 ALAE，并使用特征表示来执行分类、重建和分析解耦能力的任务，与已有的自编码器模型对比结果存在优势，ALAE最让人印象深刻的就是StyleALAE在FFHQ上的生成效果，真是将自编码器做到了GAN的高精度生成。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gf5yr0u5d8j30fk08w45v.jpg&quot; height=&quot;300&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图7.StyleALAE的生成效果
&lt;/p&gt;

&lt;p&gt;本文围绕着图像翻译展开，ALAE当然适用于图像翻译任务，在人脸属性的转换上也做到了优越的转换效果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gf5y2wqgakj30v60kkb29.jpg&quot; height=&quot;300&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图8.StyleALAE人脸属性变换
&lt;/p&gt;

&lt;h2 id=&quot;consingan&quot;&gt;ConSinGAN&lt;/h2&gt;

&lt;p&gt;近年有部分研究者将目光投入到单幅图像训练网络上，ICCV 2019 best paper &lt;a href=&quot;https://arxiv.org/abs/1905.01164&quot;&gt; SinGAN&lt;/a&gt;[15]便是一个代表作，此处要介绍的&lt;a href=&quot;&quot;&gt;ConSinGAN&lt;/a&gt;则是在SinGAN的基础上的升级版。&lt;/p&gt;

&lt;p&gt;受限于数据样本和网络训练时长，单幅图像训练的模型存在着很大的应用意义。要介绍清ConSinGAN则必须要提一下SinGAN，本质上ConSinGAN就是并行的SinGAN，缩写中不同的Con就是指Concurrent的意思。&lt;/p&gt;

&lt;p&gt;SinGAN按照不同分辨率分阶段训练生成器和判别器，在串行的阶段训练上，当前生成器将前一个生成器生成的图像作为输入，在此基础上生成比当前还要高分辨率的图像，此时不同阶段的生成器都是单独训练的，这也意味着在训练当前生成器时，之前的生成器的权重都保持不变，这个过程由图9所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gf5y3e4z4bj30os0hy45s.jpg&quot; height=&quot;300&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图9.SinGAN训练过程
&lt;/p&gt;

&lt;p&gt;ConSinGAN指出每个分辨率下仅训练一个生成器而固定前面的生成器的参数，这仅仅将前一阶段生成器输出作为当前的输入，这一定程度上限制了不同阶段生成器之间的交互。ConSInGAN设计了对生成器进行端到端的训练，也就是说，在给定时间内可以训练多个生成器，每个生成器将前一个生成器生成的特征(而不是图像)作为输入。这种训练是对多个阶段下的生成器同时进行的，也称之为并行训练的方式，这个过程如图10所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gf5y3r8tm7j30li0oan5k.jpg&quot; height=&quot;500&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图10.ConSinGAN训练过程
&lt;/p&gt;

&lt;p&gt;然而训练多个分辨率下的生成器将会导致另一个问题，那就是过拟合，也就是最后得到的图像失去了多样性，为了解决这个问题，ConSinGAN提出了2个应对方案。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;在任意给定时间内，只训练一部分生成器&lt;/li&gt;
  &lt;li&gt;在训练一部分生成器时，还要对不同的生成器使用不同的学习率，对于低分辨率阶段的生成器使用较小的学习率&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;文章和源码中默认最多同时训练3个生成器，此时对前两阶段的生成器采用当前学习率的$\frac{1}{10}$和$\frac{1}{100}$，这个过程图11进行展示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gf5y45jegcj30u01nvgul.jpg&quot; height=&quot;900&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图11.ConSinGAN训练不同生成器不同学习率
&lt;/p&gt;

&lt;p&gt;实验发现如果对早阶段的生成器采用较高的学习率，那么生成的图像质量会高些，但是差异性较弱。相反，如果对早阶段的生成器采用较小的学习率，那么生成图像的差异性会丰富一些。&lt;/p&gt;

&lt;p&gt;在进行图像翻译任务时，ConSinGAN进行了图像协调实验，主要与SinGAN进行对比，得到的对比结果如图12所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gf5y4nkdn9j31is0u0e83.jpg&quot; height=&quot;350&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图12.ConSinGAN在图像协调下的转换结果
&lt;/p&gt;

&lt;h2 id=&quot;hidt&quot;&gt;HiDT&lt;/h2&gt;

&lt;p&gt;最后来分析下&lt;a href=&quot;https://arxiv.org/abs/2003.08791&quot;&gt;High-Resolution Daytime Translation Without Domain Labels（HiDT）&lt;/a&gt;，这篇文章虽然做的是高清自然场景时移变换，但是确实将图像翻译的训练逻辑和损失函数介绍的非常清晰的文章，HiDT也是CVPR 2020 oral的一篇文章，在这里梳理一下HiDT对图像翻译的设计逻辑和损失函数的设计。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://tva1.sinaimg.cn/large/007S8ZIlly1gf5y51i85xj30um0noq6f.jpg&quot; height=&quot;300&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图13.HiDT网络优化过程
&lt;/p&gt;

&lt;p&gt;先交代下符号，$x$表示源域输入图像，$E_c$表示内容编码器相对应的$c$为内容编码，$E_s$表示风格编码器相对应的$s$为风格编码，$G$为生成器，$s^\prime$为目标域风格编码，$p^*(s)$为风格编码的先验分布，$s_r$为在风格编码的先验分布下随机采样的风格编码。生成器$G$不光光输出的是转换后的图像，同时也输出相对应的风格掩码图$m$。从上到下分析，随机风格采样$s_r$与内容编码$c$生成$G(c,s_r)=x_r,m_r$，此时$x_r$的风格取决于随机风格$s_r$，掩码$m_r$则是受内容$c$的影响，对$x_r$继续进行内容和风格编码得到\(\tilde{c}_r,\tilde{s}_r$，将$\tilde{c}_r,\tilde{s}_r\)馈送到生成器\(G\)得到重构的\(\tilde{x}_r\)，为什么说是重构呢？因为此时输入的风格是\(x_r\)自身的风格编码；中间一路就是对\(x\)进行编码后再重构得到\(\tilde{x}\)；最下面一路则是先根据源域内容编码$c$与目标域风格编码\(s^\prime\)生成得到目标域图像和分割掩码\(\hat{x},\hat{m}\)，再由\(\hat{x}\)编码得到的内容编码\(\hat{c}\)与风格编码\(\hat{s}^\prime\)得到最原始源域图像\(\tilde{\hat{x}}\)，由于\(\tilde{\hat{x}}\)给出的损失为\(\mathcal L_{cyc}\)，这里推测风格编码\(\hat{s}^\prime\)就是源域图像的风格表示。&lt;/p&gt;

&lt;p&gt;上述分析，总结起来就是模型在优化阶段由三种模式，一是随机风格的转换和重构，二是原始图像的重构，三是目标域图像转换和循环一致的转换。&lt;/p&gt;

&lt;p&gt;最后就是如何对模型进行损失优化，正由图13中所展示的，重构损失$\mathcal L_{rec}$，风格掩码损失$\mathcal L_{seg}$，内容编码损失$\mathcal L_{c}$，风格编码损失$\mathcal L_s$，风格编码下趋紧先验分布的损失$\mathcal L_{dist}$以及循环一致损失$\mathcal L_{cyc}$，由此衍生的$\mathcal L_{seg}^r , \mathcal L_c^r, \mathcal L_s^r, \mathcal L_{rec}^r$也是一样的含义，图13中省略了对抗损失$\mathcal L_{adv}, \mathcal L_{adv}^r$，对抗损失主要是对转换后的$\hat x$和$x_r$进行优化。&lt;/p&gt;

&lt;p&gt;重构损失为$L_1$损失，即$\mathcal L_{rec}=\Vert \tilde x - x \Vert_1$，类似的有$\mathcal L_{rec}^r = \Vert \tilde x_r - x_r \Vert_1$，循环一致损失也是采用$L_1$损失$\mathcal L_{cyc} = \Vert \tilde{\hat{x}} - x \Vert_1$。对于分割掩码损失则是采取交叉熵损失$CE(m,\hat m)=-\sum_{i,j}m_{i,j} \log \hat m_{i,j}$，则有$\mathcal L_{seg}=CE(m, \hat{m}), L_{seg}^r=CE(m, m_r)$。由于风格编码的维度较低，此时可以通过均值和方差拉向正态分布，达到风格编码向先验分布靠近，$\mathcal L_{dist} = \Vert \hat\mu_r \Vert_1 + \Vert \hat\sum_T - I \Vert_1 + \Vert diag(\hat\sum_T) - 1 \Vert_1$。对于内容编码损失$\mathcal L_{c}$和风格编码损失$\mathcal L_s$，则是通过$L_1$损失一致性优化，即$\mathcal L_s = \Vert \hat s - s^\prime \Vert_1, \mathcal L_s^r = \Vert \tilde s - s_r \Vert_1, \mathcal L_c = \Vert \hat c - c \Vert_1, \mathcal L_c^r = \Vert \tilde{c}_r - c \Vert_1$。&lt;/p&gt;

&lt;p&gt;总的损失可变式为：&lt;/p&gt;

\[\begin{equation}
\begin{aligned}
\min_{E_c,E_s,G}\max_D \mathcal L(E_c,E_s,G,D) &amp;amp;= \lambda_1(\mathcal L_{adv} + \mathcal L_{adv}^r)+\lambda_2(\mathcal L_{rec}+ \mathcal L_{rec}^r+ \mathcal L_{cyc}) +\lambda_3(\mathcal L_{seg} + \mathcal L_{seg}^r) \\
&amp;amp;+\lambda_4(\mathcal L_{c} + \mathcal L_{c}^r) +\lambda_5 \mathcal L_{s}+\lambda_6 \mathcal L_{s}^r +\lambda_7 \mathcal L_{dist}
\end{aligned}
\end{equation}\]

&lt;p&gt;其中$\lambda_{i},i \in [1,7]$为超参数。HiDT的模型优化算是对图像翻译下的损失进行了一个系统的介绍，同时也是我认为在不系统阅读代码下对图像翻译下的逻辑介绍最为清晰的一篇文章。&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;近年来图像翻译的文章还有很多，本文仅仅是笔者选摘的有代表性的几篇文章，图像翻译已不再是简单的图像风格变换或是源域到目标域的转换，而是上升到多源域到多目标域图像的转换。同时基于GAN，基于自编码器，基于pixelCNN的模型也是十分丰富。从庞大的数据集进行训练，到可以由单幅图像的训练，对于训练的样本要求也在逐步降低。&lt;/p&gt;

&lt;p&gt;总的来说，图像翻译向着更加系统和全面的方向有序进展，虽然模型做到了多源域到多目标域图像的转换，但是这个过程仍存在很多的限制，限制于数据集和各目标域间的标注，同时不同目标域间的差距仍不能做到很大，one for all的理念仍是一个很值得研究和迈进的方向。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] Isola P, Zhu J Y, Zhou T, et al. Image-to-image translation with conditional adversarial networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 1125-1134.&lt;/p&gt;

&lt;p&gt;[2] Zhu J Y, Park T, Isola P, et al. Unpaired image-to-image translation using cycle-consistent adversarial networks[C]//Proceedings of the IEEE international conference on computer vision. 2017: 2223-2232.&lt;/p&gt;

&lt;p&gt;[3] Liu M Y, Breuel T, Kautz J. Unsupervised image-to-image translation networks[C]//Advances in neural information processing systems. 2017: 700-708.&lt;/p&gt;

&lt;p&gt;[4] Choi Y, Choi M, Kim M, et al. Stargan: Unified generative adversarial networks for multi-domain image-to-image translation[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 8789-8797.&lt;/p&gt;

&lt;p&gt;[5] Huang X, Liu M Y, Belongie S, et al. Multimodal unsupervised image-to-image translation[C]//Proceedings of the European Conference on Computer Vision (ECCV). 2018: 172-189.&lt;/p&gt;

&lt;p&gt;[6] Lee H Y, Tseng H Y, Mao Q, et al. Drit++: Diverse image-to-image translation via disentangled representations[J]. International Journal of Computer Vision, 2020: 1-16.&lt;/p&gt;

&lt;p&gt;[7] Kim J, Kim M, Kang H, et al. U-GAT-IT: unsupervised generative attentional networks with adaptive layer-instance normalization for image-to-image translation[J]. arXiv preprint arXiv:1907.10830, 2019.&lt;/p&gt;

&lt;p&gt;[8] Park T, Liu M Y, Wang T C, et al. Semantic image synthesis with spatially-adaptive normalization[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019: 2337-2346.&lt;/p&gt;

&lt;p&gt;[9] Karras T, Laine S, Aila T. A style-based generator architecture for generative adversarial networks[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019: 4401-4410.&lt;/p&gt;

&lt;p&gt;[10] Karras T, Laine S, Aittala M, et al. Analyzing and improving the image quality of stylegan[J]. arXiv preprint arXiv:1912.04958, 2019.&lt;/p&gt;

&lt;p&gt;[11] Choi Y, Uh Y, Yoo J, et al. StarGAN v2: Diverse Image Synthesis for Multiple Domains[J]. arXiv preprint arXiv:1912.01865, 2019.&lt;/p&gt;

&lt;p&gt;[12] Pidhorskyi, Stanislav and Adjeroh, Donald A and Doretto, Gianfranco, et al. Adversarial Latent Autoencoders[J]. arXiv preprint arXiv:2004.04467, 2020.&lt;/p&gt;

&lt;p&gt;[13] Anokhin I, Solovev P, Korzhenkov D, et al. High-Resolution Daytime Translation Without Domain Labels[J]. arXiv preprint arXiv:2003.08791, 2020.&lt;/p&gt;

&lt;p&gt;[14] Hinz T, Fisher M, Wang O, et al. Improved Techniques for Training Single-Image GANs[J]. arXiv preprint arXiv:2003.11512, 2020.&lt;/p&gt;

&lt;p&gt;[15] Rott Shaham T, Dekel T, Michaeli T. SinGAN: Learning a Generative Model from a Single Natural Image[J]. arXiv preprint arXiv:1905.01164, 2019.&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>高分辨率自然场景时移变换</title>
        <link>http://www.twistedwg.com//2020/04/19/HiDT.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2020/04/19/HiDT.html</guid>
        <pubDate>Sun, 19 Apr 2020 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;同一个场景在不同时间段存在着一定的变化，这主要取决于光照对图像的成像的影响，如何通过一个时间段的场景图像在无域标签的情况下合成出不同时间段下的高分辨率场景图像是本文要介绍的CVPR 2020 oral中&lt;a href=&quot;https://arxiv.org/abs/2003.08791&quot;&gt;High-Resolution Daytime Translation Without Domain Labels（HiDT）&lt;/a&gt;所做的工作。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;大部分使用Mac系统的用户默认动态壁纸是位于洛杉矶卡特琳娜岛的一天场景变化，对应着清晨、日出、正午、傍晚、入夜、凌晨的时移变化，固定机位间隔拍摄可以作为取景，然而这将花费一天时间。如何利用一张高分辨率图像达到时移自然场景的合成，是HiDT要实现的任务，文章称之为Daytime Translation，图1展示了任务效果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/HiDT1.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图1.HiDT在自然场景时移变换的结果图
&lt;/p&gt;

&lt;p&gt;自然场景的时移变换其实就是图像翻译的一类应用，早期的图像翻译在训练以及推理时都需要域标签，而&lt;a href=&quot;https://arxiv.org/abs/1804.04732&quot;&gt;MUNIT&lt;/a&gt;[1]和&lt;a href=&quot;https://arxiv.org/abs/1905.01723&quot;&gt;FUNIT&lt;/a&gt;[2]提出了目标域的几幅图像作为翻译指导，同时期的&lt;a href=&quot;https://arxiv.org/abs/1912.01865&quot;&gt;StarGAN v2&lt;/a&gt;[3]更是提出了在一个生成器中根据不同的style code实现多域转换，这些或多或少都要有域标签的参与。在时移场景变换下，域对应于一天中的不同时间和不同的照明，这个域标签定义起来是繁琐的，如何在无域标签的情况下实现高分辨率时移场景的合成是一个大的挑战。&lt;/p&gt;

&lt;p&gt;然而大部分图像翻译任务在处理的图像上的尺寸多为中等尺寸，即$256\times 256$居多，如何实现高分辨率下（$1024 \times 1024$）的图像翻译仍是一个值得研究的问题，同时自然场景时移变换更是面临着不能完全依赖图像色彩空间的全局仿射变换，不能依赖时间戳和高分辨率下如何消去伪影等问题。HiDT通过对高分辨率源域图像进行分步转换，最后通过融合实现高分辨率图像合成，在处理图像伪影和细节上，文章将跳跃连接（Skip connections）和AdaIN进行结合，总结一下HiDT相比较已有的图像翻译方法的优势。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;在仅有语义分割图的弱标签下实现了多域图像转换&lt;/li&gt;
  &lt;li&gt;在图像细节转换上通过跳跃连接和AdaIN结合实现高质量转换&lt;/li&gt;
  &lt;li&gt;通过拆分转换和融合达到高分辨图像转换&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;网络架构和优化&quot;&gt;网络架构和优化&lt;/h1&gt;

&lt;p&gt;HiDT的架构是建立在跳跃连接和AdaIN结合的基础上，采用UNet和AdaIN架构起网络的编码和解码器的主体，这个结构如图2所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/HiDT2.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图2.HiDT编码和解码器网络
&lt;/p&gt;

&lt;p&gt;由架构图可以看到对于输入$x$，通过下采样进行编码得到对应的图像内容编码$c$，解码端（生成器）将内容编码$x$，风格编码$s$与不同下采样进行跳跃连接再配合AdaIN嵌入进行上采样生成对应的目标域图像。决定转换后图像风格（可以理解为自然场景的不同时刻和光照）的是由风格编码$s$决定。而风格编码$s$在训练阶段是由目标域图像编码得到，在测试阶段则是通过在先验分布下采样得到，这部分我们待会再详细讨论。&lt;/p&gt;

&lt;p&gt;HiDT的整体架构倒是很直观，详细的网络结构只能通过代码去进一步查看，作者放出了&lt;a href=&quot;https://github.com/saic-mdal/HiDT&quot;&gt;项目地址&lt;/a&gt;，但是代码还在更新中。不过值得说的是HiDT对于模型的优化过程介绍的很好，这也算是图像翻译中比较详细和先进的模型优化方式。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/HiDT3.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图3.HiDT网络优化过程
&lt;/p&gt;

&lt;p&gt;在介绍之前，先来梳理一下图3中的符号，$x$表示源域输入图像，$E_c$表示内容编码器相对应的$c$为内容编码，$E_s$表示风格编码器相对应的$s$为风格编码，$G$为生成器，$s^\prime$为目标域风格编码，$p^*(s)$为风格编码的先验分布，$s_r$为在风格编码的先验分布下随机采样的风格编码。生成器$G$不光光输出的是转换后的图像，同时也输出相对应的风格掩码图$m$。从上到下分析，随机风格采样$s_r$与内容编码$c$生成$G(c,s_r)=x_r,m_r$，此时$x_r$的风格取决于随机风格$s_r$，掩码$m_r$则是受内容$c$的影响，对$x_r$继续进行内容和风格编码得到\(\tilde{c}_r,\tilde{s}_r\)，将\(\tilde{c}_r,\tilde{s}_r\)馈送到生成器$G$得到重构的\(\tilde{x}_r\)，为什么说是重构呢？因为此时输入的风格是$x_r$自身的风格编码；中间一路就是对$x$进行编码后再重构得到$\tilde{x}$；最下面一路则是先根据源域内容编码$c$与目标域风格编码$s^\prime$生成得到目标域图像和分割掩码$\hat{x},\hat{m}$，再由$\hat{x}$编码得到的内容编码$\hat{c}$与风格编码$\hat{s}^\prime$得到最原始源域图像$\tilde{\hat{x}}$，由于$\tilde{\hat{x}}$给出的损失为\(\mathcal L_{cyc}\)，这里推测风格编码$\hat{s}^\prime$就是源域图像的风格表示，此处在原文中并没有做详细交代，等作者公布代码可以做进一步验证。&lt;/p&gt;

&lt;p&gt;上述分析，总结起来就是模型在优化阶段由三种模式，一是随机风格的转换和重构，二是原始图像的重构，三是目标域图像转换和循环一致的转换。&lt;/p&gt;

&lt;p&gt;最后就是如何对模型进行损失优化，正由图3中所展示的，重构损失$\mathcal L_{rec}$，风格掩码损失$\mathcal L_{seg}$，内容编码损失$\mathcal L_{c}$，风格编码损失$\mathcal L_s$，风格编码下趋紧先验分布的损失$\mathcal L_{dist}$以及循环一致损失$\mathcal L_{cyc}$，由此衍生的$\mathcal L_{seg}^r , \mathcal L_c^r, \mathcal L_s^r, \mathcal L_{rec}^r$也是一样的含义，图3中省略了对抗损失$\mathcal L_{adv}, \mathcal L_{adv}^r$，对抗损失主要是对转换后的$\hat x$和$x_r$进行优化。&lt;/p&gt;

&lt;p&gt;重构损失为$L_1$损失，即$\mathcal L_{rec}=\Vert \tilde x - x \Vert_1$，类似的有$\mathcal L_{rec}^r = \Vert \tilde x_r - x_r \Vert_1$，循环一致损失也是采用$L_1$损失$\mathcal L_{cyc} = \Vert \tilde{\hat{x}} - x \Vert_1$。对于分割掩码损失则是采取交叉熵损失$CE(m,\hat m)=-\sum_{i,j}m_{i,j} \log \hat m_{i,j}$，则有$\mathcal L_{seg}=CE(m, \hat{m}), L_{seg}^r=CE(m, m_r)$。由于风格编码的维度较低，此时可以通过均值和方差拉向正态分布，达到风格编码向先验分布靠近，$\mathcal L_{dist} = \Vert \hat\mu_r \Vert_1 + \Vert \hat\sum_T - I \Vert_1 + \Vert diag(\hat\sum_T) - 1 \Vert_1$。对于内容编码损失$\mathcal L_{c}$和风格编码损失$\mathcal L_s$，则是通过$L_1$损失一致性优化，即$\mathcal L_s = \Vert \hat s - s^\prime \Vert_1, \mathcal L_s^r = \Vert \tilde s - s_r \Vert_1, \mathcal L_c = \Vert \hat c - c \Vert_1, \mathcal L_c^r = \Vert \tilde{c}_r - c \Vert_1$。&lt;/p&gt;

&lt;p&gt;总的损失可变式为：&lt;/p&gt;

\[\begin{equation}
\begin{aligned}
\min_{E_c,E_s,G}\max_D \mathcal L(E_c,E_s,G,D) &amp;amp;= \lambda_1(\mathcal L_{adv} + \mathcal L_{adv}^r)+\lambda_2(\mathcal L_{rec}+ \mathcal L_{rec}^r+ \mathcal L_{cyc}) +\lambda_3(\mathcal L_{seg} + \mathcal L_{seg}^r) \\
&amp;amp;+\lambda_4(\mathcal L_{c} + \mathcal L_{c}^r) +\lambda_5 \mathcal L_{s}+\lambda_6 \mathcal L_{s}^r +\lambda_7 \mathcal L_{dist}
\end{aligned}
\end{equation}\]

&lt;p&gt;其中$\lambda_{i},i \in [1,7]$为超参数，HiDT的模型优化算是对图像翻译下的损失进行了一个系统的介绍。&lt;/p&gt;

&lt;h1 id=&quot;增强处理&quot;&gt;增强处理&lt;/h1&gt;

&lt;p&gt;由于内存和计算时间的限制，在高分辨率图像上进行图像翻译是不可行的。文章进行了一个增强处理，整个过程如图4所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/HiDT4.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图4.HiDT增强处理下拆分和融合方案
&lt;/p&gt;

&lt;p&gt;虽然内存和时间的限制可以通过在中等分辨率训练，并以完全卷积的方式应用于高分辨率图像；或者可以使用引导过滤[4]对中等分辨率的处理结果进行升采样。但是，经过实验文章发现完全卷积的应用可能会由于感受野有限而导致场景崩塌，在夕阳下可能会出现多个太阳，或者在水反射下可能会混淆天空和水面之间的边界。另一方面，引导过滤在水或阳光下能较好地实现转换，但如果通过样式转换更改细小细节，则引导过滤将失败，在高对比度边界附近产生光晕伪影。&lt;/p&gt;

&lt;p&gt;为此，作者提出了图4所示的增强处理拆分和融合方案，对原始的高分辨率图像\(x_{hi}\)分为不同的移位版本，根据保留移位位置像素，对于中间的像素用0去替代，得到移位的高分辨率图像\(\lbrace x_{hi}^i \rbrace_i\)，对移位后的图像进行双线性下采样得到中等分辨率图像\(\lbrace x_{med}^i \rbrace_i\)，文中的移位版本设置为16，对这16个中等分辨率图像进行图像翻译，即\(\hat{x}_{med}^{i} = G(E_c(x_{med}^{i}),E_s(x_{med}^{i}))\)，再由这16个中等分辨率图像经过融合网络\(G_{enh}\)融合得到高分辨率图像输出，图4则是大致的演示过程。&lt;/p&gt;

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;对于对比的基线选择，文章选择了FUNIT[2]和DRIT[5]，在定性对比上，得到的结果如图5所示，从左到右对应的是原始图像、FUNIT-T、FUNIT-O、HiDT。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/HiDT5.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图5.HiDT定性结果对比
&lt;/p&gt;

&lt;p&gt;定量上也展示了优越的结果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/HiDT6.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图6.HiDT定量结果对比
&lt;/p&gt;

&lt;p&gt;对于自然场景图像时移变换下，通过随机采样$N$的设置，可以实现多域的生成，图7展示了时移图像的转换结果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/HiDT7.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图7.HiDT自然场景时移结果
&lt;/p&gt;

&lt;p&gt;由于模型的设计，HiDT可根据指导图像进行指导转换，图8为展示结果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/HiDT8.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图8.HiDT指导图像进行转换
&lt;/p&gt;

&lt;p&gt;在消融实验上，当去掉分割掩码损失，转换结果上大幅度下降。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/HiDT9.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图9.HiDT去掉分割掩码损失后的结果
&lt;/p&gt;

&lt;p&gt;在高分辨率上的拆分和融合上展示了一定的结果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/HiDT10.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图10.HiDT高分辨率图像下的结果
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;HiDT作为图像翻译模型，在训练和推理过程中均不依赖域标签，通过增强方案解决了图像翻译下高分辨率图像的转换。模型主要用于自然场景时移图像的合成，在定性和定量结果上展示了优越的结果。&lt;/p&gt;

&lt;p&gt;整体而言，HiDT与MUNIT存在着一定的相似性，但是网络结构中通过U-Net和AdaIN的结合实现了更好的翻译结果，同时在高分辨率转换上也取得了一定的成效，这归功于HiDT的拆分和融合思想，同时自然场景时移变换在很多场合下有着积极的意义。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] Xun Huang, Ming-Yu Liu, Serge Belongie, and Jan Kautz. Multimodal Unsupervised Image-to-Image Translation. In Vittorio Ferrari, Martial Hebert, Cristian Sminchisescu, and Yair Weiss, editors, Computer Vision – ECCV 2018, pages 179–196, Cham, 2018. Springer International Publishing. 1, 2, 6&lt;/p&gt;

&lt;p&gt;[2] Ming-Yu Liu, Xun Huang, Arun Mallya, Tero Karras, Timo Aila, Jaakko Lehtinen, and Jan Kautz. Few-shot unsupervised image-to-image translation. In The IEEE International Conference on Computer Vision (ICCV), October 2019. 1, 2, 3, 6&lt;/p&gt;

&lt;p&gt;[3] Choi Y, Uh Y, Yoo J, et al. StarGAN v2: Diverse Image Synthesis for Multiple Domains[J]. arXiv preprint arXiv:1912.01865, 2019.&lt;/p&gt;

&lt;p&gt;[4] K. He, J. Sun, and X. Tang. Guided Image Filtering. IEEE Transactions on Pattern Analysis and Machine Intelligence, 35(6):1397–1409, June 2013. 2, 4&lt;/p&gt;

&lt;p&gt;[5] Hsin-Ying Lee, Hung-Yu Tseng, Qi Mao, Jia-Bin Huang, Yu-Ding Lu, Maneesh Singh, and Ming-Hsuan Yang. DRIT++: diverse image-to-image translation via disentangled representations. CoRR, abs/1905.01270, 2019. 1, 2, 6&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>Real or not real，GAN真的在对抗中判定了真假？</title>
        <link>http://www.twistedwg.com//2020/03/07/RealnessGAN.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2020/03/07/RealnessGAN.html</guid>
        <pubDate>Sat, 07 Mar 2020 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;GAN自提出以来就以生成对抗为目标进行模型优化，这种对抗真的区分了真实数据和生成数据了吗？ICLR2020中的一篇&lt;a href=&quot;https://arxiv.org/abs/2002.05512&quot;&gt;Real or Not Real, that is the Question&lt;/a&gt;（RealnessGAN）提出了对传统GAN判别数据真假的质疑，文章抛出了在传统GAN中对于判别器的鉴别输出为一常数score是不合理的观点，并由此提出合理的解决方案，本文将对RealnessGAN进行解析，探究GAN是否真的区分了真假。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;GAN[1]自提出就得到了空前反响，GAN在逼真的图像生成方面以及处理高维数据时的灵活性上推动着包括图像，音频和视频生成的发展，更甚者在诸如强化学习、迁移学习等也展示了一定的价值。GAN通过生成器和判别器的博弈下达到交替更新，其核心就是模型能否鉴别数据的真实与生成并与生成器形成对抗。&lt;/p&gt;

&lt;p&gt;在标准的GAN中，输入样本的真实性由判别器使用单个标量估算，也就是判别输出的是一个鉴别分数。然而诸如图像之类的高维数据，需要从多个角度认知它们，并基于多个标准来推断这幅图像是否逼真。 如图1所示，在拿到一张人脸肖像图时，我们可能会关注其面部结构，皮肤色调，头发纹理，甚至虹膜和牙齿等细节，它们每一个属性都代表着真实性的不同方面。 此时判别器用单个标量输出鉴别结果，这是多个量度的抽象和汇总，它们共同反映了图像的整体真实性。 但是这种简洁的测量可能传达的信息不足，无法引导生成器向着正确的图像进行生成，这就可能导致在GAN中众所周知的模式崩溃和梯度消失的发生。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/RealnessGAN1.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;图1.人脸肖像图中的人眼感知(a)真实人眼感知(b)由于面部结构/组件不协调，背景不自然，样式组合异常和纹理变形可能降低的真实感&lt;/p&gt;

&lt;p&gt;既然判别器的单标量输出是不合理的，那么怎样表示判别器的输出呢？RealnessGAN提出了通过将逼真度视为随机变量，也就是对于判别器的输出表示为一分布而不是单个标量。整体的架构和训练上RealnessGAN沿用标准GAN的方式，只是将判别器的输出表示为一个分布，并且在优化阶段是以分布进行度量。总结一下RealnessGAN的优势：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;将标量真实性得分扩展为分布的真实性得分，判别器$D$为生成器$G$提供了更强的指导。&lt;/li&gt;
  &lt;li&gt;RealnessGAN的思路可以推广到一般的GAN中，具有较强的灵活性。&lt;/li&gt;
  &lt;li&gt;基于一个简单的DCGAN架构，RealnessGAN可以成功地从头开始学习生成$1024 \times 1024$分辨率的逼真的图像。&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;realnessgan原理分析&quot;&gt;RealnessGAN原理分析&lt;/h1&gt;

&lt;p&gt;在RealnessGAN原理分析前，先回顾一下标准GAN的优化过程：&lt;/p&gt;

\[\begin{equation}
\begin{aligned}
\min_G\max_DV(G,D)&amp;amp;=\mathbb E_{x \sim p_{data}}[\log D(x)]+E_{z \sim p_z}[\log (1−D(G(z)))] \\
&amp;amp;= \mathbb E_{x \sim p_{data}}[\log D(x)-0]+E_{x \sim p_g}[\log(1−D(x))]
\end{aligned}
\end{equation}\]

&lt;p&gt;此时用0和1分别表示两个虚拟的标量，也就是作为判别器的输出对照，判别器鉴定真实为1，虚假为0。通过固定的$G$，最优$D$得到$D_G^∗(x)=\frac{p_{data}(x)}{p_{data}(x)+p_g(x)}$，再将$D$固定为最优值，最优$G$满足$p_g=p_{data}$。&lt;/p&gt;

&lt;p&gt;采用单个标量作为真实性的度量是受限的，现实中的很多本质上是一个涵盖多个因素的随机变量，此时RealnessGAN便发挥了作用，用一个分布$p_{realness}$替换判别器$D$的标量输出，那么对于一个输入$x$，此时$D(x)={ p_{realness}(x, u);u\in\Omega }$其中$\Omega$是输出$p_{realness}$的结果集，可以将每个结果$u$视为通过某些标准估算的真实性度量。既然判别器的输出被规定为是个分布，那么如何去优化这个判别器输出呢？&lt;/p&gt;

&lt;p&gt;类似于标准GAN的0和1真假标量，RealnessGAN需要两个分布来代表判别器输出的真实和虚假图像的鉴定分布，这里的分布可不同于数据的分布，这里的分布指的是判别器的对照分布。定义两个分布$\mathcal A_1$表示理论上的判别输出为真实的分布，$\mathcal A_0$表示理论上的判别输出为假的分布，它们也在$\Omega$上定义，优化分布之间的距离可以想到的是通过KL散度进行，此时生成器与判别器的博弈过程表示为：&lt;/p&gt;

\[\max_G\min_DV(G,D)= \mathbb E_{x \sim p_{data}}[\mathcal D_{KL}(\mathcal A_1 \Vert D(x))]+E_{x \sim p_g}[\mathcal D_{KL}(\mathcal A_0 \Vert D(x))]\]

&lt;p&gt;先从理论角度分析下这个目标函数，对于判别器$D$，它的目的是为了将真的数据鉴定为真的，假的数据鉴定为假的，所以对于真实数据$x\sim p_{data}$，希望鉴定结果$D(x)$与理论真实分布$\mathcal A_1$尽可能接近，即$\mathcal D_{KL}(\mathcal A_1 \Vert D(x))=0$为理想解，同理对于生成数据$x \sim p_g$则希望判别输出与理论虚假分布$\mathcal A_0$尽可能接近，即$\mathcal D_{KL}(\mathcal A_0 \Vert D(x))=0$为理想解。而对于生成器$G$，公式的第一项由于没有$G$的参与不允讨论，而对于第二项生成器则希望能够骗过判别器，即$\mathcal D_{KL}(\mathcal A_0 \Vert D(x))$越大越好，也就是希望$D(x)$与理论虚假分布$\mathcal A_0$差异越大越好。那生成数据的判别分布于理论虚假分布差异越大，怎么能保证与理论真实分布$\mathcal A_1$越接近呢？文章也进行了讨论，主要通过对生成器的损失进行调整实现，这个我们后面再详细说明。&lt;/p&gt;

&lt;p&gt;知道了目标函数，那怎么保证模型博弈到最后得到的最优解就是$p_g=p_{data}$呢？这需要进一步对目标函数进行分析了，接下来会有一定的公式推导，不喜欢这部分的可以直接跳到下一节，最后的结论就是模型的收敛最优解就是生成数据分布于真实数据分布相同$p_g=p_{data}$。&lt;/p&gt;

&lt;p&gt;与标准GAN的分析相同，固定$G$，目标$D$表示为：&lt;/p&gt;

\[\begin{equation}
\begin{aligned}
\min_DV(G,D) &amp;amp;= \mathbb E_{x \sim p_{data}}[\mathcal D_{KL}(\mathcal A_1 \Vert D(x))]+E_{x \sim p_g}[\mathcal D_{KL}(\mathcal A_0 \Vert D(x))]\\
&amp;amp;= \int_x (p_{data}(x) \int_u \mathcal A_1(u) \log \frac{\mathcal A_1(u)}{D(x,u)}du + p_{g}(x) \int_u \mathcal A_0(u) \log \frac{\mathcal A_0(u)}{D(x,u)}du)dx \\
&amp;amp;= \int_x p_{data}(x) \int_u \mathcal A_1(u) \log \mathcal A_1(u)dudx + \int_x p_{g}(x) \int_u \mathcal A_0(u) \log \mathcal A_0(u)dudx\\
&amp;amp;- \int_x \int_u (p_{data}(x)\mathcal A_1(u)+p_g(x)\mathcal A_0(u)) \log D(x,u)dudx
\end{aligned}
\end{equation}\]

&lt;p&gt;根据熵的定义，记$h(\mathcal A_1)=-\int_u \mathcal A_1(u) \log \mathcal A_1(u)du$，同理$h(\mathcal A_0)=-\int_u \mathcal A_0(u) \log \mathcal A_0(u)du$，则上式改写为：&lt;/p&gt;

\[\begin{equation}
\begin{aligned}
\min_DV(G,D) &amp;amp;= \int_x (p_{data}(x)h(\mathcal A_1)+p_g(x)h(\mathcal A_0))dx - \int_x \int_u (p_{data}(x)\mathcal A_1(u)+p_g(x)\mathcal A_0(u)) \log D(x,u)dudx
\end{aligned}
\end{equation}\]

&lt;p&gt;公式的第一项与$D$无关，将之记为$C_1$，上式可进一步表示为：&lt;/p&gt;

\[\begin{equation}
\begin{aligned}
\min_DV(G,D) &amp;amp;= - \int_x(p_{data}(x)+p_g(x))\int_u \frac{p_{data}(x) \mathcal A_1(u)+p_g(x)\mathcal A_0(u)}{p_{data}(x)+p_g(x)}\log D(x,u)dudx + C_1
\end{aligned}
\end{equation}\]

&lt;p&gt;记$p_x(u) =\frac{p_{data}(x) \mathcal A_1(u)+p_g(x)\mathcal A_0(u)}{p_{data}(x)+p_g(x)} $，$C_2=p_{data}(x)+p_g(x)$，可得到：&lt;/p&gt;

\[\begin{equation}
\begin{aligned}
\min_DV(G,D) &amp;amp;=  C_1 + \int_xC_2 (-\int_u p_x(u)\log D(x,u)du - h(p_x) + h(p_x))dx \\
&amp;amp;= C_1 + \int_xC_2 (-\int_u p_x(u)\log D(x,u)du + \int_u p_x(u) \log p_x(u) + h(p_x))dx \\
&amp;amp;= C_1 + \int_x C_2 \mathcal D_{KL}(p_x \Vert D(x))dx + \int_x C_x h(p_x) dx
\end{aligned}
\end{equation}\]

&lt;p&gt;最小化\(V(G,D)\)就是最小化\(D_{KL}(p_x \Vert D(x))\)，则D的最优解就是\(D^*(x) ={p_x}\)，接下来就是对$G$的最优解进行讨论，当\(D^*(x) =p_{x}\)时，假设\(p_g=p_{data}\)，此时\(D_G^*(x,u)=\frac{\mathcal A_1(u) + \mathcal A_0(u)}{2}\)，则对应的\(V^*(G,D^*_G)\)：&lt;/p&gt;

\[V^⋆(G,D_G^⋆)=\int_u \mathcal A_1(u) \log \frac{2 \mathcal A_1(u)}{\mathcal A_1(u)+ 
\mathcal A_0(u)} + \mathcal A_0(u) \log \frac{2 \mathcal A_0(u)}{\mathcal A_1(u)+ \mathcal A_0(u)}du\]

&lt;p&gt;从\(V(G,D_G^*)\)中减去\(V^*(G,D^*_G)\)得：&lt;/p&gt;

\[\begin{equation}
\begin{aligned}
V^\prime(G,D_G^*)&amp;amp;=V(G,D_G^*)-V^*(G,D^*_G)\\
&amp;amp;=\int_x \int_u (p_{data}(x)\mathcal A_1(u)+p_g(x)\mathcal A_0(u)) \log \frac{(p_{data}(x)+p_g(x))(\mathcal A_1(u)+ \mathcal A_0(u))}{2(p_{data}(x)\mathcal A_1(u)+p_g(x)\mathcal A_0(u))}dudx \\
&amp;amp;= -2\int_x \int_u \frac{p_{data}(x)\mathcal A_1(u)+p_g(x)\mathcal A_0(u)}{2} \log \frac{\frac{p_{data}(x)\mathcal A_1(u)+p_g(x)\mathcal A_0(u)}{2}}{\frac{(p_{data}(x)+p_g(x))(\mathcal A_1(u)+ \mathcal A_0(u))}{4}}dudx \\
&amp;amp;= -2 \mathcal D_{KL}(\frac{p_{data}\mathcal A_1 + p_g \mathcal A_0}{2} \Vert \frac{(p_{data}+p_g)(\mathcal A_1+ \mathcal A_0)}{4})
\end{aligned}
\end{equation}\]

&lt;p&gt;由于\(V^*(G,D^*_G)\)相对于$G$为常数，最大化\(V(G,D_G^*)\)等价于最大化\(V^\prime(G,D_G^*)\)，当且仅当KL散度达到其最小值时，才能获得最佳\(V^\prime(G,D_G^*)\)，对于任何有效的$x$和$u$：&lt;/p&gt;

\[\frac{p_{data}\mathcal A_1 + p_g \mathcal A_0}{2} = \frac{(p_{data}+p_g)(\mathcal A_1+ \mathcal A_0)}{4}\]

&lt;p&gt;即$(p_{data}-p_g)(\mathcal A_1 - \mathcal A_0)=0$，因此，只要存在一个有效的$u$，使得$\mathcal A_1(u) \ne \mathcal A_0(u)$，对于任何有效$x$，都有$p_{data} = p_g$。&lt;/p&gt;

&lt;h1 id=&quot;realnessgan的实施和训练&quot;&gt;RealnessGAN的实施和训练&lt;/h1&gt;

&lt;p&gt;当满足$\mathcal A_1(u) \ne \mathcal A_0(u)$，为了优化模型，此时的$G$需要足够的强大才能匹配理论真实分布，随着$u$数量的增加，对$G$施加的约束因此变得更加严格，则$G$需要付出更多去学习才能匹配判别下理论真实分布，所以$u$数量的增加决定着模型的一定性能，说了这么多，这个$\mathcal A_1$和$\mathcal A_0$以及$u$到底怎么表示呢？&lt;/p&gt;

&lt;p&gt;我们知道$\mathcal A_1$和$\mathcal A_0$是定义下的判别理论分布，只要这两个分布之间差异足够的大即可，那么到底取什么呢？这个答案在文章公布的源码中作者规定了理论判别真实分布锚点$\mathcal A_1$和理论判别虚假分布锚点$\mathcal A_0$。&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# e.g. normal and uniform
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gauss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bins&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;histogram&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gauss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num_outcomes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;anchor0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;unif&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uniform&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bins&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;histogram&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;unif&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num_outcomes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;anchor1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;对于理论判别真实分布$\mathcal A_1$，作者用$(-1,1)$的均匀分布来表示，用均值为0，方差为0.1的高斯分布来表示理论判别虚假分布$\mathcal A_0$，通过np.histogram通过对这采样的1000个点进行num_outcomes的离散化，这个num_outcomes就是$u$的数量。高斯分布与均匀分布分布上的差异决定着锚点$\mathcal A_1$与$\mathcal A_0$的不同，这也满足了推导的条件，num_outcomes则在一定程度上影响着生成的结果，这点我们在后面的实验中再进行分析。&lt;/p&gt;

&lt;p&gt;回到之前提到的优化$G$的问题上来，上述的目标函数对于$G$而言是通过欺骗$D$是增大假样本的$D(x)$和锚点分布$\mathcal A_0$之间的KL散度，而不是减小假样本和锚点分布$\mathcal A_1$之间的KL散度，作者进行了损失上的一定改进，对于一般$G$的优化：&lt;/p&gt;

\[(G_{object1}) \min_G -\mathbb E_{z \sim p_z}[\mathcal D_{KL}(\mathcal A_0 \Vert D(G(z)))]\]

&lt;p&gt;文章又提出了：&lt;/p&gt;

\[(G_{object2}) \min_G \mathbb E_{x \sim p_{data},z\sim p_z}[\mathcal D_{KL}(D(x) \Vert D(G(z)))] -\mathbb E_{z \sim p_z}[\mathcal D_{KL}(\mathcal A_0 \Vert D(G(z)))]\]

\[(G_{object3}) \min_G \mathbb E_{z\sim p_z}[\mathcal D_{KL}(\mathcal A_1 \Vert D(G(z)))] -\mathbb E_{z \sim p_z}[\mathcal D_{KL}(\mathcal A_0 \Vert D(G(z)))]\]

&lt;p&gt;至于说哪个损失更好用，这个在实验中进行了对比。值得一说的是RealnessGAN提出的思想可以用在大部分的GAN中，只需要对损失函数进行一定的调整即可，这也展示了RealnessGAN的灵活性。&lt;/p&gt;

&lt;p&gt;在训练阶段，采用Adam优化器，BN用在生成器，SN用在判别器。&lt;/p&gt;

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;文章首先进行了简单的实验验证模型的有效性，通过toy dataset进行验证，与基准模型进行了对比，选取了StdGAN[2]、WGAN-GP[3]、LSGAN[4]和HingeGAN[5]作为基准模型，得到的结果如图2所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/RealnessGAN2.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图2.toy dataset下RealnessGAN与基准模型的对比
&lt;/p&gt;

&lt;p&gt;可以看到RealnessGAN展示了较为优越的结果生成，在验证$u$的数量上，文章也进行了实验，得到的结果如图3所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/RealnessGAN3.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图3.输出结果数量对生成的影响
&lt;/p&gt;

&lt;p&gt;在固定$G$的更新数量下，$u$的数量越多并没有取得越好的结果，但是随着$G$给予足够的更新，$u$的数量增大得到的结果就越有优势。在定性上模型给出的结果如图4.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/RealnessGAN4.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图4.RealnessGAN在Cifar10、CelebA和FFHQ下的生成结果。
&lt;/p&gt;

&lt;p&gt;定量上文章在Cifar10数据集下进行了对比实验：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/RealnessGAN5.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图5.在Cifar10数据集下各模型在FID和SD指标下结果。
&lt;/p&gt;

&lt;p&gt;为了验证$\mathcal A_1$与$\mathcal A_0$的差异性对结果的影响，文章做了对比实验，结果如图6.&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/RealnessGAN6.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图6.锚点分布的差异性对生成结果的影响，
&lt;/p&gt;

&lt;p&gt;对于$G$的损失优化上，作者进行了比对。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/RealnessGAN7.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图7.G的不同损失下的生成结果。
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;RealnessGAN从分布的角度扩展了生成对抗网络的逼真性，以判别输出分布替代了标准GAN中的单标量判别输出，此时判别器会从多个角度估算真实性，从而为生成器提供更多信息指导。同时这种判别输出分布的方式可以推广到更多的一般性GAN的训练上，从理论和实验分析上可以得到该方法的有效性，对于GAN的发展起到了推助作用。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] Ledig C, Theis L, Huszár F, et al. Photo-realistic single image super-resolution using a generative adversarial network[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 4681-4690.&lt;/p&gt;

&lt;p&gt;[2] Zhang Z, Yu J. STDGAN: ResBlock Based Generative Adversarial Nets Using Spectral Normalization and Two Different Discriminators[C]//Proceedings of the 27th ACM International Conference on Multimedia. 2019: 674-682.&lt;/p&gt;

&lt;p&gt;[3] Gulrajani I, Ahmed F, Arjovsky M, et al. Improved training of wasserstein gans[C]//Advances in neural information processing systems. 2017: 5767-5777.&lt;/p&gt;

&lt;p&gt;[4] Mao X, Li Q, Xie H, et al. Least squares generative adversarial networks[C]//Proceedings of the IEEE International Conference on Computer Vision. 2017: 2794-2802.&lt;/p&gt;

&lt;p&gt;[5] Junbo Zhao, Michael Mathieu, and Yann LeCun. Energy-based generative adversarial network. In
&lt;em&gt;ICLR&lt;/em&gt;, 2017.&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>StarGAN v2图像翻译下的标榜模型</title>
        <link>http://www.twistedwg.com//2019/12/17/StraGAN_v2.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/12/17/StraGAN_v2.html</guid>
        <pubDate>Tue, 17 Dec 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;近期NVIDIA发布的&lt;a href=&quot;https://arxiv.org/abs/1912.04958&quot;&gt;StyleGAN2&lt;/a&gt;对于GAN用于图像生成又推进了一把，同时也是赚足了眼球，然而同期下另一篇图像翻译任务下的改进版模型却显得有点默默无闻了，这就是今天我们要介绍的&lt;a href=&quot;https://arxiv.org/abs/1912.01865&quot;&gt;StarGAN v2&lt;/a&gt;。模型整体在&lt;a href=&quot;https://arxiv.org/abs/1711.09020&quot;&gt;StarGAN&lt;/a&gt;[1]的基础上解决了图像翻译任务中源域的图像转换为目标域的多种图像，并支持多个目标域的问题，实现了较好的源域图像到目标域图像的转换，值得一说的是文章还公布了一个动物面部图像数据集，即将发布于作者的&lt;a href=&quot;https://github.com/clovaai/stargan-v2&quot;&gt;Github&lt;/a&gt;下。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;图像翻译旨在学习不同视觉域之间的映射，域这个概念在视觉下表示一组图像，这组图像可以将它们分组为视觉上独特的类别，比如一个域全是由狗的图像构成，我们称这个就是一个域，在这个域下全是狗的图像，但是狗又可以细分为拉布拉多、斗牛犬、巴哥、柴犬等这些具有特定风格的图像，在一个大类下的分支它们具有这个类的属性，但是又有自己独特的特征，我们称此为风格，推演到人的话，妆容、胡须、卷发也可以定义为风格。&lt;/p&gt;

&lt;p&gt;这种不同域下不同的风格进行转换是相对复杂的，之前的论文在处理这种人脸风格图像的时候往往通过热编码进行有监督的一一属性之间的转换，但是这种热编码的标签在同一张图像输入得到的目标属性的结果往往是相同的，因为我们的输入是相同的，标签也是相同的，得到的结果也是一致的，这种方式也是原始的StarGAN[1]采用的转换方式。另一种转换的方式就类似于CycleGAN[2]那样，从一个域简单的转换到另一个域，可以实现斑马到马，博美到吉娃娃这种单一的转换，如果要实现博美到萨摩这种变换，往往需要重新设计一组生成器。那么由$N$中风格图像的转换的话，就需要设计$N \times (N-1)$种生成器，这显然是不合理的。上述分析的两个问题就是图像翻译任务下的两个需要解决的问题。&lt;/p&gt;

&lt;p&gt;为了实现由一个域图像转换到目标域的多种图像，并支持多个目标域的问题，StarGAN v2便在StarGAN的基础上进行了改进，并且解决了这两类问题。StarGAN是不是第一篇处理这两个问题的呢？答案是否定的，在18年由NVIDIA发表的MUNIT[3]就成功的解决了这两类问题，StarGAN v2算是在MUNIT的基础上实现了更加简洁易懂的处理和图像翻译任务。&lt;/p&gt;

&lt;p&gt;为了展示模型的转换效果，这里先贴一张实验效果图。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/StarGAN2-1.jpg&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图1.StarGAN v2图像转换效果展示
&lt;/p&gt;

&lt;p&gt;总结一下StarGAN v2的优势：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;设计了Mapping Network用于生成风格编码，摆脱了标签的束缚；&lt;/li&gt;
  &lt;li&gt;用风格编码器指导Mapping Network进行目标风格学习，可以实现目标域下多风格图像的转换；&lt;/li&gt;
  &lt;li&gt;公开了动物面部数据集AFQH，实现了图像翻译下较好的结果。&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;stargan-v2模型结构&quot;&gt;StarGAN v2模型结构&lt;/h1&gt;

&lt;p&gt;在具体介绍模型前，我们先来规定下用到的符号，源域图像$x \in \mathcal X$，目标域图像$y \in \mathcal Y$，StarGAN v2的目的是设计单个生成器$G$，该生成器$G$可以生成与图像$x$对应的每个域$y$的不同图像。我们先来看看原文中给的整体结构图。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/StarGAN2-2.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图2.StarGAN v2模型整体结构
&lt;/p&gt;

&lt;p&gt;图2给出的结构是一个很笼统的图示，可以看出StarGAN v2由四部分组成，生成器$-G$，映射网络$-F$，风格编码器$-E$判别器$-D$。我们先捋一下整个过程，首先映射网络学习到目标域图像的风格编码$\hat s = F_{\hat y}(z)$，其中$\hat y \in \mathcal Y$，这是映射网络学习到的目标域图像的风格编码，而作为参照真实目标域图像的风格编码由风格编码器得到$s=E_y(y)$，得到了风格编码$\hat s$结合源域输入图像$x$便可送入到生成器，生成器输出的就是转换后的目标域图像$G(x, \hat s)$，而判别器则为了区分生成的目标域图像是否是真实来源于真实目标域。&lt;/p&gt;

&lt;p&gt;从大方向上捋了一下StarGAN v2的结构，是不是有几个问题要问，为什么设计了映射网络就能实现由源域图像转换到目标域下多幅图像？多幅图像是怎么得到的？这里的风格编码器除了优化映射网络还能用来干嘛？具体的网络细节要怎么实现？&lt;/p&gt;

&lt;p&gt;我们将从这几个问题详细的解释下StarGAN v2，这里的映射网络的输入是一个先验$z$，根据我们的经验的话，这个$z$可以设置为高斯分布，映射网络学习到的是目标域图像的风格表示，也就是说源域图像$x$提供的是源域图像的大致的内容信息，而风格编码$\hat s$则提供了目标域的风格表示，这部分可以指导源域图像$x$按照告诉的风格$\hat s$去转换到目标域下的图像。重点来了，我们在采样$z$下，由于每次采样是不同的，固然得到的风格表示也是不同的，这样每次的$\hat s$也是不一样的，所以可以由固定的一张$x$根据不同的风格表示$\hat s$生成出目标域下不同的风格图像。这就是前两个问题的实现答案。&lt;/p&gt;

&lt;p&gt;风格编码器当然不是单纯用来优化映射网络的，它的另一个大作用是为了在应用阶段作为目标域图像风格的指导器，也就是如果我想指定生成器生成我要求的目标域中某张图像$y$的风格，这个时候就不能送入给生成器随机采样得到的$\hat s$，此时应该馈送进去的是此时的风格编码器的输出$s=E_y(y)$。这样生成出的图像就是指定的风格了，这里可以理解为风格编码器在测试阶段就是一个在线标签生成器，用来指定生成器要按照什么风格进行转换。&lt;/p&gt;

&lt;p&gt;最后就是网络的具体实现，这部分我根据作者给出的附录整理了一下，得到了图3的模型设计图。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/StarGAN2-3.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图3.StarGAN v2模型设计结构
&lt;/p&gt;

&lt;p&gt;这里要强调的是映射网络、风格编码器和判别器的输出都是多分支的，因为文章的目的是进行多目标域的转换，这里的多分支就是不同的目标域的表示，对于映射网络和风格编码器，多分支表示的是多个目标域图像的风格表示，对于判别器多分支则是代表不同目标域的判别真假情况，作者在附录中用$N$表示分支数。虽然作者没有具体的公布代码，有了上述的具体结构，复现简易版本StarGAN v2应该是没啥问题的，要想写代码还是需要对损失函数做简单的解释。&lt;/p&gt;

&lt;h1 id=&quot;损失函数&quot;&gt;损失函数&lt;/h1&gt;

&lt;p&gt;上一章节如果读透了，损失函数这部分就没啥要介绍的了，首先是生成器和判别器的对抗损失：&lt;/p&gt;

\[\mathcal L_{adv} = \mathbb E_{x,y}[logD_y(x)] + \mathbb E_{x, \hat y, z}[log(1-D_{\hat y}(G(x, \hat s)))]\]

&lt;p&gt;这里提一下，虽然公式前半部分写的是$x$，但是在训练阶段肯定是参照的是目标域图像作为真实的，当然，可以设计双向网络，也就是源域和目标域可以实现相互转换。&lt;/p&gt;

&lt;p&gt;为了优化映射网络，设计了风格重构损失：&lt;/p&gt;

\[\mathcal L_{sty} = \mathbb E_{x, \hat{y}, z} [\Vert \hat{s} - E_{\hat{y}}(G(x, \hat{s})) \Vert_1]\]

&lt;p&gt;为了让映射网络可以学习到更多的目标域下的不同风格，也就是让风格更加的多样化，设计了距离度量损失，也就是希望每次得到的风格表示尽量的不一致，这样风格就会更加丰富，所以是最大化$\mathcal L_{ds}$：&lt;/p&gt;

\[\mathcal L_{ds} = \mathbb E_{x, \hat{y}, z_1, z_2}[\Vert G(x,\hat{s}_1) - G(x, \hat{s}_2) \Vert]\]

&lt;p&gt;为了保留源域的特征，作者又加入了一个循环一致损失：&lt;/p&gt;

\[\mathcal L_{cyc} = \mathbb E_{x, y, \hat{y},z}[\Vert x - G(G(x, \hat{s}), s) \Vert_1]\]

&lt;p&gt;在最终的损失优化上：&lt;/p&gt;

\[\mathcal L_D = - \mathcal L_{adv}\]

\[\mathcal L_{F,G,E} = \mathcal L_{adv} + \lambda_{sty} \mathcal L_{sty} - \lambda_{ds} \mathcal L_{ds} + \lambda_{cyc} \mathcal L_{cyc}\]

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;对于基线的选择，作者选定了MUNIT[3]、DRIT[4]和MSGAN[5]这几个都是图像翻译中代表性的文章，数据集上作者在CelebA HQ和自己公布的动物脸部数据集 AFHQ上进行了测试，至于评估标准除了大家熟悉的FID外，还引入了LPIPS[6]，这是一个衡量图像色块相似度的指标（越大越好）。&lt;/p&gt;

&lt;p&gt;在定性实验对比上可以看到StarGAN v2转换得到的图像更加的逼真和多样性，这个在CelebAHQ和AFHQ数据集上都得到了体现。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/StarGAN2-4.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图4.StarGAN v2定性实验结果
&lt;/p&gt;

&lt;p&gt;在有参照的测试结果也同样展示了优越的结果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/StarGAN2-5.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图5.StarGAN v2在有参照图像下定性实验结果
&lt;/p&gt;

&lt;p&gt;定量实验和人力评估上也都展示了优秀的结果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/StarGAN2-6.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图6.StarGAN v2定量实验结果
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/StarGAN2-7.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图7.StarGAN v2人力评估下实验结果
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;StarGAN v2最大的创新之处就是设计了Mapping Network，这个将固定的风格编码用更加灵活的映射网络去学习，可以更加丰富的学习到风格表示，同时整个网络的设计也像较于MUNIT得到了一定的精简，结构更加清晰。网络的整体架构参考了StyleGAN的优越的生成效果，在图像转换上进一步得到了提高，同时也处理了图像翻译下将一个域的图像转换为目标域的多种图像，并支持多个目标域的问题。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] Y. Choi, M. Choi, M. Kim, J.-W. Ha, S. Kim, and J. Choo. Stargan: Uniﬁed generative adversarial networks for multidomain image-to-image translation. In CVPR, 2018. 2, 3, 4&lt;/p&gt;

&lt;p&gt;[2] Zhu J Y, Park T, Isola P, et al. Unpaired image-to-image translation using cycle-consistent adversarial networks[C]//Proceedings of the IEEE international conference on computer vision. 2017: 2223-2232.&lt;/p&gt;

&lt;p&gt;[3] X. Huang, M.-Y. Liu, S. Belongie, and J. Kautz. Multimodal unsupervised image-to-image translation. In ECCV, 2018. 2, 3, 4, 6, 7, 8, 12&lt;/p&gt;

&lt;p&gt;[4] H.-Y. Lee, H.-Y. Tseng, J.-B. Huang, M. K. Singh, and M.-H. Yang. Diverse image-to-image translation via disentangled representations. In ECCV, 2018. 2, 3, 4, 6, 7, 8&lt;/p&gt;

&lt;p&gt;[5] Q. Mao, H.-Y. Lee, H.-Y. Tseng, S. Ma, and M.-H. Yang. Mode seeking generative adversarial networks for diverse image synthesis. In CVPR, 2019. 2, 3, 4, 6, 7, 8&lt;/p&gt;

&lt;p&gt;[6] R. Zhang, P. Isola, A. A. Efros, E. Shechtman, and O. Wang. The unreasonable effectiveness of deep features as a perceptual metric. In CVPR, 2018. 4, 9&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>MelGAN快速生成音频</title>
        <link>http://www.twistedwg.com//2019/10/31/MelGAN.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/10/31/MelGAN.html</guid>
        <pubDate>Thu, 31 Oct 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;谈到数据的生成，很多人都会想到利用生成对抗网络（GAN）去实现，这对于图像和视频这种较易于编码表示的数据是合适的。然而在实现音频的生成时，却是困难重重，首先音频具有较高的时间分辨率（通常至少为每秒16,000个样本），并且在不同时间尺度上存在具有短期和长期依赖性的结构。就目前基于GAN做音频生成的文章中，基本上都是生成出音频对应的中间形态-声谱图。本篇将对音频的后端生成进行分析，介绍&lt;a href=&quot;https://arxiv.org/abs/1910.06711&quot;&gt;MelGAN&lt;/a&gt;是如何通过梅尔谱图快速转换得到最终声音的。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;对原始音频进行建模是一个特别具有挑战性的问题，因为音频具有很高的时间分辨率，同时音频在时间尺度上是有前后依赖关系的。因此，目前大多数方法不是直接对原始时间音频建模，而是通过对原始音频信号进行较低分辨率表示后再进行建模。选择这样的表示形式比使用原始音频更容易建模，同时也保留足够的信息再次转换回音频。这种低分辨率的表示我们称之为音频的中间形式，目前主流的中间形式表达有两种，对齐的语言特征[1]和Mel频谱图[2]。有了音频的中间形式，那么对音频建模就可以转换为$音频  \to 中间形式 \to 音频$。&lt;/p&gt;

&lt;p&gt;音频转换到中间形式相对来说是比较容易的，拿Mel频谱图的转换来说，首先对原始音频文件进行采样，采样速率视实际音频而定，对采样后的信号进行短时傅里叶变换，即在傅里叶变换过程中，使用时间窗口函数与源信号相乘，通过窗函数的滑动得到一系列傅里叶变换的结果，其中快速傅里叶变换的点数和窗函数每次滑动的大小也是人为设定，进而得到其线性振幅谱，然后利用梅尔滤波器组就可以得到梅尔频谱图，其中梅尔滤波器组的个数视实际而定，最后还可以通过对数运算将线性谱转换为对数谱，这个对数谱图可由图1表示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/MelGAN1.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图1.音频的对数谱图表示
&lt;/p&gt;

&lt;p&gt;由音频的中间形式转换为原始音频是一项很大的挑战，不过目前倒是已经有一些方法去实现这个转换。这个转换过程可分为三大家族：纯信号处理技术，自回归和非自回归神经网络。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;纯信号处理：&lt;/strong&gt;较早的Griffin-Lim算法[3]使人们可以有效地将STFT序列解码回时间信号，而代价是要引入了伪像。WORLD声码器[4]引入了一种中间类表示形式，专门针对基于类似于mel频谱图的特征的语音建模而设计。WORLD声码器与专用信号处理算法配对，以将中间表示映射回原始音频。这些纯信号处理方法的主要问题是，从中间特征到音频的映射通常会引入明显的伪像。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;基于自回归神经网络模型：&lt;/strong&gt;WaveNet[1]是一种完全卷积的自回归序列模型，可生成高度逼真的语音样本，该样本与原始音频在时间保持对齐为条件，同时它还能够生成高质量的无条件语音和音乐样本。SampleRNN[5]是一种执行无条件波形生成的替代架构，该架构使用多尺度递归神经网络以不同的时间分辨率显式建模原始音频。WaveRNN[6]是一种基于简单单层递归神经网络的更快的自回归模型。然而，由于这些自回归模型必须依次生成音频样本，因此对这些模型的推论本质上是缓慢且效率低下的，所以自回归模型通常不适合实时应用。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;基于非自回归神经网络模型&lt;/strong&gt;：并行WaveNet[7]和Clarinet[8]将经过训练的自回归解码器提炼成基于流的蒸馏模型。WaveGlow[9]是一种非常高容量的生成流，由12个耦合和12个可逆$1 \times 1$卷积组成，每个耦合层由8层膨胀卷积的堆栈组成。然而，这些基于非自回归模型的一大弊病就是训练成本太高，往往需要耗费长时间在训练上。&lt;/p&gt;

&lt;p&gt;GAN在数据生成上已经取得了很大的进展，尽管它们在计算机视觉方面取得了巨大的成功，但在使用GAN进行音频建模方面，并没有多大的进展。目前基于GAN对音频生成的文章中，大多数是对于音频表示为中间形式就戛然而至了，完全由GAN一步到位生成音频样本的到目前还没有。本篇要介绍的&lt;a href=&quot;https://arxiv.org/abs/1910.06711&quot;&gt;MelGAN&lt;/a&gt;打破了这一僵局的同时，还大大提升了音频建模的速度，总结一下MelGAN的优势：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;MelGAN是一种非自回归前馈卷积架构，是第一个由GAN去实现原始音频的生成，在没有额外的蒸馏和感知损失的引入下仍能产生高质量的语音合成模型。&lt;/li&gt;
  &lt;li&gt;MelGAN解码器可替代自回归模型，以生成原始音频。&lt;/li&gt;
  &lt;li&gt;MelGAN的速度明显快于其他Mel谱图转换到音频的方法，在保证音频质量没有明显下降的情况下比迄今为止最快的可用模型快10倍。&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;模型总览&quot;&gt;模型总览&lt;/h1&gt;

&lt;p&gt;MelGAN是基于GAN实现的，整体结构不难理解就是由生成器和判别器组成，整体结构如图2所示：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/MelGAN2.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图2.MelGAN整体架构
&lt;/p&gt;

&lt;p&gt;生成器的输入是Mel谱图，经过一层Conv层后送到上采样阶段，经过两次$8 \times$后再经过两次$2 \times$，每次上采样中嵌套残差模块，具体的设计目的我们后面详细展开。最后经过一层conv层得到音频输出，由于音频的channel表示为1，所以最后一层的channel设为1。对于判别器，则是采用多尺度架构，也就是除了对原始音频做判别，还对原始音频做降频处理后再馈送到判别器下进行判别，这里的降频方式采用Avg pooling方式。判别器的内部模块设计主要是卷积层和下采样层得到，后续做详细展开。&lt;/p&gt;

&lt;h1 id=&quot;生成器与判别器的设计&quot;&gt;生成器与判别器的设计&lt;/h1&gt;

&lt;p&gt;GAN的训练向来是不太稳定的，为了实现比较好的音频生成，作者也是在生成器和判别器的设计上下足了功夫。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;生成器：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;生成器的输入是声音的频谱图，输出是频谱图对应的音频，在实际处理音频时，文章采用的hop_length（帧移对应卷积中的stride也可以理解为连续帧分割长度）为256，所以Mel频谱图的时间分辨率比原始音频低256倍，所以在生成器的设计上要做到总共$256 \times$的上采样。与传统的GAN不同，MeilGAN生成器并没有使用全局噪声矢量作为输入，在实验中注意到，当额外的噪声馈送到生成器时，所产生的波形几乎没有感知差异。这是不合理的情况，因为由音频到Meil谱图的过程是个有损压缩过程，做逆映射的时候多少不能完全保真的还原。为了保持合理性，作者并没有将噪声馈送到生成器端。图3展示了生成器的详细设计结构：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/MelGAN3.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图3.MelGAN生成器的详细设计
&lt;/p&gt;

&lt;p&gt;为了增强音频在生成过程中的时间步长之间存在长程相关性，作者在上采样后加入了带有空洞卷积的残差块，以便每个后续层的时间远的输出激活具有明显的重叠输入。空洞卷积层的感受野随层数的增加而指数增加，能够有效地增加每个输出时间步长的感应野。相距较远的时间步长的感应野中存在较大的重叠，从而导致更好的远程相关性。残差块主要是3个空洞卷积块组成，每个空洞卷积块由两层卷积层组成。&lt;/p&gt;

&lt;p&gt;GAN在做图像生成的时候常常伴有棋盘状伪影的出现，这个对应到音频生成中表现为可听到的高频嘶嘶声，为了改善这种”伪影”现象，文章通过仔细选择反卷积层的内核大小和步幅来解决此问题，使用内核的大小为跨度的倍数（如果步长为8，则内核大小则为16），为了防止空洞卷积层导致的”伪影”，模型确保空洞随核大小的增长而增长，从而使堆栈的接受域看起来像一个完全平衡且对称的树，核大小则作为分支因子。图4给出了空洞残差块的详细设计结构：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/MelGAN4.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图4.MelGAN生成器中空洞残差块的详细设计
&lt;/p&gt;

&lt;p&gt;最后说一下生成器中的归一化的使用，在GAN做图像生成过程中，如果是随机噪声到图像的生成任务下我们常常使用Batch Normalization，在做图像到图像转换的任务下我们常使用Instance Normalization。由Mel谱图到音频的转换过程更像是在做转换任务，但是，在生成音频的情况下，实验发现Instance Normalization会冲走重要的音高信息，使音频听起来具有金属感。那使用谱归一化呢？当在发生器上应用频谱归一化时，同样得到了较差的结果。 作者认为，对判别器的强烈Lipshitz约束会影响用于训练生成器的特征匹配目标。在所有可用的归一化技术中，最后发现权重归一化[10]效果最好，因为它不会限制判别器的空间或对激活进行归一化。它只是通过将权重矢量的比例从方向上解耦来简单地重新配置权重矩阵，以具有更好的训练动态。因此，文章在生成器的所有层中使用权重归一化。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;判别器：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;为了实现判别器可以学习音频不同频率范围的特征，文章设计的判别器采用多尺度，具有3个判别器（$D_1,D_2,D_2$）的多尺度架构，这些判别器具有相同的网络结构，但在不同的音频规模上运行。$D_1$以原始音频的规模运行，而$D_2,D_3$分别以降频2倍和4倍的原始音频运行，这个多尺度是通过上一尺度下步长为2的平均池化下采样得到的，且内核大小都是3。&lt;/p&gt;

&lt;p&gt;判别器的架构利用分组卷积允许使用较大的内核（文章用的是$41 \times 41$），同时保持较小的参数数量。由于判别器损耗是在每个内核窗口非常大的重叠窗口上计算，因此，MelGAN模型学会了在各个音块之间保持相干性。文章选择基于分组卷积的判别器，也是为了保证捕获音频中的高频结构，而且具有较少的参数，运行速度更快还可以应用于可变长度的音频序列。与生成器类似，在判别器的所有层中使用权重归一化。判别器的详细结构如图5所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/MelGAN5.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图5.MelGAN判别器的详细设计
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;损失函数：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;损失函数上，文章采用了Hinge loss作为生成对抗网络的损失：&lt;/p&gt;

\[\min_{D_k} \mathbb E_x[min(0, 1-D_k(x))]+\mathbb E_{s,z}[min(0, 1+D_k(G(s,z)))],\forall k = 1,2,3\]

\[\min_G \mathbb E_{s,z}[\sum_{k=1,2,3} -D_k(G(s,z))]\]

&lt;p&gt;这里的$x$表示原始音频，$s$表示输入的Mel谱图，$z$表示高斯噪声（可不加），$k$表示判别器的尺度。文章还加了特征匹配损失，这一损失除了优化判别器，也优化了生成器，使真实和合成音频的判别器特征图之间的L1距离最小。&lt;/p&gt;

\[\mathcal L_{FM}(G,D_k) = \mathbb E_{x,s \sim p_{data}}[\sum_{i=1}^T \frac{1}{N_i}\Vert D_k^{(i)}(x)-D_k^{(i)}(G(s)) \Vert_1]\]

&lt;p&gt;其中$D_k^{(i)}$表示第k个判别器的第i层特征图输出，$N_i$表示每层中的单元数，在所有判别块的每个中间层使用特征匹配。最终的生成器的损失可表示如下，其中$\lambda=10$：&lt;/p&gt;

\[\min_G ( \mathbb E_{s,z}[\sum_{k=1,2,3} -D_k(G(s,z))] + \lambda \sum_{k=1}^3 \mathcal L_{FM}(G,D_k))\]

&lt;p&gt;&lt;strong&gt;参数和推断速度：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;文章对网络的参数和速度做了对比，如图6所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/MelGAN6.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图6.MelGAN参数和速度优势
&lt;/p&gt;

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;实验阶段首先是对模型做了消融实验，评判标准是通过人类听力测试评估的音频质量的平均意见得分，得到的结果为图7所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/MelGAN7.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图7.MelGAN消融实验
&lt;/p&gt;

&lt;p&gt;在文本转语音的实验中，文章将MelGAN与WaveNet、WaveGlow进行了对比，采用的架构如图8所示：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/MelGAN8.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图8.MelGAN实现文本转语音的架构
&lt;/p&gt;

&lt;p&gt;得到的对比结果如下：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/MelGAN9.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图9.MelGAN在文本转语音上与现有模型对比
&lt;/p&gt;

&lt;p&gt;可以看出，MelGAN与WaveNet和WaveGlow相当，但是MelGAN速度上的优势还是值得肯定的。&lt;/p&gt;

&lt;p&gt;为了证明MelGAN强大并且可以插入自回归模型执行音频生成上，文章用MelGAN取代了Universal Music Translation Network中的WaveNet型自回归解码器。在仅使用目标音乐域中的数据，MelGAN解码器经过训练，可以从潜在编码中重建原始音频。配备MelGAN解码器的音乐翻译网络能够将音乐从任何音乐领域转换到训练有素的目标领域，感兴趣的读者可以在作者公布的&lt;a href=&quot;https://www.descript.com/overdub&quot;&gt;Demo&lt;/a&gt;上进一步去感受MelGAN的强大。&lt;/p&gt;

&lt;p&gt;最后为了进一步确立方法的通用性，作者将VAE中的解码器替换为MelGAN去实现音频的重构，称之为MelGAN VQ-VAE，这一部分已经有学者进行了较好的浮现，代码地址在&lt;a href=&quot;https://github.com/seungwonpark/melgan&quot;&gt;这里&lt;/a&gt;。VQ-VAE的整体架构如图10所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/MelGAN10.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图10.MelGAN取代VAE下的解码器架构设计
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;MelGAN首次将GAN用于原始音频的生成，这是一个很大的尝试和进步，相信有了这个架构会出现一堆跟进的论文来实现音频的合成。MelGAN能被接受的另一大优势就是它的训练参数和训练时长都是可以接受的，在1080Ti的机子上就可以较好的对论文进行浮现，结合各种语音资料库相信很多学者都可以实现很多有意义的应用。&lt;/p&gt;

&lt;p&gt;文章还拓展了MelGAN模型，在无条件下实现了VQ-VAE这种无条件的音频重构，这种重构模型在一定意义上很像是图像翻译下的转换，这一块也将会引领出一些又意义的创新和应用实现，无条件音频生成将很快得到进一步的发展。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] Van Den Oord, A., Dieleman, S., Zen, H., Simonyan, K., Vinyals, O., Graves, A., Kalchbrenner, N., Senior, A. W., and Kavukcuoglu, K. Wavenet: A generative model for raw audio. &lt;em&gt;SSW&lt;/em&gt;, 125, 2016.&lt;/p&gt;

&lt;p&gt;[2] Shen, J., Pang, R., Weiss, R. J., Schuster, M., Jaitly, N., Yang, Z., Chen, Z., Zhang, Y., Wang, Y., Skerrv-Ryan, R., et al. Natural tts synthesis by conditioning wavenet on mel spectrogram predictions. In 2018 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)*, pp. 4779–4783. IEEE, 2018.&lt;/p&gt;

&lt;p&gt;[3] Griffin, D. and Lim, J. Signal estimation from modified short-time fourier transform. &lt;em&gt;IEEE Transactions on Acoustics, Speech, and Signal Processing&lt;/em&gt;, 32(2):236–243, 1984.&lt;/p&gt;

&lt;p&gt;[4] MORISE, M., YOKOMORI, F., and OZAWA, K. World: A vocoder-based high-quality speech synthesis system for real-time applications. &lt;em&gt;IEICE Transactions on Information and Systems&lt;/em&gt;, E99.D(7):1877–1884, 2016. doi: 10.1587/transinf.2015EDP7457.&lt;/p&gt;

&lt;p&gt;[5] Mehri, S., Kumar, K., Gulrajani, I., Kumar, R., Jain, S., Sotelo, J., Courville, A., and Bengio,Y. Samplernn: An unconditional end-to-end neural audio generation model. &lt;em&gt;arXiv preprint arXiv:1612.07837&lt;/em&gt;, 2016.&lt;/p&gt;

&lt;p&gt;[6] Kalchbrenner, N., Elsen, E., Simonyan, K., Noury, S., Casagrande, N., Lockhart, E., Stimberg, F., Oord, A. v. d., Dieleman, S., and Kavukcuoglu, K. Efficient neural audio synthesis. &lt;em&gt;arXiv preprint arXiv:1802.08435&lt;/em&gt;, 2018.&lt;/p&gt;

&lt;p&gt;[7] Oord, A. v. d., Li, Y., Babuschkin, I., Simonyan, K., Vinyals, O., Kavukcuoglu, K., Driessche, G. v. d., Lockhart, E., Cobo, L. C., Stimberg, F., et al. Parallel wavenet: Fast high-fidelity speech synthesis. &lt;em&gt;arXiv preprint arXiv:1711.10433&lt;/em&gt;, 2017.&lt;/p&gt;

&lt;p&gt;[8] Ping, W., Peng, K., and Chen, J. Clarinet: Parallel wave generation in end-to-end text-to-speech. arXiv preprint arXiv:1807.07281*, 2018.&lt;/p&gt;

&lt;p&gt;[9] Prenger, R., Valle, R., and Catanzaro, B. Waveglow: A flow-based generative network for speech synthesis. In &lt;em&gt;ICASSP 2019-2019 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)&lt;/em&gt;, pp. 3617–3621. IEEE, 2019.&lt;/p&gt;

&lt;p&gt;[10] Salimans, T. and Kingma, D. P. Weight normalization: A simple reparameterization to accelerate training of deep neural networks. In &lt;em&gt;Advances in Neural Information Processing Systems&lt;/em&gt;, pp. 901–909, 2016.&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>InGAN捕捉图像内部块</title>
        <link>http://www.twistedwg.com//2019/10/25/InGAN.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/10/25/InGAN.html</guid>
        <pubDate>Fri, 25 Oct 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;图像翻译这个领域的应用是相当的多，图像风格迁移、图像修复、图像属性变换、图像分割、图像模态的转换等都可以统称为图像翻译的任务。本文将介绍一个图像翻译中比较新颖和有趣的应用，图像的重定向，也就是对图像进行自然的放大和缩小而不影响图像的整体，这是区别于简单的图像拉伸和压缩的过程，而是通过图像到图像转换的过程来实现的。本文将介绍的&lt;a href=&quot;https://arxiv.org/abs/1812.00231&quot;&gt;InGAN&lt;/a&gt;通过捕获图像的内部色块分布实现了图像的的扩充和拉伸，同时文章也是ICCV 2019的oral。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;每个自然图像都有其独特的内部统计数据：构成图像的小块，这些小块在图像中多次出现，从而也可以作为该图像的特异性的表示[1]。例如，假设根据一个输入图像，希望将其转换为形状，大小和纵横比完全不同的新图像。但是又要求不能扭曲其内部任何元素，将它们全部保留为其原始大小，形状，长宽比以及图像中相同的相对位置。这个过程可以由图1所示：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/InGAN1.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图1.图像在保留内部元素下的拉伸
&lt;/p&gt;

&lt;p&gt;当放大图1中的水果摊图像时，每个水果盒中会添加更多的水果，同时保持每个水果的大小相同。反之亦然，当图像变小时，水果的数量变小，同时保持其大小和在图像中的相对位置。此外，请注意，目标图像不一定是矩形的。如果能够捕获并可视化了这种独特的图像特定小块分布，就可以将其映射到不同大小和形状的新目标图像（所有目标图像都具有与输入图像相同的内部小块分布） 。&lt;/p&gt;

&lt;p&gt;如何才能做到这一点？满足这些标准首先是要求目标图像中的小块分布与输入图像中多个图像尺度上的小块分布相匹配，&lt;strong&gt;分布匹配&lt;/strong&gt;允许合成不同大小和形状的新目标图像。双向相似性[2]是目前实现该转换最先进的方法，双向相似性变换将目标图像限制为仅包含来自输入图像的色块（“视觉一致性”），输入目标应仅包含来自目标的色块（“视觉完整性”）。因此，在目标图像中不会引入新的伪像，并且也不会丢失任何关键信息。&lt;a href=&quot;https://arxiv.org/abs/1812.00231&quot;&gt;InGAN&lt;/a&gt;的设计目的在双向相似性的基础上进一步实现：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;不仅要求所有输入色块都在输出中，而且还需要保持这些色块的频率相同。&lt;/li&gt;
  &lt;li&gt;通过匹配分布而不是单个补丁。&lt;/li&gt;
  &lt;li&gt;通过已训练的网络进行一次前向遍历可以生成任何大小/形状/长宽比的目标图像。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这里实现分布的匹配就依赖于生成对抗网络(GAN)来实现了，但是InGAN并不是简单的匹配完整图像的分布，而是通过对图像的不同尺度下的分块分布进行匹配，这也正是文章的题目”InGAN: Capturing and Remapping the “DNA” of a Natural Image”的核心，实现这种内部分块分布的学习，可以进一步的理解和应用在超分辨率图像、修复从图像中删除的补丁、从图像中合成纹理等，总结一下InGAN的优势：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;InGAN为各种不同的任务和不同的数据类型提供统一的框架，所有这些都具有一个单一的网络体系结构。&lt;/li&gt;
  &lt;li&gt;InGAN可以产生大小，形状和纵横比明显不同的输出，包括非矩形输出图像。&lt;/li&gt;
  &lt;li&gt;InGAN是第一个在单个自然图像上训练GAN（训练过程中只是对一张图像进行训练和学习）。&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;ingan框架&quot;&gt;InGAN框架&lt;/h1&gt;

&lt;p&gt;InGAN是如何训练一张图像达到图像重定向的呢？我们先从整体架构上去理解，图2展示了InGAN的框架：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/InGAN2.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图2.InGAN整体框架
&lt;/p&gt;

&lt;p&gt;我们先宏观的分析一下InGAN模型，整体结构就是简单的由生成器和判别器构成，生成器的输入就是输入图像$x$和目标尺度$T$，得到的输出就是目标尺寸下的图像$y$。为了缓解GAN生成多样性不足的问题，这里引入了类似于”循环一致”的思想，就是将由$x$得到的$y$再次送入到生成器还原为原尺度图像$x’$，理想情况下$x$与$x’$应该完全一致。但是这个过程和CycleGAN[3]等”循环一致”是有本质区别的，CycleGAN中的生成器和判别器是有两路的，也就是由$A \to B$和$B \to A$两路，然而InGAN中是只有一路的，因为InGAN的目的是为了学习到图像的内部块，并不是对图像做任何结构和风格的变换。所以，只是图像的尺度发生了改变，这里用一个生成器就可以实现，作者也将这种设计称之为Encoder-Encoder结构。在优化阶段，判别器D是一个多尺度的判别器，它会根据对比不同尺度下的真实图像和生成图像的真假，在不同尺度下进行加权得到最后的得分，用于优化对抗损失。&lt;/p&gt;

&lt;p&gt;整体架构分析下来可以对整个网络有了一个大概上的了解，这里涉及到的损失函数也很简单，一个是生成对抗损失，另一个就是循环一致损失：&lt;/p&gt;

\[\mathcal L_{GAN}(G,D) = \mathbb E_{x \sim p_{data}(x)}[(D(x)-1)^2]+\mathbb E_{x \sim p_{data}(x)} [D(G(x))^2]\]

&lt;p&gt;这里采用的生成对抗损失来自于LSGAN[4]，循环一致损失就是重构损失：&lt;/p&gt;

\[\mathcal L_{reconst} = \Vert G(G(x;T);T^{-1})-1 \Vert_1\]

&lt;p&gt;总的损失可表示为：&lt;/p&gt;

\[\mathcal L_{InGAN} = \mathcal L_{GAN} + \lambda \cdot \mathcal L_{reconst}\]

&lt;h1 id=&quot;设计细节&quot;&gt;设计细节&lt;/h1&gt;

&lt;p&gt;如果你只是想了解一下InGAN的工作原理的话，上面一节已经大致上解释了，这一部分将对网络的具体设计细节进行讨论。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;灵活的生成器&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;生成器的具体设计如图3所示：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/InGAN3.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图3.InGAN中生成器的详细结构
&lt;/p&gt;

&lt;p&gt;整个生成器由三部分组成，用于上下采样和图像特征提取的卷积层、用于图像尺度变换的几何变换层、用于加深图像特征提取的残差层三部分组成。在图像输入阶段经过kernel为7的卷积进行channel的加深，并得到图像的特征表示map，接着送入到几何变换层，所谓的几何变换层就是根据目标尺度T进行的图像的尺度上的简单转换过程，根据T来得到对应于T的尺度图像，在训练阶段这个T是由random_size函数随机产生的，详细的可以参看作者公布的&lt;a href=&quot;&quot;&gt;源码&lt;/a&gt;。接着就是三层下采样，kernel的大小都是3，尺度都是0.5，然后在6层残差层下加深网络后送到上采样为2，最后得到T尺度的图像的彩色输出。需要强调的是在上下采样阶段，利用了U-Net的跳跃连接的思想对特征层进行了前后的联系进一步提高了图像转换中内容和结构的质量，下采样通过max pooling实现，上采样都过最近邻方式实现。&lt;/p&gt;

&lt;p&gt;当训练完成，在训练阶段尺度T就可以人为的指定，从而得到需求下图像的尺度变换。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;多尺度判别器&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;判别器采用的全卷积结构设计，整体结构如图4所示：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/InGAN4.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图4.InGAN中判别器的详细结构
&lt;/p&gt;

&lt;p&gt;提取出判别器一个尺度下结构进行分析，一个标准的网络由4个卷积层组成，一个卷积提取层，接着一个下采样层，再来一个常规卷积层，最后接上sigmoid激活函数下卷积层到[0,1]得分输出。这是一个尺度下的，对于多尺度，则将每一个尺度下的判别得分进行加权，最后得到最终的输出。至于这个多尺度是怎么得到的，这里就涉及到源码下的分析了，作者是通过设计scale_weight实现图像的多尺度的判别，设定的多尺度的上限为99，也就是在图像中进行了99个尺度的分布匹配。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;实施细节&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;使用ADAM优化器和线性衰减学习率，batch size设定为1，对于循环一致损失的超参设定为0.1，在每次迭代中，T的参数都是随机采样的，从而导致不同的输出大小，形状和纵横比，在T的设计上在最初的时候是变化较小的，随着训练的进行，允许的变形范围在整个训练期间（10k次迭代）逐渐增大，直到最终覆盖整个所需范围。判别器和发生器中的谱归一化用于除最后一层以外的所有层，BatchNormalization在大多数conv块中使用，在实际事例中加入$[0, \frac{1}{255}]$范围内的均价噪声。&lt;/p&gt;

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;在图像的重定向上，InGAN展示了合理而强大的转换效果：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/InGAN5.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图5.InGAN与其它模型的图像重定向结构对比
&lt;/p&gt;

&lt;p&gt;在纹理合成上也展示了不错的结果：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/InGAN6.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图6.InGAN与其它模型的图像纹理合成对比
&lt;/p&gt;

&lt;p&gt;实验就一步做了消融实验，展示了循环一致和多尺度对抗的重要性：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/InGAN7.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    图7.InGAN消融实验对比
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;InGAN通过对单一图像的内部色块分布进行学习和分布匹配，在内部色块被学习到后可以实现图像的自然拉伸和重定向（可以产生大小，形状和纵横比明显不同的输出，包括非矩形输出图像）等任务，同时这个框架便可适用于这些任务而不需要再去更改。&lt;/p&gt;

&lt;p&gt;但是InGAN每次只能训练一张图像，这可能有好处也有弊端。好处就是需要的训练集比较小，至于为什么一张图像就能训练网络，这也归功于文中随机变换尺度T的设计。然而每次只能训练一张图像，这样的话当需要处理另一张图像是还需要重新训练网络，这就增加了训练和时间成本了。能否通过设计普适性的预训练模型再通过具体的图像进行微调达到快速处理图像是可以进一步研究的方向。一旦训练成本降低，通过InGAN去扩充数据集，去处理数据集都是很不错的方法。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] A. Buades, B. Coll, and J.-M. Morel. A non-local algorithm for image denoising. In CVPR, volume 2, pages 60–65, 2005. 1&lt;/p&gt;

&lt;p&gt;[2] D. Simakov, Y. Caspi, E. Shechtman, and M. Irani. Summarizing visual data using bidirectional similarity. In The IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2008. 1, 4, 5, 7&lt;/p&gt;

&lt;p&gt;[3] Zhu J Y, Park T, Isola P, et al. Unpaired image-to-image translation using cycle-consistent adversarial networks[C]//Proceedings of the IEEE international conference on computer vision. 2017: 2223-2232.&lt;/p&gt;

&lt;p&gt;[4] X. Mao, Q. Li, H. Xie, R. Y. K. Lau, and Z. Wang. Least squares generative adversarial networks. In Computer Vision (ICCV), IEEE International Conference on, 2017. 4&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>APDrawingGAN由人脸到高质量肖像图转换</title>
        <link>http://www.twistedwg.com//2019/09/27/APDrawingGAN.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/09/27/APDrawingGAN.html</guid>
        <pubDate>Fri, 27 Sep 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;固定的应用场景对于泛化的图像翻译模型来说存在着一定的局限性，往往需要根据实际的需求对网络和细节进行设计以达到特定的效果。图像转换模型中&lt;a href=&quot;https://arxiv.org/abs/1703.10593&quot;&gt;CycleGAN&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1611.07004&quot;&gt;Pix2Pix&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1711.09020&quot;&gt;StarGAN&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1905.01723&quot;&gt;FUNIT&lt;/a&gt;都是泛化较好的模型，然而对于特定需求还是需要更为细致的设计。本篇的目的是为了解读在人脸到肖像画的图像翻译任务下，如何做到这种固定需求的高质量图像转换。本篇的主角是&lt;a href=&quot;[http://openaccess.thecvf.com/content_CVPR_2019/papers/Yi_APDrawingGAN_Generating_Artistic_Portrait_Drawings_From_Face_Photos_With_Hierarchical_CVPR_2019_paper.pdf](http://openaccess.thecvf.com/content_CVPR_2019/papers/Yi_APDrawingGAN_Generating_Artistic_Portrait_Drawings_From_Face_Photos_With_Hierarchical_CVPR_2019_paper.pdf)&quot;&gt;APDrawingGAN&lt;/a&gt;，同时也是CVPR2019 oral，实现了高质量的人脸到肖像图的转换。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;肖像画是一种艺术表现形式，可以简单的通过线条去捕捉人的独特外观，并且可以做到高相似度的描述。这类素描图往往需要艺术家在人或他们的照片面前绘制，且依赖于整体的观察、分析和经验去创作。一副好的肖像画可以形象的表征人的个性和神气，这往往需要一个受过好的培训的艺术家几个小时的时间去创作。&lt;/p&gt;

&lt;p&gt;这种耗时的工作当然可以交给计算机去实现了，但是在实现之前还是要分析一下这项任务的难点。艺术肖像画（APDrawings）是高度抽象的，包含少量稀疏但连续的图形元素（线条）。同时，APDrawings涉及数千个不同大小和形状的笔画的密集集合，面部特征下一些小的伪像也能被清楚的看到，面部特征不能有错位、移位出现。不同人物的肖像结构是变化的，没有固定的精确位置，再者为了体现发型的流动性，往往APDrawings会有一些指示头发流动的线条。综合这些难点，想实现一个高质量的人脸到肖像画的转换是难度很大的，上述的特点都要在考虑范围内。&lt;/p&gt;

&lt;p&gt;为了解决上述挑战，提出了APDrawingGAN，一种新颖的Hierarchical GAN架构，专门用于面部结构和APDrawing样式，用于将面部照片转换为高质量的APDrawings。为了有效地学习不同面部区域的不同绘图风格，GAN架构涉及专门用于面部特征区域的几个局部网络，以及用于捕获整体特征的全局网络。为了进一步应对艺术家绘画中基于线条笔划的风格和不精确定位的元素，还提出了一种新的距离变换（DT）损失来学习APDrawings中的笔划线。总结一下APDrawingGAN的优势：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;提出了一种Hierarchical GAN架构，用于从面部照片中进行艺术人像合成，可以生成高质量和富有表现力的艺术肖像画。特别是，可以用细腻的白线学习复杂的发型。&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;为了最好地模拟艺术家，模型将GAN的渲染输出分成多个层，每个层由分离的损失函数控制。&lt;/li&gt;
  &lt;li&gt;从10个面部数据集中收集的6,655张正面照片预训练模型，并构建适合训练和测试的APDrawing数据集（包含140张专业艺术家的高分辨率面部照片和相应的肖像画）。&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;模型结构&quot;&gt;模型结构&lt;/h1&gt;

&lt;p&gt;先从整体上看一下APDrawingGAN模型结构：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/APDrawingGAN1.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;整体结构是比较直观理解的，整个网络是基于GAN建立的，左边为分层生成器，右边为分层判别器，输入的原始人脸图记为$p_i \in P$。分层生成器的上部分为全局生成器它的输出为全局人脸肖像$I_{global}$，下部分为分别对应着左眼、右眼、鼻子、嘴巴、头发、背景的六个局部生成器，这六个生成器得到的肖像局部图结合在一起便得到了$I_{local}$，通过融合生成器便得到最终的输出结果$G(p_i)$。对于判别器则整体上采用的是条件GAN的判别器设计，对于真实的肖像图给定的标签为True，对于合成的肖像图给定的标签是False，这个标签是人为构建的。同时也是采用全局判别器和六个局部判别器组成，最终确定真假以优化生成器。&lt;/p&gt;

&lt;p&gt;接下来，我们对各个部分详细的进行梳理。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;全局生成器&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这里说的全局生成器和局部生成器并不是我们在感受野中定义的全局和局部，这里的全局和局部就是全局得到的人脸肖像和局部得到的眼睛、鼻子、嘴巴和头发。对于全局生成器采用的是U-Net的设计思路，通过下采样结合特征复用的上采样最终得到全局的输出。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;局部生成器&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;局部生成器的前提是要把人脸的各个部位提取出来，将人脸图取出左眼、右眼、鼻子、嘴巴出来，扣除掉这些部位后得到的就是头发部分，对人脸图取掩码得到背景图。将这六个部分分别进行小尺度下的U-Net的重构得到对应的局部肖像图，通过partCombiner2_bg网络将这六个部分组合组合成一副完整的人脸肖像图，partCombiner2_bg主要通过在重叠区域使用最小池化来将所有局部生成器的输出混合到聚合图形。其实从扣出局部的部位到再次将每一个部位整合在一起，这中间还是比较繁琐的，同时这块也是APDrawingGAN的主要创新之处，在源码中作者通过固定各个部位的尺度大小，然后通过对每一幅图像的各个部位进行标注（主要是嘴巴和中心位置，保存在txt中的5行2列的坐标），在训练阶段进行截取局部位置时调用。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;融合生成器&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;融合生成器就是将全局生成器得到的全局图和局部生成器得到的局部整合图进行channel维度的concat后送入到combine网络再次经过一些卷积处理最终得到最后的输出$G(p_i)$。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;全局判别器和局部判别器&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;全局判别器和局部判别器就和条件GAN的判别器类似，定义真实部分的label为真，合成部分的label为假，然后通过条件判别器进行优化，整个网络的架构就是堆叠的下采样。&lt;/p&gt;

&lt;h2 id=&quot;损失函数&quot;&gt;损失函数&lt;/h2&gt;

&lt;p&gt;整个模型的损失函数由四部分组成，大家熟知的生成对抗损失、像素层面损失、距离变换损失以及局部像素损失。对于生成对抗损失，主要分为两部分一个是全局性的生成对抗损失和局部性六个部位的生成对抗损失；像素层面损失主要是采用$\mathcal L_1$损失$L_{\mathcal L_1}=\mathbb E_{(p_i,a_i) \sim S_{data}}[\Vert G(p_i)-a_i] \Vert_1$，其中$a_i$就是真实肖像画的数据；局部像素损失就是对各个部位的合成和真实进行$\mathcal L_1$损失优化，比如对鼻子的局部损失$L_{local_{nose}}=\mathbb E_{(p_i,a_i) \sim S_{data}}[\Vert G_{l_nose}(Ns(p_i)-Ns(a_i)] \Vert_1$；我们重点分析一下距离变换损失。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;距离变换损失&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;距离变换指的是对于一张图像中的每一个像素点的值用距离来代替，其实得到的就是一副类似于二值图的图像，$I_{DT}(x)$用于表示肖像图的黑线分布，$I^{‘}&lt;em&gt;{DT}(x)$用于表示肖像图白线的分布，由肖像图计算黑线与白线可以用卷积层去检测到，从而确定确定对应的$I&lt;/em&gt;{DT}(x)$和$I^{‘}_{DT}(x)$。我们可以用下图进一步理解距离变换的定义。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/APDrawingGAN2.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;距离变换损失就是衡量真实肖像图与生成肖像图的$I_{DT}(x)$与$I^{‘}_{DT}(x)$的差值：&lt;/p&gt;

\[d_{CM}(a_i,G(p_i))=\sum_{(j,k) \in \Theta_b(a_i)}I_{DT}(G(p_i))(j,k) + \sum_{(j,k) \in \Theta_\omega(a_i)}I^{'}_{DT}(G(p_i))(j,k)\]

&lt;p&gt;其中像素$(j,k)$在真实和生成肖像图下$I_{DT}(x)$与$I^{‘}_{DT}(x)$的距离，得到的最终的损失表示为：&lt;/p&gt;

\[L_{DT}(G,D) = \mathbb E_{(p_i,a_i) \sim S_{data}}[d_{CM}(a_i,G(p_i))+d_{CM}(G(p_i),a_i)]\]

&lt;p&gt;这种对肖像图中的黑线和白线的距离控制是为了尽可能还原肖像图中的发型流动性和光泽度，让肖像图更加地逼真。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;整体损失&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;最终得到的损失函数为：&lt;/p&gt;

\[\min_G \max_D L(G,D) = L_{adv}(G,D)+\lambda_1 L_{\mathcal L_1}(G,D)+\lambda_2 L_{DT}(G,D)+\lambda_3 L_{local}(G,D)\]

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;数据集处理&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;由于由艺术家手绘的肖像图的成本过高，实验组是收集了140对面部照片和相应的肖像画的数据集（由专业人员手绘的肖像图），为了实现少量图像对下的训练，从10个面部数据集中收集了6,655张正面照片，对每张图片使用双色调NPR算法[1]生成肖像图纸，这个阶段得到的结果通常会产生没有明确下颚线的结果（由于这些位置的图像中的对比度低），再使用OpenFace [2]中的面部模型来检测颌骨上的标记，然后将下颌线添加到NPR结果中。对于这种处理得到的数据，主要用于预训练，预训练阶段为前10个epoch，由于NPR生成的绘图（与艺术家的绘图不同）与照片准确对齐，因此在预训练中不去优化距离变换损失。预训练结束后，将数据集换为由专业人员手绘的肖像图进一步训练得到最后的结果，这个过程解释可看下图。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/APDrawingGAN3.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;消融对比&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;文章在定性上做了消融性对比，包括有无局部生成器、距离变换损失、预训练和完整结果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/APDrawingGAN4.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;实验对比&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;和已有的方法，APDrawingGAN也与时下的模型进行了定性和定量上的对比。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/APDrawingGAN5.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/APDrawingGAN6.png&quot; /&gt;
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;文章提出了APDrawingGAN，一种用于将面部照片转换为APDrawing的分层GAN模型。实验致力于特定的人脸和APDrawing风格的转换，特别是旨在完成这种特定的转换工作。通过全局生成器和局部生成器对人脸进行肖像图重构，利用距离变换损失加强肖像图的逼真度，从实验结果上可以实现成功的艺术肖像风格转移，并且取得了一定的优势。&lt;/p&gt;

&lt;p&gt;这也启发了我们在通用型的图像翻译工作下，具体的模型设计还需要根据具体的目的需求去设计，在特定的任务下实现合理而且高质量的结果。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] Paul L. Rosin and Yu-Kun Lai. Towards artistic minimal rendering. In International Symposium on Non-Photorealistic Animation and Rendering, NPAR ’10, pages 119–127, 2010. 5, 6&lt;/p&gt;

&lt;p&gt;[2] Brandon Amos, Bartosz Ludwiczuk, and Mahadev Satyanarayanan. OpenFace: A general-purpose face recognition library with mobile applications. Technical report, CMUCS-16-118, CMU School of Computer Science, 2016. 6&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>UGATIT-自适应图层实例归一化下图像到图像转换</title>
        <link>http://www.twistedwg.com//2019/08/07/UGATIT.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/08/07/UGATIT.html</guid>
        <pubDate>Wed, 07 Aug 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;生成对抗网络（GAN）在这几年的发展下已经渐渐沉淀下来，在网络的架构、训练的稳定性控制、模型参数设计上都有了指导性的研究成果。我们可以看出17、18年大部分关于GAN的有影响力的文章多集中在模型自身的理论改进上，如&lt;a href=&quot;https://arxiv.org/abs/1710.10196&quot;&gt;PGGAN&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1802.05957&quot;&gt;SNGAN&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1805.08318&quot;&gt;SAGAN&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1809.11096&quot;&gt;BigGAN&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1812.04948&quot;&gt;StyleGAN&lt;/a&gt;等，这些模型都还在强调如何通过随机采样生成高质量图像。19年关于GAN的有影响力的文章则更加关注GAN的应用上，如&lt;a href=&quot;https://arxiv.org/abs/1905.01723&quot;&gt;FUNIT&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1903.07291&quot;&gt;SPADE&lt;/a&gt;等已经将注意力放在了应用层，也就是如何利用GAN做好图像翻译等实际应用任务。学术上的一致性也暗示了GAN研究的成熟，本文主要介绍一种利用GAN的新型无监督图像转换论文&lt;a href=&quot;https://arxiv.org/abs/1907.10830&quot;&gt;U-GAT-IT: Unsupervised Generative Attentional Networks with Adaptive Layer-Instance Normalization for Image-to-Image Translation&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;图像到图像转换可以应用在很多计算机视觉任务，图像分割、图像修复、图像着色、图像超分辨率、图像风格（场景）变换等都是图像到图像转换的范畴。生成对抗网络[1]不仅仅在模型训练的收敛速度上，同时在图像转换质量上展示了优越的结果。这些优越性能相比&lt;a href=&quot;https://arxiv.org/abs/1606.05328&quot;&gt;Pixel CNN&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1312.6114&quot;&gt;VAE&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1807.03039&quot;&gt;Glow&lt;/a&gt;都是具有很大竞争力的。所以近年来的围绕GAN实现图像翻译的研究是很多的，例如&lt;a href=&quot;https://arxiv.org/abs/1703.10593&quot;&gt;CycleGAN&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1703.00848&quot;&gt;UNIT&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1804.04732&quot;&gt;MUNIT&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1808.00948&quot;&gt;DRIT&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1905.01723&quot;&gt;FUNIT&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1903.07291&quot;&gt;SPADE&lt;/a&gt;。图像翻译是GAN铺开应用的第一步，跨模态间的转换，文本到图像、文本到视频、语音到视频等，凡是这种端到端，希望实现一个分布到另一个分布转换的过程，GAN都是可以发挥一定的作用的。&lt;/p&gt;

&lt;p&gt;回归到现实，图像到图像的转换到目前为止还是具有一定挑战性的，大多数的工作都围绕着局部纹理间的转换展开的，例如人脸属性变换、画作的风格变换、图像分割等，但是在图像差异性较大的情况下，在猫到狗或者是仅仅是语义联系的图像转换上的表现则不佳的。这就是图像转换模型的适用域问题了，实现一个具有多任务下鲁棒的图像转换模型是十分有必要的。本文将要介绍的&lt;a href=&quot;https://arxiv.org/abs/1907.10830&quot;&gt;U-GAT-IT&lt;/a&gt;正是为了实现这种鲁棒性能设计的，我们先宏观的看一下文章采用何种方式去实现这种鲁棒性能。&lt;/p&gt;

&lt;p&gt;首先是&lt;strong&gt;引入注意力机制&lt;/strong&gt;，这里的注意力机制并不传统的Attention或者Self-Attention的计算全图的权重作为关注，而是采用全局和平均池化下的类激活图（Class Activation Map-CAM）[2]来实现的，CAM对于做分类和检测的应该很熟悉，通过CNN确定分类依据的位置，这个思想和注意力是一致的，同时这对于无监督下语义信息的一致性判断也是有作用的，这块我们后续再进行展开。有了这个注意力图，文章再加上&lt;strong&gt;自适应图层实例归一化&lt;/strong&gt;（AdaLIN），其作用是帮助注意力引导模型灵活控制形状和纹理的变化量。有了上述的两项作用，使得U-GAT-IT实现了鲁棒下的图像转换。总结一下U-GAT-IT的优势：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;提出了一种新的无监督图像到图像转换方法，它具有新的注意模块和新的归一化函数AdaLIN。&lt;/li&gt;
  &lt;li&gt;注意模块通过基于辅助分类器获得的注意力图区分源域和目标域，帮助模型知道在何处进行密集转换。&lt;/li&gt;
  &lt;li&gt;AdaLIN功能帮助注意力引导模型灵活地控制形状和纹理的变化量，增强模型鲁棒性。&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;模型结构&quot;&gt;模型结构&lt;/h1&gt;

&lt;p&gt;端到端模型最直观的展示就是模型结构图，我们看一下U-GAT-IT实现结构：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/UGATIT1.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;我们先把我们能直观看懂的部分做一个介绍，模型分为生成器和判别器，可以看到生成器和判别器的结构几乎相同，生成器好像多了一点操作（这多的这点就是AdaLIN和Decoder部分），我们分析生成器，首先是对端的输入端进行图像的下采样，配合残差块增强图像特征提取，接下来就是注意力模块（这部分乍一看，看不出具体细节，后续分析），接着就是对注意力模块通过AdaLIN引导下残差块，最后通过上采样得到转换后的图像。对于判别器相对于生成器而言，就是将解码过程换成判别输出。&lt;/p&gt;

&lt;p&gt;重点来了，就是如何实现图像编码后注意力模块以及AdaLIN怎样引导解码得到目标域图像的呢？&lt;/p&gt;

&lt;h2 id=&quot;cam--auxillary-classifier&quot;&gt;CAM &amp;amp; Auxillary classifier&lt;/h2&gt;

&lt;p&gt;对于这部分计算CAM，结合模型结构图做进一步理解：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/UGATIT2.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;由上图，我们可以看到对于图像经过下采样和残差块得到的Encoder Feature map经过Global average pooling和Global max pooling后得到依托通道数的特征向量。创建可学习参数weight，经过全连接层压缩到$B \times 1$维，这里的$B$是BatchSize，对于图像转换，通常取为1。对于学习参数weight和Encoder Feature map做multiply（对应位想乘）也就是对于Encoder Feature map的每一个通道，我们赋予一个权重，这个权重决定了这一通道对应特征的重要性，这就实现了Feature map下的注意力机制。对于经过全连接得到的$B \times 1$维，在average和max pooling下做concat后送入分类，做源域和目标域的分类判断，这是个无监督过程，仅仅知道的是源域和目标域，这种二分类问题在CAM全局和平均池化下可以实现很好的分类。当生成器可以很好的区分出源域和目标域输入时在注意力模块下可以帮助模型知道在何处进行密集转换。将average和max得到的注意力图做concat，经过一层卷积层还原为输入通道数，便送入AdaLIN下进行自适应归一化。&lt;/p&gt;

&lt;h2 id=&quot;adalin&quot;&gt;AdaLIN&lt;/h2&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/UGATIT3.png&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;由上图，完整的AdaLIN操作就是上图展示，对于经过CAM得到的输出，首先经过MLP多层感知机得到$\gamma , \beta$，在Adaptive Instance Layer resblock中，中间就是AdaLIN归一化。AdaLIN正如图中展示的那样，就是Instance Normalization和Layer Normalization的结合，学习参数为$\rho$，论文作者也是参考自BIN[3]设计。AdaIN的前提是保证通道之间不相关，因为它仅对图像map本身做归一化，文中说明AdaIN会保留稍多的内容结构，而LN则并没有假设通道相关性，它做了全局的归一化，却不能很好的保留内容结构，AdaLIN的设计正是为了结合AdaIN和LN的优点。&lt;/p&gt;

&lt;h2 id=&quot;判别器&quot;&gt;判别器&lt;/h2&gt;

&lt;p&gt;文章的源码中，判别器的设计采用一个全局判别器(&lt;strong&gt;Global Discriminator&lt;/strong&gt;)以及一个局部判别器(&lt;strong&gt;Local Discriminator&lt;/strong&gt;)结合实现，所谓的全局判别器和局部判别器的区别就在于全局判别器对输入的图像进行了更深层次的特征压缩，最后输出的前一层，feature map的尺寸达到了$\frac{h}{32} \times \frac{w}{32}$，根据感受野的传递，这个尺度卷积下的感受野是作用在全局的（感受野超过了图像尺寸），读者可以自行按照论文给出的网络设计参数进行计算（kernel全为4），（我算的结果是$286 \times 286$比输入图像$256 \times 256$要大）对于局部判别器，最后输出的前一层，feature map的尺寸达到了$\frac{h}{8} \times \frac{w}{8}$，此时感受野是达不到图像尺寸（我算的结果是$70 \times 70$），这部分称为局部判别器。最后通过extend将全局和局部判别结果进行连接，此处要提一下，在判别器中也加入了CAM模块，虽然在判别器下CAM并没有做域的分类，但是加入注意力模块对于判别图像真伪是有益的，文中给出的解释是&lt;strong&gt;注意力图通过关注目标域中的真实图像和伪图像之间的差异来帮助进行微调。&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;损失函数&quot;&gt;损失函数&lt;/h2&gt;

&lt;p&gt;对于利用GAN实现图像到图像转换的损失函数其实也就那几个，首先是GAN的对抗损失$\mathcal L_{gan}$，循环一致性损失$\mathcal L_{cycle}$，以及身份损失（相同域之间不希望进行转换）$\mathcal L_{identity}$，最后说一下CAM的损失。CAM的损失主要是生成器中对图像域进行分类，希望源域和目标域尽可能分开，这部分利用交叉熵损失：
\(\mathcal L_{cam} = -(\mathbb E_{x \sim X_s}[log(\eta_s(x))]+\mathbb E_{x \sim X_t}[log(1 - \eta_t(x))])\)
在判别器中，也对真假图像的CAM进行了对抗损失优化，主要是为了在注意图上进一步区分真假图像，最后得到完整的目标函数：
\(\mathcal L = \lambda_1 \mathcal L_{gan} + \lambda_2 \mathcal L_{cycle} + \lambda_3 \mathcal L_{identity} + \lambda_4 \mathcal L_{cam}\)&lt;/p&gt;

&lt;h2 id=&quot;trick和adalin实现代码&quot;&gt;Trick和AdaLIN实现代码&lt;/h2&gt;

&lt;p&gt;作者公布的源码如果大家尝试运行可能会参数爆内存，这里的罪魁祸首发生在计算自适应图层实例归一化下的MLP直接从卷积展平送到全连接层中参数过大，大致计算一下，从$1 \times 64 \times 64 \times 256$直接展平的尺寸是$1 \times 1048576$再进行全连接操作，这个计算量是很大的，为了减小计算量，可以在这一步先对map进行global average pooling再进行全连接操作。对于生成器Encoder部分的归一化采用IN，Decoder采用LIN，判别器网络加上谱归一化限制（生成器并没有加），我们接下来放上论文的核心AdaLIN的tensorflow下代码实现：&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;adaptive_instance_layer_norm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gamma&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;beta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;smoothing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'instance_layer_norm'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;variable_scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;ch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;eps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1e-5&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# 计算Instance mean，sigma and ins
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;ins_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ins_sigma&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;moments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keep_dims&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;x_ins&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ins_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sqrt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ins_sigma&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;eps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
				
        &lt;span class=&quot;c1&quot;&gt;# 计算Layer mean，sigma and ln
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;ln_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ln_sigma&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;moments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keep_dims&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;x_ln&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ln_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sqrt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ln_sigma&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;eps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 给定rho的范围，smoothing控制rho的弹性范围
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;smoothing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;rho&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_variable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;rho&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;initializer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;constant_initializer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                  &lt;span class=&quot;n&quot;&gt;constraint&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clip_by_value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
                                  &lt;span class=&quot;n&quot;&gt;clip_value_min&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clip_value_max&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;rho&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_variable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;rho&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;initializer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;constant_initializer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                                  &lt;span class=&quot;n&quot;&gt;constraint&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clip_by_value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                                  &lt;span class=&quot;n&quot;&gt;clip_value_min&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clip_value_max&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# rho = tf.clip_by_value(rho - tf.constant(0.1), 0.0, 1.0)
&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;x_hat&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rho&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_ins&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rho&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_ln&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;x_hat&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_hat&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gamma&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;beta&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_hat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;作者在五个不成对的图像数据集评估了方法的性能，有比较熟悉的马和斑马，猫到狗，人脸到油画，风格场景还有就是最让我感兴趣的作者团队创建的女性到动漫的数据集，不过可惜的是这个数据集作者并没有公布。&lt;/p&gt;

&lt;p&gt;在定性和定量上，U-GAT-IT都展示了优越的结果：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/UGATIT4.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/UGATIT5.png&quot; /&gt;
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;论文提出了无监督的图像到图像转换（U-GAT-IT），其中注意模块和AdaLIN可以在具有固定网络架构和超参数的各种数据集中产生更加视觉上令人愉悦的结果。辅助分类器获得的关注图可以指导生成器更多地关注源域和目标域之间的不同区域，从而进行有效的密集转换。此外，自适应图层实例规范化（AdaLIN）可以进一步增强模型在不同数据集下的鲁棒性。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] Goodfellow I, Pouget-Abadie J, Mirza M, et al. Generative adversarial nets[C]//Advances in neural information processing systems. 2014: 2672-2680.&lt;/p&gt;

&lt;p&gt;[2] B. Zhou, A. Khosla, A. Lapedriza, A. Oliva, and A. Torralba. Learning deep features for discriminative localization. In Computer Vision and Pattern Recognition (CVPR), 2016 IEEE Conference on, pages 2921–2929. IEEE, 2016. 2, 3&lt;/p&gt;

&lt;p&gt;[3] H. Nam and H.-E. Kim. Batch-instance normalization for adaptively style-invariant neural networks. arXiv preprint arXiv:1805.07925, 2018. 2, 3&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>空间自适应归一化下图像语义合成（论文解读）</title>
        <link>http://www.twistedwg.com//2019/07/22/GauGAN.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/07/22/GauGAN.html</guid>
        <pubDate>Mon, 22 Jul 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;深度学习在算力的推动下不断的发展，随着卷积层的堆叠，模型的层数是越来越深，理论上神经网络中的参数越多这样对数据的拟合和分布描述就能越细致。然而简单的堆叠卷积层又会引起梯度消失和过拟合的问题，伴随着解决方案下残差网络、归一化和非线性层被提出。本博客将对NVIDA近期的论文&lt;a href=&quot;https://arxiv.org/abs/1903.07291&quot;&gt;Semantic Image Synthesis with Spatially-Adaptive Normalization&lt;/a&gt;进行解读，这篇论文提出了适合保留语义信息的Spatially-Adaptive Normalization（空间自适应归一化），同时文章在实现细节上也很有参考意义。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;Batch Normalization (BN)在&lt;a href=&quot;&quot;&gt;Inception v2&lt;/a&gt;[1]网络中被提出，它的设计之初是为了解决Internal Covariate Shift问题，也就是在训练过程中，隐层的输入分布老是变来变去。因为深层神经网络在做非线性变换前的激活输入值随着网络深度加深或者在训练过程中，其分布逐渐发生偏移或者变动，这导致了训练收敛慢，也就是数据整体分布逐渐往非线性函数的取值区间的上下限两端靠近。所以这导致反向传播时低层神经网络的梯度消失，这是训练深层神经网络收敛越来越慢的本质原因。&lt;/p&gt;

&lt;p&gt;我们知道&lt;strong&gt;数据白化&lt;/strong&gt;，是对输入数据分布变换到0均值，单位方差的正态分布，这样会使神经网络较快收敛。如果这种”白化处理”作用在每一个隐层上，是不是可以稳定数据分布的同时加速收敛？这个问题的答案就是BN设计的根源了，BN就是通过一定的规范化手段，对于每个隐层神经元，把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布，使得非线性变换函数的输入值落入对输入比较敏感的区域，以此避免梯度消失问题。&lt;/p&gt;

&lt;p&gt;掌握了Batch Normalization的作用后，其实后期演进的&lt;a href=&quot;https://arxiv.org/abs/1607.08022&quot;&gt;Instance Normalization&lt;/a&gt;[2]、&lt;a href=&quot;https://arxiv.org/abs/1607.06450&quot;&gt;Layer Normalization&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1803.08494&quot;&gt;Group Normalization&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1602.07868&quot;&gt;Weight Normalization&lt;/a&gt;在原理上的作用是相近的，都是为了稳定模型训练，只不过不同的归一化方法适用于不同的场合。比如在做图像翻译时，往往设置的BatchSize为1或者模型训练时BatchSize取值很小，这个时候Batch Normalization在对这批数据取均值和方差，而这批数据由于量不够，很难描述整体数据，此时就可以尝试使用Layer Normalization或者Group Normalization。&lt;/p&gt;

&lt;p&gt;言归正传，回到本博客的主题Spatially-Adaptive Normalization（空间自适应归一化），已经有这么多好用的归一化方法了为啥还要Spatially-Adaptive Normalization呢？说清这个问题前，我们要来看一下&lt;a href=&quot;https://papers.nips.cc/paper/7237-modulating-early-visual-processing-by-language.pdf&quot;&gt;Conditional Batch Normalization&lt;/a&gt;(CBN)[3]，以图像和其标签为例，CBN就是通过BN将图片底层信息和标签信息结合，这样处理的好处就是让图像的标签（语义信息）指导图像的特征表达。这种标签信息往往是由热编码或者是低纬的向量通过感知层代替BN中的参数$\gamma$和$\beta$，如果这个标签信息是一张语义分割图呢？这种输入到感知层的方式将不能充分表达图像的语义信息了，此时Spatially-Adaptive Normalization便派上用场了，它正是处理这种标签信息是一张语义分割图时如何让&lt;strong&gt;图像的标签（语义信息）指导图像的特征表达&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;总结一下论文的优势：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;提出了Spatially-Adaptive Normalization，实现了给定输入语义布局的情况下合成逼真的图像。&lt;/li&gt;
  &lt;li&gt;可以根据输入图像和语义图指导合成语义信息下的图像。&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;spatially-adaptive-normalization&quot;&gt;Spatially-Adaptive Normalization&lt;/h1&gt;

&lt;p&gt;如果熟悉Conditional Batch Normalization的话，Spatially-Adaptive Normalization(SPADE)自然是很容易理解的，简单点说就是将Conditional Batch Normalization中的”标签”经过多层感知机换成了语义分割图经过卷积层而已。当然你要是不熟悉也没问题，我们接下来详细说明，在说明之前我们看一下Spatially-Adaptive Normalization的整体结构。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/BN/SPADE1.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;我们用$m \in \mathbb L^{H \times W}$表示语义分割图，其中$\mathbb L$表示语义标签的整数集，$H$ 和 $W$是图像的高度和宽度。论文的最终目的就是为了学习可以将输入分割掩模 $m$转换为逼真图像的模型结构。&lt;/p&gt;

&lt;p&gt;设$h^i$表示给定一批 $N$ 个样本的深卷积网络的第$i$层激活层。设$C^i$是图层中通道的数量。设 $H^i$和$W^i$ 是各图层中激活层的高度和宽度。Spatially-Adaptive Normalization可以表示为：&lt;/p&gt;

\[\gamma_{c,y,x}^i(m) \frac{h_{n,c,y,x}^i-\mu_c^i}{\delta_c^i}+\beta_{c,y,x}^i(m)\]

&lt;p&gt;可以看出以通道方式进行归一化，其中$n \in N,c \in C_i,y \in H^i, x \in W^i$，$h_{n,c,y,x}^i$是归一化处理前的输入，$\mu_c^i$和$\delta_c^i$为通道$c$中输入的平均值和标准差：&lt;/p&gt;

\[\mu_c^i = \frac{1}{NH^iW^i}\sum_{n,y,x}h_{n,c,y,x}^i\]

\[\delta_c^i = \sqrt{\frac{1}{NH^iW^i}\sum_{n,y,x}(h_{n,c,y,x}^i)^2-(\mu_c^i)^2}\]

&lt;p&gt;$\gamma_{c,y,x}^i(m)$和$\beta_{c,y,x}^i(m)$是Spatially-Adaptive Normalization学习参数，它们是通过语义分割图$m$经过卷积层得到的参数，此时的$\gamma_{c,y,x}^i(m)$和$\beta_{c,y,x}^i(m)$是包含语义分割图的语义信息的，同时也是语义分割图的feature map表示，这样学习到的参数将保留语义分割图的充分的语义信息，也实现了输入的归一化处理。&lt;/p&gt;

&lt;p&gt;对于一般的归一化（BN、LN、IN、GN）只是对网络层中输入进行不同维度下求均值和标准差操作，例如Instance Normalization是对$H$ 和 $W$求均值和标准差，再进行归一化，这是用于图像的风格描述。假定我们对一个3通道的RGB图像求像素上的均值和标准差，不同风格的图像呈现的均值和方差是有差异的，比如艳丽的风格往往是像素特别丰富的，此时的图像像素均值自然是大的，阴暗风格对应的像素均值自然是小的。但是这仅仅是对输入的本身进行操作，这个过程没有语义的表示，而SPADE将语义分割图为输入提供了丰富的语义信息，这个可以实现输入下语义的传递和表达，这也是SPADE真正的意义所在。&lt;/p&gt;

&lt;h1 id=&quot;语义图像的生成&quot;&gt;语义图像的生成&lt;/h1&gt;

&lt;p&gt;介绍的SPADE只是实现语义图像合成的手段，并不是文章的最终目的，论文的目标是实现根据语义分割图实现语义图像的生成，也就是下面这个过程：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/BN/SPADE2.gif&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;我们看一下完整的模型结构：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/BN/SPADE3.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;模型中的Image Encoder其实就是为了实现VAE[4]和GAN[5]结合的作用，目的是为语义图像的合成提供参考，也就是告诉模型按照语义分割指导合成的图像应该和我的整体风格类似。比如一批山水画作Image Encoder得到的特征隐变量通过KL映射到先验分布（高斯分布）上，通过采样根据语义分割图像的指导，解码生成包含语义信息的另一幅山水画。之所以加入VAE让图像编码的隐变量映射到先验分布上是为了在测试阶段可以通过随机采样实现语义图像的生成而不是再送入一张指导图像。&lt;/p&gt;

&lt;p&gt;接下来我们将对模型细节进一步梳理，主要突出SPADE和SPADE ResBlk的设计介绍。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SPADE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这部分的结构如下：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/BN/SPADE4.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;首先对语义分割图进行Resize，这步的作用是为了让语义分割图的输入尺寸和要进行归一化的输入尺寸保持一致，此处的Resize都是最近邻下采样实现。得到与输入相同尺寸map后，先通过一个$3 \times 3$卷积层得到128通道的语义分割图feature map，这一步主要是为了将原始的语义分割图3通道进行升维到128通道，接着就是分别经过两个$3 \times 3$卷积层得到对应的$\gamma$和$\beta$，此处的$k$要根据实际而定。得到$\gamma$和$\beta$后就可以和输入（已经和均值和标准差处理过）进行操作。在源码中，在SPADE内部就进行了一个残差操作，图中没有画出而已，结合分析，我们用tensorflow对SPADE进行实现：&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;spade&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;segmap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'spade'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;variable_scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;param_free_norm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x_init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 进行均值，标准差计算，(x - x_mean) / x_std
&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;as_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;segmap_h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;segmap_w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;segmap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;as_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;factor_h&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;segmap_h&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_h&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 确定下采样的比例
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;factor_w&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;segmap_w&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_w&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;segmap_down&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;down_sample&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;segmap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;factor_h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;factor_w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 最近邻下采样
&lt;/span&gt;				
        &lt;span class=&quot;c1&quot;&gt;# 第一步卷积处理
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;segmap_down&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;conv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;segmap_down&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;128&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kernel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stride&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
                           &lt;span class=&quot;n&quot;&gt;pad&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'conv_128'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;segmap_down&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;relu&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;segmap_down&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
				
        &lt;span class=&quot;c1&quot;&gt;# 两个卷积得到segmap_gamma和segmap_beta
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;segmap_gamma&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;conv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;segmap_down&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kernel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stride&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
                            &lt;span class=&quot;n&quot;&gt;pad&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'conv_gamma'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;segmap_beta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;conv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;segmap_down&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kernel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stride&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
                           &lt;span class=&quot;n&quot;&gt;pad&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'conv_beta'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# 引入残差
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;segmap_gamma&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;segmap_beta&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;param_free_norm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;epsilon&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1e-5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;x_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_var&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;moments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keep_dims&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;x_std&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sqrt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x_var&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;epsilon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_std&lt;/span&gt;
  
  
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;down_sample&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale_factor_h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale_factor_w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;as_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;new_size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale_factor_h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scale_factor_w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resize_nearest_neighbor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;SPADE ResBlk&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;我们再来看SPADE ResBlk的结构：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/BN/SPADE5.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;它是由主路下两个SPADE和残差分路SPADE构成，分路的SPADE主要是为了保证残差块之前和之后的通道数量不同的情况下的操作（这步主要发生在channel变化的阶段，如生成器中1024到512的过程），我们用tensorflow实现SPADE ResBlk：&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;spade_resblock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;segmap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'spade_resblock'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;channel_in&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;as_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;channel_middle&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channel_in&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 由于是生成阶段，channel是逐渐变小的
&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;variable_scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;spade&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;segmap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channel_in&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'spade_1'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lrelu&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;conv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channel_middle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kernel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stride&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
                 &lt;span class=&quot;n&quot;&gt;pad&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'conv_1'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;spade&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;segmap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channel_middle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
                  &lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'spade_2'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lrelu&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;conv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kernel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stride&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pad&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
                 &lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'conv_2'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channel_in&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x_init&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;spade&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;segmap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channel_in&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
                           &lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'spade_shortcut'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x_init&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;conv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x_init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channels&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kernel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stride&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
                          &lt;span class=&quot;n&quot;&gt;use_bias&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'conv_shortcut'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_init&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;整个生成器的架构就可以由SPADE ResBlk进行设计，判别器首先将语义分割图和真实（生成）进行concat再逐步下采样，由于这是图像翻译的过程，默认情况下batch size取1，所以在判别器下不适合用BN，而使用的IN作为归一化处理（个人感觉LN得到的效果应该也会不错的）。图像编码器的架构是个下采样过程，也是采用IN，输出为均值和方差，用于拟合先验分布（高斯分布）。&lt;/p&gt;

&lt;p&gt;论文涉及到训练中的损失函数主要是生成对抗损失和拟合先验分布的KL loss，对抗损失默认采用的是hinge loss，还涉及到特征匹配损失，生成器和判别器的正则化损失以及衡量生成和真实图像的VGG loss，感兴趣的可以阅读源码进一步了解，[&lt;a href=&quot;https://github.com/NVlabs/SPADE&quot;&gt;Pytorch版本&lt;/a&gt;]、[&lt;a href=&quot;https://github.com/taki0112/SPADE-Tensorflow&quot;&gt;tensorflow版本&lt;/a&gt;]。&lt;/p&gt;

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;实施细节上，采用Spectral Norm [6]应用于生成器和判别器中的所有层。 生成器和判别器的学习率分别设置为0.0001 和 0.0004。优化器使用 ADAM 并设置$\beta_1 = 0$ ，$\beta_2= 0.999$。分别在COCO-Stuff、ADE20K、ADE20K-outdoor、Cityscapes 、FlickrLandscapes数据集上进行实验。&lt;/p&gt;

&lt;p&gt;在定性上，结果还是很有说服力的：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/BN/SPADE6.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;在定量上也展示了优势：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/BN/SPADE7.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;在模型参数上也有一定优势：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/BN/SPADE8.png&quot; /&gt;
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;论文提出了Spatially-Adaptive Normalization（空间自适应归一化），该方法对Conditional Batch Normalization（条件批归一化）进行了改进，将标签信息换成了语义分割图，通过卷积层代替多层感知层为图像合成提供了丰富的语义信息。同时这种转换也不仅仅适用于语义分割图，甚至可以在语音和视频中得到改进和发展。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] S. Ioffe and C. Szegedy. Batch normalization: Accelerating deep network training by reducing internal covariate shift. In International Conference on Machine Learning (ICML), 2015.&lt;/p&gt;

&lt;p&gt;[2] D. Ulyanov, A. Vedaldi, and V. Lempitsky. Instance nor- malization: The missing ingredient for fast stylization. arxiv 2016. arXiv preprint arXiv:1607.08022, 2016.&lt;/p&gt;

&lt;p&gt;[3] V. Dumoulin, J. Shlens, and M. Kudlur. A learned repre- sentation for artistic style. In International Conference on Learning Representations (ICLR), 2016.&lt;/p&gt;

&lt;p&gt;[4] Kingma D P, Welling M. Auto-encoding variational bayes[J]. arXiv preprint arXiv:1312.6114, 2013.&lt;/p&gt;

&lt;p&gt;[5] Goodfellow I, Pouget-Abadie J, Mirza M, et al. Generative adversarial nets[C]//Advances in neural information processing systems. 2014: 2672-2680.&lt;/p&gt;

&lt;p&gt;[6] T. Miyato, T. Kataoka, M. Koyama, and Y. Yoshida. Spec-tral normalization for generative adversarial networks. In In-ternational Conference on Learning Representations (ICLR), 2018.&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>Sphere GAN（论文解读）</title>
        <link>http://www.twistedwg.com//2019/05/22/Sphere_GAN.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/05/22/Sphere_GAN.html</guid>
        <pubDate>Wed, 22 May 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;GAN是通过积分概率度量实现数据分布的拟合，从原始的&lt;a href=&quot;https://arxiv.org/abs/1406.2661&quot;&gt;GAN&lt;/a&gt;一路发展下来经过了多次重大的改进。Wesserstein距离代替了原始GAN中KullbackLeibler（KL）散度，从而提出了&lt;a href=&quot;https://arxiv.org/abs/1701.07875&quot;&gt;WGAN&lt;/a&gt;；梯度惩罚下的&lt;a href=&quot;https://arxiv.org/abs/1704.00028&quot;&gt;WGAN-GP&lt;/a&gt;;&lt;a href=&quot;https://arxiv.org/abs/1705.08584&quot;&gt;MMD GAN&lt;/a&gt;匹配在希尔伯特空间中单位球上定义的有序矩;&lt;a href=&quot;https://arxiv.org/abs/1802.05957&quot;&gt;SNGAN&lt;/a&gt;为代表的参数归一化的实现；&lt;a href=&quot;https://arxiv.org/abs/1705.10743&quot;&gt;Cram’er GAN&lt;/a&gt;使用能量距离来训练GAN。这些改进都在对判别器进行约束，本博客将介绍的&lt;a href=&quot;http://cau.ac.kr/~jskwon/paper/SphereGAN_CVPR2019.pdf&quot;&gt;Sphere GAN&lt;/a&gt;使用超球面来绑定目标函数中的积分概率度量（IPM），实现了更加快捷稳定的GAN的训练，同时这篇论文也被选作CVPR 2019 Oral。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;自Goodfellow等人提出生成对抗网络（GAN）[1]引起了很多研究兴趣，它们已被用于在各种计算机视觉应用中并实现了卓越性能，包括图像生成、超分辨率、视频预测、风格迁移、图像修复、图像编辑、视觉跟踪、三维重建、图像分割、物体检测、强化学习和医学成像等。&lt;/p&gt;

&lt;p&gt;GAN现在已经得到普及式的推广，传统的GAN试图最小化生成数据和真实数据之间的分布差异。为此目的，生成器试图产生看起来像真实数据的所需样本，判别器试图将它们与实际数据区分开。尽管GAN已经成功地应用于各种任务，但是训练它们非常困难，常见的两大问题就是训练上的不稳定（一旦判别器训练到最优状态，生成器会出现参数的梯度消失）、生成的多样性不足（GAN训练上对数据分布的记忆性）。&lt;/p&gt;

&lt;p&gt;随着深度学习的训练模型的硬件进步，改进的GAN已经取得了足以以假乱真的实验结果，例如&lt;a href=&quot;https://arxiv.org/abs/1809.11096&quot;&gt;BigGAN&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1812.04948&quot;&gt;StyleGAN&lt;/a&gt;、&lt;a href=&quot;https://arxiv.org/abs/1905.01723&quot;&gt;FUNIT&lt;/a&gt;都是深度学习巨头公司的杰作。作为大众研究者，我们更希望看到的是对GAN进行理论上的改进，Sphere GAN的出发点也在于此，并将重点放在基于积分概率指标（IPM）GAN上，以克服上述问题。基于IPM的GAN将梯度惩罚项或改进项插入到目标函数中以实现模型稳定学习，然而，这些附加约束不可避免地引入了需要调整的额外超参数，从而导致更高的计算成本。此外，许多基于IPM的GAN也带来了基于样本的约束策略的不稳定行为，&lt;/p&gt;

&lt;p&gt;Sphere GAN是一种新颖的基于IPM的GAN，通过使用几何矩匹配并利用数据的高阶统计信息，从而获得准确的结果。因为矩形匹配是在超球面上进行的，所以Sphere GAN的IPM可以是有界的。文章也证明了超球面引起的几何约束使得GAN训练更加稳定。Sphere GAN并不依赖于传统的基于IPM的GAN的虚拟采样技术和附加的梯度惩罚项，而是利用数学理论支持的黎曼流形下超球面进行实现。&lt;/p&gt;

&lt;p&gt;总结一下Sphere GAN的优势：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Sphere GAN是利用黎曼流形在GAN目标函数中定义IPM的第一次尝试&lt;/li&gt;
  &lt;li&gt;第一个基于IPM的GAN下不使用梯度惩罚或虚拟数据采样技术&lt;/li&gt;
  &lt;li&gt;Sphere GAN的良好性能在数学上得到证实&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;sphere-gan&quot;&gt;Sphere GAN&lt;/h1&gt;

&lt;p&gt;为了更加直观的介绍Sphere GAN，我们先来回顾一下基于Wasserstein度量GAN直接匹配一维特征空间中实现方式，WGAN[2]模型的目标函数如下：&lt;/p&gt;

\[\min_G \max_D \mathbb E_{x \sim \mathcal P}[D(x)] - \mathbb E_{z \sim \mathcal N}[D(G(z))]\]

&lt;p&gt;如果大家对WGAN比较熟悉的话，上述目标函数应该很好理解，G和D分别对应着生成器和判别起参数，$\mathcal P$是真实数据分布，$\mathcal N$为先验噪声分布。Wasserstein度量下判别器将样本映射到实数域进行损失优化，$D:x \in \mathcal X \to \mathbb R$。其中D应满足$1- Lipschitz$条件，图像样本$x \subset \mathbb R^n$是n维欧几里得图像空间，判别器是将n维图像空间映射到一维特征空间下。&lt;/p&gt;

&lt;p&gt;我们再来看一下Sphere GAN的目标函数：&lt;/p&gt;

\[\min_G \max_D \sum_r \mathbb E_{x \sim \mathcal P}[d_s^r(N,D(x))] - \sum_r \mathbb E_{z \sim \mathcal N}[d_s^r(N,D(G(z)))]\]

&lt;p&gt;其中$r=1, \cdots ,R$指的是取的样本对应的索引表示，函数$d_s^r$测量每个样本与超球面北极之间的第$r$个矩距离$N$。与直接匹配一维特征空间的WGAN不同，Sphere GAN匹配在超球面上定义的高阶和多阶。为此，判别器输出一个n维超球，$D:x \in \mathcal X \to \mathbb S^n$，$d_s^r$的下标$s$表示的是在$\mathbb S^n$上定义的。&lt;/p&gt;

&lt;p&gt;为了形象的展示这个目标函数的实现意义，我们看一下这个实现超球面度量的结构表示：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Sphere_GAN1.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;对于生成器和判别器的实现网络没什么要说的，我们看一下判别器最后的输出口是通过将样本映射到欧几里得空间$\mathbb R^n$再投影到超球面$\mathbb S^n$上，通过度量超球面上的点到超球面北极的距离作为最终的确定度量。&lt;/p&gt;

&lt;p&gt;判别器的作用就是使得真实样本的超球面下的度量距离和生成样本尽可能的远，而生成器的目的就是为了让这两个度量距离越近越好，从而达到最大最小的对抗，实现对抗优化。&lt;/p&gt;

&lt;p&gt;基于Wesserstein距离的传统判别器需要$Lipschitz$约束，这迫使判别器成为$1-Lipschitz$函数的成员。具有不恰当的权重参数λ的约束可能会降低网络稳定并且增加网络训练的压力，例如WGAN-GP[3]，WGAN-CT[4]和WGANLP[5]在目标函数中需要额外的约束项来更新判别器。这一种约束在Sphere GAN下是不需要的，通过匹配在超球面$\mathbb S^n$上定义的特征空间上的多个矩，这样就不是在任意的黎曼流形取实现界限约束。&lt;/p&gt;

&lt;p&gt;我们再来梳理一下这个过程。传统的GAN通常将欧几里德空间$\mathbb R^n$视为欧几里德距离，这些GAN可以通过对任意黎曼流形进行建模来扩展。这些流形是不紧凑的，距离函数不受限制，可能导致梯度爆炸和学习不稳定。Sphere GAN使用几何感知变换函数，该函数将欧几里德空间$\mathbb R^n$变换为超球面$\mathbb S^n$，这个变换函数是微分同胚下的，是可微分的并且可以在特征空间的每个点处保持维度（后续会做展开说明）。&lt;/p&gt;

&lt;p&gt;超球面在GAN下的应用带来了以下的优势：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;超球面的距离函数$d_s^r$是有界的&lt;/li&gt;
  &lt;li&gt;梯度范数与$d_s^r$距离函数对于稳定学习至关重要&lt;/li&gt;
  &lt;li&gt;超球面的黎曼结构适用于GAN&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;几何感知转换函数&quot;&gt;几何感知转换函数&lt;/h1&gt;

&lt;p&gt;超球面的距离度量是通过欧几里得空间$\mathbb R^n$映射到超球面$\mathbb S^n$上，这是一个立体投影的过程，而且这个立体投影是符合微分同胚的，立体投影的逆可以被认为是将超平面投影到超球面上的一种方式整个过程如下图展示：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Sphere_GAN2.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;我们先看原文给出的投影定义，假设$p=(p_1,p_2, \cdots , p_n)$点是坐标系$\mathbb R^n$上，$N=(0, \cdots , 1)$为超球面的北极，也就是默认了超球面的半径为1，立体投影$\prod^{-1}:\mathbb R^n \to \mathbb S^n/ \lbrace N \rbrace$的逆定义为：
\(\begin{matrix} \prod^{-1} \end{matrix} (p) = (\frac{2p}{\Vert p \Vert^2 + 1},\frac{\Vert p \Vert^2 - 1}{\Vert p \Vert^2 + 1})\)
在$n$维的条件下我们不好理解这个公式是如何投影的，我们不妨将维度降低一些来分析，我们将超球面变为2维的圆，那么欧几里得上坐标就是一个点，我们设北极为$N(0,1)$（圆的半径为1），由北极$N$投影的点为$p(p,0)$，投影在圆上的点为$\hat{p}(x,y)$，现在我们就来表示点$\hat{p}$。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Sphere_GAN3.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;我们由三角形的相似定理可以得到：&lt;/p&gt;

\[\frac{y}{1} = \frac{p-x}{p}\]

&lt;p&gt;我们再有圆上点的特性有：$x^2 + y^2 = 1$&lt;/p&gt;

&lt;p&gt;上述公式化简后平方可得：$p^2 y^2 = p^2 - 2px + x^2$&lt;/p&gt;

&lt;p&gt;将$y$用$x$表示可以解得：&lt;/p&gt;

\[\begin{cases}
x = \frac{2p}{p^2+1} \\
y=\frac{p^2-1}{p^2+1}
\end{cases}\]

&lt;p&gt;对应在单位圆上可以进一步得到：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Sphere_GAN4.png&quot; /&gt;
&lt;/p&gt;

\[\begin{cases}
x = \frac{2p}{p^2+1} = cos \theta \\
y=\frac{p^2-1}{p^2+1} = sin \theta
\end{cases}\]

&lt;p&gt;将这个过程上升到$n$维，加上向量的思想后就得到了一开始的立体投影的结果了，我们再来求对应超球面的两点的测地距离$d_r^s$，我们取投影后的两点$p(p,0),q(q,0)$。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Sphere_GAN5.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;此时的两点的测地距离就是点$p,q$这段弧长，我们由弧长公式$d = \theta \cdot R$可以得到：&lt;/p&gt;

\[d = arccos(cos(\theta_2 - \theta_1)) \cdot R\]

&lt;p&gt;我们知道半径$R=1$，再由余弦和差公式$cos(\theta_2 - \theta_1) = cos \theta_2 cos \theta_1 + sin \theta_1 sin \theta_2$，由已知的解代入其中：&lt;/p&gt;

\[cos(\theta_2 - \theta_1) = \frac{p^2-1}{p^2+1} \cdot \frac{q^2-1}{q^2+1} + \frac{2q}{q^2+1} \cdot \frac{2p}{p^2+1}\]

&lt;p&gt;最后整理得到：&lt;/p&gt;

\[d = arccos(\frac{p^2q^2 - p^2 - q^2+ 4pq + 1}{(p^2 + 1)(q^2 + 1)})\]

&lt;p&gt;将此上升到$n$维超球面就得到了原文中的公式：&lt;/p&gt;

\[d_s(\begin{matrix} \prod^{-1} \end{matrix} (p) , \begin{matrix} \prod^{-1} \end{matrix} (q) ) = arccos(\frac{\Vert p^2 \Vert \Vert q^2 \Vert - \Vert p^2 \Vert - \Vert q^2 \Vert + 4pq + 1}{(\Vert p^2 \Vert + 1)(\Vert q^2 \Vert + 1)})\]

&lt;p&gt;如图，超球面上两点之间的测地距离比欧几里德距离短得多，并且在超球面（即黄色球面）上有界，因此实现几何变换等效于对超平面施加全局约束，这也保证了训练上的稳定性。&lt;/p&gt;

&lt;p&gt;原文为了进一步对Sphere GAN做了数学分析，通过和IPM、Wesserstein距离、梯度进行分析，较全面的对Sphere GAN进行了深入的理论分析，限于篇幅就不展开了，有兴趣的可以自行阅读原文。我们说一下如何在程序的思想上实现立体投影下欧几里得到超平面的逆定义，以及用在GAN下的损失函数的实现：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Sphere_GAN6.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;我们用tensorflow进行实现：&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;inverse_stereographic_projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;x_u&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;transpose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;pow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;norm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;x_v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;pow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;norm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x_u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keepdims&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;pow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;norm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x_u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keepdims&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;x_projection&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;transpose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x_u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_projection&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;对应的度量距离：&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sphere_loss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;acos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keras&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;backend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;batch_dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loss&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;我们再把对应的GAN下训练的判别器和生成器的损失整理进来：&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;discriminator_loss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;real&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;moment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;real_loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fake_loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;real&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;as_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# [bs, c+1] -&amp;gt; [0, 0, 0, ... , 1]
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;north_pole&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;one_hot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;multiples&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;depth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; 
    &lt;span class=&quot;n&quot;&gt;real_projection&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;inverse_stereographic_projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;real&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fake_projection&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;inverse_stereographic_projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;moment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;real_loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reduce_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;pow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sphere_loss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;real_projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;north_pole&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
      	&lt;span class=&quot;n&quot;&gt;fake_loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reduce_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;pow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sphere_loss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fake_projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;north_pole&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;real_loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fake_loss&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loss&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;generator_loss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loss_func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;moment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fake_loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;as_list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# [bs, c+1] -&amp;gt; [0, 0, 0, ... , 1]
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;north_pole&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;one_hot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;multiples&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;depth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  
    &lt;span class=&quot;n&quot;&gt;fake_projection&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;inverse_stereographic_projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fake&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;moment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;fake_loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reduce_mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;pow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sphere_loss&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fake_projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;north_pole&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;loss&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fake_loss&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loss&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;网络训练批次大小为64。在所有实验中，对发生器和鉴别器使用Xavier初始化和Adam优化器，将发生器和判别器的Adam优化器的超参数固定为$\alpha = 1e-4,\beta_1 = 0, \beta_2 = 0.9$。在使用ConvNet的实验中，将moment modes设置为$\sum_1^5d^r$。在其他实验中，将超球面的尺寸设置为$\mathbb S^{1024}$，将moment modes设置为$\sum_1^3d^r$。&lt;/p&gt;

&lt;p&gt;需要强调的是作者用于训练的就是单个GTX Titan GPU进行的，在某些大厂的GPU甚至TPU横飞的GAN模型训练下，能用单块GTX Titan GPU完成实验，并且获得CVPR 2019 Oral真可谓是着实不易。&lt;/p&gt;

&lt;p&gt;文章在数据集的选择下使用了CIFAR-10，STL-10和LSUN数据集上进行了实验，对于CIFAR-10大家可能很熟悉，STL-10是图像大小为$96 \times 96$，包含10类的自然图像数据集，文章将此调整为$48 \times 48$，LSUN文章选择了卧室作为训练数据，并调整为$64 \times 64$。&lt;/p&gt;

&lt;p&gt;文章首先进行了Ablation Study，在不同的矩匹配模式和超球面的不同维度下进行了测试，采用的定量指标是Inception Score：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Sphere_GAN7.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;可以看到随着矩匹配模式和超球面维度的增加，得到的结果是增益的，这也符合理论的分析，在训练的稳定性和训练的持续性上，文章对比了WGAN-GP：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Sphere_GAN8.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;在不同的基于IPM的改进GAN的模型上，文章也做了定量上的IS和FID的对比：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Sphere_GAN9.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;最后，文章还对Sphere GAN训练时间上的优势做了对比：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Sphere_GAN10.png&quot; /&gt;
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;Sphere GAN是一种新颖的基于IPM的GAN，定义了超球面上的IPM（一种黎曼流形），超球面的黎曼流形提供了有界的IPM使得训练变得稳定。高阶矩匹配使Sphere GAN能够利用有关数据的有用信息并提供准确的结果。实验结果也验证了Sphere GAN确实实现了GAN的又一个不错的方向上的改进。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] Goodfellow I, Pouget-Abadie J, Mirza M, et al. Generative adversarial nets[C]//Advances in neural information processing systems. 2014: 2672-2680.&lt;/p&gt;

&lt;p&gt;[2] Arjovsky M, Chintala S, Bottou L. Wasserstein generative adversarial networks[C]//International Conference on Machine Learning. 2017: 214-223.&lt;/p&gt;

&lt;p&gt;[3] Gulrajani I, Ahmed F, Arjovsky M, et al. Improved training of wasserstein gans[C]//Advances in Neural Information Processing Systems. 2017: 5767-5777.&lt;/p&gt;

&lt;p&gt;[4] Petzka H, Fischer A, Lukovnicov D. On the regularization of Wasserstein GANs[J]. arXiv preprint arXiv:1709.08894, 2017.&lt;/p&gt;

&lt;p&gt;[5] Wei X, Gong B, Liu Z, et al. Improving the improved training of wasserstein gans: A consistency term and its dual effect[J]. arXiv preprint arXiv:1803.01541, 2018.&lt;/p&gt;

</description>
      </item>
    
      <item>
        <title>STGAN人脸属性编辑（论文解读）</title>
        <link>http://www.twistedwg.com//2019/04/29/STGAN.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/04/29/STGAN.html</guid>
        <pubDate>Mon, 29 Apr 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/1711.10678&quot;&gt;AttGAN&lt;/a&gt;和&lt;a href=&quot;http://openaccess.thecvf.com/content_cvpr_2018/papers/Choi_StarGAN_Unified_Generative_CVPR_2018_paper.pdf&quot;&gt;StarGAN&lt;/a&gt;在人脸属性编辑上取得了很大的成功，但当人脸属性之间相互交集或者目标人脸属性比较复杂时，这两种方式对于控制属性的标签上的精细化就显示了些许的不足。&lt;a href=&quot;https://arxiv.org/abs/1904.09709&quot;&gt;STGAN&lt;/a&gt;是一个建立在&lt;a href=&quot;https://arxiv.org/abs/1711.10678&quot;&gt;AttGAN&lt;/a&gt;基础上的人脸属性编辑模型，通过差分属性标签下选择性传输单元的跳跃连接实现了人脸高精度属性的编辑。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;图像编辑是计算机视觉下有趣但也具有挑战性的工作，随着生成对抗网络的发展，图像编辑取得了长足的发展，任意属性编辑实际上也转换到了多域图像到图像变换任务。类似于&lt;a href=&quot;https://arxiv.org/abs/1703.10593&quot;&gt;CycleGAN&lt;/a&gt;和&lt;a href=&quot;https://arxiv.org/abs/1611.07004&quot;&gt;Pix2Pix&lt;/a&gt;等此类单个翻译模型已经取得了一定的成功，但是它在利用整个训练数据方面是无效的，并且学习的模型随着属性的数量呈指数增长。为了解决这个问题，多属性的图像变换模型逐渐涌现，其中最为有名的则是&lt;a href=&quot;https://arxiv.org/abs/1711.10678&quot;&gt;AttGAN&lt;/a&gt;[1]和&lt;a href=&quot;http://openaccess.thecvf.com/content_cvpr_2018/papers/Choi_StarGAN_Unified_Generative_CVPR_2018_paper.pdf&quot;&gt;StarGAN&lt;/a&gt;[2]了。&lt;/p&gt;

&lt;p&gt;这两个模型都是架构在编码器 - 解码器上，同时将源图像和目标属性向量作为输入，&lt;a href=&quot;https://arxiv.org/abs/1711.10678&quot;&gt;AttGAN&lt;/a&gt;不是对潜在表示施加约束，而是对生成的图像应用属性分类约束，以保证所需属性的正确变化，同时引入重建学习以保留属性排除细节。&lt;a href=&quot;http://openaccess.thecvf.com/content_cvpr_2018/papers/Choi_StarGAN_Unified_Generative_CVPR_2018_paper.pdf&quot;&gt;StarGAN&lt;/a&gt;只用一个generator网络，处理多个domain之间互相generate图像的问题，这是比&lt;a href=&quot;https://arxiv.org/abs/1711.10678&quot;&gt;AttGAN&lt;/a&gt;更深一步的人脸属性迁移。&lt;/p&gt;

&lt;p&gt;STGAN是建立在这两个模型基础上的人脸高精度属性编辑模型，我们先看一下这三个模型生成的人脸对比：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/STGAN1.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;从上图可以看出这三个模型下虽然所有属性都保持不变，但AttGAN和StarGAN在结果中可以观察到不必要的变化和视觉退化，造成这种结果的主要原因在于编码器 - 解码器的结构限制和目标属性的使用矢量作为输入。STGAN仅考虑要改变的属性，以及在用解码器特征编辑属性无关区域时选择性地连接编码器特征。&lt;/p&gt;

&lt;p&gt;仅考虑要改变的属性通过目标和源属性标签之间的差异作为编码器 - 解码器的输入；提出了选择性传输单元（STU）来自适应地选择和修改编码器特征，其进一步与解码器特征连接以增强图像质量和属性操纵能力。总结一下STGAN的优势：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;将差异属性向量作为输入，以增强属性的灵活转换并简化训练过程&lt;/li&gt;
  &lt;li&gt;设计选择性传输单元并与编码器 - 解码器结合，以同时提高属性操作能力和图像质量&lt;/li&gt;
  &lt;li&gt;实验结果上，STGAN在任意面部属性编辑和图像翻译方面取得了很好的效果&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;skip-connection&quot;&gt;Skip Connection&lt;/h1&gt;

&lt;p&gt;skip connection在UNet下被广泛使用，翻译过来的话可以称为跳跃连接，skip connection已经在图像语义分割上得到了广泛的应用，同时也不仅仅是限于UNet的设计框架下。STGAN将skip connection应用在模型中，我们知道人脸属性编辑上的架构采用编码器 - 解码器结构，其中空间池化或下采样对于获得属性操纵的高级抽象表示是必不可少的。然而，下采样不可逆地降低了空间分辨率和特征图的细节，这些细节无法通过反卷积完全恢复，并且结果容易模糊或丢失细节。为了提高编辑结果的图像质量，skip connection自然而然的被想到应用在结构中。&lt;/p&gt;

&lt;p&gt;为了分析skip connection的影响和限制，作者在测试集上测试了AttGAN的四种变体：1.没有skip connection的AttGAN(AttGAN-ED)；2.具有一个skip connection（AttGAN）也就是原版的AttGAN；3.具有两个skip connection的AttGAN（AttGAN-2s）；4.具有所有对称skip connection的AttGAN（AttGAN-UNet）。下表和下图显示了对比实验的结果：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/STGAN2.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;可以看出，添加跳过连接确实有利于重建细节，并且随着skip connection的增加可以获得更好的结果。然而，作者又做了人脸属性添加上的对比性实验：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/STGAN3.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;通过分类准确率可以看到，添加多个skip connection却实现了降低指标的作用，我们可以猜测通过skip connection的部署弱化了属性操纵能力为代价改善了重建图像质量，主要归因于该跳过连接直接连接编码器和解码器特征。为了避免这种情况，STGAN采用选择性传输单元来自适应地转换由要改变的属性引导的编码器特征。&lt;/p&gt;

&lt;h1 id=&quot;选择性传输单元&quot;&gt;选择性传输单元&lt;/h1&gt;

&lt;p&gt;在介绍选择性传输单元之前，我们先把文章对目标属性和源属性的标签处理交代一下。StarGAN 和AttGAN 都将目标属性向量$Att_t$和源图像x作为输入到生成器。实际上，使用完整目标属性向量是多余的，可能对编辑结果有害。如果目标属性向量$Att_t$与源$Att_t$完全相同，此时，理论上输入只需要对图像进行重构即可，但StarGAN和AttGAN 可能会错误地操作一些未更改的属性，比如把原本就是金色头发变得更加的金色。&lt;/p&gt;

&lt;p&gt;对于任意图像属性编辑，而不是完整目标属性向量，只应考虑要更改的属性以保留源图像的更多信息。因此，将差异属性向量定义为目标和源属性向量之间的差异是合适的：&lt;/p&gt;

\[Att_{diff} = Att_t - Att_s\]

&lt;p&gt;比如男性有胡子戴眼镜的源图编辑到男性无胡子戴眼镜秃头目标图，这里面仅仅是添加了秃头这一属性，减少了胡子这一属性，其它的可以保持不变。$Att_{diff}$可以为指导图像属性编辑提供更有价值的信息，包括是否需要编辑属性，以及属性应该改变的方向。然后可以利用该信息来设计合适的模型，以将编码器特征与解码器特征进行变换和连接，并且在不牺牲属性操纵精度的情况下提高图像重建质量。&lt;/p&gt;

&lt;p&gt;选择性传输单元（STU）来选择性地转换编码器特征，使其与解码器特征兼容并互补，而不是通过skip connection直接将编码器与解码器特征连接起来。这个变换需要适应变化的属性，并且在不同的编码器层之间保持一致，作者修改&lt;a href=&quot;https://arxiv.org/abs/1412.3555&quot;&gt;GRU&lt;/a&gt;[3]的结构以构建用于将信息从内层传递到外层的STU。我们来看一下STU的结构：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/STGAN4.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;$f_{enc}^l$为编码器第l层输出，$s^{l+1}$为数据编码在l+1层的隐藏状态，隐藏状态$\hat{s}^{l+1}$则是结合了$Att_{diff}$得到的：&lt;/p&gt;

\[\hat{s}^{l+1} = W_{t}*_{T}[s^{l+1},Att_{diff}]\]

&lt;p&gt;其中$[\cdot , \cdot]$表示为concatenation操作，$*_{T}$为转置卷积，然后，STU采用GRU的数学模型来更新隐藏状态$s^l$和转换后的编码器特征$f_t^l$:&lt;/p&gt;

\[r^l = \sigma(W_r * [f_{enc}^l,\hat{s}^{l+1}]),z^l = \sigma(W_z * [f_{enc}^l,\hat{s}^{l+1}]),s^l=r^l \circ \hat{s}^{l+1}\]

\[\hat{f}_t^l = tanh(W_h*[f_{enc}^l,s^l]),f_t^l = (1-z^l) \circ \hat{s}^{l+1} + z^l \circ \hat{f}_t^l\]

&lt;p&gt;其中$*$表示卷积运算，$\circ$表示逐项乘积，$\sigma (\cdot)$表示sigmoid函数。复位门$r^l$和更新门$z^l$的引入允许以选择性方式控制隐藏状态，差异属性向量和编码器特征。输出$f_t^l$提供了一种自适应的编码器特征传输方法及其与隐藏状态的组合。&lt;/p&gt;

&lt;p&gt;选择性传输单元（STU）说白了就是在GRU的结构上实现的，差分标签控制下的编码特征的选择。&lt;/p&gt;

&lt;h1 id=&quot;模型结构&quot;&gt;模型结构&lt;/h1&gt;

&lt;p&gt;有了上述的分析，我们再看模型的结构则是比较容易理解了：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/STGAN5.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;整个模型比较简单，在编码器和解码器过程中，加入STU选择单元，从而获得人脸属性编辑后的输出。编码器的输入端包括源图x和差分属性标签$Att_{diff}$。对于判别器，也是判别生成器输出真假和对应的属性标签。对抗损失采用WGAN-GP来实现生成优化，对应着$\mathcal L_{D_{adv}},\mathcal L_{G_{adv}}$。对于属性标签和生成器的属性优化通过源真实样本和标签优化判别器，再通过判别器去判别目标生成的属性结果来优化生成器：&lt;/p&gt;

\[\mathcal L_{D_{att}} = -\sum_{i=1}^c[att_s^{(i)}logD_{att}^{(i)}(x)+(1-att_s^{(i)})(1-logD_{att}^{(i)}(x))]\]

\[\mathcal L_{G_{att}} = -\sum_{i=1}^c[att_t^{(i)}logD_{att}^{(i)}(\hat{y})+(1-att_t^{(i)})(1-logD_{att}^{(i)}(\hat{y}))]\]

&lt;p&gt;$att_s^{(i)},att_t^{(i)}$为源域和目标域属性标签，文章还加入了一个不使用标签的重构误差，也就是差分标签置为0：&lt;/p&gt;

\[\mathcal L_{rec} = \Vert x - G(x,0) \Vert_1\]

&lt;p&gt;最终得到的损失为：&lt;/p&gt;

\[\min_D \mathcal L_D = -\mathcal L_{D_{adv}} + \lambda_1 \mathcal L_{D_{att}}\]

\[\min_G \mathcal L_G = -\mathcal L_{G_{adv}} + \lambda_2 \mathcal L_{G_{att}} + \lambda_3 \mathcal L_{rec}\]

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;人脸属性编辑的实验建立在CelebA数据集上，CelebA数据集包含裁剪到$178 \times 218$的202,599个对齐的面部图像，每个图像有40个带/不带属性标签。图像分为训练集，验证集和测试集，文章从验证集中获取1,000张图像以评估训练过程，使用验证集的其余部分和训练集来训练STGAN模型，并利用测试集进行性能评估。实验考虑13种属性，包括秃头，爆炸，黑发，金发，棕色头发，浓密眉毛，眼镜，男性，嘴微微开口，小胡子，无胡子，苍白皮肤和年轻，实验中，每个图像的中心$170 \times 170$区域被裁剪并通过双三次插值调整为$128 \times 128$。&lt;/p&gt;

&lt;p&gt;定性结果分析上，文章将STGAN与四种竞争方法进行比较，即IcGAN，FaderNet，AttGAN和StarGAN，实验结果如下图所示，可以看出STGAN展示了很好的竞争效果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/STGAN6.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;定量评估上，文章从两个方面评估属性编辑的性能，即图像质量和属性生成准确性。图像质量上，保持目标属性向量与源图像属性相同，得到了PSNR / SSIM结果：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/STGAN7.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;对于属性生成准确性，STGAN也展示了优秀的结果：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/STGAN8.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;实验在用户的选择测试上也取得了最佳效果，Ablation Study实验上也证实了模型的每一部分的优势和必要。最后放一张STGAN在图像季节转换的实验效果：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/STGAN9.png&quot; /&gt;
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;文章研究了选择性传输视角下任意图像属性编辑的问题，并通过在编码器 - 解码器网络中结合差分属性向量和选择性传输单元（STU）来提出STGAN模型。通过将差异属性向量而不是目标属性向量作为模型输入，STGAN可以专注于编辑要改变的属性，这极大地提高了图像重建质量，增强了属性的灵活转换。&lt;/p&gt;

&lt;h1 id=&quot;参看文献&quot;&gt;参看文献&lt;/h1&gt;

&lt;p&gt;[1] He, Zhenliang, et al. “Attgan: Facial attribute editing by only changing what you want.” &lt;em&gt;arXiv preprint arXiv:1711.10678&lt;/em&gt; (2017).&lt;/p&gt;

&lt;p&gt;[2] Choi, Yunjey, et al. “Stargan: Unified generative adversarial networks for multi-domain image-to-image translation.” &lt;em&gt;Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition&lt;/em&gt;. 2018.&lt;/p&gt;

&lt;p&gt;[3] Chung, Junyoung, et al. “Empirical evaluation of gated recurrent neural networks on sequence modeling.” &lt;em&gt;arXiv preprint arXiv:1412.3555&lt;/em&gt; (2014).&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>Collaborative GAN for Missing Image Data Imputation（论文解读）</title>
        <link>http://www.twistedwg.com//2019/04/14/CollaGAN.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/04/14/CollaGAN.html</guid>
        <pubDate>Sun, 14 Apr 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;在同一域下的图像和数据是符合一个整体流形分布的，一旦域中的数据缺失，能否利用已有的域中数据去还原丢失的数据呢？&lt;a href=&quot;https://arxiv.org/abs/1901.09764&quot;&gt;Collaborative GAN&lt;/a&gt;提出了一种新的缺失图像数据插补框架，称为协同生成对抗网络(CollaGAN)。CollaGAN是在现在已经成熟的单图像到图像生成的基础上，研究多域图像到图像的翻译任务，以便单个生成器和判别器网络可以使用剩余的干净数据集成功估计丢失的数据。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;无论是人眼还是摄像头都不可能实现单采样下全视角的视角采集，往往一个物体的描述需要多视角的结合才能得到完整的性质描述。所以一个完整的数据在实现视觉分析起到很重要的作用，例如在从多个视图相机图像生成三维体积时，大多数算法都需要预先定义视角集，可是由于采集成本和时间，数据集中的（系统）错误等，通常很难获得完整的输入数据集。&lt;/p&gt;

&lt;p&gt;估算缺失数据对于物体建模和分析影响很大，有几种标准方法可以根据整组的建模假设来估算缺失数据，如均值插补，回归插补，随机插补等[1]。然而，这些标准算法对诸如图像这类高维数据具有限制，因为图像插补需要知道高维图像数据流形。图像到图像翻译试图解决高维图像的缺失修复，诸如超分辨率、去噪、去模糊、风格迁移、语义分割、深度预测等任务可被视为将图像从一个域映射到另一个域中的对应图像。&lt;/p&gt;

&lt;p&gt;图像翻译的高质量决定着缺失模态估算的准确性，生成对抗网络(GAN)的提出大大改善了图像翻译的实现任务。已经很熟悉的模型有CycleGAN、DiscoGAN、UNIT，这一类实现了两个域之间的单图像到单图像的转换。StarGAN[2]和MUNIT[3]则可以实现单个生成器学习多个域之间的转换映射，这就是单张图像转换到多张图像。这些基于GAN的图像传输技术与图像数据插补密切相关，因为图像翻译可以被认为是通过对图像流形结构建模来估计丢失图像数据库的过程。然而，图像插补和图像转换之间存在根本差异。例如，CycleGAN和StarGAN有兴趣将一个图像转移到另一个图像，但不考虑剩余的域数据集。然而，在图像插补问题中，丢失的数据不经常发生，并且目标是通过利用其他清洁数据集来估计丢失的数据。&lt;/p&gt;

&lt;p&gt;因此&lt;a href=&quot;https://arxiv.org/abs/1901.09764&quot;&gt;Collaborative GAN&lt;/a&gt;通过设计一个生成器去使用剩余的有效数据集来估计丢失的数据。由于丢失的数据域不难以估计先验，因此应该设计插补算法，使得一种算法可以通过利用其余域的数据来估计任何域中的丢失数据。这一过程和之前所提模型的区别可由下图展示：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/CollaGAN1.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;上图(a)可以表示单图到单图的模型，代表由CycleGAN；(b)图为StarGAN转换图示，它是由原输入去转换成对应标签的图像；(c)则是利用除目标域图像外的其余图像一起作用生成目标标签图像。总结一下协同生成对抗网络（CollaGAN）的优点：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;可以从共享相同流形结构的多输入数据集而不是单个输入中更加协同地学习基础图像流形，达到更准确估计丢失数据。&lt;/li&gt;
  &lt;li&gt;CollaGAN保留了StarGAN类似的单生成器架构，与CycleGAN相比，它具有更高的内存效率。&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;模型实现&quot;&gt;模型实现&lt;/h1&gt;

&lt;p&gt;首先贴上CollaGAN的模型实现框图：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/CollaGAN2.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;这个图咋一看有些抽象，我们待会再详细分析，先把涉及到的参量做个定义。原文为了便于解释，假设域中含有4类样本：a、b、c、d。比如，生成器为了生成域a的样本，则生成器则会参考图像域b、c、d，将b、c、d协同送入生成器获得图像集$\lbrace x_a \rbrace^C = \lbrace x_b, x_c, x_d \rbrace$。其中上标C表示补充集，完整表示为：&lt;/p&gt;

\[\hat{x}_k  = G(\lbrace x_k \rbrace^C;k)\]

&lt;p&gt;其中$k \in \lbrace a,b,c,d \rbrace$表示目标域索引，用于指导生成适当目标域的输出κ。由于存在多个输入和单输出组合的N个组合，在训练期间随机选择这些组合，以便生成器学习到多个目标域的各种映射。&lt;/p&gt;

&lt;p&gt;我们来分析一下如何实现CollaGAN，类似于StarGAN，判别器的作用有两个，一个是实现对生成图像判断真假，另一个是实现域分类作用，确定图像是来自哪一个域。判别器的分类和判断只在最后一层分出，其余网络部分均共享参数，模型框图的最左侧就是预训练判别器的分类参数。通过固定网络的其余部分只对判别器实现图像域分类做优化，这一实现可以通过仅送入真实域图像下利用交叉熵损失实现：&lt;/p&gt;

\[\mathcal L_{clsf}^{real}(D_{clsf}) = \mathbb E_{x_k}[-log(D_{clsf}(k;x_k))]\]

&lt;p&gt;其中$D_{clsf}(k;x_k)$可以解释为将实际输入$x_k$正确分类为类$κ$的概率。&lt;/p&gt;

&lt;p&gt;训练好判别器的分类就可以对模型的正式部分进行训练，对于生成器G（图中的中间部分）输入的是要生成目标域的类别标签Target Domain，和其余域类的协同输入Input Image，经过生成器得到目标域图像Fake Image，为了实现循环一致的思想，用生成的Target Image作为协同输入的一部分去生成其余的域图像。对于a、b、c、d的4类输入下，假设目标域是a，这个循环思想的思想就要再重构其余3类：&lt;/p&gt;

\[\tilde{x}_{b \vert a} = G(\lbrace \hat{x}_a,x_c,x_b \rbrace;b)\]

\[\tilde{x}_{c \vert a} = G(\lbrace \hat{x}_a,x_b,x_d \rbrace;c)\]

\[\tilde{x}_{d \vert a} = G(\lbrace \hat{x}_a,x_b,x_c \rbrace;d)\]

&lt;p&gt;优化循环一致损失为：&lt;/p&gt;

\[\mathcal L_{mcc,a} = \Vert x_b - \tilde{x}_{b \vert a} \Vert_1 + \Vert x_c - \tilde{x}_{c \vert a} \Vert_1 + \Vert x_d - \tilde{x}_{d \vert a} \Vert_1\]

&lt;p&gt;这里的$\Vert \cdot \Vert$表示的是$L_1$损失，这个循环一致的推广到各类域可进一步表示为：&lt;/p&gt;

\[\mathcal L_{mcc,k} = \sum_{k' \neq k} \Vert x_k' - \tilde{x}_{k' \vert k} \Vert_1\]

&lt;p&gt;此时：&lt;/p&gt;

\[\tilde{x}_{k' \vert k} = G(\lbrace \hat{x}_k \rbrace^C;k')\]

&lt;p&gt;模型框图的最右侧就是训练中判别器的，判别器在训练阶段除了分清图片的真假还有就是通过分类器去优化生成器网络。我们解释下怎么通过分类去优化生成器，通过训练发生器G以产生由$D_{clsf}$正确分类的假样本。因此，对于G，在优化生成域分类当最小化损失：&lt;/p&gt;

\[\mathcal L_{clsf}^{fake}(G) = \mathbb E_{\tilde{x}_{k' \vert k}}[-log(D_{clsf}(k;\tilde{x}_{k' \vert k}))]\]

&lt;p&gt;至于生成对抗损失，文章采用的是较为稳定的LSGAN：&lt;/p&gt;

\[\mathcal L_{gan}^{dsc}(D_{gan}) = \mathbb E_{x_k}[(D_{gan}(x_k)-1)^2] + \mathbb E_{\tilde{x}_{k' \vert k}}[(D_{gan}(\tilde{x}_{k' \vert k}))^2]\]

\[\mathcal L_{gan}^{gen}(G) =  \mathbb E_{\tilde{x}_{k' \vert k}}[(D_{gan}(\tilde{x}_{k' \vert k}) - 1)^2]\]

&lt;p&gt;域标签的嵌入采用经典的one-hot形式。&lt;/p&gt;

&lt;p&gt;这里提一下如何实现生成器输入端的协同输入，这个的实现在文章中是根据不同的数据集采取的方式是不同的，对于面部表情数据集RaFD下八个面部表情，对生成器重新设计有八个编码器分支，并且在生成器的中间阶段的编码处理之后将它们连接起来。生成器的架构是包含编码解码过程的，整体采用U-Net实现，判别器采用PatchGAN的设计思路。&lt;/p&gt;

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;文章主要在三个数据集下进行实验测试，MR contrast synthesis数据集是通过多动态多回波序列和来自10个受试者的附加T2 FLAIR（流体衰减反转恢复）序列扫描总共280个轴脑图像。在数据集中有四种类型的MR对比图像：T1-FLAIR (T1F)，T2-weighted(T2w)，T2-FLAIR (T2F)和 T2-FLAIR* (T2F*)。前三个对比度是从磁共振图像编译（MAGiC，GE Healthcare）获得的，T2-FLAIR *是通过第三对比度（T2F）的不同MR扫描参数的附加扫描获得的。MR contrast synthesis数据集也是作者进行本次研究的目的性数据集。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/CollaGAN3.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;CMU Multi-PIE数据集使用了Carnegie Mellon Univesity多姿态照明和表情面部数据库的子集，250名参与者，并且在以下五种照明条件下选择中性表情的正面：-90°（右）， -  45°，0°（前），45°和90°（左），并将图像裁剪为240×240，其中面部居中。对于此数据集的实验上，使用YCbCr颜色编码代替RGB颜色编码。YCbCr编码由Y亮度和CbCr色空间组成。在五种不同的照明图像，它们几乎共享CbCr编码，唯一的区别是Y-亮度通道。因此，处理唯一的Y亮度通道用于照明转换任务，然后重建的图像转换为RGB编码图像。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/CollaGAN4.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;Radboud Faces数据集（RaFD）包含从67名参与者收集的八种不同的面部表情;中立，愤怒，轻蔑，厌恶，恐惧，快乐，悲伤和惊讶（这个数据集在StarGAN中也被使用）。此外，有三个不同的凝视方向，总共1,608个图像，并将图像裁剪为640×640并将resize为128×128。&lt;/p&gt;

&lt;p&gt;在MR的数据集上，实验对比了CycleGAN、StarGAN和CollaGAN：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/CollaGAN5.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;从医学分析上T2-weighted图像中的脑脊液（CSF）应该是明亮的，上图中的第二行结果，这个在CollaGAN上效果最佳，在StarGAN和CycleGAN上则是暗淡的，在另外两个数据集下的定性测试上，CollaGAN也展示优势：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/CollaGAN6.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/CollaGAN7.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;文章还对不同域下的图像弥补缺失输入下进行了测试，得到的结果依旧是正向的：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/CollaGAN8.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;在定量分析上，作者采用重建和目标之间计算归一化均方误差（NMSE）和结构相似性指数（SSIM）来衡量，文章还花了一定篇幅介绍了SSIM的度量计算公式（感兴趣的可以自行阅读原文）。在定量上对比CycleGAN和StarGAN得到了优异的效果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/CollaGAN9.png&quot; /&gt;
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;CollaGAN通过在单个发生器和判别器的帮助下协同组合来自可用数据的信息，提出了一种新颖的CollaGAN架构，用于丢失图像数据插补。与现有方法相比，所提出的方法产生了更高视觉质量的图像。&lt;/p&gt;

&lt;p&gt;CollaGAN的创新在于生成器的多输入下生成域中缺失信息，这个想法是以往模型中没有的，同时利用多域下的有效信息去恢复缺失信息也很符合人类的思考方式。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] A. N. Baraldi and C. K. Enders. An introduction to modern missing data analyses. Journal of school psychology,48(1):5–37, 2010.&lt;/p&gt;

&lt;p&gt;[2] Y. Choi, M. Choi, M. Kim, J.-W. Ha, S. Kim, and J. Choo.StarGAN: Unified generative adversarial networks for multi-domain image-to-image translation. arXiv preprint, 1711,2017.&lt;/p&gt;

&lt;p&gt;[3] Huang X, Liu M, Belongie S J, et al. Multimodal Unsupervised Image-to-Image Translation[J]. european conference on computer vision, 2018: 179-196.&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>深度学习下人脸属性编辑</title>
        <link>http://www.twistedwg.com//2019/03/31/Face_edit.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/03/31/Face_edit.html</guid>
        <pubDate>Sun, 31 Mar 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;人脸属性编辑是建立在人脸识别和人脸生成基础上的应用技术，本博客将对人脸属性编辑在深度学习环境下应用做梳理。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;人脸属性的基本介绍&quot;&gt;人脸属性的基本介绍&lt;/h1&gt;

&lt;p&gt;人脸是识别和验证人物身份的重要标识，一张标准人脸包含了68个关键点，表情，年龄(年龄段)，性别，种族。其中68个关键点，主要集中在人脸的中心，如下图所示：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/dataset/Faceedit1.png&quot; height=&quot;600px&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;人脸的属性在celebA的数据集下一共分为了40种属性，其中包括：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/dataset/Faceedit2.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;通过人脸可以得到人脸属性、判断估计年龄、性别和种族，同时人脸是代表一个人身份的最直接证明。&lt;/p&gt;

&lt;h1 id=&quot;人脸识别和人脸增强的发展&quot;&gt;人脸识别和人脸增强的发展&lt;/h1&gt;

&lt;p&gt;人脸增强主要是对人脸的特征属性进行放大，使得系统对人物的分辨力得到提升，常用的人脸数据增强包括：旋转、缩放、镜像、平移、调色、噪声。人脸增强被广泛应用于人脸研究上，目前对人脸最为深入的研究是人脸识别，所谓的人脸识别就是通过对人脸的特征分析和判断从而确定人物身份信息的技术。人脸识别问题宏观上分为两类：1）人脸验证（又叫人脸比对）2）人脸识别。&lt;/p&gt;

&lt;p&gt;人脸验证做的是 1 比 1 的比对，即判断两张图片里的人是否为同一人。最常见的应用场景便是人脸解锁，终端设备（如手机）只需将用户事先注册的照片与临场采集的照片做对比，判断是否为同一人，即可完成身份验证。人脸识别做的是 1 比 N 的比对，即判断系统当前见到的人，为事先见过的众多人中的哪一个。比如疑犯追踪，小区门禁，会场签到，以及新零售概念里的客户识别。这些应用场景的共同特点是：人脸识别系统都事先存储了大量的不同人脸和身份信息，系统运行时需要将见到的人脸与之前存储的大量人脸做比对，找出匹配的人脸。&lt;/p&gt;

&lt;p&gt;深度学习未发展之前，人脸识别的技术主要通过分析人脸的68个关键点达到人物身份的确认。常用的方法：1）基于几何特征的人脸识别方法2）基于相关匹配的方法3）基于子空间方法4）基于统计的识别方法5）弹性图匹配方法6）K-L投影和奇异值分解（SVD）相融合的分类判别方法7）HMM和奇异值分解相融合的分类判别方法8）基于三维模型的方法。&lt;/p&gt;

&lt;p&gt;随着深度神经网络的发展，深度学习的方法被广泛应用到人脸识别上，这也是人脸增强和人脸属性编辑的发展基础和具有借鉴意义的发展：&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://xueshu.baidu.com/usercenter/paper/show?paperid=628ecff0bf9ee4a3a6cea9d3fbca0fd3&amp;amp;site=xueshu_se&quot;&gt;face++&lt;/a&gt;从网络上搜集了5million张人脸图片用于训练深度卷积神经网络模型，该篇文章的网路模型很常规（常规深度卷积神经网络模型）。&lt;a href=&quot;http://xueshu.baidu.com/usercenter/paper/show?paperid=4f6ebc430416b52c9d52b5bad9b87083&amp;amp;site=xueshu_se&quot;&gt;DeepFace&lt;/a&gt;通过额外的3d模型改进了人脸对齐的方法。然后，通过基于4million人脸图像（4000个个体）训练的一个9层的人工神经网络来进行人脸特征表达。&lt;a href=&quot;http://xueshu.baidu.com/usercenter/paper/show?paperid=01772567cb2a0ba5ab6e0ab7238f1441&amp;amp;site=xueshu_se&quot;&gt;FR+FCN&lt;/a&gt;这篇文章在人脸增强做了研究，自然条件下，因为角度，光线，occlusions（咬合/张口闭口），低分辨率等原因，使人脸图像在个体之间有很大的差异，影响到人脸识别的广泛应用。作者开发了一种从个体照片中自动选择/合成canonical-view的方法。按照以下三个标准来采集个体人脸图片：1）人脸对称性（左右脸的差异）进行升序排列；2）图像锐度进行降序排列；3）将1）和2）组合。通过人脸的重建，实现了人脸增强的效果，在深度神经网络训练下得到了识别上的提高。&lt;a href=&quot;http://xueshu.baidu.com/usercenter/paper/show?paperid=c8d4befe80e3bfeb693456adae6f141c&amp;amp;site=xueshu_se&quot;&gt;DeepID&lt;/a&gt;使用了两种深度神经网络框架（VGG net 和GoogleLeNet）来进行人脸识别。&lt;a href=&quot;http://xueshu.baidu.com/usercenter/paper/show?paperid=b5457de3c4f74fbbb7d4703e93dc5974&amp;amp;site=xueshu_se&quot;&gt;FaceNet&lt;/a&gt;可以直接将人脸图像映射到欧几里得空间，空间的距离代表了人脸图像的相似性。只要该映射空间生成，人脸识别，验证和聚类等任务就可以轻松完成。&lt;a href=&quot;http://xueshu.baidu.com/usercenter/paper/show?paperid=3932460d37f978db26e386460904a032&amp;amp;site=xueshu_se&quot;&gt;Face Recognition via Deep Embedding&lt;/a&gt;提出了一种两步学习方法，结合mutil-patch deep CNN和deep metric learning，实现脸部特征提取和识别。&lt;a href=&quot;http://xueshu.baidu.com/usercenter/paper/show?paperid=cde5da78cfb6ddc9323ec99b98b1a49e&amp;amp;site=xueshu_se&amp;amp;hitarticle=1&quot;&gt;pose+shape+expression augmentation&lt;/a&gt;该文章的主要思路是对数据集进行扩增，pose（姿态，文章中为人脸角度，即通过3d人脸模型数据库合成图像看不见的角度，生成新的角度的人脸）。首先，通过人脸特征点检测（facial landmark detector），获取人脸特征点。根据人脸特征点和开放的Basel 3D face set数据库的人脸模板合成3d人脸。shape（脸型）。首先，通过Basel 3D face获取10种高质量3d面部扫描数据。再将图像数据与不同3d脸型数据结合，生成同一个人不同脸型的图像。expression（表情，本文中，将图像的张嘴表情替换为闭口表情）。采用中性嘴型将图像中的开口表情换位闭口表情。这是人脸增强的新阶段的方法。&lt;a href=&quot;http://xueshu.baidu.com/usercenter/paper/show?paperid=3d53e555457c71da8a4fdcccf8a40cce&amp;amp;site=xueshu_se&quot;&gt;CNN-3DMM estimation&lt;/a&gt;当在真实场景中应用3d模拟来增加人脸识别精度，存在两类问题：要么3d模拟不稳定，导致同一个个体的3d模拟差异较大；要么过于泛化，导致大部分合成的图片都类似。因此，作者研究了一种鲁棒的三维可变人脸模型（3D morphable face models (3DMM)）生成方法。他们采用了卷积神经网络（CNN）来根据输入照片来调节三维人脸模型的脸型和纹理参数。该方法可以用来生成大量的标记样本。&lt;/p&gt;

&lt;p&gt;随着深度神经网络的发展，目前比较好的人脸识别方法，都是以人脸增强为基础进行模型训练，往往需要对人脸进行3D生成，增强模型的鲁棒性。&lt;/p&gt;

&lt;h1 id=&quot;人脸属性编辑&quot;&gt;人脸属性编辑&lt;/h1&gt;

&lt;p&gt;人脸属性编辑旨在操纵面部图像的单个或多个属性，即生成具有所需属性的新面部，同时保留其他细节。人脸属性编辑是建立在人脸生成上展开的，当然利用人脸关键点去控制人脸也是可以实现人脸的属性编辑，但那样往往会带来人脸的扭曲和不对称出现。随着生成模型的发展，人脸属性编辑得到了长足的发展，生成对抗网络更是实现了图像在一个域中映射到另一个域中，以此带来了人脸属性编辑优质论文的涌现，接下来将对近几年人脸属性编辑主流方法进行介绍。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/1711.10678&quot;&gt;AttGAN&lt;/a&gt;不是对潜在表示施加约束，而是对生成的图像应用属性分类约束，以保证所需属性的正确变化。同时，引入重建学习以保留属性排除细节。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/dataset/Faceedit3.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;模型通过控制属性标签，利用属性标签去监督性的去编辑人脸，在训练阶段利用重构误差、标签分类误差、对抗损失实现了标签对应人脸属性的人脸编辑。类似这个思想，&lt;a href=&quot;https://arxiv.org/abs/1703.10593&quot;&gt;CycleGAN&lt;/a&gt;可固定实现A-B的模态转换，但是不能解决多领域迁移的问题。&lt;a href=&quot;http://openaccess.thecvf.com/content_cvpr_2018/papers/Choi_StarGAN_Unified_Generative_CVPR_2018_paper.pdf&quot;&gt;StarGAN&lt;/a&gt;只用一个generator网络，处理多个domain之间互相generate图像的问题，这是比AttGAN更深一步的人脸属性迁移。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/dataset/Faceedit4.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;对于StarGAN的生成器G的输入除了图片，还有domain的label，对应的生成图片变到指定的domain，这很像是在CycleGAN上加了conditional 的输入。StarGAN的结构就可以理解成在CycleGAN的基础上添加了条件（模态的信息），整体的训练结构也是如此：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/dataset/Faceedit5.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;当然，这里的条件是可以叠加输入的，对应在人脸属性编辑上就是可以同时控制几个属性的编辑效果：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/dataset/Faceedit6.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;利用属性标签对人脸属性编辑是该方法的一种实现，&lt;a href=&quot;https://arxiv.org/abs/1804.03447&quot;&gt;RSGAN&lt;/a&gt;提出称为区域分离生成对抗网络，通过独立地处理潜在空间中的面部和头发外观，然后，通过替换面部的潜在空间表示来实现面部交换，并且用它们重建整个面部图像。文章的一大手段就是将面部和头发进行分离：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/dataset/Faceedit7.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;通过面部和头发的分离，再通过属性条件的控制，Zf和Zh分别为面部和头发的潜在空间，这也提供给网络更多的能力去实现类似于换脸和换头发的操作从而实现了人脸属性编辑。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/1901.01569&quot;&gt;SGGAN&lt;/a&gt;提出了一种新颖的分段引导生成对抗网络，它利用语义分割来进一步提高生成性能并提供空间映射。特别地，分段器网络被设计为对生成的图像施加语义信息。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/dataset/Faceedit8.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;通过输入图像，结合语义分割的目标，比如是微笑和大笑的目标，在网络中再次加入属性标签生成出指定的图像，整个过程可由下图分析：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/dataset/Faceedit9.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;最终控制人脸编辑的输入有3个，原始人脸、语义分割的目标表情和属性的标签信息，最终生成出目标人脸。通过语义分割的分割图为人脸编辑提供了更加自由的人为操作，可以进一步的刻画人物的面部，而不是死板的在属性标签上实现人脸属性编辑。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/1902.06838&quot;&gt;SC-FEGAN&lt;/a&gt;在人脸编辑上又进了一步，通过自由形式的原始图片、草图、掩码图、颜色图、噪声的共同输入网络实现了人脸自由的编辑。这样实现的人脸属性编辑将不再局限于属性标签，而是将人脸编辑的自由权交由使用者，通过联合输入和SN-patchGAN的作用，最终实现人脸属性编辑。详细解读可参看&lt;a href=&quot;http://www.twistedwg.com/2019/02/26/SC_FEGAN.html&quot;&gt;此篇博客&lt;/a&gt;。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/dataset/Faceedit10.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/dataset/Faceedit11.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;正是草图、颜色图和掩码图的作用才可以指导人脸按照使用者的绘制来实现人脸面部编辑的效果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/dataset/Faceedit12.png&quot; /&gt;
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;面部增强和属性编辑是人脸识别和人脸特征提取下发展产物，通过人脸增强可以提高模型的鲁棒性以及因数据集自身的问题导致的人脸识别和编辑任务的不完善。人脸属性编辑往往是建立在人脸生成上，可以提供人脸的自由化属性变换，随着人脸属性编辑的发展，使用者可以更加自由的控制面部编辑。&lt;/p&gt;

&lt;p&gt;实现面部编辑的方法由单纯的属性标签控制，到面部头发分离下的人脸和头发的变换，再到语义分割下更加自由的人脸生成，最后是草图作用下人脸的任意编辑的实现。&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>无监督下图像去模糊（论文解读）</title>
        <link>http://www.twistedwg.com//2019/03/09/Deblurring.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/03/09/Deblurring.html</guid>
        <pubDate>Sat, 09 Mar 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;图像模糊是影响图像质量的重要因素，显着降低了许多计算机视觉应用的性能，例如物体检测和人脸识别。随着深度神经网络的发展，计算机视觉领域的难题被一个个解决，单纯依靠先验核去实现图像去模糊的技术已经渐渐被取代。本文将针对CVPR2019 &lt;a href=&quot;https://arxiv.org/abs/1903.01594&quot;&gt;Unsupervised Domain-Specific Deblurring via Disentangled Representations&lt;/a&gt;一文进行分析，梳理一下基于深度神经网络下图像去模糊的实现方法。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;图像的模糊严重影响图像的本身质量，同时在进行图像的识别和图像中物体识别都会产生影响。图像去模糊旨在从相应的模糊图像中恢复潜在的清晰图像。大多数传统方法将图像去模糊任务公式化为模糊核估计问题，在过去的十年中，已经开发了各种自然图像和先验核来规范潜在锐利图像的解空间，包括重尾梯度先验，稀疏核先验，$l_0$梯度先验，归一化稀疏性和暗通道。然而，这些先验是通过有限的观察来估计的，并且不够准确。结果，去模糊的图像通常欠去模糊（图像仍然模糊）或过度去模糊（图像包含许多伪像）。&lt;/p&gt;

&lt;p&gt;近年来深度神经网络和GAN的巨大成功，已经提出了一些基于CNN的方法用于图像去模糊，例如Nimisha在ECCV2018 发表的&lt;a href=&quot;http://openaccess.thecvf.com/content_ECCV_2018/papers/Nimisha_T_M_Unsupervised_Class-Specific_Deblurring_ECCV_2018_paper.pdf&quot;&gt;Unsupervised Class-Specific Deblurring&lt;/a&gt;[1]是一种基于GAN的无监督图像去模糊方法，在模型上增加了重复损失和多尺度梯度损失。虽然它们在合成数据集上取得了良好的性能，但它们对一些真实模糊图像的结果并不令人满意。另一类方法是基于现有的图像到图像的模型，例如CycleGAN[2]这类无监督端到端的模型，然而，这些通用方法通常编码其他因素（例如，颜色，纹理）而不是将信息模糊到发生器中，因此不会产生良好的去模糊图像。文章对这些方法进行了一个可视化结果比对，同时也是展示了自己模型的优越性：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Deblurring1.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;上图最右侧就是这篇文章的实验效果，可以看出对比已有的基于深度神经网络的去模糊模型还是展示了不错的实现效果的。这些效果的实现得益于文章提出了一种基于解缠表示的无监督域特定图像去模糊方，通过将模糊图像中的内容和模糊特征解开，以将模糊信息准确地编码到去模糊框架中。我们后续再详细分析，这里总结一下文章的创新和优势所在：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;内容编码器和模糊编码器将模糊图像的内容和模糊特征区分开，实现了高质量的图像去模糊。&lt;/li&gt;
  &lt;li&gt;对模糊编码器添加KL散度损失以阻止模糊特征对内容信息进行编码。&lt;/li&gt;
  &lt;li&gt;为了保留原始图像的内容结构，在框架中添加了模糊图像构造和循环一致性损失，同时添加的感知损失有助于模糊图像去除不切实际的伪像。&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;模型详解&quot;&gt;模型详解&lt;/h1&gt;

&lt;p&gt;我们还是先通过模型框架图去理解文章设计的思路：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Deblurring2.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;我们先把模型中的组间简绍清楚，由于模型的循环一致性设计，网络的左右是基本对称的，我们对左侧组间交代下。$s$代表清晰的真实图像，$b$代表模糊的真实图像，$E_S^c$是清晰图像的内容编码器（可以理解为图像颜色、纹理、像素的编码器），对应的$E_B^c$是模糊图像的内容编码器，$E^b$是模糊图像的模糊编码器（仅用来提取图像的模糊信息），$G_B$是模糊图像生成器，$G_S$是清晰图像生成器，$b_s$是生成的模糊图像，$s_b$是生成的清晰图像。经过循环的转换，$\hat{s}$是循环生成的清晰图像，$\hat{b}$是循环生成的模糊图像。结合上下标和模型结构，这些组间的名称还是很好区别的。&lt;/p&gt;

&lt;p&gt;看了这个模型，大家是不是有一些疑问，我们的目的是实现图像的去模糊，为什么要添加模糊编码器？为什么还要主动去生成模糊的图像？怎么保证模糊图像的内容编码器真的提取到图像的内容信息？为什么模糊编码器要同时作用在$G_B$和$G_S$上？&lt;/p&gt;

&lt;p&gt;这些问题正是这篇文章区别于已有模型的关键，我们按照文章思路一步步去分析。&lt;/p&gt;

&lt;p&gt;文章的一大创新就是模糊编码器的设计，它主要的作用是用来捕获模糊图像的模糊特征，如何去保证这个模糊编码器是真的提取到模糊图像的模糊特征了呢？作者就采用了迂回的思路，既然清晰的图像是不含模糊信息的，如果清晰的图像通过结合模糊编码器模糊特征去生成出模糊图像，是不是可以说，模糊编码器是在对清晰图像做模糊化处理，这个模糊化的前提是什么？那就是模糊编码器确实提取到了图像的模糊特征，所以说由清晰图像生成模糊图像也保证了模糊编码器是对图像的模糊信息进行编码的作用。&lt;/p&gt;

&lt;p&gt;同时，由清晰图像到模糊图像的生成过程中，清晰图像的内容编码器我们是有理由相信它是提取到了清晰图像的内容信息（因为清晰图像并不包含模糊信息）。文章为了保证模糊图像的内容编码器$E_B^c$是对模糊图像的内容进行编码，文章将清晰图像内容编码器$E_S^c$和模糊图像内容编码器$E_B^c$强制执行最后一层共享权重，以指导$E_B^c$学习如何从模糊图像中有效地提取内容信息。&lt;/p&gt;

&lt;p&gt;为了进一步尽可能多地抑制模糊编码器$E^b$对内容信息的编码，通过添加一个KL散度损失来规范模糊特征$z_b=E^b(b)$的分布，使其接近正态分布$p(z) \sim N(0,1)$。这个思路和VAE中的限制数据编码的潜在空间的分布思路是相近的，这里将模糊编码器的编码向量限制住，旨在控制模糊编码器仅对图像的模糊信息进行编码。&lt;/p&gt;

&lt;p&gt;理清了上面的设计思路，这篇文章的实现就已经基本介绍完毕了。由模糊图像去模糊到清晰图像的过程中，将模糊图像内容编码$E_B^c$和模糊编码$E^b$送入清晰图像生成器$G_S$重构得到去模糊的清晰图像，清晰图像到模糊图像是为了优化模糊编码$E^b$和模糊图像的内容编码$E_B^c$的作用。通过循环一致性，进行进一步的还原保证模型的鲁棒性。核心的损失是图像生成在GAN的对抗损失，结合感知损失达到图像下一些伪影的优化。&lt;/p&gt;

&lt;h1 id=&quot;模型损失函数&quot;&gt;模型损失函数&lt;/h1&gt;

&lt;p&gt;本部分是对模型实现的补充，在上一小节中，也是大致上分析了各类损失的作用，这里做一个简短的展开。&lt;/p&gt;

&lt;p&gt;首先是对模糊编码的隐空间分布进行约束，这个约束通过KL散度去实现，这个过程和VAE的思路是一致的：&lt;/p&gt;

\[KL(q(z_b)\Vert p(z)) = - \int q(z_b)log \frac{p(z)}{q(z_b)}dz\]

&lt;p&gt;这里的$p(z) \sim N(0,1)$，具体的损失可进一步写为：&lt;/p&gt;

\[\mathcal L_{KL} = \frac{1}{2} \sum_{i=1}^N(\mu_i^2 + \sigma_i^2 - log(\sigma_i^2) -1)\]

&lt;p&gt;此时，$z_b$可表示为$z_b = \mu + z \circ \sigma$。&lt;/p&gt;

&lt;p&gt;接下来就是GAN的那一套对抗损失，这里写一下清晰图像生成的判别器损失，模糊图像的是一致的：&lt;/p&gt;

\[\mathcal L_{D_s} = \mathbb E_{s \sim p(s)}[logD_s(s)] + \mathbb E_{b \sim p(b)}[log(1-D_s(G_s(E_B^c(b),z_b)))]\]

&lt;p&gt;循环一致损失参考的是CycleGAN[2]：&lt;/p&gt;

\[\mathcal L_{cc} = \mathbb E_{s \sim p(s)}[\Vert s - \hat{s} \Vert_1] + \mathbb E_{b \sim p(b)}[\Vert b - \hat{b} \Vert_1]\]

&lt;p&gt;感知损失的加入，作者是加在预训练CNN的第1层的特征，实验中加在ImageNet上预训练的VGG-19的conv3,3。&lt;/p&gt;

\[\mathcal L_{p} = \Vert \phi_l(s_b) - \phi_l(b) \Vert_2^2\]

&lt;p&gt;感知损失中使用模糊图像$b$而不是锐利图像作为参考图像有两个主要原因。首先，假设$b$的内容信息可以由预训练的CNN提取。其次，由于$s$和$b$未配对，因此在$s$和$s_b$之间应用感知损失将迫使$s_b$对$s$中的无关内容信息进行编码。值得一提的是，$b_s$和$s$上没有添加感知损失。这是因为在训练期间没有在$b_s$中发现明显的伪像。&lt;/p&gt;

&lt;p&gt;整个模型总的损失可写为：&lt;/p&gt;

\[\mathcal L = \lambda_{adv} \mathcal L_{adv} + \lambda_{KL} \mathcal L_{KL} + \lambda_{cc} \mathcal L_{cc} + \lambda_{p} \mathcal L_{p}\]

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;文章的网络的设计结构参考了&lt;a href=&quot;https://arxiv.org/abs/1808.00948&quot;&gt;Diverse image-to-image translation via disentangled representations&lt;/a&gt;[3]。内容编码器由三个卷积层和四个残差块组成。模糊编码器包含四个卷积层和一个完全连接的层。对于发生器，该架构与内容编码器对称，具有四个残差块，后面是三个转置的卷积层。判别器采用多尺度结构，其中每个尺度的特征图经过五个卷积层，然后被馈送到sigmoid输出。采用Adam优化损失，对于前40个时期，学习速率最初设置为0.0002，然后在接下来的40个时期使用指数衰减。超参上$\lambda_{adv}=1,\lambda_{KL}=0.01, \lambda_{cc} =10,\lambda_{p}=0.1$。&lt;/p&gt;

&lt;p&gt;实验数据集采用三种数据集：CelebA数据集，BMVC文本数据集和CFP数据集。CelebA数据集包含超过202,000个面部图像，文章设置了清晰图像100k，模糊图像100k，测试图像2137。BMVC文本数据集由66,000个文本图像组成，分配方式类似于CelebA数据集。CFP数据集由来自500个主题的7,000个静止图像组成，并且对于每个主题，它具有正面姿势的10个图像和具有专业姿势的4个图像。&lt;/p&gt;

&lt;p&gt;对于CelebA和BMVC Text数据集，我们使用标准的debluring指标（PSNR，SSIM）进行评估。文章还使用去模糊图像和真实图像之间的特征距离（即来自某些深层网络的输出的$L_2$距离）作为语义相似性的度量，因为实验发现它是比PSNR和SSIM更好的感知度量。对于CelebA数据集，使用来自VGG-Face 的pool5层的输出，对于文本数据集，使用来自VGG-19网络的pool5层的输出。对于文本去模糊，另一个有意义的度量是去模糊文本的OCR识别率。在可视化模型和定量对比上，文章对比了各类模型的去模糊的效果：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Deblurring3.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Deblurring4.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;实验也对比了各个组间的有无对实验结果的影响：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Deblurring5.png&quot; /&gt;
&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Deblurring6.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;不仅仅在人脸图像去模糊上，在文本去模糊上也展示了不错的实验效果：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Deblurring7.png&quot; /&gt;
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;文章提出了一种无监督的领域特定单图像去模糊方法。通过解开模糊图像中的内容和模糊特征，并添加KL散度损失以阻止模糊特征对内容信息进行编码。为了保留原始图像的内容结构，在框架中添加了模糊分支和循环一致性损失，同时添加的感知损失有助于模糊图像去除不切实际的伪像。每个组件的消融研究显示了不同模块的有效性。&lt;/p&gt;

&lt;p&gt;文章的创新之处正是内容编码器和模糊编码器的设计和应用，尝试将内容和模糊信息分离，这对图像到图像的工作具有一定的指导意义。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] T. Madam Nimisha, K. Sunil, and A. Rajagopalan. Unsupervised class-specific deblurring. In Proceedings of the European Conference on Computer Vision (ECCV), pages 353–369, 2018.&lt;/p&gt;

&lt;p&gt;[2] J.-Y. Zhu, T. Park, P. Isola, and A. A. Efros. Unpaired image-to-image translation using cycle-consistent adversarial networks. In Proceedings of International Conference on Computer Vision (ICCV), 2017.&lt;/p&gt;

&lt;p&gt;[3] H.-Y. Lee, H.-Y. Tseng, J.-B. Huang, M. Singh, and M.-H.Yang. Diverse image-to-image translation via disentangled representations. In Proceedings of European Conference on Computer Vision (ECCV), pages 36–52. Springer, 2018.&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>SC-FEGAN人脸编辑（论文解读）</title>
        <link>http://www.twistedwg.com//2019/02/26/SC_FEGAN.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/02/26/SC_FEGAN.html</guid>
        <pubDate>Tue, 26 Feb 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;人脸编辑可以在大多数图像编辑软件上得到实现，但是这都需要专业知识，例如了解在特定情况下使用哪些特定工具，以便按照想要的方式有效地修改图像，同时操作图像编辑软件也是耗时的。基于深度学习下图像编辑得到越来越多的重视和应用，在GAN的推动下，图像风格转换、图像修复、图像翻译等等在近几年有了长足的发展。这篇文章将介绍基于GAN损失的端到端可训练生成网络，在人脸修复上取得了很棒的结果，同时该模型也适用于有趣的人脸编辑。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;提到图像编辑，一定要说的就是Photoshop这款软件，近乎可以处理日常所有的照片，但是PS不是这么容易操作的，精通PS更是需要专业知识了。如何让小白完成在图像上勾勾画画就能实现图像的编辑？这个任务当然可以交给深度学习来实现了。&lt;/p&gt;

&lt;p&gt;生成对抗网络（GAN）的发展，促进了图像生成下一系列研究的发展。图像编辑下图像修复是一个难点，这对于图像编辑软件来说也是很困难的。近几年在深度学习发展下，图像修复在不断进步，最典型的方法是使用普通（方形）掩模，然后用编码器-解码器恢复掩蔽区域，再使用全局和局部判别器来估计结果的真假。然而，该系统限于低分辨率图像，并且所生成的图像在掩蔽区域的边缘不能很好的与原图衔接。尽管&lt;a href=&quot;https://arxiv.org/abs/1806.03589&quot;&gt;Deepfillv2&lt;/a&gt;[1]、&lt;a href=&quot;https://arxiv.org/abs/1803.08435&quot;&gt;GuidedInpating&lt;/a&gt;[2]、&lt;a href=&quot;https://arxiv.org/abs/1705.02999&quot;&gt;Ideepcolor&lt;/a&gt;[3]、&lt;a href=&quot;https://arxiv.org/abs/1804.08972&quot;&gt;FaceShop&lt;/a&gt;[4]在不断改进实现结果，但是对于深度学习处理图像修复上的难点还是依旧存在，总的来说主要的挑战有两个。1.图像在恢复的部分上具有不和谐的边缘 2.如果图像太多区域被覆盖，修复的图像将会不合理。&lt;/p&gt;

&lt;p&gt;本文要解读的论文&lt;a href=&quot;https://arxiv.org/abs/1902.06838&quot;&gt;SC-FEGAN: Face Editing Generative Adversarial Network with User’s Sketch and Color&lt;/a&gt;[5]为了解决上述限制，提出了SC-FEGAN，它具有完全卷积网络，可以进行端到端的训练。提出的网络使用&lt;a href=&quot;https://arxiv.org/abs/1806.03589&quot;&gt;SN-patchGAN&lt;/a&gt;[1]判别器来解决和改善不和谐的边缘。该系统不仅具有一般的GAN损失，而且还具有风格损失，即使在大面积缺失的情况下也可以编辑面部图像的各个部分。这篇论文发布在arxiv不到10天，其&lt;a href=&quot;https://github.com/JoYoungjoo/SC-FEGAN&quot;&gt;源码&lt;/a&gt;便已标星破千。文章的人脸编辑效果十分逼真，先一睹为快。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://raw.githubusercontent.com/JoYoungjoo/SC-FEGAN/master/imgs/GUI.gif&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;总结一下SC-FEGAN的贡献：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;使用类似于&lt;a href=&quot;https://arxiv.org/abs/1505.04597&quot;&gt;U-Net&lt;/a&gt;[6]的网络体系结构，以及&lt;a href=&quot;https://arxiv.org/abs/1806.03589&quot;&gt;gated convolutional layers&lt;/a&gt;[1]。对于训练和测试阶段，这种架构更容易，更快捷，与粗糙网络相比，它产生了优越而细致的结果。&lt;/li&gt;
  &lt;li&gt;创建了解码图，颜色图和草图的自由格式域数据，该数据可以处理不完整图像数据输入而不是刻板形式输入。&lt;/li&gt;
  &lt;li&gt;应用了SN-patchGAN判别器，并对模型进行了额外的风格损失。该模型适应于擦除大部分的情况，并且在管理掩模边缘时表现出稳健性。它还允许生成图像的细节，例如高质量的合成发型和耳环。&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;训练数据处理&quot;&gt;训练数据处理&lt;/h1&gt;

&lt;p&gt;决定模型训练好坏的一个重要因素就是训练数据的处理，SC-FEGAN采用&lt;a href=&quot;https://arxiv.org/abs/1710.10196&quot;&gt;CelebA-HQ&lt;/a&gt;[7]数据集，并将图片统一处理为512x512大小。&lt;/p&gt;

&lt;p&gt;为了突显面部图像中眼睛的复杂性，文章使用基于眼睛位置掩模来训练网络。这主要用在掩码的提取上，当对面部图像进行训练时，随机应用一个以眼睛位置为起点的free-form mask，以表达眼睛的复杂部分。此外，文章还使用GFC随机添加了人脸头发的轮廓。算法如下：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/SC-FEGAN2.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;文章的又一个创新是在提取图像的草图和颜色图，使用&lt;a href=&quot;https://arxiv.org/abs/1504.06375&quot;&gt;HED边缘检测器&lt;/a&gt;[8]生成与用户输入相对应的草图数据，之后，平滑曲线并擦除了小边缘。创建颜色域数据，首先通过应用大小为3的中值滤波，然后应用双边滤波器来创建模糊图像。之后，使用&lt;a href=&quot;https://arxiv.org/abs/1704.05838&quot;&gt;GFC&lt;/a&gt;[9]对面部进行分割，并将每个分割的部分替换为相应部分的中间颜色。最后还提取噪声表示。最终处理完得到的数据可由下图展示，上面一行作为真实标准，下面一行为处理得到的输入数据。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/SC-FEGAN3.png&quot; /&gt;
&lt;/p&gt;

&lt;h1 id=&quot;模型结构&quot;&gt;模型结构&lt;/h1&gt;

&lt;p&gt;SC-FEGAN采用的网络设计结构与U-Net类似，上采样的思路是U-Net的那一套，通过Concat连接下采样的特征提取完成上采样，整体框架如下所示：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/SC-FEGAN4.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;网络的整体很好理解，图示也很清晰，我们强调一下网络的输入。&lt;/p&gt;

&lt;p&gt;不像传统的图像到图像的模型输入是512x512x3的RGB输入，这篇论文的输入是尺寸为512×512×9的张量，这个张量是由5张图片图片构成的。首先是被覆盖残缺的RGB图像，也就是我们在图片上勾勾画画的图像，其尺寸为512x512x3；其次是提取得到的草图512x512x1；图像的颜色域RGB图512x512x3；掩码图512x512x1；最后就是噪声对应的512x512x1。按照通道连接的话得到最终的模型输入512x512x9。&lt;/p&gt;

&lt;p&gt;卷积层采用的是gated convolution，使用3x3内核，下采样采取2个步幅内核卷积对输入进行7次下采样，上采样通过U-Net思路进行解码得到编辑好的图像。解码得到的图像依旧是5张图片，包括修复的RGB图像、草图、颜色图、掩码图、噪声图。通过判别器和真实的5张图片进行SN-patchGAN结构设计进行真假判断，优化模型。&lt;/p&gt;

&lt;p&gt;在整个网络的卷积层后应用局部信号归一化（LRN），生成器采用Leaky Relu，判别器通过SN限制，并且施加梯度惩罚。SC-FEGAN的损失函数由5部分组成，像素损失$L_{per-pixel}、感知损失L_{percept}$、风格损失$L_{style}$、总方差损失$L_{tv}$以及GAN的对抗损失。&lt;/p&gt;

&lt;p&gt;先来看一下GAN的对抗损失，文章采用的WGAN的损失设计：&lt;/p&gt;

\[L_{G_{SN}} = - \mathbb E[D(I_{comp})]\]

\[L_D = \mathbb E[1 - D(I_{gt})] + \mathbb E[1 + D(I_{comp})] + \theta L_{GP}\]

&lt;p&gt;其中$I_{comp}$是生成器输出的$I_{gen}$的完成图像（包括草图和颜色图以后的），也就是送入判别器判别的输入，最后判别器加上梯度惩罚项。对于生成器希望判别器判错，故生成器损失最小值为-1，判别器则希望真实判为真，生成判为假，上述损失还是很好理解的。生成器完整的损失为：&lt;/p&gt;

\[L_{G} = L_{per-pixel} + \sigma L_{percept} + \beta L_{G_{SN}} + \gamma (L_{style}(I_{gen}) + L_{style}(I_{comp})) + vL_{tv} + \epsilon \mathbb E[D(I_{gt})^2]\]

&lt;p&gt;像素损失保证图像编辑生成与真实的一致性：&lt;/p&gt;

\[L_{per-pixel} = \frac{1}{N_{I_{gt}}} \Vert M \odot (I_{gen} - I_{gt}) \Vert_1 + \alpha \frac{1}{N_{I_{gt}}} \Vert (1 - M) \odot (I_{gen} - I_{gt}) \Vert_1\]

&lt;p&gt;其中$N_a$是特征$a$的数字元素，M是二元掩模图，用于控制修复图像的像素，达到生成与真实的一致性。公式后一项给予擦除部分损失更多的权重。对于大区域下的擦除图像的修复时，风格损失和感知损失是必要的。感知损失在GAN中的应用已经很多了，就是对中间层进行特征差异损失，这里不做赘述。&lt;/p&gt;

&lt;p&gt;风格损失使用Gram矩阵比较两个图像的内容，风格损失表示为：&lt;/p&gt;

\[L_{style}(I) = \sum_q \frac{1}{C_qC_q} \Vert \frac{G_q(I) - G_q(I_{gt})}{N_q} \Vert_1\]

&lt;p&gt;其中，$G_q(x) = (\Theta_q(x))^T(\Theta - q(x))$，$\Theta$为网络的中间层，$G_q(x)$是用于在中间的每个特征图上执行自相关的Gram矩阵，Gram矩阵的形状是$C_q \times C_q$。总方差损失，反应的是相邻像素间是相似的，记为$L_{tv} = L_{tv-col} + L_{tv-row}$。其中：&lt;/p&gt;

\[L_{tv-col} = \sum_{(i,j) \in R} \frac{\Vert I_{comp}^{i,j+1} - I_{comp}^{i,j} \Vert_1}{N_{comp}}\]

&lt;p&gt;对于列row也是一样，自此整体的损失函数构建完成，在实际实验中参数设置为，$\sigma = 0.05,\beta = 0.001,\gamma = 120,v=0.1,\epsilon = 0.001, \theta = 10$。&lt;/p&gt;

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;实验首先对比了使用U-Net框架设计的优势，对比的框架是Coarse-Refined。论文测试了Coarse-Refined结构网络，并注意在一些需要精确输出的却是模糊的。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/SC-FEGAN5.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;FaceShop已经显示出难以修改像整个头发区域那样的巨大擦除图像。由于感知和风格损失的加入，SC-FEGAN在这方面表现更好。下图显示了有和没有VGG损失（感知和风格损失）的结果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/SC-FEGAN6.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;实验还与最近的研究Deepfillv1进行了比较，下图显示模型在使用自由形状的掩模在结构和形状的质量方面产生更好的结果。意味着没有附加信息，如草图和颜色，面部元素的形状和位置具有一定的依赖值。因此，只需提供附加信息即可在所需方向上恢复图像。此外，即使输入图像被完全擦除，我们的SC-FEGAN也可以生成仅具有草图和颜色自由形式输入的人脸图像（感兴趣的可以参看论文中更多结果）。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/SC-FEGAN7.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;下图显示了草图和颜色输入的各种结果，它表明模型允许用户直观地编辑脸部图像功能，如发型，脸型，眼睛，嘴巴等。即使整个头发区域被删除，它也能够产生适当的结果。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/SC-FEGAN8.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;文章还做了给人物加上耳环的有趣实验，这种人脸编辑确实蛮有意思：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/SC-FEGAN9.png&quot; /&gt;
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;SC-FEGAN提出了一种新颖的图像编辑系统，用于自由形式的蒙版，草图，颜色输入，它基于具有新颖GAN损失的端到端可训练生成网络。与其他研究相比，网络架构和损失功能显着改善了修复效果。论文基于celebA-HQ数据集进行了高分辨率图像的训练，并在许多情况下显示了各种成功和逼真的编辑结果。实验证明了系统能够一次性修改和恢复大区域，并且只需要用户细致的勾画就可以产生高质量和逼真的结果。&lt;/p&gt;

&lt;p&gt;模型的框架采用U-Net思想，在Decoder端结合Encoder端特征实现上采样过程下精确图像的生成。引入感知损失和风格损失更是帮助模型实现了大区域擦除的修复。在判别器采用SN-patchGAN思想，使得恢复的图像在边缘上更加和谐，生成器和判别器都结合了图像的草图、颜色图和掩模图进行判断，使得修复的图像更加逼真，同时也是论文的一个创新。实验上的炫彩也是使得源码得到了广泛的关注。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] J. Yu, Z. Lin, J. Yang, X. Shen, X. Lu, and T. S. Huang.Free-form image inpainting with gated convolution. arXiv preprint arXiv:1806.03589, 2018. 2, 3, 4, 6, 7&lt;/p&gt;

&lt;p&gt;[2] Y. Zhao, B. Price, S. Cohen, and D. Gurari. Guided image inpainting: Replacing an image region by pulling content from another image. arXiv preprint arXiv:1803.08435, 2018. 2&lt;/p&gt;

&lt;p&gt;[3] R. Zhang, J.-Y. Zhu, P. Isola, X. Geng, A. S. Lin, T. Yu, and A. A. Efros. Real-time user-guided image colorization with learned deep priors. arXiv preprint arXiv:1705.02999, 2017.2, 3&lt;/p&gt;

&lt;p&gt;[4] T. Portenier, Q. Hu, A. Szabo, S. Bigdeli, P. Favaro, and M. Zwicker. Faceshop: Deep sketch-based face image editing. arXiv preprint arXiv:1804.08972, 2018. 2, 3, 4, 6, 7&lt;/p&gt;

&lt;p&gt;[5] Jo Y, Park J. SC-FEGAN: Face Editing  Generative Adversarial Network with User’s Sketch and Color[J]. arXiv  preprint arXiv:1902.06838, 2019.&lt;/p&gt;

&lt;p&gt;[6] O. Ronneberger, P. Fischer, and T. Brox. U-net: Convolutional networks for biomedical image segmentation. In International Conference on Medical image computing andcomputer-assisted intervention, pages 234–241. Springer,2015. 2, 3, 4&lt;/p&gt;

&lt;p&gt;[7] T. Karras, T. Aila, S. Laine, and J. Lehtinen. Progressive growing of gans for improved quality, stability, and variation.arXiv preprint arXiv:1710.10196, 2017. 3, 4&lt;/p&gt;

&lt;p&gt;[8] S. ”Xie and Z. Tu. Holistically-nested edge detection. In Proceedings of IEEE International Conference on Computer Vision, 2015. 3&lt;/p&gt;

&lt;p&gt;[9] Y. Li, S. Liu, J. Yang, and M.-H. Yang. Generative face completion. In The IEEE Conference on Computer Vision and Pattern Recognition (CVPR), volume 1, page 3, 2017. 1,3, 4&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>GAN在图像生成应用综述（论文解读）</title>
        <link>http://www.twistedwg.com//2019/01/23/GAN_image_generation.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/01/23/GAN_image_generation.html</guid>
        <pubDate>Wed, 23 Jan 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;GAN在图像生成上取得了巨大的成功，这无疑取决于GAN在博弈下不断提高建模能力，最终实现以假乱真的图像生成。GAN自2014年诞生至今也有4个多年头了，大量围绕GAN展开的文章被发表在各大期刊和会议。以改进和分析GAN的数学研究、提高GAN的生成质量研究、GAN在图像生成上的应用（指定图像合成、文本到图像，图像到图像、视频）以及GAN在NLP和其它领域的应用。图像生成是研究最多的，并且该领域的研究已经证明了在图像合成中使用GAN的巨大潜力。本博客围绕&lt;a href=&quot;https://arxiv.org/abs/1803.04469&quot;&gt;An Introduction to Image Synthesis with Generative Adversarial Nets&lt;/a&gt;一文对GAN在图像生成应用做个综述。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;著名的物理学家Richard Feynman说过：“What I cannot create, I do not understand”（对于我创造不出的事物，我是无法理解它的）。我们现阶段接触到的AI产品，都是在尝试去看懂人类可以看懂的，例如对Imagenet的图像分类、AlphaGo、智能对话机器人等。然而，我们仍然不能断定这些算法具有真正的“智能”，因为知道如何做某事并不一定意味着理解某些东西，而且真正智能的机器人理解其任务是至关重要的。&lt;/p&gt;

&lt;p&gt;如果机器可以去create，这也就可以说明机器对它的输入数据已经可以自主的建模，这是否可以说明机器在朝着更加“智慧”迈进了一步。这种create在机器学习的领域下，目前最为可行的方法是生成模型。通过学习的生成模型，机器甚至可以绘制不在训练集中但遵循相同分布的样本。&lt;/p&gt;

&lt;p&gt;在生成模型中比较有影响力的有VAE[1]、PixelCNN[2]、Glow[3]、GAN[4]。其中在2014年提出的GAN可谓是生成模型中最受欢迎的，即使不能说GAN是一骑绝尘但也可谓是鹤立鸡群。GAN由两个神经网络组成，一个生成器和一个判别器组成，其中生成器试图产生欺骗判别器的真实样本，而判别器试图区分真实样本和生成样本。这种对抗博弈下使得生成器和判别器不断提高性能，在达到纳什平衡后生成器可以实现以假乱真的输出，但是这种纳什平衡只存在于理论中，实际GAN的训练伴随着一些问题的限制。一个是GAN训练不稳定性另一个是模式崩溃，导致问题的理论推导在之前&lt;a href=&quot;http://www.twistedwg.com/2018/01/30/GAN-problem.html&quot;&gt;博客&lt;/a&gt;有所推证。&lt;/p&gt;

&lt;p&gt;GAN存在的问题并没有限制GAN的发展，不断改进GAN的文章层出不穷，在这几年的铺垫下GAN已经发展的蛮成熟的。从这几年关于GAN的高质量文章可以看出，18年以后的文章更多关注的是GAN在各个领域的应用，而之前的文章则是集中在GAN存在问题的改进。GAN在图像生成应用最为突出，当然在计算机视觉中还有许多其他应用，如图像绘画，图像标注，物体检测和语义分割。在自然语言处理中应用GAN的研究也是一种增长趋势，如文本建模，对话生成，问答和机器翻译。然而，在NLP任务中训练GAN更加困难并且需要更多技术，这也使其成为具有挑战性但有趣的研究领域。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/1803.04469&quot;&gt;An Introduction to Image Synthesis with Generative Adversarial Nets&lt;/a&gt;一文是概述GAN图像生成中使用的方法，并指出已有方法的优缺点。这篇博客则是对这篇论文进行个人的理解和翻译，并对其中的一些方法结合个人实际应用经验进行分析。&lt;/p&gt;

&lt;h1 id=&quot;gan的基础&quot;&gt;GAN的基础&lt;/h1&gt;

&lt;p&gt;接触过GAN的学者如果对GAN的结构已经很熟悉，这一部分可以自行跳过。我们看一下GAN的基础结构：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review1.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;GAN可以将任意的分布作为输入，这里的$Z$就是输入，在实验中我们多取$Z \sim \mathcal N(0,1)$，也多取$[-1,1]$的均匀分布作为输入。生成器G的参数为$\theta$，输入$Z$在生成器下得到$G(z;\theta)$，输出可以被视为从分布中抽取的样本$G(z;\theta)  \sim p_g$。对于训练样本$x$的数据分布为$p_{data}$，生成模型G的训练目标是使$p_g$近似$p_{data}$。判别器D便是为了区分生成样本和真实样本的真假，训练发生器和判别器通过最小 - 最大游戏，其中发生器G试图产生逼真的数据以欺骗判别器，而判别器D试图区分真实数据和合成数据。这种博弈可公式化为：&lt;/p&gt;

&lt;p&gt;\(\min_G \max_D V(D,G) = \mathbb E_{x \sim p_{data}(x)}[logD(x)] + \mathbb E_{z \sim p_z(z)}[log(1-D(G(z)))]\)
最初的GAN 使用完全连接的层作为其构建块。后来，DCGAN [5]提出使用卷积神经网络实现了更好的性能，从那以后卷积层成为许多GAN模型的核心组件。然而，当判别器训练得比发生器好得多时，D可以有信心地从G中拒绝来自G的样本，因此损失项$log(1-D(G(z)))$饱和并且G无法从中学到任何东西。为了防止这种情况，可以训练G来最大化$log D(G(z))$，而不是训练G来最小化$log(1-D(G(z)))$。虽然G的改变后的损失函数给出了与原始梯度不同的梯度，但它仍然提供相同的梯度方向并且不会饱和。&lt;/p&gt;

&lt;h2 id=&quot;条件gan&quot;&gt;条件GAN&lt;/h2&gt;

&lt;p&gt;在原始GAN中，无法控制要生成的内容，因为输出仅依赖于随机噪声。我们可以将条件输入$c$添加到随机噪声$Z$，以便生成的图像由$G(c,z)$定义。这就是CGAN[6]，通常条件输入矢量$c$与噪声矢量$z$直接连接即可，并且将得到的矢量原样作为发生器的输入，就像它在原始GAN中一样。条件$c$可以是图像的类，对象的属性或嵌入想要生成的图像的文本描述，甚至是图片。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review2.png&quot; /&gt;
&lt;/p&gt;

&lt;h2 id=&quot;辅助分类器ganacgan&quot;&gt;辅助分类器GAN(ACGAN)&lt;/h2&gt;

&lt;p&gt;为了提供更多的辅助信息并允许半监督学习，可以向判别器添加额外的辅助分类器，以便在原始任务以及附加任务上优化模型。这种方法的体系结构如下图所示，其中C是辅助分类器。 添加辅助分类器允许我们使用预先训练的模型（例如，在ImageNet上训练的图像分类器），并且在ACGAN [7]中的实验证明这种方法可以帮助生成更清晰的图像以及减轻模式崩溃问题。 使用辅助分类器还可以应用在文本到图像合成和图像到图像的转换。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review3.png&quot; /&gt;
&lt;/p&gt;

&lt;h2 id=&quot;gan与encoder的结合&quot;&gt;GAN与Encoder的结合&lt;/h2&gt;

&lt;p&gt;尽管GAN可以将噪声向量z转换为合成数据样本G(z)，但它不允许逆变换。如果将噪声分布视为数据样本的潜在特征空间，则GAN缺乏将数据样本x映射到潜在特征z的能力。为了允许这样的映射，两个并发的工作BiGAN[8]和ALI[9]在原始GAN中添加编码器E，如下图所示。令$\Omega_x$为数据空间，$\Omega_z$为潜在特征空间，编码器E将$x \in \Omega_x$作为输入，并产生特征向量$E(x) \in \Omega_z$作为输出。修正判别器D以将数据样本和特征向量都作为输入来计算$P(Y \vert x,z)$，其中$Y = 1$表示样本是真实的而$Y = 0$表示数据由G生成。用数学公式表示为：&lt;/p&gt;

\[\min_G \max_D V(D,G) = \mathbb E_{x \sim p_{data}(x,E(x))}[logD(x)] + \mathbb E_{z \sim p_z(z)}[log(1-D(G(z),z))]\]

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review4.png&quot; /&gt;
&lt;/p&gt;

&lt;h2 id=&quot;gan与vae的结合&quot;&gt;GAN与VAE的结合&lt;/h2&gt;

&lt;p&gt;VAE生成的图像是模糊的，但是VAE生成并没有像GAN的模式崩溃的问题，VAE-GAN[10]的初衷是结合两者的优点形成更加鲁棒的生成模型。模型结构如下：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review5.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;但是实际训练过程中，VAE和GAN的结合训练过程也是很难把握的。&lt;/p&gt;

&lt;h2 id=&quot;处理模式崩溃问题&quot;&gt;处理模式崩溃问题&lt;/h2&gt;

&lt;p&gt;虽然GAN在图像生成方面非常有效，但它的训练过程非常不稳定，需要很多技巧才能获得良好的结果。GAN不仅在训练中不稳定，还存在模式崩溃问题。判别器不需要考虑生成样品的种类，而只关注于确定每个样品是否真实，这使得生成器只需要生成少数高质量的图像就足以愚弄判别者。例如在MNIST 数据集包含从0到9的数字图像，但在极端情况下，生成器只需要学会完美地生成十个数字中的一个以完全欺骗判别器，然后生成器停止尝试生成其他九位数，缺少其他九位数是类间模式崩溃的一个例子。类内模式崩溃的一个例子是，每个数字有很多写作风格，但是生成器只学习为每个数字生成一个完美的样本，以成功地欺骗鉴别器。&lt;/p&gt;

&lt;p&gt;目前已经提出了许多方法来解决模型崩溃问题。一种技术被称为小批量（miniBatch）特征，其思想是使判别器比较真实样本的小批量以及小批量生成的样本。通过这种方式，判别器可以通过测量样本在潜在空间中的距离来学习判断生成的样本是否与其他一些生成的样本过于相似。尽管这种方法运行良好，但性能在很大程度上取决于距离计算中使用的特征。 MRGAN [11]建议添加一个编码器，将数据空间中的样本转换回潜在空间，如BiGAN 它的编码器和生成器的组合充当自动编码器，重建损失被添加到对抗性损失中以充当模式正则化器。同时，还训练判别器以区分重构样本，其用作另一模式正则化器。 WGAN [12]使用Wasserstein距离来测量真实数据分布与学习分布之间的相似性，而不是像原始GAN那样使用Jensen-Shannon散度。虽然它在理论上避免了模式崩溃，但模型收敛的时间比以前的GAN要长。为了缓解这个问题，WGAN-GP [13]建议使用梯度惩罚，而不是WGAN中的权重削减。 WGAN-GP通常可以产生良好的图像并极大地避免模式崩溃，并且很容易将此培训框架应用于其他GAN模型。SAGAN[14]将谱归一化的思想用在判别器，限制判别器的能力。&lt;/p&gt;

&lt;h1 id=&quot;gan在图像生成方法&quot;&gt;GAN在图像生成方法&lt;/h1&gt;

&lt;p&gt;GAN在图像生成中的主要方法为直接方法，迭代方法和分层方法，这三种方法可由下图展示：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review6.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;区分图像生成方法是看它拥有几个生成器和判别器。&lt;/p&gt;

&lt;h2 id=&quot;直接法&quot;&gt;直接法&lt;/h2&gt;

&lt;p&gt;该类别下的所有方法都遵循在其模型中使用一个生成器和一个判别器的原理，并且生成器和判别器的结构是直接的，没有分支。许多最早的GAN模型属于这一类，如GAN [4]、DCGAN [5]、ImprovedGAN [15]，InfoGAN [16]，f-GAN [17]和GANINT-CLS [18]。其中，DCGAN是最经典的之一，其结构被许多后来的模型使用，DCGAN中使用的一般构建块如下图所示，其中生成器使用反卷积，批量归一化和ReLU激活，而判别器使用卷积，batchnormalization和LeakyReLU激活，这也是现在很多GAN模型网络设计所借鉴的。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review7.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;与分层和迭代方法相比，这种方法设计和实现相对更直接，并且通常可以获得良好的结果。&lt;/p&gt;

&lt;h2 id=&quot;分层法&quot;&gt;分层法&lt;/h2&gt;

&lt;p&gt;与直接法相反，分层方法下的算法在其模型中使用两个生成器和两个鉴别器，其中不同的生成器具有不同的目的。这些方法背后的想法是将图像分成两部分，如“样式和结构”和“前景和背景”。两个生成器之间的关系可以是并联的或串联的。&lt;/p&gt;

&lt;p&gt;SS-GAN [19]使用两个GAN，一个Structure-GAN用于从随机噪声$\hat{z}$作为输入并输出图像，整体结构可由下图展示：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review8.png&quot; /&gt;
&lt;/p&gt;

&lt;h2 id=&quot;迭代法&quot;&gt;迭代法&lt;/h2&gt;

&lt;p&gt;迭代法不同于分层法，首先，不使用两个执行不同角色的不同生成器，此类别中的模型使用具有相似或甚至相同结构的多个生成器，并且它们生成从粗到细的图像，每个生成器重新生成结果的详细信息。当在生成器中使用相同的结构时，迭代方法可以在生成器之间使用权重共享，而分层方法通常不能。&lt;/p&gt;

&lt;p&gt;LAPGAN [20]是第一个使用拉普拉斯金字塔使用迭代方法从粗到细生成图像的GAN。LAPGAN中的多个生成器执行相同的任务：从前一个生成器获取图像并将噪声矢量作为输入，然后输出再添加到输入图像时使图像更清晰的细节（残留图像）。这些发生器结构的唯一区别在于输入/输出尺寸的大小，而一个例外是最低级别的生成器仅将噪声向量作为输入并输出图像。LAPGAN优于原始GAN 并且表明迭代方法可以生成比直接方法更清晰的图像。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review9.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;StackGAN [21]作为一种迭代方法，只有两层生成器。第一个生成器接收输入$(z,c)$，然后输出模糊图像，可以显示粗略的形状和对象的模糊细节，而第二个生成器采用$(z,c)$和前一个生成器生成的图像，然后输出更大的图像，可以得到更加真实的照片细节。&lt;/p&gt;

&lt;p&gt;迭代法的另一个例子是SGAN [22]，其堆叠生成器，其将较低级别的特征作为输入并输出较高级别的特征，而底部生成器将噪声矢量作为输入并且顶部生成器输出图像。对不同级别的特征使用单独的生成器的必要性是SGAN关联编码器，判别器和Q网络（用于预测$P(z_i \vert h_i)$的后验概率以进行熵最大化，其中$h_i$每个生成器的第i层的输出特征），以约束和改善这些特征的质量。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review10.png&quot; /&gt;
&lt;/p&gt;

&lt;h2 id=&quot;其它方法&quot;&gt;其它方法&lt;/h2&gt;

&lt;p&gt;与前面提到的其他方法不同，PPGN[23]使用激活最大化来生成图像，它基于先前使用去噪自动编码器（DAE）学习的采样。为了生成以特定类别标签y为条件的图像，而不是使用前馈方式（例如，如果通过时间展开，可以将循环方法视为前馈），PPGN优化过程为生成器找到输入z这使得输出图像高度激活另一个预训练分类器中的某个神经元（输出层中与其类标签y对应的神经元）。&lt;/p&gt;

&lt;p&gt;为了生成更好的更高分辨率的图像，ProgressiveGAN [24]建议首先训练$4 \times 4$像素的生成器和判别器，然后逐渐增加额外的层，使输出分辨率加倍至$1024 \times 1024$。这种方法允许模型首先学习粗糙结构，然后专注于稍后重新定义细节，而不是必须同时处理不同规模的所有细节。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review11.png&quot; /&gt;
&lt;/p&gt;

&lt;h1 id=&quot;gan在文本到图像的应用&quot;&gt;GAN在文本到图像的应用&lt;/h1&gt;

&lt;p&gt;GAN应用于图像生成时，虽然CGAN [6]这样的标签条件GAN模型可以生成属于特定类的图像，但基于文本描述生成图像仍然是一个巨大的挑战。文本到图像合成是计算机视觉的里程碑，因为如果算法能够从纯粹的文本描述中生成真实逼真的图像，我们可以高度确信算法实际上理解图像中的内容。&lt;/p&gt;

&lt;p&gt;GAN-INT-CLS [18]是使用GAN从文本描述生成图像的第一次尝试，这个想法类似于将条件向量与噪声向量连接起来的条件GAN，但是使用文本句子的嵌入而不是类标签或属性的区别。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review12.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;GAN-INT-CLS开创性的区分两种错误来源：不真实的图像与任何文本，以及不匹配的文本的真实图像。为了训练判别器以区分这两种错误，在每个训练步骤中将三种类型的输入馈送到判别器：{真实图像，匹配文本}，{真实图像，不匹配文本}和{伪图像，真实文本}。这种训练技术对于生成高质量图像非常重要，因为它不仅告诉模型如何生成逼真的图像，还告诉文本和图像之间的对应关系。&lt;/p&gt;

&lt;p&gt;TAC-GAN [25]是GAN-INT-CLS [18]和ACGAN [7]的组合。&lt;/p&gt;

&lt;h2 id=&quot;位置约束的文本到图像&quot;&gt;位置约束的文本到图像&lt;/h2&gt;

&lt;p&gt;尽管GAN-INT-CLS [18]和StackGAN [21]可以基于文本描述生成图像，但是它们无法捕获图像中对象的定位约束。为了允许编码空间约束，GAWWN [26]提出了两种可能的解决方案。&lt;/p&gt;

&lt;p&gt;GAWWN 提出的第一种方法是通过空间变换网络对空间复制的文本嵌入张量进行学习，从而学习对象的边界框。空间变换器网络的输出是与输入具有相同维度的张量，但是边界外的值都是零。空间变换器的输出张量经过几个卷积层，以将其大小减小回一维向量，这不仅保留了文本信息，而且还通过边界框提供了对象位置的约束。这种方法的一个好处是它是端到端的，不需要额外的输入。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review13.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;GAWWN 提出的第二种方法是使用用户指定的关键点来约束图像中对象的不同部分（例如头部，腿部，手臂，尾部等）。对于每个关键点，生成一个掩码矩阵，其中关键点位置为1，其他为0，所有矩阵通过深度级联组合形成一个形状$[M \times M \times K]$的掩码张量，其中$M$是掩码的大小，$K$是数字关键点。然后将张量放入二进制矩阵中，其中1指示存在关键点，否则为0，然后在深度方向上复制以成为要被馈送到剩余层中的张量。虽然此方法允许对对象进行更详细的约束，但它需要额外的用户输入来指定关键点。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review14.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;尽管GAWWN提供了两种可以对生成的图像强制执行位置约束的方法，但它仅适用于具有单个对象的图像，因为所提出的方法都不能处理图像中的多个不同对象。&lt;/p&gt;

&lt;h2 id=&quot;堆叠gan的文本到图像&quot;&gt;堆叠GAN的文本到图像&lt;/h2&gt;

&lt;p&gt;StackGAN [21]建议使用两个不同的生成器进行文本到图像的合成，而不是只使用一个生成器。第一个生成器负责生成包含粗糙形状和颜色的对象的低分辨率图像，而第二个生成器获取第一个生成器的输出并生成具有更高分辨率和更清晰细节的图像，每个生成器都与其自己的判别器相关联。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review15.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;StackGAN ++ [27]建议使用更多对生成器和判别器而不是仅仅两个，为判别器增加无条件图像合成损失，并使用由均值平均损失计算的色彩一致性正则化项和真实和虚假图像之间的差异。&lt;/p&gt;

&lt;p&gt;AttnGAN [28]通过在图像和文本特征上使用注意机制进一步扩展了StackGAN ++ [27]的体系结构。在AttnGAM中，每个句子都嵌入到全局句子向量中，并且句子的每个单词也嵌入到单词向量中。全局句子向量用于在第一阶段生成低分辨率图像，然后以下阶段使用前一阶段的输入图像特征和单词向量作为对关注层的输入并计算将使用的词语上下文向量。与图像特征组合并形成生成器的输入，将生成新的图像特征。&lt;/p&gt;

&lt;h2 id=&quot;文本到图像模型的局限性&quot;&gt;文本到图像模型的局限性&lt;/h2&gt;

&lt;p&gt;目前的文本到图像模型在每个图像具有单个对象的数据集上表现良好，例如CelebA中的人脸，CUB中的鸟以及ImageNet中的一些对象。此外，他们可以在LSUN 中为卧室和起居室等场景合成合理的图像，即使场景中的物体缺乏清晰的细节。然而，在一个图像中涉及多个复杂对象的情况下，所有现有模型都工作得很糟糕。&lt;/p&gt;

&lt;p&gt;当前模型在复杂图像上不能很好地工作的一个合理的原因是模型只学习图像的整体特征，而不是学习其中每种对象的概念。这解释了为什么卧室和起居室的合成场景缺乏清晰的细节，因为模型不区分床和桌子，所有它看到的是一些形状和颜色的图案应放在合成图像的某处。换句话说，模型并不真正理解图像，只记得在哪里放置一些形状和颜色。&lt;/p&gt;

&lt;p&gt;生成性对抗网络无疑提供了一种有前途的文本到图像合成方法，因为它产生的图像比迄今为止的任何其他生成方法都要清晰。为了在文本到图像合成中迈出更进一步的步骤，需要找到新的方法实现算法的事物概念。一种可能的方法是训练可以生成不同种类对象的单独模型，然后训练另一个模型，该模型学习如何基于文本描述将不同对象（对象之间的合理关系）组合成一个图像。然而，这种方法需要针对不同对象的大型训练集，以及包含难以获取的那些不同对象的图像的另一大型数据集。另一个可能的方向可能是利用Hinton等人提出的胶囊理念，]因为胶囊被设计用于捕获物体的概念，但是如何有效地训练这种基于胶囊的网络仍然是一个需要解决的问题。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;分割线（篇幅有点长，可以选择下次阅读）&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;gan在图像到图像的应用&quot;&gt;GAN在图像到图像的应用&lt;/h1&gt;

&lt;p&gt;图像到图像的转换被定义为将一个场景的可能表示转换成另一个场景的问题，例如图像结构图映射到RGB图像，或者反过来。该问题与风格迁移有关，其采用内容图像和样式图像并输出具有内容图像的内容和样式图像的样式的图像。图像到图像转换可以被视为风格迁移的概括，因为它不仅限于转移图像的风格，还可以操纵对象的属性（如在面部编辑的应用中）。&lt;/p&gt;

&lt;h2 id=&quot;有监督下图像到图像转换&quot;&gt;有监督下图像到图像转换&lt;/h2&gt;

&lt;p&gt;Pix2Pix [29]提出将CGAN的损失与L1正则化损失相结合，使得生成器不仅被训练以欺骗判别器而且还生成尽可能接近真实标注的图像，使用L1而不是L2的原因是L1产生较少的模糊图像。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review16.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;有条件的GAN损失定义为：&lt;/p&gt;

\[\mathcal L_{CGAN}(G,D) = \mathbb E_{x,y \sim p_{data}(x,y)}[logD(x,y)] + \mathbb E_{x \sim p_{data},z \sim p_z(z)}[log(1-D(x,G(x,z)))]\]

&lt;p&gt;约束自相似性的L1损失定义为：&lt;/p&gt;

\[\mathcal L_{L1}(G) = \mathbb E_{x \sim p_{data},z \sim p_z(z)}[\Vert y - G(x,z) \Vert_1]\]

&lt;p&gt;总的损失为：&lt;/p&gt;

\[G^*, D^* = arg \min_G \max_D \mathcal L_{CGAN} + \lambda \mathcal L_{L1}(G)\]

&lt;p&gt;其中$\lambda$是一个超参数来平衡两个损失项，Pix2Pix 的生成器结构基于UNet ，它属于编码器 - 解码器框架，但增加了从编码器到解码器的跳过连接，以便绕过共享诸如对象边缘之类的低级信息的瓶颈。&lt;/p&gt;

&lt;h2 id=&quot;配对监督下图像到图像转换&quot;&gt;配对监督下图像到图像转换&lt;/h2&gt;

&lt;p&gt;PLDT [30]提出了另一种进行监督图像到图像转换的方法，通过添加另一个判别器$D_{pair}$来学习判断来自不同域的一对图像是否相互关联。的体系结构如下图所示，给定来自源域的输入图像来学习判断来自不同域的一对图像是否相互关联。PLDT的体系结构如下图所示，给定来自源域的输入图像$X_s$，其目标域中的真实图像，其目标域中的真实图像$X_t$，目标域中的无关图像，目标域中的无关图像$X_{\tilde{t}}$，以及生成器将，以及生成器G将$X_s$传输到图像传输到图像$\hat{X_t}$中。中。$D_{pair}$的损失可表示为：&lt;/p&gt;

\[\mathcal L_{pair} = -t \cdot log[D_{pair}(x_s,x)] + (t-1) \cdot log[1 - D_{pair}(x_s,x)]\]

\[when, x=x_t or x=\hat{x_t}, t=0.\]

\[when, x=x_{\tilde{t}}, t=1\]

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review17.png&quot; /&gt;
&lt;/p&gt;

&lt;h2 id=&quot;无监督图像到图像转换&quot;&gt;无监督图像到图像转换&lt;/h2&gt;

&lt;p&gt;两个并发工作CycleGAN [31]和DualGAN [32]采用重构损失，试图在转换周期后保留输入图像。CycleGAN和DualGAN共享相同的框架，如下图所示。可以看到，两个生成器$G_{AB}$和$G_{BA}$正在进行相反的转换，这可以看作是一种双重学习。此外，DiscoGAN [33]是另一种利用与下图相同的循环框架的模型。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review18.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;以CycleGAN为例，在CycleGAN中，有两个生成器，$G_{AB}$用于将图像从域A传输到B，$G_{BA}$用于执行相反的转换。此外，还有两个判别器$D_A$和$D_B$可预测图像是否属于该域。&lt;/p&gt;

&lt;p&gt;尽管CycleGAN 和DualGAN具有相同的模型结构，但它们对生成器使用不同的实现。CycleGAN使用卷积架构的生成器结构，而DualGAN遵循U-Net结构。&lt;/p&gt;

&lt;h2 id=&quot;距离约束下无监督图像到图像转换&quot;&gt;距离约束下无监督图像到图像转换&lt;/h2&gt;

&lt;p&gt;DistanceGAN [34]发现，源域A中两个图像之间的距离的$d_k = \Vert x_i - x_j \Vert$与目标域B中对应图像$d_k^, = \Vert G_{AB}(x_i) - G_{AB}(x_j) \Vert$的距离高度正相关。高度相关性下$\sum d_k d_k^,$也应该为高。源域中的成对距离$d_k$是固定的，并且最大化$\sum d_k d_k^,$导致具有大值的$d_k$支配损失，这是不希望的。因此作者建议最小化$\sum \vert d_k - d_k^, \vert$。&lt;/p&gt;

&lt;h2 id=&quot;特征稳定下无监督图像到图像转换&quot;&gt;特征稳定下无监督图像到图像转换&lt;/h2&gt;

&lt;p&gt;除了最小化原始像素级别的重建误差外，还可以在更高的特征级别进行此操作，这在DTN [35]中进行了探讨。DTN的体系结构如下图所示，其中发生器G由两个神经网络组成，一个卷积网络f和一个反卷积网络g，使得$G = f \circ g$。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review19.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;这里f充当特征提取器，并且DTN 尝试在将输入图像传输到目标域之后保留输入图像的高级特征。给定输入图像$x \in x_s$生成器的输出为$G(x) = g(f(x))$，然后可以使用距离度量d(DTN使用均方误差(MSE))定义特征重建错误。这篇论文之前我们进行过详细解读，可参看&lt;a href=&quot;http://www.twistedwg.com/2018/09/05/DTN.html&quot;&gt;这篇博客&lt;/a&gt;。&lt;/p&gt;

&lt;h2 id=&quot;借助vae和权重分享下无监督图像到图像转换&quot;&gt;借助VAE和权重分享下无监督图像到图像转换&lt;/h2&gt;

&lt;p&gt;UNIT [36]建议将VAE添加到CoGAN [37]用于无监督的图像到图像转换，如下图所示。此外，UNIT假设两个编码器共享相同的潜在空间，这意味着$x_A ,x_B$是不同域中的相同图像，然后共享潜在空间意味着$E_A(x_A) = E_B(x_B)$。基于共享潜在空间假设，UNIT强制在编码器的最后几层之间以及发生器的前几层之间进行权重共享。 UNIT的目标函数是GAN和VAE目标的组合，不同之处在于使用两组GAN / VAE并添加超参数$\lambda_s$来平衡不同的损耗项。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review20.png&quot; /&gt;
&lt;/p&gt;

&lt;h2 id=&quot;无监督的多域图像到图像转换&quot;&gt;无监督的多域图像到图像转换&lt;/h2&gt;

&lt;p&gt;以前的模型只能在两个域之间转换图像，但如果想在几个域之间转换图像，需要为每对域训练一个单独的生成器，这是昂贵的。为了解决这个问题，StarGAN [38]建议使用一个可以生成所有域图像的生成器。StarGAN不是仅将图像作为条件输入，而是将目标域的标签作为输入，并且生成器用于将输入图像转换为输入标签指示的目标域。与ACGAN类似，StarGAN使用辅助域分类器，将图像分类到其所属的域中。此外，循环一致性损失用于保持输入和输出图像之间的内容相似性。为了允许StarGAN在可能具有不同标签集的多个数据集上进行训练，StarGAN使用额外的单一向量来指示数据集并将所有标签向量连接成一个向量，将每个数据集的未指定标签设置为零。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review21.png&quot; /&gt;
&lt;/p&gt;

&lt;h2 id=&quot;图像到图像转换总结&quot;&gt;图像到图像转换总结&lt;/h2&gt;

&lt;p&gt;之前讨论的图像到图像转换方法，它们使用的不同损失总结在下表中：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/GAN/Review22.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;最简单的损失是像素方式的$L1$重建损失，这需要成对的训练样本。单侧和双向重建损失都可以被视为像素方式$L1$重建损失的无监督版本，因为它们强制执行循环一致性并且不需要成对的训练样本。额外的VAE损失基于源域和目标域的共享潜在空间的假设，并且还意味着双向循环一致性损失。然而，等效损失不会尝试重建图像，而是保留源和目标域之间图像之间的差异。&lt;/p&gt;

&lt;p&gt;在所有提到的模型中，Pix2Pix [29]产生最清晰的图像，即使$L1$损失只是原始GAN模型的简单附加组件。将$L1$损失与PLDT中的成对判别器结合起来可以改善模型在涉及图像几何变化的图像到图像转换上的性能。此外，Pix2Pix可能有利于保留源域和目标域中图像之间的相似性信息，如在一些无监督方法如CycleGAN [31]和DistanceGAN [34]中所做的那样。至于无监督方法，虽然它们的结果不如Pix2Pix等监督方法生成效果，但它们是一个很有前途的研究方向，因为它们不需要配对数据，并且在现实世界中收集标记数据是非常昂贵的。&lt;/p&gt;

&lt;h2 id=&quot;图像到图像转换的应用&quot;&gt;图像到图像转换的应用&lt;/h2&gt;

&lt;p&gt;图像到图像转换已经应用在很多领域，比如在人脸面部编辑、图像超分辨率、视频预测以及医学图像转换，这一部分就不具体展开，因为这方面的工作实在过于庞大。&lt;/p&gt;

&lt;h1 id=&quot;gan生成图像的评价指标&quot;&gt;GAN生成图像的评价指标&lt;/h1&gt;

&lt;p&gt;生成图像的质量很难去量化，并且像RMSE这样的度量并不合适，因为合成图像和真实图像之间没有绝对的一对一对应关系。一个常用的主观指标是使用Amazon Mechanical Turk (AMT)，它雇用人类根据他们认为图像的真实程度对合成和真实图像进行评分。然而，人们通常对好的或坏的看法不同，因此我们还需要客观的指标来评估图像的质量。&lt;/p&gt;

&lt;p&gt;Inception score (IS)[15]在将类别放入预先训练的图像分类器时，基于类概率分布中的熵来评估图像。初始得分背后的一个直觉是图像x越好，条件分布$p(y \vert x)$的熵就越低，这意味着分类器对图像的高度信任。此外，为了鼓励模型生成各种类型的图像，边际分布$p(y) = \int p(y \vert x = G(z))dz$应具有高熵。结合这两个讨论，初始分数由$exp( \mathcal E_{x \sim G(z)} D_{KL}(p(y \vert x) \Vert p(y)))$计算。Inception score既不对标签的先前分布敏感，也不对适当的距离测量敏感。此外，Inception score受到类内模式崩溃的影响，因为模型只需要为每个类生成一个完美样本以获得完美的Inception score，所以Inception score不能反应生成模型到底有没有模式崩溃。&lt;/p&gt;

&lt;p&gt;与初始得分相似，FCN-score[29]采用的理念是，如果生成图像是真实的，那么在真实图像上训练的分类者将能够正确地对合成图像进行分类。然而，图像分类器不需要输入图像非常清晰以给出正确的分类，这意味着基于图像分类的度量可能无法在分辨两个图像之间细节上很小的差异。更糟糕的是，分类器的决定不一定取决于图像的视觉内容，但可能受到人类不可见的噪声的高度影响，FCN-score的度量也是存在问题。&lt;/p&gt;

&lt;p&gt;Fréchet Inception Distance (FID) [39]提供了一种不同的方法。首先，生成的图像嵌入到初始网络的所选层的潜在特征空间中。其次，将生成的和真实的图像的嵌入视为来自两个连续多元高斯的样本，以便可以计算它们的均值和协方差。然后，生成的图像的质量可以通过两个高斯之间的Fréchet距离来确定：&lt;/p&gt;

\[FID(x,g) = \Vert \mu_x - \mu_g \Vert_2^2 + Tr(\sum_x + \sum_g - 2(\sum_x \sum_g)^{\frac{1}{2}})\]

&lt;p&gt;上式$(\mu_x，\mu_g)$和$(\sum_x,\sum_g)$分别是来自真实数据分布和生成样本的均值和协方差。FID与人类判断一致，并且FID与生成图像的质量之间存在强烈的负相关。此外，FID对噪声的敏感度低于IS，并且可以检测到类内模式崩溃。&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;此博客在论文&lt;a href=&quot;https://arxiv.org/abs/1803.04469&quot;&gt;An Introduction to Image Synthesis with Generative Adversarial Nets&lt;/a&gt;基础上回顾了GAN的基础知识，图像生成方法的三种主要方法，即直接方法，分层方法和迭代方法和其它生成方法，如迭代采样。也讨论了图像合成的两种主要形式，即文本到图像合成和图像到图像的转换。希望本文可以帮助读者理清GAN在图像生成方向的指导，当然限于原论文（本博客多数内容为翻译原文），还有很多篇精彩的GAN在图像生成方向的论文没有涉及，读者可以自行阅读。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] Kingma D P, Welling M. Auto-encoding variational bayes[J]. arXiv preprint arXiv:1312.6114, 2013.https://arxiv.org/pdf/1312.6114.pdf&lt;/p&gt;

&lt;p&gt;[2] van den Oord, Aaron, et al. “Conditional image generation with pixelcnn decoders.” &lt;em&gt;Advances in Neural Information Processing Systems&lt;/em&gt;. 2016.https://arxiv.org/abs/1606.05328&lt;/p&gt;

&lt;p&gt;[3] Kingma, Durk P., and Prafulla Dhariwal. “Glow: Generative flow with invertible 1x1 convolutions.” &lt;em&gt;Advances in Neural Information Processing Systems&lt;/em&gt;. 2018.https://arxiv.org/pdf/1807.03039.pdf&lt;/p&gt;

&lt;p&gt;[4] Goodfellow, Ian, et al. “Generative adversarial nets.” &lt;em&gt;Advances in neural information processing systems&lt;/em&gt;. 2014.https://arxiv.org/abs/1406.2661&lt;/p&gt;

&lt;p&gt;[5] A. Radford, L. Metz, and S. Chintala, “Unsupervised represetation learning with deep convolutional generative adversarial networks,” arXiv preprint arXiv:1511.06434, 2015.https://arxiv.org/abs/1511.06434&lt;/p&gt;

&lt;p&gt;[6] M.  Mirza  and  S.  Osindero,  “Conditional  generative  adversarial nets,”arXiv preprint arXiv:1411.1784, 2014.https://arxiv.org/abs/1411.1784&lt;/p&gt;

&lt;p&gt;[7] A. Odena, C. Olah, and J. Shlens, “Conditional image synthesis with auxiliary classifier gans,” arXiv preprint arXiv:1610.09585,2016.https://arxiv.org/abs/1610.09585&lt;/p&gt;

&lt;p&gt;[8] J. Donahue, P. Krähenbühl, and T. Darrell, “Adversarial feature learning,” arXiv preprint arXiv:1605.09782, 2016.https://arxiv.org/abs/1605.09782&lt;/p&gt;

&lt;p&gt;[9] V. Dumoulin, I. Belghazi, B. Poole, A. Lamb, M. Arjovsky, O. Mastropietro, and A. Courville, “Adversarially learned inference,”arXiv preprint arXiv:1606.00704, 2016.https://arxiv.org/abs/1606.00704&lt;/p&gt;

&lt;p&gt;[10] A. B. L. Larsen, S. K. Sønderby, H. Larochelle, and O. Winther,“Autoencoding beyond pixels using a learned similarity metric,”arXiv preprint arXiv:1512.09300, 2015.https://arxiv.org/abs/1512.09300&lt;/p&gt;

&lt;p&gt;[11] T. Che, Y. Li, A. P. Jacob, Y. Bengio, and W. Li, “Mode regularized generative adversarial networks,” arXiv preprint arXiv:1612.02136, 2016.https://arxiv.org/abs/1612.02136&lt;/p&gt;

&lt;p&gt;[12] M. Arjovsky, S. Chintala, and L. Bottou, “Wasserstein gan,” arXiv preprint arXiv:1701.07875, 2017.https://arxiv.org/abs/1701.07875&lt;/p&gt;

&lt;p&gt;[13] I. Gulrajani, F. Ahmed, M. Arjovsky, V. Dumoulin, and A. Courville, “Improved training of wasserstein gan,” arXiv preprint arXiv:1704.00028, 2017.https://arxiv.org/abs/1704.00028&lt;/p&gt;

&lt;p&gt;[14] Miyato, Takeru, et al. “Spectral normalization for generative adversarial networks.” &lt;em&gt;arXiv preprint arXiv:1802.05957&lt;/em&gt; (2018).https://arxiv.org/abs/1802.05957&lt;/p&gt;

&lt;p&gt;[15] T. Salimans, I. Goodfellow, W. Zaremba, V. Cheung, A. Radford,and X. Chen, “Improved techniques for training gans,” in Advances in Neural Information Processing Systems, 2016, pp. 2226–2234.https://arxiv.org/abs/1606.03498&lt;/p&gt;

&lt;p&gt;[16] X. Chen, Y. Duan, R. Houthooft, J. Schulman, I. Sutskever, and P. Abbeel, “Infogan: Interpretable representation learning by information maximizing generative adversarial nets,” in Advances In Neural Information Processing Systems, 2016, pp. 2172–2180.https://arxiv.org/abs/1606.03657&lt;/p&gt;

&lt;p&gt;[17] S. Nowozin, B. Cseke, and R. Tomioka, “f-gan: Training generative neural samplers using variational divergence minimization,”arXiv preprint arXiv:1606.00709, 2016.https://arxiv.org/abs/1606.00709&lt;/p&gt;

&lt;p&gt;[18] S. Reed, Z. Akata, X. Yan, L. Logeswaran, B. Schiele, and H. Lee,“Generative adversarial text to image synthesis,” arXiv preprint arXiv:1605.05396, 2016.https://arxiv.org/abs/1605.05396&lt;/p&gt;

&lt;p&gt;[19] X. Wang and A. Gupta, “Generative image modeling using style and structure adversarial networks,” arXiv preprint arXiv:1603.05631, 2016.https://arxiv.org/abs/1603.05631&lt;/p&gt;

&lt;p&gt;[20] E. L. Denton, S. Chintala, a. szlam, and R. Fergus, “Deep generative image models using a laplacian pyramid of adversarial networks,” in Advances in Neural Information Processing Systems Curran Associates, Inc., 2015, pp. 1486–1494.https://arxiv.org/abs/1506.05751&lt;/p&gt;

&lt;p&gt;[21] H. Zhang, T. Xu, H. Li, S. Zhang, X. Huang, X. Wang, and D. Metaxas, “Stackgan: Text to photo-realistic image synthesis with stacked generative adversarial networks,” arXiv preprint arXiv:1612.03242, 2016.https://arxiv.org/abs/1612.03242&lt;/p&gt;

&lt;p&gt;[22] X. Huang, Y. Li, O. Poursaeed, J. Hopcroft, and S. Belongie, “Stacked generative adversarial networks,” arXiv preprint arXiv:1612.04357, 2016.https://arxiv.org/abs/1612.04357&lt;/p&gt;

&lt;p&gt;[23] A. Nguyen, J. Yosinski, Y. Bengio, A. Dosovitskiy, and J. Clune,“Plug &amp;amp; play generative networks: Conditional iterative generation of images in latent space,” arXiv preprint arXiv:1612.00005,2016.https://arxiv.org/abs/1612.00005&lt;/p&gt;

&lt;p&gt;[24] T. Karras, T. Aila, S. Laine, and J. Lehtinen, “Progressive growing of gans for improved quality, stability, and variation,” arXiv preprint arXiv:1710.10196, 2017.https://arxiv.org/abs/1710.10196&lt;/p&gt;

&lt;p&gt;[25] A. Dash, J. C. B. Gamboa, S. Ahmed, M. Z. Afzal, and M. Liwicki,“Tac-gan-text conditioned auxiliary classifier generative adversarial network,” arXiv preprint arXiv:1703.06412, 2017.https://arxiv.org/abs/1703.06412&lt;/p&gt;

&lt;p&gt;[26] S. E. Reed, Z. Akata, S. Mohan, S. Tenka, B. Schiele, and H. Lee,“Learning what and where to draw,” in Advances in Neural Information Processing Systems, 2016, pp. 217–225.https://arxiv.org/abs/1610.02454&lt;/p&gt;

&lt;p&gt;[27] H. Zhang, T. Xu, H. Li, S. Zhang, X. Wang, X. Huang, and D. N. Metaxas, “Stackgan++: Realistic image synthesis with stacked generative adversarial networks,” CoRR, vol. abs/1710.10916,2017. http://arxiv.org/abs/1710.10916&lt;/p&gt;

&lt;p&gt;[28] T. Xu, P. Zhang, Q. Huang, H. Zhang, Z. Gan, X. Huang,and X. He, “Attngan: Fine-grained text to image generation with attentional generative adversarial networks,” arXiv preprint arXiv:1711.10485, 2017.https://arxiv.org/abs/1711.10485&lt;/p&gt;

&lt;p&gt;[29] P. Isola, J.-Y. Zhu, T. Zhou, and A. A. Efros, “Image-to-image translation with conditional adversarial networks,” arXiv preprint arXiv:1611.07004, 2016.https://arxiv.org/abs/1611.07004&lt;/p&gt;

&lt;p&gt;[30] D. Yoo, N. Kim, S. Park, A. S. Paek, and I. S. Kweon, “Pixel-level domain transfer,” in European Conference on Computer Vision. Springer, 2016, pp. 517–532.https://arxiv.org/abs/1603.07442&lt;/p&gt;

&lt;p&gt;[31] J.-Y. Zhu, T. Park, P. Isola, and A. A. Efros, “Unpaired image-to-image translation using cycle-consistent adversarial networks,”arXiv preprint arXiv:1703.10593, 2017.https://arxiv.org/abs/1703.10593&lt;/p&gt;

&lt;p&gt;[32] Z. Yi, H. Zhang, P. T. Gong et al., “Dualgan: Unsupervised dual learning for image-to-image translation,” arXiv preprint arXiv:1704.02510, 2017.https://arxiv.org/abs/1704.02510&lt;/p&gt;

&lt;p&gt;[33] T. Kim, M. Cha, H. Kim, J. Lee, and J. Kim, “Learning to discover cross-domain relations with generative adversarial networks,”arXiv preprint arXiv:1703.05192, 2017.https://arxiv.org/abs/1703.05192&lt;/p&gt;

&lt;p&gt;[34] S. Benaim and L. Wolf, “One-sided unsupervised domain mapping,” arXiv preprint arXiv:1706.00826, 2017.https://arxiv.org/abs/1706.00826&lt;/p&gt;

&lt;p&gt;[35] Y. Taigman, A. Polyak, and L. Wolf, “Unsupervised cross-domain image generation,” arXiv preprint arXiv:1611.02200, 2016.https://arxiv.org/abs/1611.02200&lt;/p&gt;

&lt;p&gt;[36] neural information processing systems, 2014, pp. 2366–2374.M.-Y. Liu, T. Breuel, and J. Kautz, “Unsupervised image-to-image translation networks,” in Advances in Neural Information Processing Systems, 2017, pp. 700–708.https://arxiv.org/abs/1703.00848&lt;/p&gt;

&lt;p&gt;[37] M.-Y. Liu and O. Tuzel, “Coupled generative adversarial networks,” in Advances in neural information processing systems, 2016,pp. 469–477.https://arxiv.org/abs/1606.07536&lt;/p&gt;

&lt;p&gt;[38] Y. Choi, M. Choi, M. Kim, J.-W. Ha, S. Kim, and J. Choo, “Stargan: Unified generative adversarial networks for multi-domain image-to-image translation,” arXiv preprint arXiv:1711.09020,2017.https://arxiv.org/abs/1711.09020&lt;/p&gt;

&lt;p&gt;[39] M. Heusel, H. Ramsauer, T. Unterthiner, B. Nessler,G. Klambauer, and S. Hochreiter, “Gans trained by
a two time-scale update rule converge to a nash equilibrium,” CoRR, vol. abs/1706.08500, 2017.  http://arxiv.org/abs/1706.08500&lt;/p&gt;

&lt;p&gt;[40] Huang, He, Phillip S. Yu, and Changhu Wang. “An Introduction to Image Synthesis with Generative Adversarial Nets.” &lt;em&gt;arXiv preprint arXiv:1803.04469&lt;/em&gt; (2018).http://arxiv.org/abs/1803.04469&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>弱标签下视听目标检测-识别、定位、分离（论文解读）</title>
        <link>http://www.twistedwg.com//2019/01/12/NCP.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/01/12/NCP.html</guid>
        <pubDate>Sat, 12 Jan 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;弱标签数据下的视听场景分析是一个很值得研究的问题，今天要说的这篇&lt;a href=&quot;https://arxiv.org/abs/1811.04000&quot;&gt;Identify, locate and separate: Audio-visual object extraction in large video collections using weak supervision&lt;/a&gt;是在论文作者已发表的论文&lt;a href=&quot;https://arxiv.org/abs/1804.07345v1&quot;&gt;Weakly Supervised Representation Learning for Unsynchronized Audio-Visual Events&lt;/a&gt;基础上的改进版本。我们将通过本次博客分析这两篇论文是如何在视听场景分析下实现场景识别、声音分离和声源定位的。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;无论是铃声电话还是来往的车辆，人类都能立即识别出这些事件特征的视听（AV）组件。这种卓越的能力有助于我们理解环境并与之互动。机器去理解这种场景的话，设计用于从真实世界数据学习视听表示的算法是很重要的。从视听信息中提取事件、目标、声音以及场景判断在视频监控，多媒体索引和机器人等多个领域中具有重要的应用。总的来说声视场景的分析需要包含：1）识别事件或对象 2）在空间和时间中定位它们 3）在场景中提取希望得到的音频。&lt;/p&gt;

&lt;p&gt;对于算法的实现上，大量的视听场景数据是必要的，在多媒体如此发达的现代，这类数据是庞大的，但是和数据匹配的标注信息是缺乏的。昂贵的信息标注一直是机器学习发展的阻碍物，标注过程不仅容易出错且耗时，而且在一定程度上也是主观的。通常，音频中的事件边界，视频对象的范围甚至它们的存在都是模糊的。因此，论文&lt;a href=&quot;https://arxiv.org/abs/1804.07345v1&quot;&gt;Weakly Supervised Representation Learning for Unsynchronized Audio-Visual Events&lt;/a&gt;选择使用仅具有视频级事件标签的数据的弱监督学习方法，即没有整个视频文档的时间的标签也无具体内容的标注。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/1804.07345v1&quot;&gt;Weakly Supervised Representation Learning for Unsynchronized Audio-Visual Events&lt;/a&gt;一文将视频分解为图像区域和时间音频片段，在单独对视觉和音频子模块中处理每个视频，最后根据处理得到的视觉分类得分和听觉分类得分最终对场景进行分类。这个过程由下图所示：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/NCP1.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;可以看到对于音频处理上，是将音频进行时间上的分段，提取得到$S=\lbrace s_1, s_2,…,s_T \rbrace$再送入音频处理网络。但这种音频方案设计有两个缺点：（i）在噪声声学条件下容易出现错误的分类，（ii）仅限于时间定位，音频事件或对象不允许进行时频分割，无法分离出希望得到的音频源。我们今天要解读的&lt;a href=&quot;https://arxiv.org/abs/1811.04000&quot;&gt;Identify, locate and separate: Audio-visual object extraction in large video collections using weak supervision&lt;/a&gt;正是原团队在之前的基础上对音频处理上的改进，其它部分是一样的，所以我们将主要分析后一篇论文。&lt;/p&gt;

&lt;p&gt;总结一下论文的优势：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;通过视听场景分析对事件进行合理分类&lt;/li&gt;
  &lt;li&gt;通过音频处理上对音频的分离处理，增强了原有系统的鲁棒性&lt;/li&gt;
  &lt;li&gt;在视听场景弱标记数据集上定量和定性地验证系统的性能&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;nmf介绍&quot;&gt;NMF介绍&lt;/h1&gt;

&lt;p&gt;后一篇论文正是在音频处理上进行了改进，主要是引入了NMF对音频进行了音频分离。&lt;strong&gt;NMF&lt;/strong&gt;是一种流行的无监督音频分解方法，已成功应用于各种声源分离系统，并作为音频事件检测系统的前端。它将音频频谱图分解为两个非负矩阵，即所谓的频率图及时间表示图。这种基于部分的分解类似于将图像分解成构成对象区域，同时这种思想正是促使论文改进方案的设计。它不仅可以对音频进行去噪，还可以将混合音频适当地组合起来进行分离。&lt;/p&gt;

&lt;p&gt;在&lt;a href=&quot;https://arxiv.org/abs/1804.03160&quot;&gt;The Sound of Pixels&lt;/a&gt;一文中，论文利用U-Net在真实掩码的训练下实现了声音的分离，这个方法的源头也是受到NMF的方法启发，这个我们在论文解读的&lt;a href=&quot;http://www.twistedwg.com/2018/12/18/sound_pixels.html&quot;&gt;博客&lt;/a&gt;中也有所提及。只依赖于弱标签进行声音的分离是&lt;a href=&quot;https://arxiv.org/abs/1811.04000&quot;&gt;Identify, locate and separate: Audio-visual object extraction in large video collections using weak supervision&lt;/a&gt;的一个创新点。&lt;/p&gt;

&lt;p&gt;利用NMF可将声音的频谱图分解由F频率区和N个短时傅里叶变换（STFT）帧组成的音频幅度谱图$Q \in \mathbb R_{+}^{F \times N}$，即：&lt;/p&gt;

\[Q \approx WH\]

&lt;p&gt;其中$W \in \mathbb R_{+}^{F \times K}$是分解得到的频率矩阵，是分解得到的频率矩阵，$H \in \mathbb R_{+}^{K \times N}$是分解得到的时间表示矩阵，这里的是分解得到的时间表示矩阵，这里的$K$是指分离出的音轨数量。这个过程可以用下图近似表示：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/NCP2.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;音轨K对应着$W_k$和$H_k$，将每个音轨进行时间段的划分，论文称之为&lt;strong&gt;NCP&lt;/strong&gt;，NCP的集合记为$\mathcal D = \lbrace d_{k ,t} \rbrace$。这里的$k \in [1, K], t \in [1,T]$&lt;/p&gt;

&lt;h1 id=&quot;模型框架&quot;&gt;模型框架&lt;/h1&gt;

&lt;p&gt;介绍完NMF后，我们对论文实现的模型框架进行分析：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/NCP3.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;不同于第一篇论文，这个模型的输入端音频有一个NMF的处理过程。整体分析一下这个模型，首先分为上下路对视频进行视觉特征提取和分类得分输出，视觉特征提取和分类得分输出，最后将分类得分进行相加得到最终的分类得分，从而确定场景的最终分类。大模型只代表整体思路，接下来，我们去分析每一块的具体实现。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;视觉模块处理&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;分析图像中的对象是各种视觉目标检测算法的核心，这篇论文的目标是在空间和时间上定位与类相关的最具辨别力的区域，并将该技术应用于子采样视频帧序列。以每秒1帧的速率对每个视频的提取帧进行子采样，使用EdgeBoxes对子采样图像对象进行框注。完全在框内的轮廓表示对象存在的可能性，这也是通过实验证明在大多数竞争技术的速度/精度方面具有好的性能。EdgeBoxes还为每个边界框生成一个置信分数，它反映了框的“对象性”。为了减少计算负荷和冗余，选择置信分数最高的对象将其用于特征提取。因此，给定10秒的视频，上述操作将保留下$M = 10 \times M$图像区域框图，特征提取得到特征向量$x_v$，$x_v$是从V中的每个图像区域$r_m$通过感兴趣区域（RoI）池层的卷积神经网络获得的。&lt;/p&gt;

&lt;p&gt;$x_v$再通过两个全连接层，通过双流（twostream）架构，该模块的体系结构包括并行分类和定位流。前者通过使特征通过具有权重$W_{cls}$的线性全连接层来分类每个区域，得到矩阵$A \in \mathbb R^{\vert \mathcal p \vert \times C}$。另一方面，定位层通过权重$W_{loc}$通过另一个全连接层传递相同的输入。然后对定位流中的结果矩阵$B \in \mathbb R^{\vert \mathcal p \vert \times C}$进行softmax操作。&lt;/p&gt;

&lt;p&gt;最后，分类流输出$A$通过$\sigma (B)$通过逐元素乘法加权：$D = A \odot \sigma (B)$。通过将$D$中的结果加权分数与类别得分相加来获得视频上的分数。在训练中图像允许区域或段属于多个类，因此不在分类流上选择softmax。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;听觉模块处理&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;首先将原始音频波形表示为log-Mel谱图，接下来就是处理音频的重要环节了，论文给出了两种处理音频的方法，其中第二种是论文的改进版，也就是我们之前提到的NMF操作。&lt;/p&gt;

&lt;p&gt;1.时间段（Temporal Segment Proposals (TSP)）：音频被简单地分解为相等长度的T个时间段$S=\lbrace s_1, s_2,…,s_T \rbrace$，log-Mel频谱图通过沿时间轴滑动固定长度窗口来对其进行分块而获得的。&lt;/p&gt;

&lt;p&gt;2.NMF分量建议（NMF Component Proposals (NCP)）：使用NMF，我们分解由F频率区和N个短时傅里叶变换（STFT）帧组成的音频幅度谱图，具体的细节我们在前面的NMF中有过介绍。&lt;/p&gt;

&lt;p&gt;两种方法处理完的音频都在&lt;a href=&quot;https://github.com/DTaoo/VGGish&quot;&gt;VGGISH&lt;/a&gt;下做特征提取得到特征向量$x_a$，接下来的操作和视觉处理模块类似。最后，视觉和听觉分数经过$l2$归一化后相加得到最后的分类分数。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;训练和损失&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;给定一组N个训练视频和标签$\lbrace V(n), y(n) \rbrace$，这里$y \in \mathcal y = \lbrace -1, +1 \rbrace^C$，类的存在由+1表示，缺少由-1表示。对于每个视频$V(n)$，网络将一组图像区域R(n)和音频段TSP下$S(n)$或NCP下$D(n$)作为输入。在分别对每个模态执行所描述的操作之后，添加$l2$归一化分数并由$\phi (V(n);w) \in \mathbb R^C$表示，其中所有网络权重和偏差由w表示。对于两种模态，包括和遵循全连接层处理阶段的所有权重都包括在w中。两个子模块都是联合培训的，并且使用多标签铰链损失训练网络：&lt;/p&gt;

\[L(w) = \frac{1}{CN} \sum_{n=1}^N \sum_{c=1}^C max(0,1-y^{(n)} \phi_c(V^{(n)};w))\]

&lt;p&gt;论文在处理音频上还进行了源增强操作，感兴趣的可以进一步阅读原文了解。&lt;/p&gt;

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;此处的实验部分主要介绍引入NMF的这篇论文的实验，毕竟是最近的文章。&lt;/p&gt;

&lt;p&gt;在数据集的选择上，论文使用了Kinetics-Instruments（KI），这是&lt;a href=&quot;https://deepmind.com/research/open-source/open-source-datasets/kinetics/&quot;&gt;Kinetics&lt;/a&gt;数据集的一个子集，其中包含来自15个乐器类的10s Youtube视频。在总共10,267个视频中，分别创建了包含9199和1023个视频的训练和测试集。对于源增强评估，挑选了45个“干净”的乐器录音，每种3个。由于它们不受约束的性质，音频记录大多是有噪声的，即视频是用伴随的音乐/乐器拍摄的，或者是在包含其他背景事件的声学环境中拍摄的。在这种情况下，“干净”指的是具有最小量这种噪声的独奏乐器样本。&lt;/p&gt;

&lt;p&gt;在实验上，论文仅在音频A下的实验记为A，仅在视觉下记为V，视听结合记为V+A。在使用音频处理上，仅仅使用TSP、仅使用NCP以及两者一起使用（TCP，NCP）。&lt;/p&gt;

&lt;p&gt;在分类准确率上，NCP展示了更加优越的效果：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/NCP4.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;在不同的信噪比下同样展示了NCP的较强的鲁棒性：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/NCP5.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;对于乐器的视觉定位上，我们定性看一下实验的效果：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/NCP6.png&quot; /&gt;
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;论文作者在早期工作的基础上对音频的处理进行了NMF的分离增强处理，不仅实现了音频的分离同时使得视听场景分析更具有鲁棒性。论文如它的标题一样，在理论上是做到了识别、定位和分离，对视听场景分析很有借鉴意义，在弱标签下处理视频的多实例学习也是对数据标注昂贵一种合理的处理方式。&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>Attention增强视听觉同步判断</title>
        <link>http://www.twistedwg.com//2019/01/05/Attention_AVS.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2019/01/05/Attention_AVS.html</guid>
        <pubDate>Sat, 05 Jan 2019 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;音频和视频的同步是检验一场多媒体演示质量好坏的关键因素，这就像是没人希望花钱看一场音频和视频不对应的电影。然而多媒体演示的过程中，音频和视频信号通常由独立的工作流程管理 ，分开创作，处理，存储甚至传送到回放系统。这种独立操作增大了音视频同步性的考验，之前博客中分析的&lt;a href=&quot;http://www.twistedwg.com/2018/11/26/L3Net.html&quot;&gt;语义关联判断的AVC&lt;/a&gt;和&lt;a href=&quot;http://www.twistedwg.com/2018/12/12/AVTS.html&quot;&gt;时序关联的AVTS&lt;/a&gt;都是对音视频关联性判断的方法。今天介绍的&lt;a href=&quot;https://arxiv.org/abs/1812.06071&quot;&gt;On Attention Modules for Audio-Visual Synchronization&lt;/a&gt;是将Attention应用在音视频时序同步性的判断。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;在大部分多媒体演示中，音频和视频信号由独立的工作流程管理。在高价制作的优质内容（如电影）的情况下尤其如此。然而从原始音频和视频的拍摄到后期制作上存在大量认为的操作，这里涉及到视频编辑（决定原始素材的哪些部分将用于完成的工作），数字特效（为视频和音频独立创建）以及声音母带制作和混合。这些后期操作很可能带来音视频时序上不同步的问题。此外，用于全球发行的影视材料通常具有对应于不同国际语言的若干音轨。这就需要在视频和主要语言音频已经完成后创建配音音轨。所有这些都开启了音频和视频之间时间错位的可能性。制作电影所涉及的高成本以及目标观众的大小保证了高的多媒体质量，需要音频和视频媒体之间的紧密同步。&lt;/p&gt;

&lt;p&gt;人类非常有能力确定多媒体演示的音频和视频信号是否同步，甚至可以无缝地实现视频中何时何地注意，以便能够判断音频和视频之间是否存在错位。人类经常密切关注时空细节，例如观看电影时人类的嘴唇运动，并仅根据这些线索做出同步性的判断。同时，当我们无法在视觉内容（例如，电影场景中的背景音乐）中找到声音的来源时，我们忽略视频大部分时空部分去处理关注重要细节，这使我们能够有更好的判断力。总之，当人类发现音视频不同步时，我们会感觉很难受，看着别扭，这也与我们人类在大量视听觉关联事例上已经建立了强烈的音视频时序关联的意识。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://arxiv.org/abs/1812.06071&quot;&gt;On Attention Modules for Audio-Visual Synchronization&lt;/a&gt;将Attention引入到音视频同步性判断上，我们后文简称为Attention AVS。在模型中引入了时间注意模块和时空注意模块，时间注意模块关注的是视觉特征和听觉特征混合后得到的融合特征在时序上权重的分配；时空模块则是关注融合特征在每一个局部块上的权重分配。确定了权重，在决策层按照权重计算进行决策输出。这个过程我们用下图进一步理解，时间注意模块关注的是视频时序上的权重分配，时空模块关注的是视频局部的权重分配：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/AAVS1.png&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;总结一下Attention AVS一文的优势：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;提出了一种基于注意力的框架，以自我监督的方式训练，用于视听同步判断&lt;/li&gt;
  &lt;li&gt;设计了时间注意模块和时空注意模块，增加了音视频同步性判断的准确率&lt;/li&gt;
  &lt;li&gt;在定量和定性上都展示了优越的实验结果&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;模型结构&quot;&gt;模型结构&lt;/h1&gt;

&lt;p&gt;我们先从整体上看一下Attention AVS的模型设计：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/AAVS2.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;对于输入的视频，将它分为以25帧为一段的N段非重叠视频块（对于原文处理上，帧速率为29.97，大约为0.8秒），这里记为$B_1,B_2,…,B_N$。对每一块视频段做音频和视觉的分离，再分别提取对应的特征（后续展开说），对提取好的特征做视听特征融合进行联合表示，得到联合特征$f_1,f_2,…,f_N$。将联合特征送入到Attention模块做权重分配，最后送至决策层做决策输出。&lt;/p&gt;

&lt;p&gt;接下来，我们详细分析模型结构中的每一部分，可以分为：特征提取和联合特征表示、注意力模块。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;特征提取和联合特征表示&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;论文对视频块下音频和视频进行特征提取是参考&lt;a href=&quot;https://arxiv.org/abs/1804.03641&quot;&gt;Audio-Visual Scene Analysis with Self-Supervised Multisensory Features&lt;/a&gt;一文中的网络设计，论文也是直接用了这篇论文的预训练权重。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/AAVS3.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;对于视频信息得到特征$H \times W \times T \times C_v$，音频信号得到特征$T \times C_a$，这里值得一说的是对于音频信号特征提取是直接对原始音频进行处理的，而目前很多文章都是将音频转换为声谱图再进行分析的。对于音频特征进行复制$H \times W$次后与视觉特征在channel上进行拼接，即$C=C_v + C_a$，从而得到联合特征表示$H \times W \times T \times (C_v + C_a)$尺寸张量。网络之后是5个卷积层，应用于连接的特征，组合两个模态并产生联合表示。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;注意力模块&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;论文设计了两种注意力模块，分别为时间注意模块和时空注意模块。&lt;/p&gt;

&lt;p&gt;时间注意力模块&lt;/p&gt;

&lt;p&gt;对于联合特征表示得到的$f_1,f_2,…,f_N$中的每一个进行全局平均合并处理，即把特征张量为$H \times W \times T \times C$经过全局平局池化得到$1 \times 1 \times 1 \times C$维度的特征$f_i^{gap}$。使用单个全局特征向量$f_i^{gap}$表示视频的每个块。在全局平均合并特征上应用$1 \times 1 \times 1 \times$卷积，得到每个时间块$B_i$下单个标量置信值$C_i$。$C_i$的置信值直观地捕获了特定时间块的重要性，对同一视频的不同时间块的所有置信值应用softmax归一化函数，我们为每个特征$f_i^{gap}$获得权重$w_i$。特征$\sum_i w_i f_i^{gap}$的加权平均值被传递到决策层，整个过程如下图所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/AAVS4.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;时空注意力模块&lt;/p&gt;

&lt;p&gt;对于时空关注模块，我们将$1 \times 1 \times 1 \times$卷积层直接应用于$H \times W \times T \times C$维度特征，从而为每个块生成一组置信值$C_{H \times W \times T}$。然后，我们在所有块的所有置信值（$H \times W \times T$标量值）中执行归一化处理。基于时空特征$\sum_{n=1}^N \sum_{i=1}^T \sum_{j=1}^H \sum_{k=1}^W w_{nijk} f_n^{ijk}$的加权平均值做出决定，其中$f_n^{ijk}$是在时间块n处从单个空间块$i,j,k$提取的特征向量，也就是局部的特征表示，整个过程如下图所示。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/AAVS5.png&quot; /&gt;
&lt;/p&gt;

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;文章对比的基线是上文提到的&lt;a href=&quot;https://arxiv.org/abs/1804.03641&quot;&gt;Audio-Visual Scene Analysis with Self-Supervised Multisensory Features&lt;/a&gt;一文。所选用的数据集为公开的 &lt;a href=&quot;https://research.google.com/audioset/&quot;&gt;AudioSet&lt;/a&gt;，该数据集包含632个音频事件类别的本体。文章在数据集的语音子集的3000个示例上训练时间和时空模块，并在7000个语音数据集示例上测试所提出的方法，并从通用冲击声音类别中测试800个示例，以进一步显示论文的方法对声音的稳健性诸如打破，打击，弹跳等。论文将每个视频用作正面示例，并将视频的未对齐版本作为反面示例。&lt;/p&gt;

&lt;p&gt;在定量上通过和基线进行视频同步性判断准确率作为衡量指标，时空注意力模块在语音和通用声音类都取得了最佳的同步性判断准确率。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/AAVS6.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;为了进一步说明注意模块的效果，论文绘制并比较了分类网络的输出分数的分布。如下图所示，可以看出，注意模块有助于更好地分离两类同步和非同步数据分布。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/AAVS7.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;在定性评估上，论文可视化网络估计的权重的一些示例。时间注意力的两个例子如下图所示（每类数据集一个）。在每个示例中，每行包含一个时间块。同时还显示每个时间块的分数。正如可以观察到的那样，在左边的例子中，已经为鞋子敲击地面的信息时刻分配了高权重。在右边的示例中，演员发出单词的时刻被选为最具信息性的部分。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/AAVS8.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;在时空注意模块下，下图显示了在相同示例中从时空模块获得的权重。可以观察到，网络正确地将更高的值分配给视频的更多区别区域（例如，鞋子轻敲地板，以及扬声器面对）。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/Speech/AAVS9.png&quot; /&gt;
&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;论文研究了将时间和时空关注模块纳入视听同步问题的效果。通过实验表明，简单的时间注意模块可以在视频中对同步音频和非同步音频和视频内容进行分类方面获得实质性收益。此外，更一般的时空关注模块甚至可以实现更高的准确度，因为它还能够关注视频的更具辨别力的空间块。可视化由时间和时空关注模块生成的权重，可以观察到视频的判别部分被正确地赋予更高的权重。注意力机制的引入，在音视频的同步性展示了一定的优势，注意力的引入更像人类去认知音视频同步的方法。&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>Listen to Dance由音乐自动排舞</title>
        <link>http://www.twistedwg.com//2018/12/21/Listen2Dance.html</link>
        <guid isPermaLink="true">http://www.twistedwg.com//2018/12/21/Listen2Dance.html</guid>
        <pubDate>Fri, 21 Dec 2018 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;Dance motion generation是近年来兴起的研究，由音乐去自动生成排舞动作，是Dance motion generation的进一步发展和应用。&lt;a href=&quot;https://arxiv.org/abs/1811.00818&quot;&gt;Listen to Dance&lt;/a&gt;出自首尔大学的Music &amp;amp; Audio Research Group，实现了音乐到编舞的生成。专业舞蹈者在长期舞蹈创作中学习到了音乐和舞姿之间的联系和搭配，可以说是一种视觉和听觉建立的深层次的联系，这种关联在大数据支持下计算机是有理由去实现的。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id=&quot;论文引入&quot;&gt;论文引入&lt;/h1&gt;

&lt;p&gt;编舞是一种设计一系列动作的艺术，在表演艺术中，编舞延伸到使用人体来表达运动，并且这些通常用音乐来执行。适合音乐的编舞具有重要意义，因为它不仅是艺术品本身，而且最大化音乐的表达。因此，编舞已成为近年来许多流行音乐作品的基本要素。同时创建音乐编排的过程也被认为是重要的，并且正在积极地进行对能够自动生成编排的系统的研究。然而，自动编排生成是一项具有挑战性的任务，因为音乐和舞蹈都是抽象艺术概念，两个概念之间的明确关系也不是由既定规则定义的。&lt;/p&gt;

&lt;p&gt;机器学习和深度学习技术的最新进展促进了研究舞蹈和音乐之间的关系的各种尝试。编排生成算法[&lt;a href=&quot;https://link.springer.com/article/10.1007/s11042-012-1288-5&quot;&gt;1&lt;/a&gt;]通过检索与给定新音乐片段的预定动作音乐配对数据库中的最相似音乐片段相对应的动作作为编舞姿势。该方法从预定义的数据库中选择舞蹈动作，因此保证了与音乐高度相关的检索。然而，它具有局限性，因为它不能创造未包括在数据库中的新颖的舞蹈动作。基于Mel-Frequency倒谱系数（MFCC）特征对音乐类型进行分类，并根据结果生成匹配的编排[&lt;a href=&quot;https://link.springer.com/article/10.1007/s12193-008-0009-x&quot;&gt;2&lt;/a&gt;]。但由于编排是通过类型分类器获得的分类值来确定的，因此生成新颖的编排是有限的。音乐驱动编排模型[&lt;a href=&quot;https://omid.al/projects/GrooveNet.html&quot;&gt;3&lt;/a&gt;]使用成对的音乐和三维运动数据来训练Factored Conditional Restricted Boltzmann Machines（FCRBM），试图通过在训练过程中使用mel谱图来直接训练音乐和舞蹈之间的关系，但是编排的舞蹈不是特别流畅。&lt;/p&gt;

&lt;p&gt;总的来说，在已有的研究中，编排生成算法和匹配编排不能够创造新颖的编排；音乐驱动编排模型确实成功创造了新颖的舞蹈动作，但未能取得好成绩，主要是因为训练数据仅有23分钟。Listen to Dance则是一种新颖的方法，总结一下它的优势：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Listen to Dance一种基于神经网络的模型&lt;/li&gt;
  &lt;li&gt;从大量数据中进行训练，并且训练数据获取较为容易&lt;/li&gt;
  &lt;li&gt;该模型可以生成新的自然编排&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;实现模型&quot;&gt;实现模型&lt;/h1&gt;

&lt;p&gt;我们先来看一下模型实现结构：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/VAE/L2D1.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;我们先总体分析一下网络结构，对于输入的舞蹈视频首先转换为骨架描述的人体结构视频，对于输入的对应音转换为声谱图，数据预处理后送入Encoder-Decoder网络，重构出骨架序列视频和真实进行损失优化。测试时，输入音频则可实现对应骨架序列视频（编舞）的生成。接下来，我们对这个过程展开分析。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据预处理&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;对于输入的视频帧先要转换为对应的骨架帧，文章采用Openpose算法[&lt;a href=&quot;https://arxiv.org/abs/1611.08050&quot;&gt;4&lt;/a&gt;]实现，Openpose算法现在已经算是广发应用在人体姿态检测中，影响力还是很大的。提取每帧15个人体关节的x，y坐标，利用min-max标准化每个视频的提取坐标值，并对未识别的坐标值使用线性插值。由于无法使用2d关节坐标测量人体肢体之间的精确三维角度，因此文章使用每个点的绝对坐标值作为训练目标。另外计算了14个主要肢体的长度，并增加了与模型生成的骨骼的肢体长度进行比较的损失。因此，总共15个关节的x，y坐标和总共14个主肢长度被用作骨架数据，整体操作可以参考下图。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/VAE/L2D2.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;对于输入的音频，主要进行的是将声音信号转换为声谱图图像，时间轴为t秒（与骨架视频对应）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CDHC Block&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;为了学习两种不同模态（即音乐和舞蹈）的时间序列数据之间的关系，需要一个执行多模态序列到序列变换的模型。文章修改了Dilated Convolution Text-To-Speech模型[&lt;a href=&quot;https://arxiv.org/abs/1710.08969&quot;&gt;5&lt;/a&gt;]，该模型在text-tospeech域中表现良好，并将其用作模型的编排生成网络。文章使用的卷积网络为causal dilated highway convlutional block(CDHC)，Causal意味着在计算时间$t$的输出时，只能参考从时间0到$t-1$的输入数据，网络必须是一个自动回归模型，以生成前一帧尚不知道的下一帧。&lt;a href=&quot;https://www.zhihu.com/question/54149221&quot;&gt;Dilated Convolution&lt;/a&gt;称为空洞卷积，主要是为了增大编码的感受野，在WaveNet中也被使用。所谓的Highway就是出自Highway networks一文[&lt;a href=&quot;https://arxiv.org/abs/1505.00387&quot;&gt;6&lt;/a&gt;]，它主要可以解决深层神经网络训练的困难的问题。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encoder &amp;amp; Decoder&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;骨架编码器和音频编码器都包含三个卷积层和10个CDHC块。每个编码器的第一个卷积层将输入通道增加到256维，而另外两个层执行1x1卷积。此后，来自最后卷积层的输出值依次连接到10个CDHC块，扩张系数为(1,3,9,27,1,3,9,27,3,3)，相应的操作促使音频和骨架数据被编码到感受野很广的特征空间，以反映足够的过去信息。解码器的输入是编码的骨架和编码的音频的融合，以此生成下一帧的骨架数据帧。首先，输入到解码器的编码骨架与编码音频组合如下：&lt;/p&gt;

\[\begin{equation}
\begin{aligned}
&amp;amp;H1 = conv(E_{skeleton}+E_{audio}[:128]) \\
&amp;amp;H2 = conv(E_{skeleton}+E_{audio}[128:]) \\
&amp;amp;comb = \sigma(H1) \cdot tanh(H2)
\end{aligned}
\end{equation}\]

&lt;p&gt;其中$E_{skeleton}$和$E_{audio}$分别表示编码骨架和编码音频，而conv表示卷积层，输出通道为128，内核大小为1。组合的张量然后通过六个CDHC块，扩张系数为(1,3,9,27,3,3)，再通过三个具有tanh激活功能的128通道卷积层。最后，在通过具有与目标尺寸相同的输出通道的卷积层之后，通过sigmoid获得最终的解码器输出。&lt;/p&gt;

&lt;p&gt;该网络从时间0到$t-1$接收骨架和音乐数据作为输入。两个数据都通过编码器编码，并在解码器的开头组合。解码器的最终输出在时间1到$t$与真实骨架数据进行比较，我们将其用作$L1$损耗。由于网络中包含的所有卷积运算都具有内核大小1或Causal操作，因此输出的第$k$个值仅来自0到$k-1$时间。因此，该模型满足自回归条件。这也为单独由音频生成骨架视频提供支持。&lt;/p&gt;

&lt;p&gt;测试时，每个关节的初始位置被给出作为输入骨架框架，结合音频编码器得到$t=1$的骨架图，再送入编码，进而得到后续帧的骨架帧输出。&lt;/p&gt;

&lt;h1 id=&quot;实验&quot;&gt;实验&lt;/h1&gt;

&lt;p&gt;论文让人去对生成的编舞和真实的以及随意产生的编舞进行打分，打分针对两个问题（Q1：编排是否自然？/ Q2：编排是否适合音乐？）结果如下：&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/VAE/L2D3.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;这两个问题的平均用户得分在Real组中最高，在Random组中最低，而生成的在中间，判断所提出的模型产生了适合音乐的编排。文章进一步对自相关进行了分析，以进一步研究生成的编排与实际编排之间的差异。自相关是给定序列与其自身之间的相关性，反映了序列的周期性特征。可以通过在自相关结果中观察到的峰的位置来识别给定序列的周期性分量。使用这个，通过计算编排运动的x，y坐标上的自相关来分析运动，并将其与相应音乐的速度进行比较。文章假设是，如果模型可以通过听音乐产生舞蹈，则运动的自相关峰值位置将出现在与音乐节拍相同的点上。&lt;/p&gt;

&lt;p align=&quot;center&quot;&gt;
    &lt;img src=&quot;/assets/img/VAE/L2D4.png&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;真实编舞中在y方向运动中观察到清晰的峰值，但在x方向运动中没有观察到。在生成的编排中也观察到这种趋势，判断出所提出的模型已经产生了听音乐并反映其周期性的编排。&lt;/p&gt;

&lt;h1 id=&quot;总结&quot;&gt;总结&lt;/h1&gt;

&lt;p&gt;文章提出了一种自动回归编码器 - 解码器网络，可以为给定的音乐输入生成匹配的编排。文章使用从YouTube获取的音频 - 视频对数据进行训练。结果发现通过用户研究和自相关分析的比较产生了与音乐匹配的编舞。这是个有趣的应用，因为它在基于学习的编排生成领域表现出了显着的表现，一旦编舞性能上进一步提升的话完全可以取代舞者繁琐的编舞工作。&lt;/p&gt;

&lt;h1 id=&quot;参考文献&quot;&gt;参考文献&lt;/h1&gt;

&lt;p&gt;[1] Minho Lee, Kyogu Lee, and Jaeheung Park, “Music similarity-based approach to generating dance motion sequence,” Multimedia tools and applications, vol. 62,no. 3, pp. 895–912, 2013.&lt;/p&gt;

&lt;p&gt;[2] Ferda Ofli, Yasemin Demir, Yücel Yemez, Engin Erzin,A Murat Tekalp, Koray Balcı, İdil Kızoğlu, Lale Akarun, Cristian Canton-Ferrer, Joëlle Tilmanne, et al.,“An audio-driven dancing avatar,” Journal on Multimodal User Interfaces, vol. 2, no. 2, pp. 93–103, 2008.&lt;/p&gt;

&lt;p&gt;[3] Omid Alemi, Jules Françoise, and Philippe Pasquier,“Groovenet: Real-time music-driven dance movement generation using artificial neural networks,” networks,vol. 8, no. 17, pp. 26, 2017.&lt;/p&gt;

&lt;p&gt;[4] Zhe Cao, Tomas Simon, Shih-En Wei, and Yaser Sheikh,“Realtime multi-person 2d pose estimation using part affinity fields,” in CVPR, 2017.&lt;/p&gt;

&lt;p&gt;[5] Hideyuki Tachibana, Katsuya Uenoyama, and Shunsuke Aihara, “Efficiently trainable text-to-speech system based on deep convolutional networks with guided attention,” arXiv preprint arXiv:1710.08969, 2017.&lt;/p&gt;

&lt;p&gt;[6] Rupesh Kumar Srivastava, Klaus Greff, and Jürgen Schmidhuber, “Highway networks,” arXiv preprint arXiv:1505.00387, 2015.&lt;/p&gt;
</description>
      </item>
    
  </channel>
</rss>