一般来说,人脸识别分三步走:
- 找人脸:图片中找出含人脸的区域框出来
- 对齐人脸:将人脸的眼镜鼻子嘴巴等标出来,以此作为依据对齐人脸
- 识别:将对齐的人脸进行识别,判定这张脸究竟是谁
本篇要介绍的损失函数,用于第三步骤,聚焦于更准确地识别这张脸究竟属于谁,本质上属于一个分类问题。
一言以蔽之ArcFace、SphereFace、CosFace三个损失函数相对于前辈们而言,改进的一个核心思路就是:
只有平常(train)更刻苦的训练,才有可能在比赛中(test)中得到更好的结果。
它们都对卷积神经网络提出了更高的目标,在训练阶段更为艰难,也因此让其成为了一个更好的分类器。
一、从前辈说起
首先谈谈他们的前辈:
维基百科介绍:
Softmax函数,或称 归一化指数函数[1],是逻辑函数的一种推广。它能将一个含任意实数的K维向量“压缩”到另一个K维实向量中,使得每一个元素的范围都在
之间,并且所有元素的和为1。该函数的形式通常按下面的式子给出:
简单来说 softmax 将一组向量进行压缩,使得到的向量各元素之和为 1,而压缩后的值便可以作为置信率,所以常用于分类问题。另外,在实际运算的时候,为了避免上溢和下溢,在将向量丢进softmax之前往往先对每个元素减去其中最大值,即:
想了解更多,可以参考:忆臻:softmax函数计算时候为什么要减去一个最大值?
再谈谈一个容易搞混的东西:
上面我们丢入一个长度为
其中
到这里我们不妨在看看交叉熵
其中
我咋觉得这么眼熟呢...
所以,我们可以得到:
参考链接: https:// blog.csdn.net/u01438016 5/article/details/77284921
二、SphereFace
论文地址: https:// arxiv.org/pdf/1704.0806 3.pdf
要想增强
- 让同类之间距离更近
- 让不同类之间距离更远
不妨继续看看
其中
下标
对于
这样不仅放大了类之间的距离,也因放大了同类
不过上述公式仍有问题:原来的
那就变个函数呗,把n个cos怼起来变成一个递减的连续的函数:
这样一来:
如此我们就得到了SphereFace的损失函数
原论文则是:
其中
论文中的可视化图片:
Pytorch代码实现:
# SphereFace
三、CosFace
论文地址: https:// arxiv.org/pdf/1801.0941 4.pdf
和SphereFace类似,CosFace也是从
接下来与上文
以上我们就得到了CosFace中提出的
代码实现:
# CosFace
四、ArcFace
论文地址: https:// arxiv.org/pdf/1801.0769 8.pdf
话不多说,直接上公式:
可以看到和CosFace非常类似,只是将
伪代码实现步骤:
- 对
进行归一化
- 对
进行归一化
- 计算
得到预测向量
- 从
中挑出与ground truth对应的值
- 计算其反余弦得到角度
- 角度加上m
- 得到挑出从
中挑出与ground truth对应的值所在位置的独热码
- 将
通过独热码放回原来的位置
- 对所有值乘上固定值
代码实现:
# ArcFace
到此ArcFace、SphereFace、CosFace的损失函数就介绍完啦~
参考链接:https://blog.csdn.net/fuwenyan/article/details/79657738
欢迎关注个人微信公众号: