DG-Net快速理解

Joint Discriminative and Generative Learning for Person Re-identification

帮微博妹妹整毕设,发现之前学习ReID的时候还是漏掉了很多东西,比如基于GAN的ReID模型,下午看了看论文,整理一下内容。


论文地址: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模型是联合在一起形成了一个统一的框架来进行的。

DG-Net快速理解_第1张图片

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的输入转成灰度图

在生成模块的生成过程中,要考虑到以下的情况。

  1. self-identity generation

    1. appearance和structure都来自于同一张图片的情况,希望通过decoder生成的新的图像和原图实现像素层次上的一致,pixel-wise loss
      L r e c o n i m g 1 = E [ ∣ ∣ x i − G ( a i , s i ) ∣ ∣ 1 ] L^{img_1}_{recon}=E[||x_i-G(a_i,s_i)||_1] Lreconimg1=E[xiG(ai,si)1]

    2. appearance来自和structure同一人的情况,希望通过decoder生成的信徒下和原图实现像素层次上的一致,即给定一人的structure,使用该人的appearance都需要还原到structure对应的原图。
      L r e c o n i m g 2 = E [ ∣ ∣ x i − G ( a t , s i ) ∣ ∣ 1 ] L^{img_2}_{recon}=E[||x_i-G(a_t,s_i)||_1] Lreconimg2=E[xiG(at,si)1]

    3. to force the appearance codes of different images to stay apart,use identification loss。这个部分个人理解就是确保原始图像分类正确。
      L i d s = E [ − l o g ( p ( y i ∣ x i ) ) ] L^s_{id}=E[-log(p(y_i|x_i))] Lids=E[log(p(yixi))]

  2. cross-identity generation

    这种情况即appearance和structure来自不同人的情况。在该部分计算损失时就不考虑像素层次上一致了。考虑的时能够在生成图像上编码出原有的两个空间code。
    L r e c o n c o d e 1 = E [ ∣ ∣ a i − E a ( G ( a i , s j ) ∣ ∣ 1 ] L r e c o n c o d e 1 = E [ ∣ ∣ s j − E s ( G ( a i , s j ) ∣ ∣ 1 ] 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] Lreconcode1=E[aiEa(G(ai,sj)1]Lreconcode1=E[sjEs(G(ai,sj)1]
    第一行是使用appearance encoder对生成图像进行编码出的新的appearance code需要和用于生成图像的appearance code一致。第二行是structure code。

    同时我们希望生成的图像和它的appearance code具有一样的类别。
    L i d c = E [ − l o g ( p ( y i ∣ x j i ) ) ] L^c_{id}=E[-log(p(y_i|x^i_j))] Lidc=E[log(p(yixji))]
    生成和分解的部分都有了,就需要再考虑一下对抗损失。尽可能把原始图像判断为真图像,生成图像判断为假图像。
    L a d v = E [ l o g D ( x i ) + l o g ( 1 − D ( G ( a i , s j ) ) ] L_{adv}=E[logD(x_i)+log(1-D(G(a_i,s_j))] Ladv=E[logD(xi)+log(1D(G(ai,sj))]

    Discriminative Module

    判别模块组合在生成模块里面,一起共享appearance encoder,用于最后的行人重识别。作者为了充分利用生成图像,提出了两个损失。

    1. Primary feature learning

      这一部分比较神奇,作者使用在原始数据集上训练的REID模型作为老师,让自己的架构里要训练的模型向老师模型的结果进行学习,这属于模型蒸馏的一个技巧。
      L p r i m = E [ − ∑ k = 1 K q ( k ∣ x j i ) l o g ( p ( k ∣ x j i ) q ( k ∣ x j i ) ) ] L_{prim}=E[-\sum^K_{k=1}q(k|x^i_j)log(\frac{p(k|x^i_j)}{q(k|x^i_j)})] Lprim=E[k=1Kq(kxji)log(q(kxji)p(kxji))]
      使用KL散度作为两个模型的学到的概率分布的损失。

    2. Fine-grained feature mining
      L f i n e = E [ − l o g ( P ( y j ∣ x j i ) ) ] L_{fine}=E[-log(P(y_j|x^i_j))] Lfine=E[log(P(yjxji))]
      这里把同一个structure code和不同的appearance code组合起来的生成图像都认为是和structure code一个类别。这一部分和前面的正好相反,个人感觉应是模拟同一人的不同衣服的变化。

最终对appearance encoder,structure encoder,decoder和discriminator进行联合训练。得到的损失函数是
L t o t a l ( E a , E s , G , D ) = λ i m g L r e c o n i m g + L r e c o n c o d e + L i d s + λ i d L i d c + L a d v + λ p r i m L p r i m + λ f i n e L f i n e 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} Ltotal(Ea,Es,G,D)=λimgLreconimg+Lreconcode+Lids+λidLidc+Ladv+λprimLprim+λfineLfine
也就是把之前提到的所有损失都计算进来了。

你可能感兴趣的:(深度学习,ReID,计算机视觉,行人重识别)