加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动!
同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。点击文末“阅读原文”立刻申请入群~
作者 | Slumbers
来源 | https://zhuanlan.zhihu.com/p/51324547
softmax是最常见的人脸识别函数,其原理是去掉最后的分类层,作为解特征网络导出特征向量用于人脸识别。softmax训练的时候收敛得很快,但是精确度一般达到0.9左右就不会再上升了,一方面是作为分类网络,softmax不能像metric learning一样显式的优化类间和类内距离,所以性能不会特别好,另外,人脸识别的关键在于得到泛化能力强的feature,与分类能力并不是完全等价的。
公式中N是batch size的大小,n是类别数目。如果训练进行了停滞,可以采用挑选hard sample(即那个些预测错误但是预测值较高的样本)的办法进行帮助训练
Triplet loss属于Metric Learning, 相比起softmax, 它可以方便地训练大规模数据集,不受显存的限制。缺点是过于关注局部,导致难以训练且收敛时间长
这里提一下Metric Learning的概念,它是根据不同的任务来自主学习出针对某个特定任务的度量距离函数。通过计算两张图片之间的相似度,使得输入图片被归入到相似度大的图片类别中去。通常的目标是使同类样本之间的距离尽可能缩小,不同类样本之间的距离尽可能放大。
首先我们看一张图:
可以看到,在separable features中,类内距离有的时候甚至是比内间距离要大的,这也是上问题到softmax效果不好的原因之一,它具备分类能力但是不具备metric learning的特性,没法压缩同一类别。在这个基础上,center loss被提出来,用于压缩同一类别。center loss的核心是,为每一个类别提供一个类别中心,最小化每个样本与该中心的距离:
左边是softmax, 右边则是约束各个样本到样本中心的距离。
cos函数在(0,π)内是单调递减的,乘上正整数m后内积会减小,这样可以加大类间的差别,如图所示:
由于L-softmax有一个更加难的实现目标,所以说它更能避免过拟合。同时L-softmax不仅在分类问题上有优势,同样在识别问题上也有优势,因为它使得类内的距离更加的紧凑。 通过控制m的大小,调整类间距离。m越大,类间距离就越大,类内更加紧凑。
SphereFace是在softmax的基础上将权重归一化,即使得 。它与前面提到的L-sofrmax最大的区别在于SphereFace将W权重归一化了。L-Softmax会同时从角度和权重长度上区分不同类别,而SphereFace只从角度上去区分不同类别,在数据集大小固定的条件下,L-softmax的精确度可能不如sphereFace。
在最近读的一篇论文https://arxiv.org/abs/1807.11649中,商汤认为A-Softmax使用在clean dataset的效果比之前描述的各种loss要好,但是在噪声极大的数据分布中,表现甚至不如Center Loss和Softmax。
CosFace的思想和SphereFace( A-softmax)的思想接近,其中主要做了以下三点的改进:
loss的形式做了稍微的改变,将超参数m由乘法运算变成了减法运算
不仅对权重进行了正则化,还对特征进行了正则化
再乘上一个scale参数,超球面过小时,分类映射到超球面上不好分类,这个scale参数可以扩大超球面体积,帮助分类
如下图所示,A-softmax存在一个问题,它的决策边界会随着 的变化而变化,当 为0的时候,margin=0, 而CosFace(即LMCL)克服了这个缺点,两个类别之间有一个明确的决策边界(margin>0), 相对来说有更好的鲁棒性
这里插播一下决策边界( Decision Boundaries)的概念,它表示的是在需要分类的数据中,如何区分不同类别的边界。
那么这么决策边界怎么计算呢,以二分类为例做一个简单说明。对于二分类而言,分类边界就是样本属于两个类别的概率相等。以softmax来距离,假设某个样属于类别1的概率是 中log函数的输入,那么属于类别2的概率只是将log函数输入的分子换成类别2而已,分母是不变的,又因为以e为底的指数函数又是递增函数,所以直接让两个类别的指数相等就能得到softmax的分类边界函数:
Arcface的思想和CosFace类似,主要区别是将m放入了cos中,角度距离比余弦距离对角度的影响更加直接:
论文中提供了大量对照实验:
想要研究softmax和triplet loss,可以参照google facenet的开源实现:
https://github.com/davidsandberg/facenet
想要研究各种ArcFace、CosineFace等,可以参照deepinsight洞见实验室的开源代码:
https://github.com/deepinsight/insightface
从在数据集表现上来说,ArcFace优于其他几种loss, 著名的megaface赛事,在很长一段时间都停留在91%左右,在洞见实验室使用ArcFace提交后,准确率哗哗就提到了98%,之后再刷的团队也大同小异,多使用ArcFace, CosineFace等损失函数。
这两个开源算法我也都跑过,粗略地比较了一下,可以见insightface和facenet效果+性能比较:
https://zhuanlan.zhihu.com/p/52560499
https://zhuanlan.zhihu.com/p/34717205
https://blog.csdn.net/u014380165/article/details/80645489
https://zhuanlan.zhihu.com/p/38235452
https://arxiv.org/abs/1801.07698
*延伸阅读
小Tips:如何查看和检索历史文章?
有不少小伙伴提问如何号内搜文章,其实很简单,在“极市平台”公众号后台菜单点击极市干货-历史文章,或直接搜索“极市平台”公众号查看全部消息,即可在如下搜索框查找往期文章哦~
ps.可以输入CVPR2019/目标检测/语义分割等等,快去探索宝藏吧~~
觉得有用麻烦给个好看啦~