# 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

## Motivation and Related Work

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

![](/files/-MkuKtnqcgHioYnCrv1N) 这两篇文章是同一班人马写的，所以其实整体结构上都很像，我们结合起来分析：

* 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=1}^n W*{kj}\*y^k$$

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

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

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

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

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

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

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

![](/files/-MkuKtnrCpVTLPHpWSMq) 实现上还有一个小的细节，把所有图片构成一个graph的话，开销太大了，所以训练时graph其实只是所有图片的一个子图，

* 首先每个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的模式来更新相似度向量：：

$$d\_i^{t+1}=(1-α)d\_i^{t+1}+αWd\_i^t$$

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

$$t\_i=F(d\_i)$$

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

![](/files/-MkuKtnsB9q-IWKAIxfi) 如图，通过两层FC+BN+ReLU，将相似度特征d映射为一个能够根据相似度矩阵W修正特征向量的消息向量t，由于权重是可训练的，所以下面这个式子就成立了：

$$d\_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方法：

$$d\_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

![](/files/-MkuKtntqDycZe8q-EhU) baseline rank1就91%了我还能说什么，流下了不会调参的泪水，不过看baseline+triplet居然还掉了，说明他们的hack泛化能力其实不强，另外针对两个主要的创新点，group shuffle也没有比dropout效果要好多少，random walk也没有比reranking好多少。不过有一个现象，mAP比top1提高的多，说明这种基于g2g关系的方法，通常是用得分较高的gallery图像把gallery中得分比较低的对象拉上来了。

SGGNN

![](/files/-MkuKtnuVB79b4nSUNgk) 结果也跟random walk类似。

### 总结

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blog.cweihang.io/ml/papers/reid/cuhk_sentimes.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
