在阅读论文过程中的一些简单笔记,记下一些重点和方法。
论文:ArcFace: Additive Angular Margin Loss for Deep Face Recognition
Introduction
目前人脸识别的研究主要分为两条主线:
训练一个多分类器
softmax-loss-based methods
;学习得到一个图嵌入向量,如
triplet-loss-based
,通过高内聚,低外聚的原则来区分;
不过这两种方法都存在一定的局限和缺点。
- softmax-loss-based: 当人脸类别数目增加的时候,线性变换矩阵的大小线性增加,同时学习到的特征仅仅适用于闭集分类问题,而不适合开集人脸识别问题。
- triplet-loss-based: 如果人脸数据较多的时候,为了组成足够的三元组来训练时,将会导致组合爆炸,而且semi-hard样本挖掘对于训练有效的模型将是一个困难的问题。
现有的模型:
Sphereface 引入了一个重要的idea: angular margin,但是在loss中添加了许多近似值,并且加了softmax loss(为了训练稳定),但softmax loss在训练过程中会产生梯度统治的情况;
cosFace则是直接添加了余弦距离惩罚到目标对数上,虽然比sphereface取得了更好的性能,并且实现简单,减轻了联合训练中softmax loss的压力。
本文提出的方法 Additive Angular margin loss(arcface)有效地提升了模型的判别能力,同时也稳定了模型的训练。
Approach
仔细梳理一下上面的伪代码,整理如下:
算法输入:特征缩放尺度 s,间隔参数 m,类别 n,真实值ID gt;
算法流程:
- 对经过第一个全连接层fc的输入(一维特征)进行 L2 归一化
- 对第一个全连接层fc的权重进行L2归一化
- 使用归一化后的数据完成第一个fc的计算得到 fc7,该fc没有偏置项,保证运算结果在[0~1]
- 计算 gt 所在位置的fc7的值,位于[0,1]之间, 利用该值作为余弦值,计算反余弦值得到真实类别所在位置的x和w之间的theta。
- 添加惩罚角度m到theta,返回余弦值 cos(theta + m)-cos(theta),替代原来fc gt位置的值,得到 fc7
- fc7 * s = fc7
- softmax + CE loss
到这里就可以去实现算法啦!等写完复现代码就来更新。
原理啥的暂时先不管~