Joint Discriminative and Generative Learning for Person Re-identification
作者:ZZD 英伟达实习作品 2019年CVPR oral
代码:https://github.com/NVlabs/DG-Net
简介视频:https://www.bilibili.com/video/av51439240
paper:https://arxiv.org/abs/1904.07223
poster:http://zdzheng.xyz/images/DGNet_poster.pdf
以上链接均来自作者开源
1. 摘要
使用生成模型来扩增训练数据和增强对输入变化的不变性(如HHL、ECN)是现在的共识。但目前的生成pipline和reid学习阶段是分离开的,即利用生成模型生成好数据集之后(一个生成网络的训练过程+生成数据)再喂给reid进行训练,即offline,没有将生成模型集成到reid训练中。本文解决了这一问题,在一个框架下end-to-end的联合学习reid模型和生成模型,更好地利用了生成数据,是一种online的方式(后面有offline和online的性能对比)。该方法中的生成器模块(包含encoder和decoder)将输入图像中的行人信息分别encode成apperance code和structure code,提供了更好的可操作性(类似于2018年的CVPR oral【Disentangled Person Image Generation】将行人分解为pose、前景和背景),而鉴别器模块和生成器模块共享apperance encoder结构。通过switch apperance code和structure code,生成器模块能生成高质量cross-id组合图像,这些图像又被online feed回apperance coder,并提高鉴别器模型。大量实验表明方法的性能非常好。
2. 贡献
- 2N张图像生成N^2张图像,且生成图像质量很高
- DG-Net网络:端到端,充分利用了生成图像;编码器Ea被用作reid鉴别模型的backbone,从而编码器和解码器博弈的过程中优化了reid鉴别模型,而reid鉴别模型优化时又反过来fine-tune了编码器
3. Overview
作者的思路是:网络输入三张图像(代码中是四张,原理一样)组成triplet,然后各自用apperance encoder和structure coder编码。然后一方面重构anchor(类似于自编码器)以正则网络,一方面用anchor的结构编码和posiive的外貌编码重构self-id图像,用anchor的外貌编码和posiive的结构编码重构cross-id图像,而cross-id生成图像将再次被编码以学习重构损失。同时,生成的cross-id图像被online喂回Ea来improve外貌编码器,并和真实图像一起喂给鉴别器D进行min-max对抗,由对抗损失监督。最后在鉴别性reid模型学习时,作者用主特征学习(teacher-student模型为生成图像动态打标签)和细粒度特征学习(捕捉域id相关的特征)进行监督。
作者定义了两种编码如下所示:
生成图像效果展示如下:
网络框架如下:
4. 详细介绍:
注意:上标表示提供apperance codes的真实图像index,下标表示提供structure codes的真实图像index,而真实图像只用下标不用上标,此时下标表示其index。和apperance code a_i 相比,structure code s_j 有更高的空间分辨率(网络更浅),保持了更多的几何和位置属性。然而,因为decoders倾向于依赖具有更多空间信息的特征(因为空间信息分辨率大些,decoders因为只需要进行更少的运算就能生成需要的图像而“偷懒”导致 a_i 和 s_j同时输入时多用s_j而少用a_i?),因此对于G来说仅使用 s_j 而忽略 a_i 进行图像生成会导致,因此作者将 E_s 的输入图像转换为 gray 的(去掉外貌信息)让G对 a_i 和 s_j 都加以利用。生成模块有两个目标:(1). self-id 图像生成用来正则生成器;(2). cross-id 图像生成用来使得生成图像更可控,更加与真实数据分布匹配。
4.1. self-id 生成
如图2b所示,给定一张真实图像 x_i,生成器会首先重构 x_i 图像自身,这一简单的seld-reconstruction很好的正则了整个生成器。对于这个重构过程,使用简单的像素级L1损失:
基于相同人的外貌code在不同图像下是相同的这一假设,作者进一步提出使用相同 id 的两张图像的进行重构任务,即使用真实图像x_i 和 x_t 来重构图像,其中 y_i = y_t,损失也是像素级 L1损失:
这个same-id但cross-image重构损失让相同人的不同图像外貌codes彼此close,减小类内变化,但让不同id的外貌code保持不变。作者用交叉熵id损失来监督这一过程:
4.2.cross-id生成
此外,还有普通的对抗损失:
讨论:
通过提出的基于外貌code和结构code的生成模型能生成高质量的行人图像,而以前的生成模型要么从噪声中生成图像,要么从pose factor中生成图像,都难以操控输出并且人造痕迹明显。此外,通过两个codes,生成模型易于解释并且受到语义信息的约束导致生成图像很真实。理论上,该模型能用O(2N)张图像生成O(NN)张不同图像。
以上介绍了生成器部分的结构和损失监督,下面探讨reid模型的结构,如图2d所示,鉴别性reid模型和生成模型共享外貌编码器 E_a作为 reid 学习的backbone,而在这个模块中引入了 primary feature learning 和 fine-grained feature mining 来更好的 online 利用生成图像。
4.3. Primary feature learning
关于KL散度的介绍很多,这篇博客除了基本介绍外还提供了代码便于理解。
4.4. Fine-grained feature mining
图1的每一列可以发现不仅id不变,与id相关的fine-grained属性,如头发,帽子,背包,体型等独立于衣服的信息也要不变。使用id损失来约束:
这里是将生成样本预测为提供结构编码的id的概率,也就是说视生成样本的id与提供结构信息的真实样本的id相同(这里其实和前面cross-id图像生成时可能存在一点矛盾,即到底将外貌还是结构作为行人id决定性因素,还是both?(即reid中同一个人穿了不同衣服还是同一个人吗?在现实世界中答案是肯定的,但就目前的reid模型而言,学习的行人特征中还主要是颜色外观成分,因此现在的reid系统中其实并没有认为换装后还是同一个人----例如本文就是用外貌编码特征作为行人描述符,目前开源的数据集也都是短时间内录制,因此换装的可能性不大,仅MSMT是一个月中选四天录制而且不同图像在室内时衣服都呈现黑色,可能存在缓解这一问题的能力),作者的意思可能是both,但最后还是用外貌编码作为行人描述符(作者指出,结构编码网络太浅,不适合用在行人描述符,因此只是用细粒度特征简单挖掘了一下域id有关的属性信息)。这一损失是附加多任务id监督,相当于自动利用了生成图像的细粒度属性而不像以前的方法那样需要显示属性标注(耗时)。和以前的硬样本挖掘策略相比,这里不需要显示进行硬样本搜索,因为鉴别reid模型通过fine-grained feature mining自动学习了细微的id相关的属性的attention。
讨论:
DG-Net生成的高质量图像可以被认为是inliers(和outliers相对,如作者在reid领域引入GAN的挖坑之作LSGAN)。以前的方法都是单监督,但本文的是primary feature learning和fine-grained feature mining双监督,前者注重结构不变性的衣服(外貌)信息,后者注意外貌不变性的结构(结构)信息。
总优化目标:
5. 实验
5.1. 具体实现
(1). Ea是ImageNet上预训练的ResNet50,移除GAP和FC后,加一个自适应max-pool,输出的外貌code的size为204841,映射为的primary feature和fine-grained feature都是512d的向量(在Ea的代码实现上,作者提供了如PCB,DenseNet的等很多版本);
(2). Es是一个比较浅的网络,输出的结构code为1286432,由四个卷积层后跟四个残差块组成,如表6所示;
(3). G通过四个残差块和四个卷积层处理结构编码s,每个残差块中都包含两个自适应的instance norm层(AdaIN)以代替普通的BN层,可以看到G的输入有两个,即外貌编码和结构编码,但其实只有结构编码是用来重构图像的,而外貌编码通过MLP变换是用来得到G中AdaIN的权重和偏置参数的,结构如表7所示;
(4). D使用的是多尺度的PatchGAN结构,分别是6432,12864和256*128三个尺度输入,如表8所示;
(5). 训练图像全部resize为256*128,SGD优化Ea,lr=0.002,momentum=0.9,Adam优化Es,G和D,lr=0.0001,(beta1,beta2)=(0,0.999);
(6). 测试时,reid模型只使用Ea(和ResNet50差不多参数)提取提到特征(Ea网络深一点,对reid来说更能提取到语义的id信息特征,Es太浅了承担不起这一重任;单独重构一个ResNet作为backbone一是不能在reid时fine-tune外貌编码器,一是整个网络不够干净)经过两个分支单独处理得到两个特征f_prim和f_fine,最后将这两者concat为1024d的行人描述符:
其中+表示concat而不是add。
5.2 生成评估
5.2.1 定性
不online feed(图2红色箭头)和进一步remove id监督的对比如下:
5.2.2 定量
评估生成图像质量时使用一下两个标准:
- FID:生成图像的真实度
- SSIM:生成图像的多样性
详情介绍可访问:https://blog.csdn.net/qq_27261889/article/details/86483505
FID越小代表与真实数据分布之间的距离越小,即真实度越高;SSIM越大代表生成图像之间的相似度低,即多样性高。
5.3 Further Analyze
5.3.1 外表互换
对光照,遮挡等很鲁棒,生成结果很真实
5.3.2 外貌code插值
变化很平滑,说明学到了东西,记住了生成图像的样子
5.3.3 失败的例子
网络对于条纹,dot这些信息更容易生成,但对于logo这种就比较难
5.4 reid结果
5.4.1 消融
5.4.2 超参选择
5.4.3 和SOTA比较
6. 附录
6.1. 外貌code和结构code
Es比较浅,使得结构空间主要保留了结构信息,如人/物体的位置和几何信息。因此结构code hold low-level的位置和几何信息,一方面是如pose,背景这些与id无关的信息。另一方面,还有一些结构信息如背包、头发,身体轮廓这些与id相关的语义信息(也是低级信息)可以更好的被reid模型捕捉。但softmax loss 很 lazy, 其除外貌特征外很难捕捉到结构信息,因此外貌code上的fine-grained feature mining就是为了挖掘那些与id相关的结构信息的(即“另一方面”),与primary feature learning(学习外貌code的与id相关的语义信息)互补。
6.2. 结构code插值
与5.3.2相对,插的乱七八糟,前景和背景都不真实,因为Es是一个浅层网络,其保存的是输入的几何和结构信息这些低级的信息,在这些低级特征之间插值无法保持语义平滑或一致性。
作者知乎对本文的介绍:https://zhuanlan.zhihu.com/p/66408913