【人脸识别】千变万化的人脸识别 REID损失函数总结

如果有不对的地方,欢迎指正!!!只是个人理解。

一、引言

人脸识别,REID都是经过卷积神经网络提取图像的特征向量,再进行比对的过程。神经网络的选择,可以选择经典的或者当下流行的,这里主要总结下千变万化的人脸识别 REID损失函数。

这里先说人脸识别比较火有代表性的两种方法。

facenet: 该方法用了triplet loss损失函数,Triplet loss属于度量学习,相比起softmax,它可以方便地训练大规模数据集,不受显存的限制。缺点是过于关注局部,导致难以训练且收敛时间长。代码链接如下:
https://github.com/davidsandberg/facenet
在这里插入图片描述

arcface:arcface loss属于变形softmax。softmax训练的时候收敛得很快,但是精确度一般达到0.9左右就不会再上升了,一方面是作为分类网络,softmax不能像度量学习一样显式的优化类间和类内距离,所以性能不会特别好,另外,人脸识别的关键在于得到泛化能力强的feature,与分类能力并不是完全等价的。这种损失函数改进了softmax,对特征向量归一化和加性角度间隔,提高了类间可分性同时加强类内紧度和类间差异。代码链接如下:
https://github.com/deepinsight/insightface
在这里插入图片描述
这两种方法也恰巧代表了人脸识别损失函数的两种研究方向,表征学习和度量学习,它们是什么意思?又有什么关系?请继续往下看。

二、表征学习和度量学习

度量学习:计量特征间距离,通过距离损失优化网络——>欧式距离及其变种

表征学习:将问题作为分类问题和验证问题——> softmax及其变种损失函数

这里度量学习很好理解,用欧式距离就可以计算出两串特征向量的相似性。如何理解将特征向量用于softmax损失函数?

其实就是添加了一个全连接层。假设我们得到的特征向量是256维,训练的人脸库有10,000个人就是10,000种分类,将特征向量乘以256*10000的矩阵,再经过softmax激活,计算多分类交叉熵损失。

在这里插入图片描述
度量学习样本大情况下收敛快一些,因为只是随机取一个类内,一个类间计算损失;而表征学习内存占用最大的是512*100万人脸的全连接层(假设人脸特征向量512维,人脸库有100万个人),内存占用很大,计算量也非常大。
在这里插入图片描述

CVPR2020,旷视科技推出circle loss,也属于变种softmax,这里面有个很大的贡献是关联了这两大类损失函数。放一个b站视频,感兴趣可以看一下。部分截图也来自于这个视频。
https://www.bilibili.com/video/BV13z4y1R71f?from=search&seid=16884633457415289901

对于人脸识别问题来说,无非是要解决这个问题:最大化类内相似性Sp,最小化类间相似性Sn
在这里插入图片描述
所以 loss 最小化(Sn-Sp),希望任一类间相似性小于任一类内相似性

在这里插入图片描述

cosine相似性时,Wj 第j个非目标性的权重向量,Wy是目标,分类学习中目标的相似性分数只有一个,最后可变形为softmax/ crossEntropyLoss

在这里插入图片描述
趋近无穷大 可变形为tripletloss

在这里插入图片描述

三、度量学习损失函数总结

from:ReID综述(上)https://www.leiphone.com/news/201712/4Mvj2NBIxCN5bQZI.html

(1)对比损失(Contrastive loss)
对比损失用于训练孪生网络(Siamese network)。孪生网络的输入为一对(两张)图片,其实就是损失函数的计算,还是一个网络。标签相同y=1,不同为0,对比损失函数写作:

()+:max(z,0)
在这里插入图片描述

(2)三元组损失(Triplet loss)
三元组损失是一种被广泛应用的度量学习损失,之后的大量度量学习方法也是基于三元组损失演变而来。顾名思义,三元组损失需要三张输入图片。和对比损失不同,一个输入的三元组(Triplet)包括一对正样本对和一对负样本对。三张图片分别命名为固定图片(Anchor) a ,正样本图片(Positive)p和负样本图片(Negative) n 。图片 a 和图片 p 为一对正样本对,图片 a 和图片 n 为一对负样本对。则三元组损失表示为:
在这里插入图片描述

后来有改进版认为原版的Triplet loss只考虑正负样本对之间的相对距离,而并没有考虑正样本对之间的绝对距离,为此提出改进三元组损失(Improved triplet loss)
在这里插入图片描述

保证网络不仅能够在特征空间把正负样本推开,也能保证正样本对之间的距离很近。

(3)四元组损失(Quadruplet loss)
在这里插入图片描述

四元组损失是三元组损失的另一个改进版本。顾名思义,四元组(Quadruplet)需要四张输入图片,和三元组不同的是多了一张负样本图片。即四张图片为固定图片(Anchor) a ,正样本图片(Positive) p ,负样本图片1(Negative1) n1 和负样本图片2(Negative2) n2 。其中 n1 和 n2 是两张不同行人ID的图片,其结构如上图所示。则四元组损失表示为:
在这里插入图片描述

其中α和β是手动设置的正常数,通常设置β小于α,前一项称为强推动,后一项称为弱推动。相比于三元组损失只考虑正负样本间的相对距离,四元组添加的第二项不共享ID,所以考虑的是正负样本间的绝对距离。因此,四元组损失通常能让模型学习到更好的表征。

(4)难样本采样三元组损失(Triplet loss with batch hard mining, TriHard loss)
TriHard损失的核心思想是:对于每一个训练batch,随机挑选 P 个ID的行人,每个行人随机挑选 K 张不同的图片,即一个batch含有 P×K 张图片。之后对于batch中的每一张图片 a ,我们可以挑选一个最难的正样本和一个最难的负样本和 a 组成一个三元组。
首先我们定义 a 和为相同ID的图片集为 A,剩下不同ID的图片图片集为 B,则TriHard损失表示为:
在这里插入图片描述

(5)边界挖掘损失(Margin sample mining loss, MSML)
与难采样三元组损失类似,也是一种引入难样本采样思想的度量学习方法,将其应用到四元组损失。
在这里插入图片描述

在这里插入图片描述

(6)各种度量损失loss性能对比
在这里插入图片描述

四、表征学习损失函数总结

arcface(insightface)作者提出的,softmax变形,不同的决策边界
在这里插入图片描述
这里额外说下circle loss。

circleloss
更加灵活的优化;收敛目标更加明确,更容易到达T点
在这里插入图片描述
可视化梯度
在这里插入图片描述

优化概率,最大化类内相似性,最小化类间相似性
在这里插入图片描述

推理,圆形决策边界
在这里插入图片描述

可视化,圆形收敛分界面,梯度不会骤变,也更加灵活
在这里插入图片描述

梯度推理解释
在这里插入图片描述

遗留问题

决策边界???
多标签分类softmax???
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/shangpapa3/article/details/109079071
今日推荐