[论文笔记]Disentangled Person Image Generation

Disentangled Person Image Generation

code:GitHub - charliememory/Disentangled-Person-Image-Generation: Tensorflow implementation of CVPR 2018 paper “Disentangled Person Image Generation”

摘要

作者认为一张人体图像由前景(人的外观),背景以及人体姿态这三个因素组成,因此提出了一个两阶段网络来解耦这三个因素,并根据这三个因素重建出原始图像。

[论文笔记]Disentangled Person Image Generation_第1张图片

  1. 第一阶段作者使用一个多分支的网络来解耦人体图像中的这三个因素,并对这个三个因素进行编码以获得其嵌入特征,同时使用解码器从这三个嵌入式的特征中重建出人体图像。

  2. 第二阶段则是使用一个对抗式生成网络来学习将高斯分布分别映射到前景,背景以及人体姿态所对应的特征空间上。

使用上述网络框架就能够实现对人体图像的外观,背景以及姿态进行操控,并且可以凭空生成人体图像。

创新点

  1. 提出这样一个通过解耦人体图像的三个组成因素的方式来实现人体图像生成的方法
  2. 使用一个两阶段网络结构来实现对人体图像的三个组成因素进行操作的方法。第一阶段负责对人体图像的三个因素进行解耦,并使用编码器分别提取出三个因素所对应的嵌入特征,第二阶段则是使用解码器从三个因素的的嵌入特征中重建出人体图像。第二阶段则使用使用对抗式生成网络将高斯空间中采样出噪声向量映射到对应因素的嵌入特征空间中。
  3. 通过对抗训练方式来拟合真实和伪造嵌入特征空间的方法,,可以不受图像生成任务的约束。(即不是直接使用GAN来生成人体图像,而使用GAN将从高斯分布中采样出的噪声z映射到人体图像嵌入式特征空间中,生成一个新的嵌入特征,在根据这个新的特征生成人体图像。)这样可以实现人体图像的凭空生成。
  4. 通过固定人体前景,改变背景和人体姿势来生成同一个人物的多张图片,对re-ID(行人重识别)这样一个人物提供一种新的生成成对数据的方法。

相较前面提出的pose guided person image generation有如下优势:

  1. 可操作性更强,不仅可以对人体姿态进行操作还可以对背景和外观进行操作,并且可以凭空生成人体图像
  2. 不再需要成对的人体图像作为训练数据

方法

作者提出的两阶段方法在生成人体图像的过程中可以对人体图像的任意一个因素进行操控(可以固定其中几个因素,然后操纵余下的几个因素,也可以对这些因素同时进行操控),这种操控可以迁移也可以是凭空生成

第一阶段

[论文笔记]Disentangled Person Image Generation_第2张图片

第一阶段的主要任务得到一个多分支的重构网络,该重构网络首先通过将人体图像的三个因素解耦成三个嵌入特征,再根据这个三个嵌入特征来得到重构出人体图像。

前景分支

  1. 首先使用pose guided person image generation 中相同的方法获取输入人体图像的姿态信息,并采用相同的方式生成人体的掩膜mask。
  2. 得到人体掩膜mask后就可以将人体从原始图片分离出来,这里作者并没有将mask作用于输入图像上,而是将输入图像先经过一个CNN网络提取出特征图(这个卷积块只改变图像通道数不改变图像大小),然后将mask作用这个特征图。这样可以减小由于mask不够精确所带来信息影响。
  3. 需要主要注意的是经过mask作用后得到人体的特征图实际上是同时包含了人体姿态信息和外观信息(前景),因此需要进一步将前景信息从人体特征图中分离出来。因此作者根据18个人体关键点来生成了7个人体感兴趣区域(基本是按照部位来划分的),作者依据划分出的ROI区域来从人体特征图分别提出特定部位特征图,并将其放大到 48 ∗ 48 48*48 4848大小。这里实际上是将原本人体图像进行分解来破坏人体特征图中的结构信息,借此来从人体图像提取出人体外观信息
  4. 将生成7张感兴趣部位的特征图使用一个权重共享的编码器来对7个人体部位的特征图进行编码生成各个人体部位的嵌入特征,最后将这些特征连接起来作为前景的嵌入特征。

背景分支

  1. 背景分支比较简单,直接使用直接将前面获取的人体的mask取反来获取背景图片,因为这里直接获取到的独立的背景信息,所以可以直接使用编码器来生成对应与背景信息的嵌入特征。

姿态分支

  1. 由于姿态信息可以使用姿态评估网络获取的18个关键点来表示出来,在考虑到可能存在部分部位被遮挡导致无法看见,因此对于每个关键点使用(x,y,a)来表示 ,其中x,y表示关键点的坐标,a表示关键点是否可见(1表示该部位可见,0表示该部位不可见),这样可以使用一个54维向量表示这18个关键点所代表的姿态信息。
  2. 作者使用一个单独的基于全连接层的重构网络,使用编码器来生成嵌入特征,然后使用解码器从嵌入特征中重构出姿态信息即54维的向量。
  3. 姿态分支部分除了确保获取分离出的姿态信息的嵌入特征外,还需要其他分支编码器生成嵌入特征结合起来并使用解码器重构出原始的人体图像,这样才能保证其他分支提取出的嵌入特征是正确的特征。
  4. 这里同样使用和pose guided person image generation 一样姿态嵌入的方式,即根据18个关键点信息来生成18张热力图,再将生成的热力图和前面的提取出前景和背景信息结合起来使用一个UNET网络重构出原始的人体图像。这里使用18张热力图也是便于网络将人体7个部分的外观信息和姿态信息结合起来。

解码器部分

  1. 姿态分支的解码器是单独训练,根据该分支上的编码器生成的嵌入特征解码出对应的54维度的向量来表示重建出姿态信息。
  2. 前景和背景部分则是公用一个解码器,该解码器的以堆叠后的姿态,前景和背景信息作为输入,然后生成人体图像。***其使用和pose guided person image generation 中G1所使用的一样的网络结构解码出人体图像,同时还是相同的辨别器来实现一个对抗训练过程,实际这一部分解码器加上辨别器就构成了PG2中的G1+D的网络结构。

优化策略

  1. 本文使用L1_LOSS和对抗性损失来训练阶段1中的前景和背景重建网络(注意姿态部分的重建网络是单独训练,L1_LOSS是用来确保生成图片尽可能与输入图片像,但是L1_LOSS会造成模糊的现象,因此增加了一个对抗式训练过程来补充图片的细节。),在上面的网络结构中是没有体现的,实际整个阶段一本质上是一个condition GAN 只不过作者在网络结构图中并未画出鉴别器的部分,其损失函数如下:

[论文笔记]Disentangled Person Image Generation_第3张图片

这里和condition GAN的区别是辨别器没有使用成对输入,我觉得这里其实可以使用成对图片作为辨别器的输入,就是彻底的作为condition GAN来做。

  1. 对于姿态信息的重构网络而言,由于其可以直接比较重构出的姿态信息和原始信息的差异来作为损失,因为二者都是54维的向量,因此可以直接使用L2_LOSS来作为损失函数:

在这里插入图片描述

第二阶段

第二阶段的设计基于:图片表示成低维的连续特征嵌入空间,而这样一个连续的特征嵌入空间相较于真实图片数据的分布而言更容易被学到。因此作者是使用对抗训练的方式将高斯噪声Z映射到图像的特征嵌入空间E,而不是直接将高斯噪声Z映射到真实图片空间X中,然后再使用一个预训练的解码器(阶段一中的)来将特征嵌入空间E映射到真实图片空间X中去;因此第二阶段的生成器需要将高斯噪声Z分别映射到阶段一中各个编码器所产生的的图像三因素的特征嵌入空间中,对于鉴别器而言只需要将由高斯噪声Z产生嵌入特征作为fake,而第一阶段产生的前景、背景以及姿态的嵌入特征视为real即可。

[论文笔记]Disentangled Person Image Generation_第4张图片

第二阶段训练

[论文笔记]Disentangled Person Image Generation_第5张图片

  1. 在第一阶段训练完成后,使用第一阶段中的前景,背景以及姿态的编码器分别产生大量真实对应因素的嵌入特征数据来作为真实数据。
  2. 对三个图像因素分别设计三个对抗网络,三个生成器分别负责学习将从高斯分布采样的噪声映射成对应因素的嵌入特征,鉴伪器则是将生成器生成的特征向量是为fake,而第一阶段提取的嵌入特征作为real。最后经过一个对抗训练的过程,生成器就可以将高斯空间映射到对应因素的特征空间中去。
损失函数

在这里插入图片描述

这里使用的对抗生成网络所使用的损失函数与前面阶段一中所用的对抗损失函数有区别,阶段一中使用损失函数是基于JS散度来做的,作者本来也想使用阶段一中一样损失函数来做,但是在训练过程中作者发现其存在 collapse mode的现象,这种可以简单理解成生成器虽然能够产生比较逼真的数据,但是产生的数据多样性很低。因此作者使用了Wasserstein GAN中的所使用的损失函数,这个函数是对之前基于JS散度的损失函数的一个改进,解决之前GAN训练时遇到的一些问题。

具体做法如下:

  1. 之前基于JS散度(即二分类损失)往往都在鉴别上增加一个sgmoid函数,来将全连接层的输出归一化来获取二分类的概率,而在WGAN则将这个sgmoid删去,直接使用全连接层的输出,然后计算真实样本的输出和伪造样本输出的距离来作为损失。
  2. 具体一点,假设一个bacth中含有m个真实输入和m个伪造输入,其计算方式就是对m个真实样本和伪造样本的输出分别求平均,然后作差,最后取反(因为是要最小化损失函数)。
  3. 更详细的解释可以看这篇博客令人拍案叫绝的Wasserstein GAN - 知乎 (zhihu.com)

从高斯分布中采样并生成图片

[论文笔记]Disentangled Person Image Generation_第6张图片

在完成对第二阶段的生成器的训练后,就可以实现将高斯空间中采样出的噪声通过对应的生成器生成对应的因素的嵌入特征,再使用第一阶段中训练出的解码器重建出想要的人体图像。

实验

数据集的使用

  1. 作者主要也是使用了Market-1501和Deepfashion这两个数据集,并且过滤掉那些无法使用姿态评估网络获取姿态的图片;从前面对方法的叙述我们可以看到相较之前pose guided 的方法,其不再需要使用成对图片来作为训练数据。
  2. 在Market-1501上作者将图片分解为3个因素,而在Deepfashion这个数据集上作者直将图片分解成前景和姿态这两个因素,这是因为考虑到该数据集中图片的背景基本上是纯白色的。

图片操纵

这一步实验主要体现模型能够对人体图片的三个因素进行任意操纵来生成新的图片,即固定一部分因素,其余因素通过生成器从高斯噪声中生成,再将这些因素组合并重构出新的图片。

[论文笔记]Disentangled Person Image Generation_第7张图片

姿态指导下图片生成

这里作者主要是比较一下自己提出的方法在姿态迁移上的效果和前面的pose guided person image generation做了对比,前面也所过本文的方法不需要成对的训练数据,如果想要将源人体图像中的人体姿势转变成目标人体图像的姿势,只需要将目标人体图像的姿态信息和源人体图像的前景以及背景信息组合起来就可以了。

[论文笔记]Disentangled Person Image Generation_第8张图片

[论文笔记]Disentangled Person Image Generation_第9张图片

在定性比较上,本文提出的方法的细节更加丰富,生成图片质量要明显要优于PG2,特别是在场景比较复杂的情况下,但是从上表定量结果中可以看到本文的方法在SSIM上并未表现优势,作者认为主要是两个因素:1. PG2中使用了跳跃链接的方式来生成图片,能够保留源图片尽可能多的信息,但是在本文解码是需要从压缩过的嵌入特征中重构出图片,这显然是一个更加困难的任务。2.与L1_LOSS类似,模糊的图片能够更高SSIM得分,而本文生成的图片则更加锐化,这在一定程度降低了是的本文的生成的结果的SSIM得分较低。

SSIM在评分时需要比较生成的图像和目标图像之间差异,由于原图像和目标图像在背景和前景方面往往存在这差异,而模型在进行姿态迁移时是在原图像提供的前景和背景信息的基础上生成出背景和前景的,因此这样导致生成图像和目标图像在前景和背景上存在着差异,这些差异会导致SSIM的评分降低。但是在姿态迁移这样一个任务中我们的目标知识姿态要和目标图像一致,对于前景和背景信息应当尽量和源图片一致,因此我感觉SSIM作为评分实际上是和我们想要达到的目标之间存在一个代沟的,我感觉需要一种更好的方式来对生成的图片进行定量的评估。

图像插值

这里插值与图像放大缩小时所说插值有点不一样,作者将其分为采样插值和真实图片的插值。(***这里的实验与前面作者基于的图片空间可以表示成连续的低维特征嵌入空间相互验证。)

采样插值:

作者从高斯空间中随机选择两个高斯噪声 z 1 z1 z1 z 2 z2 z2,然后在这两个噪声之间进行线性插值来生成一系列的高斯噪声,再将这些高斯噪声使用阶段二中的生成器映射到嵌入特征空间,最后生成最终插值图像。如下图第一行所展示的三种不同因素的插值图像,能够看到三种因素的一个连续的变化过程。

反向插值(真实图片的插值)

  1. 作者首先选择两张真实图片 x 1 x1 x1 x 2 x2 x2,然后使用第一阶段的编码器得到其特征 e 1 e1 e1 e 2 e2 e2.
  2. 使用最小梯度的方法(后面需要看一下这个方法)根据得到的 e 1 e1 e1 e 2 e2 e2来得到对应的高斯噪声 z 1 z1 z1 z 2 z2 z2
  3. 和前面插值采样使用相同的方式从得到的 z 1 z1 z1 z 2 z2 z2中插值出 z i zi zi,最后生成图片。

从反向插值的结果中可以看见图片之间的一个连续变化过程,可以想见如果在固定背景和前景的情况下,是有机会生成一系列连续的动作的,而这一点可以被应用到视频的生成和对行人动作的预测

[论文笔记]Disentangled Person Image Generation_第10张图片

与其他生成方法作对比

  1. 这这里比较一下本文中提取的生成方法和其他生成方法在生成人体图像时的效果,可以看到本文提出的方法生成的人体图像更加清晰,细节更加逼真。
  2. 作者比较了使用整个人体来提取前景信息和使用7个人体感兴趣区域来提取人体信息时的差别,能够看使用整个人体来提取前景信息的方法生成的人体图像质量较差,这里可能是是因为提取出前景信息仍然包含有姿态上信息,这种信息会在后面解码器解码时与输入姿态信息产生冲突。特别是输入姿态信息和前景信息中所包含的姿态信息不一致时。
  3. 最后作者还发现在姿态信息来自于真实数据,背景和前景信息来自于生成器的生成的情况下,能够产生质量比较高的图片,因此在后面的行人重识别评估沿用了这样的一个设置。

[论文笔记]Disentangled Person Image Generation_第11张图片

行人重识别

行人重识别任务可以理解成将同一个人的不同图片关联起来,当给定一张某个人查询图像时,网络能够找到其他关于这个人的图像。

作者提出使用行人重识别的方法在本文方法上生成的图片上的表现来定量地评估本文的提出的方法,这里作者使用行人重识别模型的Rank1-match和mAP这两个指标来对本文方法产生的数据进行评估,这样可以简洁反应出本文方法的好坏

作者从以下两个方面来评估本文的方法:

  1. 使用阶段一中提取出前景特征来作为行人重识别模型的训练和识别数据。这里就是说对于同一个的多张图片而言,使用本文方法能够提取出多个前景特征,因此如果行人重识别模型在这些前景特征数据上的Rank1-match和mAP指标比较好,说明本文方法对于同一个提取的前景特征是相似的,不同人提取出的前景特征存在较大差异,这样能够说明本文能够很好地提取人体图像的前景特征。
  2. 第二个评估方式就是使用本文提出的方法生成同一个不同背景不同姿态的数据集(VM),然后比较同一行人重识别模型在本文生成数据集上和其他现有数据集上的表现,如果行人重识别的模型在本文生成的数据集能够有良好的表现,那就说明本文的方法能够实现在不改变人体前景信息的情况对人体图像的背景和姿态进行操作(三者的解耦),同时产生的人体前景具有多样化的特性(这是因为如果本文的方法生成的不同前景之间差异很小话,同样会导致行人重识别模型表现不佳)。
    • 这里说明一下数据集的制作方式,使用第二阶段的生成器生成一个前景嵌入特征和24个背景嵌入特征,并从market-1501这个数据集中随机提取24个姿态特征,然后依据这些信息生成一组图片,作为一个人不同情况的图片来用于行人重识别的任务。

[论文笔记]Disentangled Person Image Generation_第12张图片

  • 首先看表的上半部分,其是比较使用各种方法提取出的人体前景特征作为训练数据后,行人重识别模型的精度,其中LOMO方法是手工提取特征,因此不需要训练数据,从结果可以看到本文提出的方法与其他的无监督的基线方法有着类似的性能。
  • 表的下半部就是使用本文的方法生成VM数据集进行训练后的到结果,可以看到在本文生成的数据集上行人重识别方法能够达到优秀的性能,这说明本文生成的图像与真实图像类似,够实现在不改变人体前景信息的情况对人体图像的背景和姿态进行操作,相较那些需进行昂贵的标注的数据集而言,本文提出方法能够更加简便地产生数据集,这对与行人重识别任务是有益的。

总结

本文通过将人体图像解耦成三弱相关的因素并通过一个两阶段的方式实现对人体图像进行多种操作和生成包含特定属性的人体图像,在想法上有很多值得借鉴的东西,比如对图像组成部分的解耦,通过人体部位的感兴趣区域ROI将人体外观信息从姿态信息中分离出来以及使用GAN生成嵌入式特征而不是直接生成图像等等

类似其他基于GAN图片生成网络,缺乏一个能够合理评估生成图像质量的指标,这里SSIM这个指标显然存在着很多缺陷,能不能将生成图像的外观和背景和源图像作比较,而姿态与目标姿态作比较。

对于反向插值那一部分,是不是可以只反向插值姿态信息,对于外观和背景信息保持不变来生成一个人物的连续动作,这里可以实现一个视频的效果?

你可能感兴趣的:(论文笔记,深度学习,人工智能,计算机视觉)