天天看点

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

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

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

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

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

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

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

一、从前辈说起

首先谈谈他们的前辈:

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

维基百科介绍:

Softmax函数 ,或称 归一化指数函数 [1],是逻辑函数的一种推广。它能将一个含任意实数的K维向量
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
“压缩”到另一个K维实向量
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
中,使得每一个元素的范围都在
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
之间,并且所有元素的和为1。该函数的形式通常按下面的式子给出:
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

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

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
想了解更多,可以参考:忆臻:softmax函数计算时候为什么要减去一个最大值?

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

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

上面我们丢入一个长度为

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

向量,得到

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

,而softmax loss呢,则是:

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

其中

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

是一个长度为

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

的one-hot向量,即

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

,只有ground truth对应的

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

。所以也可以简写为:

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

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

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

其中

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

是真实分布,在分类任务中,

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

实际上等价于上面的

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

。而

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

则是预测分布,在分类任务中

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

实际上等价于上面的

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

。这样一来进行化简就得到:

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

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

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

所以,我们可以得到:

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
参考链接: https:// blog.csdn.net/u01438016 5/article/details/77284921

二、SphereFace

论文地址: https:// arxiv.org/pdf/1704.0806 3.pdf

要想增强

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

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

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

不妨继续看看

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

其中

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

代表两个向量

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

之间的夹角,如果对

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

归一化,将偏置

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

置为0,即

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

,则有:

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

下标

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

表示

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

对于

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

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

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

这样不仅放大了类之间的距离,也因放大了同类

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

之间的间隔而使类内更聚拢。

不过上述公式仍有问题:原来的

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

,如今

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

超出了向量之间的夹角函数

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

定义域范围

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

咋办?

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

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

这样一来:

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

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

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

原论文则是:

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

其中

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

表示第

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

个样本,

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

表示第

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

个样本的

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

标签,

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

表示第

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

和样本

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

之间的夹角。

论文中的可视化图片:

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

Pytorch代码实现:

# SphereFace
           

三、CosFace

论文地址: https:// arxiv.org/pdf/1801.0941 4.pdf

和SphereFace类似,CosFace也是从

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

的余弦表达形式入手,令

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

。与此同时,作者发现

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

对于分类并没有啥帮助,所以干脆将其固定

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

,所以有:

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

应该代表归一化的

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

接下来与上文

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

类似的是也引入了常数

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

,不同的是这里的

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

是加上去的:

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

以上我们就得到了CosFace中提出的

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

代码实现:

# CosFace
           

四、ArcFace

论文地址: https:// arxiv.org/pdf/1801.0769 8.pdf

话不多说,直接上公式:

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

可以看到和CosFace非常类似,只是将

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

作为角度加上去了,这样就强行拉大了同类之间的角度,使得神经网络更努力地将同类收得更紧。

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

伪代码实现步骤:

  1. pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
    进行归一化
  2. pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
    进行归一化
  3. 计算
    pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
    得到预测向量
    pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
  4. pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
    中挑出与ground truth对应的值
  5. 计算其反余弦得到角度
  6. 角度加上m
  7. 得到挑出从
    pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
    中挑出与ground truth对应的值所在位置的独热码
  8. pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...
    通过独热码放回原来的位置
  9. 对所有值乘上固定值
    pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

代码实现:

# ArcFace
           

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

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

欢迎关注个人微信公众号:

pytorch如何定义损失函数_人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace...

欢迎扫码关注~