ArcFace(建议大家去看论文的第一版)是现在最常用的人脸识别算法,它从softmax、SphereFace和CosFace发展过来,这里就详述一下arcface算法和其发展过程。

图1

ArcFace发展过程

随着深度学习人脸识别的发展,现在人脸识别的主要思想是在网络学习的过程中增大类间差距(inter-class)的同时减小类内差距(intra-class)。

Softmax

Softmax是最常用的分类损失函数:
L=−1N∑i=1Nlog⁡(eWyiTxi+byi∑j=1neWjTxi+bj)(1)L = - \frac1N \sum_{i=1}^N\log(\frac{e^{W_{y_i}^Tx_i + b_{y_i}}}{\sum_{j=1}^ne^{W_j^Tx_i + b_j}})\tag{1} L=N1i=1Nlog(j=1neWjTxi+bjeWyiTxi+byi)(1)
其中x∈Rdx\in R^dxRd表示第i个样本中真值为yi的深度特征,在常见的人脸识别算法中,x的特征维度一般是512维;Wj∈RdW_j \in R^dWjRd 是权重W∈Rd×nW \in R^{d \times n}WRd×n(通常为FC层)第j个列向量,bj∈Rnb_j \in R^nbjRn是偏置项;batch size和分类数目分别是N和n;对于第i个类来说,其feature embedding(嵌入特征)即为WiTx+biW_i^Tx + b_iWiTx+bi

softmax损失经常运用在较早的人脸识别中,但是它并没有显式地优化feature embeding从而使类间距增大和类内距减小,使得人脸识别结果并不理想。

SphereFace

SphereFace是首个将人脸识别的特征空间转换到超球面角度特征空间的算法。对于(1)式中的feature embedding(WiTx+biW_i^Tx + b_iWiTx+bi),由向量的乘法可以转换成∣∣WiT∣∣∣∣x∣∣cos⁡(θi)+bi||W_i^T||||x||\cos(\theta_i) + b_iWiTxcos(θi)+bi,其中θi\theta_iθi是Wi和x之间的角度。当将权重Wi使用L2标准化和将偏置项置零后,得到的feature embedding为∣∣x∣∣cos⁡(θi)||x||\cos(\theta_i)xcos(θi)。因为在所有的权重都共享输入特征x,所以最终的分类结果的不同只跟θ\thetaθ有关。在训练过程中,上述修改的softmax损失促使第i类的特征之间有更小的角度、与其他类之间的特征有更大的角度,从而使得分类训练更加有效。这时的修改后的softmax形式如下:
L=−1N∑i=1Nlog⁡(e∣∣xi∣∣cos⁡(θyi,i)∑j=1ne∣∣xi∣∣cos⁡(θj,i)(2)L = - \frac1N \sum_{i=1}^N\log(\frac{e^{||x_i||\cos(\theta_{y_i,i})}}{\sum_{j=1}^ne^{||x_i||\cos(\theta_{j,i})}}\tag{2} L=N1i=1Nlog(j=1nexicos(θj,i)exicos(θyi,i)(2)
虽然上述损失能将特征映射到角度特征空间中,但是这些特征之间并没有区分性,即cos⁡(θi)>cos⁡(θj)\cos(\theta_i) > \cos(\theta_j)cos(θi)>cos(θj)来学习第i类比所有的j类角度大,但是在学习的过程中对于正确的i类来说,其角度与其他的所有类没有任何区别。所以,SphereFace加入angular marin(角度惩罚项)m从而增强损失函数的区分能力,对于正确的i类来说,使cos⁡(mθi)>cos⁡(θj)\cos(m\theta_i) > \cos(\theta_j)cos(mθi)>cos(θj),所以(2)式就改为:
L=−1N∑i=1Nlog⁡(e∣∣xi∣∣cos⁡(mθyi,i)e∣∣xi∣∣cos⁡(mθyi,i)+∑j=1,j≠yine∣∣xi∣∣cos⁡(θj,i)(3)L = - \frac1N \sum_{i=1}^N\log(\frac{e^{||x_i||\cos(m\theta_{y_i,i})}}{e^{||x_i||\cos(m\theta_{y_i,i})} + \sum_{j=1,j\neq y_i}^ne^{||x_i||\cos(\theta_{j,i})}}\tag{3} L=N1i=1Nlog(exicos(mθyi,i)+j=1,j=yinexicos(θj,i)exicos(mθyi,i)(3)
SphereFace的loss方式使得CNN可以在角度空间内学习人脸特征,同时由于Wi标准化和偏置项置零,网络的预测只与输入特征x和每个类的权重Wi角度有关,所以当x与Wi的夹角θi\theta_iθi比其他所有的Wj的夹角小时,x被分类到第i类

在论文后续的内容中,证明了当处于多类分类的时候,惩罚项m至少要大于3,在后续的实验中,m=4

对于2分类来说,决策边界如图1所示。

CosFace

虽然SphereFace的立意很好,但是由于cosine函数是非单调函数,使得cos⁡(mθi)>cos⁡(θj)\cos(m\theta_i) > \cos(\theta_j)cos(mθi)>cos(θj)很难优化,在原文中必须加上原softmax才能稳定训练。同时,惩罚项m与θ\thetaθ关联密切,使得不同的类有不同的间隔,导致在决策空间中有些类间距比其他类间距要大得多。

根据以上问题,CosFace提出了Large margin cosin loss(LMCL)。

在SphereFace使用L2-norm使||Wi|| = 1的基础上,CosFace更进一步使用L2-norm并rescale使||x|| = s。论文中给出的原因如下:

  1. 原始的softmax函数隐式地同时学习欧式空间(L2-norm)和cosine角度。简单样本的可变的L2-norm会比难样本大得多从而弥补较小的角度差距;相反,CosFace将W和x其标准化后,类与类之间就有了相同的L2-norm,促使网络学习只依靠于cosine角度值来增加分辨能力;
  2. 在学习过程中,如果使用∣∣xi∣∣cos⁡(θi)>∣∣xi∣∣cos⁡(θj)||x_i||\cos(\theta_i) > ||x_i||\cos(\theta_j)xicos(θi)>xicos(θj)时,假如cos⁡(θi)<cos⁡(θj)\cos(\theta_i) < \cos(\theta_j)cos(θi)<cos(θj),损失函数会要求减小||x||使得loss降低,不利于网络性能;
  3. s需要设置成一个较大的数值使得在Loss较小的时候能继续下降。
  4. (非原文给出的)有些模糊的人脸特征x比较小,若不进行norm则反向传播的梯度较小,进行了norm之后将其与其他人脸特征放到同样的尺度下,梯度增大了,算是一种间接的难样本加权方法。

所以(2)式就成了:
L=−1N∑i=1Nlog⁡(escos⁡(θyi,i)∑j=1nescos⁡(θj,i)(4)L = - \frac1N \sum_{i=1}^N\log(\frac{e^{s\cos(\theta_{y_i,i})}}{\sum_{j=1}^ne^{s\cos(\theta_{j,i})}}\tag{4} L=N1i=1Nlog(j=1nescos(θj,i)escos(θyi,i)(4)
由于上述标准化操作移除了径向中的其他变量,使得网络学习的特征分散在角度空间中。CosFace论文中称(4)式为Normalized version of Softmax Loss(NSL)。

但是NSL和(2)式一样并没有使得类间更易区分,所以需要增加惩罚项。CosFace添加惩罚项的方式是使cos⁡(θi)−m>cos⁡(θj)\cos(\theta_i) - m > \cos(\theta_j)cos(θi)m>cos(θj),所以LMCL的形式如下:
L=−1N∑i=1Nlog⁡(es(cos⁡(θyi,i)−m)es(cos⁡(θyi,i)−m)+∑j=1,j≠yinescos⁡(θj,i)(5)L = - \frac1N \sum_{i=1}^N\log(\frac{e^{s(\cos(\theta_{y_i,i})-m)}}{e^{s(\cos(\theta_{y_i,i})-m)} + \sum_{j=1,j\neq y_i}^ne^{s\cos(\theta_{j,i})}}\tag{5} L=N1i=1Nlog(es(cos(θyi,i)m)+j=1,j=yinescos(θj,i)es(cos(θyi,i)m)(5)
其二分类决策边界如图1所示,相对于NSL的分类边界如下图所示:

论文后续给出了s和m的设置方法:
s≥C−1Clog⁡(C−1)PW1−PWs \geq \frac{C-1}C \log\frac{(C-1)P_W}{1-P_W} sCC1log1PW(C1)PW
其中C是分类数目,PW是期望类中心的最小后验概率(即W)。

ArcFace

在CosFace的基础上,ArcFace,将惩罚项由cosine函数外移到了函数内,在训练稳定的同时更进一步地提升了人脸识别网络的辨别能力。

如下图所示,在进行特征x和权重W标准化之后,它们之间的相乘等价于cosine距离cos⁡(θ)\cos(\theta)cos(θ)。对其使用arc-cosine方程来计算特征和权重之间的角度θ\thetaθ,然后添加一个额外的角度上的加的惩罚项m得到θ+m\theta+mθ+m,接着对其使用cosine函数得到cos⁡(θ+m)\cos(\theta+m)cos(θ+m),在之后进行re-scale(即按照CosFace中的方式得到scos⁡(θ+m)s\cos(\theta+m)scos(θ+m)),最后送入softmax损失函数中。

ArcFace的公式如下:
L=−1N∑i=1Nlog⁡(escos⁡(θyi,i+m)escos⁡(θyi,i+m)+∑j=1,j≠yinescos⁡(θj,i)(6)L = - \frac1N \sum_{i=1}^N\log(\frac{e^{s\cos(\theta_{y_i,i}+m)}}{e^{s\cos(\theta_{y_i,i}+m)} + \sum_{j=1,j\neq y_i}^ne^{s\cos(\theta_{j,i})}}\tag{6} L=N1i=1Nlog(escos(θyi,i+m)+j=1,j=yinescos(θj,i)escos(θyi,i+m)(6)
下图是ArcFace的几何解释,不同的颜色表示特征空间中不同的类。可以看出,通过使用惩罚项m,可以压缩类内角度范围,同时使类间的边缘有一个间隔。

ArcFace优点如下:

  1. 直接在标准化后的超球面通过增加类间角度的距离优化网络的分辨能力,非常直观的展现了如何优化特征和权重之间夹角;
  2. 代码实现较为简单,几行代码即可;
  3. 训练过程中增加的计算量很少。

实现

原文给出了MxNet的伪代码如下图:

这里结合github上开源的pytorch代码解读一下:

class 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_features #输入特征维度,一般是512self.out_features = out_features #输出维度,是类别数目self.s = s #re-scaleself.m = m #角度惩罚项self.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) ---------------------------# 对应伪代码中的1、2、3行:输入x标准化、输入W标准化和它们之间进行FC层得到cos(theta)cosine = F.linear(F.normalize(input), F.normalize(self.weight))# 计算sin(theta)sine = torch.sqrt((1.0 - torch.pow(cosine, 2)).clamp(0, 1))# 对应伪代码中的5、6行:计算cos(theta+m) = cos(theta)cos(m) - sin(theta)sin(m)phi = cosine * self.cos_m - sine * self.sin_mif self.easy_margin:phi = torch.where(cosine > 0, phi, cosine)else:# 当cos(theta)>cos(pi-m)时,phi=cos(theta)-sin(pi-m)*mphi = torch.where(cosine > self.th, phi, cosine - self.mm)# --------------------------- convert label to one-hot ---------------------------# 对应伪代码中的7行:对label形式进行转换,假设batch为2、有3类的话,即将label从[1,2]转换成[[0,1,0],[0,0,1]]one_hot = torch.zeros(cosine.size(), device='cuda')one_hot.scatter_(1, label.view(-1, 1).long(), 1)# 对应伪代码中的8行:计算公式(6)# -------------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.4# 对应伪代码中的9行,进行re-scaleoutput *= self.sreturn output

与Softmax、SphereFace和CosFace比较

与softmax对比

论文分别使用softmax和ArcFace训练了8个ID的人脸,如下图所示,其中点表示每个样本、线表示每个ID的中心方向

可以看出,softmax的类之间的决策边界并未明显分开,边缘有明显接触。而ArcFace中相邻类之间有着十分明显的间隔,由于人脸特征标准化,所有的特征都被转到角度空间中;同时由于角度惩罚项m的加入,各个类之间间隔明显。

与SphereFace和CosFace对比

下图展示了在训练过程中CosFace和ArcFace角度θ\thetaθ的变化,可以看出,在初始化分布相同的情况下,无论是训练过程中还是训练结束,ArcFace的角度分布都在CosFace左边(即角度更小),证明了ArcFace更能压缩类内角度范围和增大类间角度间隔,即网络的分辨能力更强。

论文展示了softmax、SphereFace、CosFace和ArcFace在特征与目标中心角度范围[20°,100°]下的logit分布,在下图(b)中,ArcFace比其他3个损失的曲线都要低,表示ArcFace相对其他loss施加了更加严格的惩罚项。之所以只展示这个角度范围,是疑问ArcFace训练过程中发现,角度最终分布在[20°,100°],如下图(a)。

它们之间的二分类决策边界如图1所示。

实验

ArcFace论文中修改了原ResNet-basicblock,称为IRBlock(improved residual unit),如下图:

不同m取值的影响:

与其他loss的对比结果:

以上就是本文的全部内容。

人脸识别-论文阅读-ArcFace及其由来(SphereFace、CosFace)相关推荐

  1. 人脸识别 论文阅读(4)

    1.人脸识别的瓶颈在于噪声 名称:The Devil of Face Recognition is in the Noise,商汤科技,ECCV 2018 用我的话说,这篇文章通过实验数据弄清了噪声的 ...

  2. 人脸识别 论文阅读(1)- DeepFace: Closing the Gap to Human-Level Performance in Face Verification

    文章目录 face detection LBP特征 SVR为什么可以学习到fiducial point face alignment 2D对齐(a~b) 堆叠4个HG层 2D-TO-3D对齐: 基于H ...

  3. 人脸识别 论文阅读 (3)- DeeplD1:Deep Learning Face Representation from Predicting 10,000 Classes]

    理解参考:张雨石博客 DeepID1 (Linkface 孙祎) 文章目录 DeepID1 @[TOC](文章目录) 前言 一.pandas是什么? 二.使用步骤 1.引入库 2.读入数据 总结 为什 ...

  4. 人脸方向论文阅读(二)——Deep Face Representations for Differential Morphing Attack Detection

    人脸相关论文阅读(二)--Deep Face Representations for Differential Morphing Attack Detection 论文信息: 发表在Cryptogra ...

  5. 行为识别论文阅读(2)——3D Human Sensing, Action and Emotion Recognition in Robot Assisted Therapy of Children

    行为识别论文阅读(2)--3D Human Sensing, Action and Emotion Recognition in Robot Assisted Therapy of Children ...

  6. 【深度学习】步态识别-论文阅读:(T-PAMI-2021)综述:Deep Gait Recognition

    论文详情: 期刊:T-PAMI-2021 地址:参考笔记 1.Abstract 本文综述了到2021年1月底在步态识别方面的最新进展,以 全面概述了深度学习步态识别的突破和最近的发展,涵盖了广泛的主题 ...

  7. 人脸识别论文整理——深度人脸识别的大边缘余弦损失

    论文简介 论文中文翻译:<深度人脸识别的大边缘余弦损失> 论文名称:<CosFace: Large Margin Cosine Loss for Deep Face Recognit ...

  8. 人脸识别论文:Partial FC: Training 10 Million Identities on a Single Machine

    1. 背景介绍 在当前的分类任务研究中,大多数损失函数都是基于Softmax Loss或者其变体(如NormFace.ArcFace.Circle Loss.AdaCos等改进),训练效果也很好,但是 ...

  9. 【人脸识别】MTCNN + Arcface全流程详解 Pytorch代码 损失函数发展

    目录: 人脸识别介绍 损失函数发展 Softmax loss Center loss Triplet loss L-softmax loss SphereFace(A-Softmax loss) Co ...

  10. 人脸识别 | 论文参考

    人脸识别技术资料整理 2019/04/06 ISRN: Improved Selective Refinement Network for Face Detection DSFD: Dual Shot ...

最新文章

  1. MySQL操作数据库--与MySQL零距离接触1-7
  2. 【前端来刷LeetCode】两数之和与两数相加
  3. MySQL配置全文索引
  4. 地理标志农产品数据发布 特色产业对话农民丰收节交易会
  5. MySQL-常用命令大全
  6. Scala Akka的Actor模型
  7. 序列化类型为XX的对象时检测到循环引用
  8. python定义对象的比较方法
  9. python 修饰器 参数_具有参数的Python类修饰器,但未运行修饰的...
  10. 15个带示例的jQuery滚动条插件
  11. 02 掌握变量的定义和使用方法 1214
  12. struts2中action之间的一种跳转
  13. esp8266 扫描wifi_基于ESP8266与QT的智能家居控制系统设计
  14. ats反向代理和重定向
  15. 阿里云CDN、DCDN、SCDN的区别
  16. 通信总线协议二 :RS232和RS485
  17. 医院医疗类报表免费用,提反馈,还能赢取P30!
  18. linux,centos7环境下,安装RabbitMQ
  19. qt 禁止alt+f4_禁止上下关闭按钮和Alt + F4
  20. 解决微信内置浏览器屏蔽下载链接问题

热门文章

  1. 使用electron开发了一个excel对比工具
  2. NoteExpress的题录中文??问题
  3. 地图可视化开发技巧:geojson转svg后再转emf格式插入ppt实现编辑的解决方案
  4. Mac 打开大小写切换很慢
  5. emd经验模态分解 matlab,经验模态分解(EMD)在地球物理资料中的应用(附MATLAB程序)...
  6. 后缀树后缀数组LCP
  7. lvds、cml、lvpecl接口电平详解
  8. 【管理度量网络安全风险】丨上海道宁为您带来强大的Tenable漏洞及风险管理解决方案
  9. ansys模型导入matlab,ANSYS导入MATLAB
  10. .rgb格式文件的Python读取、格式转换