CVPR2018:Graph+reid

Graph + Reid

今天解读港中文商汤联合实验室沈岩涛老师在CVPR2018和ECCV2018上发表的两篇关于Graph+Person reid的文章:

CVPR2018:Deep Group-shuffling Random Walk for Person Re-identification ECCV2018:Person Re-identification with Deep Similarity-Guided Graph Neural Network

person reid这个任务是为probe图像在gallery图片集中寻找属于同一个人的图片,所以通常的做法都是考虑probe和gallery之间的关系,但有时候probe和gallery的差别太大,比如一个正面的人和一个背面的人,假如我有一个侧面的人的图片,跟两者都很像,就有可能用这个中间图片将两者关联起来。在这之前其实也有人提出过一些方法,比如CVPR2017:Re-ranking person re-identification with k-reciprocal encoding. 先计算出gallery图片之间的相似度,将较相似的图片的rank拉近。

但这些方法大多是将这种关系抽取和利用作为一个后处理的过程,对图像模型的训练起不到帮助。并且对gallery之间的相似度提取大多是基于已经训练好的图像模型,加上无监督的聚类方法,提取gallery图片之间的相似度关系,这种无监督方法较弱,不能充分利用数据集中的监督信息。

因此这两篇文章开始将gallery之间的关系(下面简称G2G)融入到图像模型的训练里。Graph由许多节点和边构成,在Reid问题里,节点就是一个个的人的图像,边就是图像之间的相似度。利用一个batch中的所有图像在关系图上的关联,提供更多的监督信号,将模型训练的更好。之所以说更多的监督信号,是因为以往我们一个batch的label只有batch_size对样本之间的相似关系,但将batch中的所有图片看成batch size个图之后,每个图之间有batch gallery size x batch gallery size个相似度关系可以学习,就引入了更多的监督信号。

Overview

  • DGRW是用Random Walk的方式将G2G的相似度信息用来更新P2G的相似度关系,在反向传播时通过G2G这个很多相似度关联的图对原来的图像模型提供更多的训练。

  • SGGNN是用G2G的相似度关系对P2G的相似度特征进行修正,从而得到更好的相似度特征,并且也通过G2G之间的大量关联提供了更多的监督信号。

Deep Group-shuffling Random Walk

与其他Reid方法一样,首先训练一个图像模型提取图像特征,对特征计算相似度可以得到probe中所有图片与gallery中所有图片之间的相似度,与其他Reid方法不同,但与reranking相同的是,我们也可以计算出所有gallery图片之间的相似度。给定一张probe图片,它和所有gallery之间的相似度向量为y,所有gallery之间的相似度矩阵为W,我们将一张probe图片和所有gallery图片合起来看成一个图,根据random walk的思想,probe图片这个节点walk到第j张gallery图片的概率是yj,接着,从probe节点出发,经过其他节点k,再到达gallery图片j的概率是yk * Wkj,那么,从probe节点出发,走两步(包含了所有中间节点的可能)到达图片j的概率就是:

k=1nWkjyk∑_{k=1}^n W_{kj}*y^k

到达所有图片j的概率拼成一个新的向量,我们就可以得到:

y(t+1)=Wy(t)y^{(t+1)} = Wy^{(t)}

论文里讲t拓展到了无穷大,并加入了权重因子λ对walk前后的概率进行了平衡,最终化简为了这样的形式:

y()=(1λ)(IλW)1y(0)y^(\infty)=(1-\lambda )(I-\lambda W)^{-1}y^{(0)}

但根本的道理就是上面所述的Random walk思想。

这样我们就得到了一组更好的P2G相似度,并且我们反向传播的时候,这组相似度的梯度会传到W矩阵上,W矩阵是由前边图像模型得出的,也就会传到前面的模型上,从而对模型提供更多的监督信号。

论文里还有一个创新点是,将视觉特征分成了K个group,每个group的特征都可以单独拿出来用,这样我们就可以做K个上边提到的random walk,于是监督信号更多了,同时因为视觉特征被拆成了K份,每一份都只是原特征的一小部分,相当于dropout了一部分信息,也能很大程度上防止过拟合。但其实这个方法并不见得比dropout优雅,实验效果也差不多。

  • 首先每个batch有64个人,每个人有4张图,这样batch size就是256(流下了贫穷的泪水),

  • 训练时,首先有256个softmax loss,

  • 然后对于64个人,每个人的4张图中取1张做probe,3张做gallery,galley是所有人一起用的(这样就有正样本也有负样本)

  • 这样W矩阵就是64_3x64_3,对角线为0,于是就有192*192个g2g相似度,同时有64个p2g的相似度。这些相似度可以用真实标签约束,也可以直接用feature求出来,论文里是用feature求的;

  • 为每个人得到更新后的p2g向量,对这64个长度为192的p2g向量加二分类loss就完成训练模型的搭建了

  • 测试时先算所有p2g相似度,然后对每个probe,选择top75个gallery组成G2G图,用这个G2G更新P2G相似度,从而获得更准的ranking结果

Deep Similarity-Guided Graph Neural Network

这篇文章跟上一篇很多地方是一样的,我们来讲讲不同的地方。

Graph and node

这篇文章声称每个节点是一个P2G的图像对,但在讨论中,图里的P都是相同的,所以我觉得可以认为这其实也是一个G2G的图,只不过每个节点的value变成了SiameseCNN算出来的P2G的相似度向量di,我们用通常的Siamese二分类loss和softmax多分类loss约束di,同时我们希望能用G2G的相似度矩阵W来进一步修正di,

feature update

考虑一下用类似random walk的模式来更新相似度向量::

dit+1=(1α)dit+1+αWditd_i^{t+1}=(1-α)d_i^{t+1}+αWd_i^t

但dit毕竟不是相似度的结果向量,而是相似度特征向量,所以上面这个式子其实是不成立的,于是进入拼凑模式,文中定义了一个消息向量:

ti=F(di)t_i=F(d_i)

这个F就是d到t的映射,

dit+1=(1α)dit+1+αWtitd_i^{t+1}=(1-α)d_i^{t+1}+αWt_i^t

文中说W*t得到的结果是fusion feature,其实我觉得这种G2G相似度和特征的fusion没有Random Walk来得优雅,然后用fusion feature和原来的feature做加权和,其实这种加权和的方式来修正原来的feature也值得商榷。不过这种update形式也是借鉴自其他的Graph Neural Network方法:

dit+1=(1α)dit+1+αj=1Nh(di,dj)titd_i^{t+1}=(1-α)d_i^{t+1}+α\sum_{j=1}^N h(d_i,d_j)t_i^t

这里边的h往往是无监督的,而SGGNN的W是可以有监督训练得到的,就比其他GNN的方法要好一点。

实现细节上,与DGRW类似

  • 选择48个人,每个人有4个图,共192张图

  • 每个人的4张图里,一张做probe,其他做gallery,gallery是所有人共用的,于是有Mx(K-1)=144个gallery图片(论文里的顺序应该是写反了)

  • 用siamese CNN算出48_144个P2G相似度,144_144个G2G相似度

  • 为每个probe取top100个gallery图片构成G2G图,于是W矩阵大小为100x100

  • 用W矩阵更新p2g相似度特征,对相似度特征加dense层再做二分类loss约束即可

  • 测试与DGRW基本相同,区别只在于更新的是相似度feature而非相似度结果。

Experiment

跟别的方法对比就不用看了,我们来看Ablation Study

DGRW

SGGNN

总结

将graph之间的关联融合到神经网络训练中提供了更丰富的监督信号,基于Graph的方法虽然结果上提升不明显(可能是baseline太强了吧),但创新性是有的。

最后更新于