在深度学习用于人脸识别方面,为了提高识别的准确率,研究者提出了ArcFace 技术。ArcFace 通过在 Softmax 损失函数上添加一种角度余弦距离的 margin 来提高人脸识别的准确率,ArcFace 始终优于 SOTA,且容易实现,计算开销可忽略不计。
论文:ArcFace: Additive Angular Margin Loss for Deep Face Recognition,地址:https://arxiv.org/pdf/1801.07698

如上图所示,相较于其他的人脸识别算法,在整个网络过程中,ArcFace有一个线性角度间距贯穿全过程。

ArcFace主要分两部分:
一、提取特征与对特征处理-主干
特征提取:通过一个深度卷积神经网络ResNet提取人脸图像的特征向量。
特征归一化:对提取到的特征向量进行 L2 归一化,将其转换为单位向量,使特征向量更加稳定。
二、头部
引入角度余弦(cosine)相似性作为度量标准,以增加样本之间的区分性。具体来说,为每个类别增加一个 learnable 的权重(称为 margin),将输入特征与各个类别的权重向量做余弦相似性计算,并确保同类别特征之间的相似度尽可能大,不同类别间的相似度尽可能小。
深度卷积神经网络(DCNN) 特征和最后一个全连接层(FC) 权重之间的点积/内积 等于 特征和权重归一化之后的余弦距离。先利用反余弦 (arc-cosine) 函数来计算当前特征与目标权重之间的角度。然后,把一个加性角度边距 (additive angular margin) 加到目标角度,然后通过余弦 (cosine) 函数再次获得目标logit。接着,通过固定的特征范数重缩放所有logit,且后续的步骤与Softmax Loss中的步骤完全相同。
ArcFace算法通过上面两步骤后,进行分类器训练:在 Softmax 损失函数的基础上,引入角度余弦(cosine)相似性作为度量标准,以增加样本之间的区分性。
在上面已为每个类别增加一个 learnable 的权重(称为 margin),这里将输入特征与各个类别的权重向量做余弦相似性计算,并确保同类别特征之间的相似度尽可能大,不同类别间的相似度尽可能小。提出基于角度和余弦间隔的加性角度边距损失 (Additive Angular Margin Loss, ArcFace),cos( θ + m ) ,(θ为当前特征与目标权重之间的夹角),对归一化后的权重和特征在角度空间内进行优化以最大化决策边界,其几何含义更加直观,大量实验表明识别效果也更好。
ArcFace算法代码实现:
一、主干
用深度卷积神经网络ResNet_50提取人脸图像特征,ResNet_50代码如下:
class Bottleneck(Module):
expansion = 4
def __init__(self, inplanes, planes, stride = 1, downsample = None):
super(Bottleneck, self).__init__()
self.conv1 = conv1x1(inplanes, planes)
self.bn1 = BatchNorm2d(planes)
self.conv2 = conv3x3(planes, planes, stride)
self.bn2 = BatchNorm2d(planes)
self.conv3 = conv1x1(planes, planes * self.expansion)
self.bn3 = BatchNorm2d(planes * self.expansion)
self.relu = ReLU(inplace = True)
self.downsample = downsample
self.stride = stride
def forward(self, x):
identity = x</


1万+

被折叠的 条评论
为什么被折叠?



