Joint Discriminative and Generative Learning for Person Re-identification
论文地址:https://arxiv.org/abs/1904.07223
源码:https://github.com/NVlabs/DG-Net (正在跑)
视频链接:https://www.bilibili.com/video/av51439240/ (还没来得及看)
论文快速理解
限制行人重识别效果的一大问题是 不同摄像头下同一人的特征差异较大,即intra-class variation的影响。同时常用的行人重识别数据集中数据量的大小限制了模型效果。所以作者希望在扩增训练数据的同时增强数据的invariance。
一般用GAN来辅助行人重识别任务,都是直接用GAN完成数据扩增的部分,生成大量fake数据,在这些数据上进行训练。作者认为在这种情况下,GAN的部分也是一个单独的模型,和reid模型仍然是分开的。
论文中提出了名为DG-NET的模型。利用了GAN来进行数据扩增从而辅助REID模型的分类效果。并且GAN和REID模型是联合在一起形成了一个统一的框架来进行的。
Generative module
首先介绍generative module生成模块,在这一部分,作者使用了两个encoder对原始输入图像进行编码,分别将原始输入图像投射到appearance space和structure space。其中appearance包括衣服颜色、纹理风格等相关的特征,而structure包括身体大小、姿态、位置、背景等因素。作者希望实现的情况是使用不同的appearance和structure的组合,来生成大量的1.质量足够好分不出真假;2. 包含足够多的diversity的新数据。
由于structure code中可能保留更多的spatial resolution,G生成器可能会忽略掉appearance的作用而过分看重structure,一个处理方法是,把structure encoder的输入转成灰度图
在生成模块的生成过程中,要考虑到以下的情况。
self-identity generation
appearance和structure都来自于同一张图片的情况,希望通过decoder生成的新的图像和原图实现像素层次上的一致,pixel-wise loss
$$ L^{img_1}_{recon}=E[||x_i-G(a_i,s_i)||_1] $$appearance来自和structure同一人的情况,希望通过decoder生成的信徒下和原图实现像素层次上的一致,即给定一人的structure,使用该人的appearance都需要还原到structure对应的原图。
$$ L^{img_2}_{recon}=E[||x_i-G(a_t,s_i)||_1] $$to force the appearance codes of different images to stay apart,use identification loss。这个部分个人理解就是确保原始图像分类正确。
$$ L^s_{id}=E[-log(p(y_i|x_i))] $$
cross-identity generation
这种情况即appearance和structure来自不同人的情况。在该部分计算损失时就不考虑像素层次上一致了。考虑的时能够在生成图像上编码出原有的两个空间code。
$$ L^{code_1}_{recon}=E[||a_i-E_a(G(ai,sj)||_1]\\ L^{code_1}_{recon}=E[||s_j-E_s(G(ai,sj)||_1] $$
第一行是使用appearance encoder对生成图像进行编码出的新的appearance code需要和用于生成图像的appearance code一致。第二行是structure code。同时我们希望生成的图像和它的appearance code具有一样的类别。
$$ L^c_{id}=E[-log(p(y_i|x^i_j))] $$
生成和分解的部分都有了,就需要再考虑一下对抗损失。尽可能把原始图像判断为真图像,生成图像判断为假图像。
$$ L_{adv}=E[logD(x_i)+log(1-D(G(a_i,s_j))] $$Discriminative Module
判别模块组合在生成模块里面,一起共享appearance encoder,用于最后的行人重识别。作者为了充分利用生成图像,提出了两个损失。
Primary feature learning
这一部分比较神奇,作者使用在原始数据集上训练的REID模型作为老师,让自己的架构里要训练的模型向老师模型的结果进行学习,这属于模型蒸馏的一个技巧。
$$ L_{prim}=E[-\sum^K_{k=1}q(k|x^i_j)log(\frac{p(k|x^i_j)}{q(k|x^i_j)})] $$
使用KL散度作为两个模型的学到的概率分布的损失。Fine-grained feature mining
$$ L_{fine}=E[-log(P(y_j|x^i_j))] $$
这里把同一个structure code和不同的appearance code组合起来的生成图像都认为是和structure code一个类别。这一部分和前面的正好相反,个人感觉应是模拟同一人的不同衣服的变化。
最终对appearance encoder,structure encoder,decoder和discriminator进行联合训练。得到的损失函数是
$$ L_{total}(E_a,E_s,G,D)=\lambda_{img}L^{img}_{recon}+L^{code}_{recon}+L^s_{id}+\lambda_{id}L^c_{id}+L_{adv}+\lambda_{prim}L_{prim}+\lambda_{fine}L_{fine} $$
也就是把之前提到的所有损失都计算进来了。