详解ReID的各部分组成及Trick——Head
Head指的是ReID任务中将前面模块获得的特征向量做一定变化,来获得可以用于构建损失函数最后完成学习。
1、Linear
Linear是ReID中最常见的Head之一,其构成非常简单,仅仅由一层或者多层全连接层构成。全连接层的目标是把特征向量变化为可以构建ID loss(常见的有交叉熵)的one hot编码。
2、Bnneck
Bnneck是在BoT(见前文)这个工作提出的,这是这篇文章的核心点。我们常用的Baseline通常会同时使用ID损失和triplet损失一起优化同一个feature。但是在大量前置的研究发现,分类损失其实是在特征空间学习几个超平面,把不同类别的特征分配到不同的子空间里面。并且从人脸的SphereFace到ReID的SphereReID等工作都显示,把特征归一化到超球面,然后再优化分类损失会更好。triplet loss适合在自由的欧式空间里约束。我们经常观察到,如果把feature归一化到超球面上然后再用triplet loss优化网络的话,通常性能会比不约束的时候要差。我们推断是因为,如果把特征约束到超球面上,特征分布的自由区域会大大减小,triplet loss把正负样本对推开的难度增加。而对于分类超平面,如果把特征约束到超球面上,分类超平面还是比较清晰的。对于标准的Baseline,一个可能发生的现象是,ID loss和triplet loss不会同步收敛。通常会发现一个loss一直收敛下降,另外一个loss在某个阶段会出现先增大再下降的现象。也就是说这两个task在更新的过程中梯度方向可能不一致。但是由于最终都能够收敛,所以可能容易引起大家的忽视。
基于以上现象考虑,我们希望找个一种方式,使得triplet loss能够在自由的欧式空间里约束feature,而ID loss可以在一个超球面附近约束feature,于是乎就出现了以下的BNNeck。BNNeck的原理也很简单,网络global pooling得到的feature是在欧式空间里的,我们直接连接triplet loss,我们把这个feature记作 。然后这个feature经过一个BN层得到 ,经过BN层的归一化之后, batch里面 的各个维度都被拉到差不多,最后近似地在超球面附近分布。
作者也说明了这个的提出是观察获得的产物,并没有严格的理论推导。
3、Reduction
Reduction因为笔者查阅能力有限,并没有找到它的出处,也可能是FastReID中所构建的一个Head,它的操作是在Bnneck的前面先通过一个1x1的卷积,对特征向量做一个降维,这个的好处可能是能减少FC的参数,同时新构建的特征向量都是考虑到特征向量的中的所有值所获得的,或许对性能有所提高。
它在代码中的体现和Bnneck只有一行代码的区别。
Harcourt.: https://github.com/haochange/DUpsampling
ohana277: X和Z的距离不应该是4吗?
qq_51238013: 大佬请问这个代码还会再次开源吗,我找不到了,谢谢
qq_42731768: 国内国外有什么区别吗
最厉害的小白啊: 我有个疑问哈,为什么现在的文章都是国内人写的?我想找几篇国外的都没找到