fast-reid中提供了不同的baselines,使用不同的backbone和不同的策略。以数据库Market1501为例:
提供了四种baselines,其中mgn在2018年提出,bagtricks(BoT)在2019年提出,AGW在2020年1月提出,sbs在2020年6月fast-reid中提出的。在此着重介绍SBS。作者在Githup中给出的关于SBS的内容如下:
SBS在BoT基础上又结合了其他的许多tricks。其中Bag of Freebies(BoF)是指只改变策略或增加训练成本来提高目标检测器的精度还不会增加推理成本的一些方法;Bag of Specials(BoS)是指稍微增加推理成本但极大提高目标检测精度的一些插件模块和后处理方法。
1.Circle loss
特征学习有两种基本范式,使用类标签和使用正负样本对标签进行学习。使用类标签时,一般需要用分类损失函数(比如 softmax + cross entropy)优化样本和权重向量之间的相似度;使用样本对标签时,通常用度量损失函数(比如 triplet 损失)来优化样本之间的相似度。
但两者本质都是最大化类内相似度,最小化类间相似度。它们有着相似的优化模式:将sp和sn组成相似度对来优化。这导致sp和sn的惩罚力度严格相等且收敛状态不明确。Circle loss把 (s_n - s_p) 泛化为 (α_ns_n − α_ps_p),从而允许 s_n 和 s_p 能以各自不同的步调学习。公式如下:
2.Freeze backbone training
为重新训练一个分类网络以满足任务要求,使用从任务中收集的数据对ImageNet预训练的模型进行微调。通常我们添加一个收集网络的分类器并随机初始化分类器参数。为了更好地初始化分类器的参数,我们在训练开始时只训练分类器参数,并且冻结网络参数,不进行更新(2k次迭代)。经过2k次迭代后,将释放网络参数进行端到端训练。
3.Cutout data augmentation & Auto Augmentation
都属于数据增强方法。Cutout data augmentation:随机选取图像的一矩形区域,使用零值擦除该矩形区域内的像素。 Auto Augmentation:基于自动技术来实现有效的数据增强,以提高特征表示的鲁棒性。该算法采用自动搜索算法来寻找平移、旋转和剪切等图像处理函数的融合策略。
4.Cosine annealing learning rate decay
在fastreid目录下的solver中的lr_scheduler.py中,实现了多间隔调整学习率 MultiStepLR(学习率调整的间隔并不是相等的)和余弦退火函数调整学习率 CosineAnnealingLR。而CosineAnnealingLR是指学习率呈余弦函数衰减。
5.Soft margin triplet loss
trilpet loss最先是在2015年的 FaceNet: A Unified Embedding for Face Recognition and Clustering 论文中提出的,可以学到较好的人脸的embedding。公式是:
其核心思想是类内距离趋小,类间距离趋大。在FaceNet中,通过构建embedding方式,将人脸图像直接映射到欧式空间。而triplet loss就是构建许多组三元组(Anchor,Positive,Negative),通过学习优化embedding,使得欧式空间内的Anchor与Positive 的距离比与Negative的距离要近。
在fast-reid中实现的triplet loss是基于在2017年的In Defense of Triplet Loss for person Re-Identification论文中所改进的triplet loss。改进点在fast-reid的代码中主要是两点。
改进点1:针对triplet loss 的缺点,即随机从训练集中挑选三张图片,挑选出来的可能是很简单的样本组合(很像的正样本和很不像的负样本)。而让网络一直学习简单的样本,会限制网络的泛化能力。在其基础上,提出batch hard sample mining,其核心思想是:每个训练的batch中随机选取P个行人id,每个id取K张照片。对于batch中的每一张图片a,挑选一个最难的正样本和一个最难的负样本和a组成一个三元组。定义和a为相同ID的图片集为A,剩下不同ID的图片图片集为B,则公式为:
改进点2:Triplet Loss采用了截断处理,即如果Triplet三元组关系正确则Loss直接为0。 论文作者发现对于Re-ID来说,有必要不断地拉近同类目标的距离。故使用softplus函数用平滑逼近代替hinge函数。softplus函数的行为与hinge相似,但它是指数衰减的,而不是硬截止,作者将其称为soft margin公式。公式如下:
1.Non-loacl block
感受野:每一层输出的特征图上的像素点在原始图像上映射的区域大小。Non-local是指感受野可以很大,而不是一个局部领域。non-local block利用两个点的相似性对每个位置的特征做加权。公式:
上面的公式中,输入是x,输出是y,i和j分别代表输入的某个空间位置,x_i是一个向量,维数跟x的channel数一样,f是一个计算任意两点相似关系的函数,g是一个映射函数,将一个点映射成一个向量,可以看成是计算一个点的特征。即为了计算输出层的一个点,需要将输入的每个点都考虑一遍,而且考虑的方式很像attention:输出的某个点在原图上的attention,而mask则是相似性给出。下图可更直观的理解:
2.GemPooling
结合不同的tricks,可以得到以下的结果:
因为SBS是基于Bag-of-Tricks的,在此在简单提一下Bag-of-Tricks。它与2019年提出,论文中提出6个tricks,分别是warmup learning rate、Random Erasing、Label Smoothing(与交叉熵有关,防止过拟合)、Last Stride(backbone中最后一个降采样操作)、BNNeck和center loss。论文中的总loss是cross entropy loss+triplet loss+a*center loss(a取了0.0005)。该论文核心是BNNeck。
cross entropy loss主要优化余弦距离,triplet loss主要优化欧氏距离,在同时优化特征向量时,他们的目标不一致,可能出现一个loss下降,另一个loss震荡甚至增加。BNNeck就是为解决该问题而被提出的。解决方法就是在特征层或者分类层增加一个BN层。更加直观的可以看图(ID loss即为cross entropy loss):
这样做的优点是使得两个loss都更易收敛,且正则化使同一个人的特征更加紧密。
结论:对于数据集Market-1501,训练模型时加载sbs_R101.yml文件可以得到目前最好的效果。
参考文献:
1.不可能打工.【行人重识别】《In Defense of the Triplet Loss for Person Re-Identification》论文阅读.https://www.jianshu.com/p/96579f524039.2020.10.19
2.Gapeng.Non-local neural networks.https://zhuanlan.zhihu.com/p/33345791.
2020.10.19
3.fast-reid的论文以及代码
4.臧辉.详解ReID的各部分组成及Trick——FastReID中的baseline配置.https://blog.csdn.net/qq_34919792/article/details/108509081.2020.10.19