人脸识别ArcFace算法原理与实现

在深度学习用于人脸识别方面,为了提高识别的准确率,研究者提出了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</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值