知行编程网知行编程网  2022-05-14 15:00 知行编程网 隐藏边栏 |   抢沙发  25 
文章评分 0 次,平均分 0.0

人脸识别损失函数简介与Pytorch实现

人脸识别损失函数简介与Pytorch实现


来自 | 知乎
作者丨Uno Whoiam
来源丨https://zhuanlan.zhihu.com/p/60747096
编辑 | 深度学习这件小事
作学术交流,如有侵权,请联系删文


一般来说,人脸识别分三步走:


  1. 找人脸:图片中找出含人脸的区域框出来
  2. 对齐人脸:将人脸的眼镜鼻子嘴巴等标出来,以此作为依据对齐人脸
  3. 识别:将对齐的人脸进行识别,判定这张脸究竟是谁


本篇要介绍的损失函数,用于第三步骤,聚焦于更准确地识别这张脸究竟属于谁,本质上属于一个分类问题。


一言以蔽之ArcFace、SphereFace、CosFace三个损失函数相对于前辈们而言,改进的一个核心思路就是:


只有平常(train)更刻苦的训练,才有可能在比赛中(test)中得到更好的结果。 


它们都对卷积神经网络提出了更高的目标,在训练阶段更为艰难,也因此让其成为了一个更好的分类器。


一、从前辈说起


先谈谈他们的前辈:  


维基百科介绍:


Softmax函数,或称归一化指数函数[1],是逻辑函数的一种推广。它能将一个含任意实数的K维向量     “压缩”到另一个K维实向量    中,使得每一个元素的范围都在   
之间,并且所有元素的和为1。该函数的形式通常按下面的式子给出:
  


简单来说 softmax 将一组向量进行压缩,使得到的向量各元素之和为 1,而压缩后的值便可以作为置信率,所以常用于分类问题。另外,在实际运算的时候,为了避免上溢和下溢,在将向量丢进softmax之前往往先对每个元素减去其中最大值,即:


 

想了解更多,可以参考:忆臻:softmax函数计算时候为什么要减去一个最大值?https://zhuanlan.zhihu.com/p/29376573


再谈谈一个容易搞混的东西: 


上面我们丢入一个长度为    的    向量,得到    ,而softmax loss呢,则是:



其中    是一个长度为    的one-hot向量,即    ,只有ground truth对应的    。所以也可以简写为:


 


到这里我们不妨在看看交叉熵    :



其中    是真实分布,在分类任务中,    实际上等价于上面的    。而    则是预测分布,在分类任务中    实际上等价于上面的    。这样一来进行化简就得到:



我咋觉得这么眼熟呢...



所以,我们可以得到:


 


参考链接:https://blog.csdn.net/u014380165/article/details/77284921


二、SphereFace


论文地址:https://arxiv.org/pdf/1704.08063.pdf

要想增强    的分类能力,其实就是要在分布上做到两点:


  1. 让同类之间距离更近

  2. 让不同类之间距离更远


不妨继续看看  :



其中    代表两个向量    之间的夹角,如果对    归一化,将偏置    置为0,即    ,则有:



下标    表示    。


对于    我们乘上一个大于等于1的整数    :



这样不仅放大了类之间的距离,也因放大了同类    与    之间的间隔而使类内更聚拢。


不过上述公式仍有问题:原来的    ,如今    超出了向量之间的夹角函数    定义域范围    咋办?


那就变个函数呗,把n个cos怼起来变成一个递减的连续的函数:



这样一来:



如此我们就得到了SphereFace的损失函数  


原论文则是:



其中    表示第   个样本,    表示第    个样本的    标签,   表示第   和样本    之间的夹角。


论文中的可视化图片:

人脸识别损失函数简介与Pytorch实现

人脸识别损失函数简介与Pytorch实现

人脸识别损失函数简介与Pytorch实现

人脸识别损失函数简介与Pytorch实现


pytorch代码实现:



三、CosFace


论文地址:https://arxiv.org/pdf/1801.09414.pdf

和SphereFace类似,CosFace也是从  的余弦表达形式入手,令  。与此同时,作者发现  对于分类并没有啥帮助,所以干脆将其固定  ,所以有:




 应该代表归一化的  


接下来与上文  类似的是也引入了常数  ,不同的是这里的  是加上去的:


 


 

以上我们就得到了CosFace中提出的Large Margin Cosine Loss

人脸识别损失函数简介与Pytorch实现代码实现:




四、ArcFace


论文地址:https://arxiv.org/pdf/1801.07698.pdf

话不多说,直接上公式:

 


 

可以看到和CosFace非常类似,只是将  作为角度加上去了,这样就强行拉大了同类之间的角度,使得神经网络更努力地将同类收得更紧。

人脸识别损失函数简介与Pytorch实现

伪代码实现步骤:


  1. 对  进行归一化
  2. 对  进行归一化
  3. 计算  得到预测向量 
  4. 从  中挑出与ground truth对应的值
  5. 计算其反余弦得到角度
  6. 角度加上m
  7. 得到挑出从  中挑出与ground truth对应的值所在位置的独热码
  8. 将  通过独热码放回原来的位置
  9. 对所有值乘上固定值 

代码实现:


到此ArcFace、SphereFace、CosFace的损失函数就介绍完啦~


参考链接:https://blog.csdn.net/fuwenyan/article/details/79657738

<pre style="letter-spacing: 0.544px;text-align: center;"><section style="margin-right: 8px;margin-left: 8px;white-space: normal;color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;widows: 1;line-height: 1.75em;"><strong><span style="letter-spacing: 0.5px;font-size: 14px;"><strong style="font-size: 16px;letter-spacing: 0.544px;"><span style="letter-spacing: 0.5px;">—</span></strong>完<strong style="font-size: 16px;letter-spacing: 0.544px;"><span style="letter-spacing: 0.5px;font-size: 14px;"><strong style="font-size: 16px;letter-spacing: 0.544px;"><span style="letter-spacing: 0.5px;">—</span></strong></span></strong></span></strong></section><section style="white-space: normal;font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;widows: 1;"><section powered-by="xiumi.us"><section style="margin-top: 15px;margin-bottom: 25px;opacity: 0.8;"><section><section style="letter-spacing: 0.544px;"><section powered-by="xiumi.us"><section style="margin-top: 15px;margin-bottom: 25px;opacity: 0.8;"><section><section style="margin-right: 8px;margin-bottom: 15px;margin-left: 8px;padding-right: 0em;padding-left: 0em;color: rgb(127, 127, 127);font-size: 12px;font-family: sans-serif;line-height: 25.5938px;letter-spacing: 3px;"><span style="color: rgb(0, 0, 0);"><strong><span style="font-size: 16px;font-family: 微软雅黑;caret-color: red;">为您推荐</span></strong></span></section><p style="margin-right: 8px;margin-bottom: 5px;margin-left: 8px;padding-right: 0em;padding-left: 0em;color: rgb(127, 127, 127);font-size: 12px;font-family: sans-serif;line-height: 1.75em;letter-spacing: 0px;">一文通俗了解对抗生成网络(GAN)核心思想<br  /></p><section style="margin-bottom: 5px;"><span style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);cursor: pointer;font-size: 14px;">MIT最新深度学习入门课,安排起来!</span></section><p style="margin-right: 8px;margin-bottom: 5px;margin-left: 8px;padding-right: 0em;padding-left: 0em;font-family: sans-serif;line-height: 1.75em;letter-spacing: 0px;">五分钟了解机器学习十大算法</p><p style="margin-right: 8px;margin-bottom: 5px;margin-left: 8px;padding-right: 0em;padding-left: 0em;font-family: sans-serif;line-height: 1.75em;letter-spacing: 0px;"><span style="color: rgb(87, 107, 149);"><span style="font-size: 14px;">图深度学习入门难?这篇教程帮你理清楚了脉络</span></span><br  /></p><p style="margin-right: 8px;margin-bottom: 5px;margin-left: 8px;padding-right: 0em;padding-left: 0em;color: rgb(127, 127, 127);font-size: 12px;font-family: sans-serif;line-height: 1.75em;letter-spacing: 0px;">谷歌出现新冠肺炎确诊病例,限制员工出行;比尔·盖茨:可能成百年不遇的大流行病<br  /></p></section></section></section></section></section></section></section></section>

人脸识别损失函数简介与Pytorch实现

本篇文章来源于: 深度学习这件小事

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享