ArcFace: Additive Angular Margin Loss for Deep Face Recognition

论文: https://arxiv.org/abs/1801.07698
官方代码: https://github.com/deepinsight/insightface

Abstract

大规模人脸识别的挑战之一就是如何设计损失函数,以增强判别能力。Centre loss: 惩罚人脸深层特征与其相应的类中心在欧氏空间中的距离,以缩小类内距离; SphereFace: 假设最后一个全连接层中的线性变换矩阵可以表示角度空间中类别中心,并以乘法的方式惩罚深特征与其相应权重之间的角度。目前的研究主线是在已有的损失函数中加入裕度,以增强对人脸的分类能力,本文提出 Additive Angular Margin Loss (ArcFace) 增强使用特征进行人脸分类的能力,将人脸识别的能力提高了10个点。

Introduction

当前,使用 DCNN (Deep Convolutional Neural Network) 进行人脸识别主要有两条研究路线,一种是使用 Softmax 直接训练一个分类器,对不同 ID 的人脸进行分类; 另一种是直接学习嵌入 (learn dirtectly an embedding)(个人理解:应该是基于对比识别的方式,例如 Siamese 和 Triplet),例如 Triplet Loss。但是 softmax loss 和 triplet loss 都有缺点,对于 softmax loss

  • 线性变换矩阵 W∈Rd×nW \in R^{d\times n}WRd×n 的维度随着 ID 数量nnn 的增加而线性增加;
  • 学习到的特征对于 closed-set 的分类效果很好,但是对于 open-set 的判别能力不够 (个人理解:对于不会增加其他类别的数据集,使用分类可以取得较好的结果,但是像是在人脸识别的使劲落地中,训练集中往往没有应用场景中的人物 ID,需要增加人物 ID,这是分类就无法解决);

对于 triplet loss:

  • 在 ID 数量和数据量多的大规模数据集上,存在组合爆炸的问题,会导致迭代步数的急剧增加 (个人理解:Siamese 和 Triplet 这种通过对比进行人脸识别的网络,需要将数据集中的数据进行配对,当 ID 的数据量和数据量大时,配对组合形成大量的数据,造成组合爆炸,训练时需要更多的迭代步数);
  • 半难样本挖掘 (semi-hard sample mining) 对模型性能的提高是一个难题 (个人理解:在通过对别识别时,需要对网络对配对图像的识别能力进行评估,将难以识别的组合进行加强训练,但是如何找出难以识别的组合,提高训练模型的性能是一个难题);

多种 softmax 的变体被提出,用于增强人脸识别的判别能力。Centre loss: 惩罚特征向量和类别中心在欧式空间中的距离来增强类内的紧密性,使用级联的 Softmax loss 来保证类间的分离性。但是,在训练时随着 ID 数量的增加,更新类别中心十分困难。SphereFace提出了角度裕度的概念,但是损失函数需要一系列近似才能计算出来,这会导致网络训练的不稳定。为了训练过程的稳定,提出看包含标准 softmax 的混合损失函数。由于基于整数的乘性角度裕度 (integer-based multiplicative angular margin) 使目标逻辑 (target logit) 曲线变得十分陡峭,会阻碍收敛,所以从经验中得出, softmax 控制训练过程。CosFace直接在目标逻辑中增加余弦裕度惩罚,得到了比 SphereFace更好的结果,并且实施起来更加简单,减少了对 softmax 的依赖。

Additive Angular Margin Loss (ArcFace)

如上图所示,DCNN 的特征与最后一层全连接层的点积等于特征与权重归一化之后的余弦距离,1. ArcFace 先使用反余弦函数计算当前特征与目标权重之间的角度,然后在目标角度上增加附加角裕度,最后使用余弦函数重新得到目标 logits。2. 通过固定的特征归一化重新改变所有 logits 的大小,剩下的步骤与 softmax 完全相同。
ArcFace 有如下优点:

  • Engaging
    通过归一化超球面中角和弧的精确对应关系,直接优化距离裕度。通过分析特征和权重之间的角度统计,直观地说明 512-D 空间中的情况;
  • Effective
    将 SOTA 提高了10 个点;
  • Easy
    按照伪代码,仅需几行代码即可实现,不依赖其他损失函数即有较好的稳定性,在任何数据集上都很容易收敛;

  • Efficient
    在训练时仅增加少许计算复杂度,在 ID 多的数据集上也可以使用;

Proposed Approach

ArcFace

最常使用的分类损失函数是 softmax,即
L1=−1N∑i=1NlogeWyiTxi+byi∑j=1neWjTxi+bjL_1=-\frac{1}{N}\sum_{i=1}^{N}log\frac{e^{W_{y_i}^{T}x_{i}+b_{y_i}}}{\sum_{j=1}^{n}e^{W_{j}^{T}x_i+b_j}}L1=N1i=1Nlogj=1neWjTxi+bjeWyiTxi+byi
其中,xi∈Rdx_i\in R^dxiRd 表示第 iii 个样本的特征,该样本属于第 yiy_iyi 类,文中的特征维度 ddd 设置为 512512512Wj∈RdW_j\in R^dWjRd 表示权重 W∈Rd×nW\in R^{d\times n}WRd×n 的第 jjj 列,bj∈Rnb_j\in R^nbjRn 是偏置项,NNN 是 batch size,nnn 是类别数量;
softmax 没有优化特征嵌入 (feature embeding) 以增强样本的类内相似性和类间的分离性,导致在人脸识别领域的表现不是很好。
为了简化,固定偏置 bj=0b_j=0bj=0
L2=−1N∑i=1NlogeWyiTxi∑j=1neWjTxiL_2=-\frac{1}{N}\sum_{i=1}^{N}log\frac{e^{W_{y_i}^{T}x_{i}}}{\sum_{j=1}^{n}e^{W_{j}^{T}x_i}}L2=N1i=1Nlogj=1neWjTxieWyiTxi
点积变换WjTxi=∥Wj∥∥xi∥cosθjW_j^Tx_i=\left \| W_j \right \| \left \| x_i \right \|cos\theta_jWjTxi=Wjxicosθj
L3=−1N∑i=1Nloge∥Wyj∥∥xi∥cosθyie∥Wyj∥∥xi∥cosθyi+∑j=1,j≠yine∥Wj∥∥xi∥cosθjL_3=-\frac{1}{N}\sum_{i=1}^{N}log\frac{e^{\left \| W_{y_j} \right \| \left \| x_i \right \|cos\theta_{y_i}}}{e^{\left \| W_{y_j} \right \| \left \| x_i \right \|cos\theta_{y_i}} + \sum_{j=1, j\neq y_i}^{n}e^{\left \| W_{j} \right \| \left \| x_i \right \|cos\theta_{j}}}L3=N1i=1NlogeWyjxicosθyi+j=1,j̸=yineWjxicosθjeWyjxicosθyi
其中 θj\theta_jθj是权重WjW_jWj和特征xix_ixi之间的角度。在经过 l2l_2l2 归一化后,固定权重∥Wj∥=1\left \| W_j \right \|=1Wj=1,固定 l2l_2l2 归一化后的特征 ∥xi∥\left \| x_i \right \|xisss,则
L4=−1N∑i=1Nlogescosθyiescosθyi+∑j=1,j≠yinescosθjL_4=-\frac{1}{N}\sum_{i=1}^{N}log\frac{e^{s\ cos\theta_{y_i}}}{e^{s\ cos\theta_{y_i}}+\sum_{j=1, j\neq y_i}^{n}e^{s\ cos\theta_j}}L4=N1i=1Nlogescosθyi+j=1,j̸=yinescosθjescosθyi
特征与权重归一化网络的预测只依赖于特征和权重之间的角度,学习到的特征以半径 sss 分布在球体上:

当嵌入特征分布在超球面上每个特征的中心周围时,使用附加角度裕度mmm惩罚特征 xix_ixi 和权值 WyiW_{y_i}Wyi 之间的距离,增加类内的致密性和类间的分离性,即
L5=−1N∑i=1Nlogescos(θyi+m)escos(θyi+m)+∑j=1,j≠yinescosθjL_5=-\frac{1}{N}\sum_{i=1}^{N}log\frac{e^{s\ cos(\theta_{y_{i}}+m)}}{e^{s\ cos(\theta_{y_i}+m)}+\sum_{j=1, j\neq y_i}^{n}e^{s\ cos\theta_j}}L5=N1i=1Nlogescos(θyi+m)+j=1,j̸=yinescosθjescos(θyi+m)
由于提出的附加角度裕度惩罚相当于在归一化后超球面的距离裕度惩罚,所以该方法被成为 ArcFace:

选用 8 个不同 ID 的人脸图像,每个 ID 的样本大约有 1500 张图像的数据集分别使用 softmax 和 ArcFace 进行训练,如上图所示,softmax 训练出的特征仅能提供模糊的决策边界,而 ArcFace 可以显著拉大相近类别之间的距离。

Comparison with SphereFace and CosFace

  • Numerical Similarity 数值相似性
    SphereFace、ArcFace 和 CosFace 分别提出了不同的裕度惩罚,分别为乘性角度裕度 m1m_1m1,附加角度裕度 m2m_2m2 和附加余弦裕度 m3m_3m3。从数值角度看,所有的裕度惩罚都是通过惩罚目标 logit ,以增加类内的致密性和类间的分离性。在图4(b)中绘出了三者在最佳裕度下的目标逻辑曲线,由于WyW_yWyxix_ixi之间的角度是从90∘90^\circ90 开始 (随机初始化),到30∘30^\circ30结束,所以仅展示了在[20∘,100∘][20^\circ, 100^\circ][20,100] 角度范围内的目标 logit 曲线。作者猜测目标 logit 曲线上有三个因素影响性能,即起始点、终止点和斜率。
    级联所有的裕度惩罚,在同一框架下同时使用 SphereFace、ArcFace 和 CosFace,m1,m2,m3m_1, m_2, m_3m1,m2,m3 均为超参数:
    L6=−1N∑i=1Nloges(cos(m1θyi+m2)−m3)es(cos(m1θyi+m2)−m3)+∑j=1,j≠yinescosθjL_6=-\frac{1}{N}\sum_{i=1}^{N}log\frac{e^{s(cos(m_1\theta_{y_{i}}+m_2)-m_3)}}{e^{s(cos(m_1\theta_{y_i}+m_2)-m_3)}+\sum_{j=1, j\neq y_i}^{n}e^{s\ cos\theta_j}}L6=N1i=1Nloges(cos(m1θyi+m2)m3)+j=1,j̸=yinescosθjes(cos(m1θyi+m2)m3)

  • Geometric Difference 几何差异
    ArcFace 有更好的几何属性,如下图所示,ArcFace 有恒定的角裕度,而 CosFace 和 SphereFace 仅有非线性的角裕度。

    裕度设计的微小差异就有可能在模型训练过程中产生蝴蝶效应。例如,SphereFace 使用退火处理的优化策略,为了避免训练开始时的发散,使用 Softmax 进行监督,削弱乘性裕度的惩罚。在 ArcFace 中,使用在裕度中无需整数的新版本 SphereFace,采用反余弦函数代替复杂的双倍角度公式,当 m=1.35m=1.35m=1.35 时可以获得与原版的 SphereFace 相似的性能,并且没有任何收敛困难。

Comparison with Other Losses

  • Intra-Loss
    通过减小样本和 groundtruth 之间的角度/弧度,提高类内的致密性:
    L5=L2+1πN∑i=1NθyiL_5=L_2+\frac{1}{\pi N}\sum_{i=1}^{N}\theta_{y_i}L5=L2+πN1i=1Nθyi
  • Inter-Loss
    通过增大不同中心之间的角度/弧度,以增强类间的分离性:
    L6=L2−1πN(n−1)∑i=1N∑j=1,j≠yinarccos(WyiTWj)L_6=L_2-\frac{1}{\pi N(n-1)}\sum_{i=1}^{N}\sum_{j=1,j\neq y_i}^{n}arccos(W_{y_i}^{T}W_j)L6=L2πN(n1)1i=1Nj=1,j̸=yinarccos(WyiTWj)
    Inter-Loss 是 Minimum Hyper-spherical Energy (MHE) 的一种特殊情况,在 MHE 中,隐藏层和输出层都被正则化;
  • Triplet-Loss
    扩大三个样本之间的角度/弧度裕度;
    arccos(xiposxi)+m≤arccos(xinegxi)arccos(x_i^{pos}x_i)+m\leq arccos(x_i^{neg}x_i)arccos(xiposxi)+marccos(xinegxi)

代码实现

  • pytorch

    from __future__ import print_function
    from __future__ import division
    import torch
    import torch.nn as nn
    import torch.nn.functional as F
    from torch.nn import Parameter
    import mathclass ArcMarginProduct(nn.Module):r"""Implement of large margin arc distance: :Args:in_features: size of each input sampleout_features: size of each output samples: norm of input featurem: margincos(theta + m)"""def __init__(self, in_features, out_features, s=30.0, m=0.50, easy_margin=False):super(ArcMarginProduct, self).__init__()self.in_features = in_featuresself.out_features = out_featuresself.s = sself.m = mself.weight = Parameter(torch.FloatTensor(out_features, in_features))nn.init.xavier_uniform_(self.weight)self.easy_margin = easy_marginself.cos_m = math.cos(m)self.sin_m = math.sin(m)self.th = math.cos(math.pi - m)self.mm = math.sin(math.pi - m) * mdef forward(self, input, label):# --------------------------- cos(theta) & phi(theta) ---------------------------cosine = F.linear(F.normalize(input), F.normalize(self.weight))sine = torch.sqrt(1.0 - torch.pow(cosine, 2))phi = cosine * self.cos_m - sine * self.sin_mif self.easy_margin:phi = torch.where(cosine > 0, phi, cosine)else:phi = torch.where(cosine > self.th, phi, cosine - self.mm)# --------------------------- convert label to one-hot ---------------------------# one_hot = torch.zeros(cosine.size(), requires_grad=True, device='cuda')one_hot = torch.zeros(cosine.size(), device='cuda')one_hot.scatter_(1, label.view(-1, 1).long(), 1)# -------------torch.where(out_i = {x_i if condition_i else y_i) -------------output = (one_hot * phi) + ((1.0 - one_hot) * cosine)  # you can use torch.where if your torch.__version__ is 0.4output *= self.s# print(output)return output
    

ArcFace 论文阅读及 pytorch 实现相关推荐

  1. 论文阅读之Arcface

    Arcface论文阅读 文章目录 Arcface论文阅读 人脸识别流程 数据 VGG2 MS-Celeb-1M MegaFace LFW CPF AgeDB 损失层 Softmax Loss Cent ...

  2. 3D目标检测论文阅读摘要

    3D目标检测论文阅读摘要 2D Object Detection 的研究已经非常成熟了,代表作品有RPN系列的FasterRCNN,One Shot系列的YOLOv1-YOLOv3,这里推荐一个2D ...

  3. 听说读论文也有trick?这篇文章告诉你深度学习论文阅读最佳姿势

    2020年的今天,我们的专业是deep learning,但是我们要keep learning,每天早上一睁眼,arxiv每天更新上百篇的论文,著名微博博主@爱可可-爱生活保持也在推送最新的deep ...

  4. character-level OCR之Character Region Awareness for Text Detection(CRAFT) 论文阅读

    Character Region Awareness for Text Detection 论文阅读 论文地址(arXiv) ,pytorch版本代码地址 最近在看一些OCR的问题,CRAFT是在场景 ...

  5. 2019 sample-free(样本不平衡)目标检测论文阅读笔记

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自知乎,已获作者同意转载,请勿二次转载 (原文地址:https://zhuanlan.zhihu.com/p/100052168) 背景 < ...

  6. resnet结构_ResNet 残差网络论文阅读及示例代码

    论文阅读 其实论文的思想在今天看来是不难的,不过在当时 ResNet 提出的时候可是横扫了各大分类任务,这个网络解决了随着网络的加深,分类的准确率不升反降的问题.通过一个名叫"残差" ...

  7. 对抗训练-smart 论文阅读笔记

    对抗训练-smart 论文阅读笔记 SMART: Robust and Efficient Fine-Tuning for Pre-trained NaturalLanguage Models thr ...

  8. 【论文阅读】Rethinking Spatiotemporal Feature Learning For Video Understanding

    [论文阅读]Rethinking Spatiotemporal Feature Learning For Video Understanding 这是一篇google的论文,它和之前介绍的一篇face ...

  9. 【论文阅读】Scene Text Image Super-Resolution in the Wild

    [论文阅读]Scene Text Image Super-Resolution in the Wild 摘要 引言 相关工作 TextZoom数据集 方法 pipeline SRB 中央对齐模块 梯度 ...

  10. 【论文阅读】【综述】3D Object Detection 3D目标检测综述

    目录 写在开头 3D Object Detection 相关博客: Sliding window Vote3Deep: Fast Object Detection in 3D Point Clouds ...

最新文章

  1. [LeetCode]题解(python):150-Evaluate Reverse Polish Notation
  2. java数字相减_Java的百日计划(day14)
  3. sed 命令自己总结
  4. python能编写手机软件-怎么用Python编写一个手机聊天软件或程序
  5. python的具体功能_python基本数据类型及常用功能
  6. Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)
  7. WordPress翻译更新失败解决方法
  8. C语言定义外部文件可使用的结构体和结构体变量
  9. C语言 模拟实现 strlen strcat strcpy函数
  10. 如何进行大数据分析与处理
  11. surf算子匹配物体
  12. 按键精灵手机助手连接不上mumu模拟器问题解决办法
  13. Tomcat9的安装和配置
  14. 【建设银行面试】面试准备
  15. 第三方配件查验苹果MFi认证
  16. outlook qr码在哪里_原平防伪码溯源_橙程(北京)科技有限公司
  17. R shiny echart4r 常见问题整理
  18. (JUC)图文并茂!!!! 超详细 偏向锁VS轻量级锁VS重量级锁VS自旋
  19. (转载)简述马尔可夫链
  20. 北航计算机学院王华峰,计算机前沿科学与技术分论坛第二场宣讲会

热门文章

  1. 6轴并联机器人示教器
  2. postman脚本文件存放的地址
  3. 【数竞笔记2】—— 常见积分方法
  4. Oracle8.1.7 报错01033,win10系统下oracle数据库报错ORA-01033如何解决
  5. 算法工程师面试基础题目及答案
  6. 电大计算机原理及应用,电大《ERP原理与应用》试题及答案.doc
  7. 微信小程序测试需要考虑哪些方面?一分钟快速掌握(小白必看!)
  8. 生命计算机在线,抖音生命计算器在线测试
  9. 测试必经之路(探索性测试)
  10. 学习分析技术【02】--社交网络分析