论文:https://arxiv.org/abs/1703.07737
GitHub:https://github.com/VisualComputingInstitute/triplet-reid
论文创新
- 针对现有triplet loss缺点,提出了几种新型的triplet loss,进行了横向的实验对比
- 对于reid模型是否需要使用pre-trained模型这一问题,进行了实验对比
相关概述
- Deep metric learning – 深度度量学习,也就是相似度学习D
- Classification Loss – 当目标很大时,会严重增加网络参数,而训练结束后很多参数都会被摒弃。
- Verification Loss – 只能成对的判断两张图片的相似度,因此很难应用到目标聚类和检索上去。因为一对一对比太慢。
- Triplet loss – 端到端,简单直接; 自带聚类属性; 特征高度嵌入,但是不好训练。
Triplet loss最早来源于Google的FaceNet,Triplet loss的想法很简单:类内距离趋小,类间距离趋大。是当前应用很广泛的一种损失函数。在FaceNet中,通过构建embedding方式,将人脸图像直接映射到欧式空间,而优化这种embedding的方法可以概括为,构建许多组三元组(Anchor,Positive,Negative),其中Anchor与Positive同label,Anchor与Negative不同label(在人脸识别里面,即就是Anchor,Positive是同一个个体,而与Negative是不同个体),通过学习优化这embedding,使得欧式空间内的Anchor与Positive 的距离比与Negative的距离要近。
Triplet loss通常能比classification得到更好的feature。还有一个优点就是Triplet loss可以卡阈值,Triplet loss训练的时候需要设置一个margin,这个margin可以控制正负样本的距离,当feature 进行normalization后,可以更加方便的卡个阈值来判断是不是同一个ID。当然Triplet loss也有缺点,就是收敛慢,而且比classification更容overfitting。Triplet loss的主要应用就是face identification、person re-identification、vehicle re-identification等。
传统的Triplet loss训练需要一个三元组,achor(a)、positive(p)、negative(n)。
Triplet loss的缺点在于随机从训练集中挑选三张图片,那么可能挑选出来的可能是很简单的样本组合,即很像的正样本和很不像的负样本。作者认为,让网络一直学习简单的样本,会限制网络的泛化能力。因此,作者提出了一种在线batch hard sample mining的改进版Triplet loss,大量实验表明,这种改进版的方法效果非常好。
Batch Hard Triplet Loss
具体做法:随机抽样P类(P个人),每个人随机地选K张图片,从而产生一个PK batch的图片即batch size=P×K。现在,对于batch中的每个样本,可以在生成triplets来计算loss时选择batch中最难的positive和negative。
Soft Margin
之前的很多Triplet Loss都采用了截断处理,即如果Triplet三元组关系正确则Loss直接为0。 作者发现,对于Re-ID来说,有必要不断地拉近同类目标的距离。
为此,可以使用softplus函数用平滑逼近代替hinge函数。其中,数值稳定的实现通常以log1p的形式提供。softplus函数的行为与hinge相似,但它是指数衰减的,而不是硬截止,因此作者将其称为soft margin公式。
实验结果
在作者的行人重识别实验中,Batch Hard + soft-magin的效果最好, 同时作者为了排除是triplet loss后面的三元组都是loss为0的情况,排除了该情况下batch hard triplet loss的效果依然是最好。该方法work的原因在于在每一个batch中都选择最难的三元组,这样整个训练过程中,模型学习的是困难度较中的样本。
TriNet表示来自pre-trained model(ResNet50),LuNet是作者自己设计的一个普通网络,从头开始训练。利用pre-trained model确实可以获得更好一点的效果,但是从头开始训练的网络也不会太差。特别的,pre-trained model往往体积较大模式固定,不如自己设计网络来的灵活。同时,pre-trained model往往有其自己的固定输入,我们如果修改其输入很可能会得到相反的效果。