人脸识别总结(附开源项目代码与各大数据集下载路径)

2019年4月8日 更新

人脸识别总结

概要

人脸识别在深度学习领域里算是一项较为成功的应用,在日常生活中,经常可以见到人脸识别的设备,如人脸考勤机,各大交通站点的闸机,移动支付等。本人在从事人脸识别算法开发的短短一年时间里,也关注了不少论文和大佬们,对相关的技术发展也有了一些皮毛上的了解,在这里记录一下。本文的主要结构如下:

网络模型

深度学习发展至今,主流的 CNN 网络有 VGG, GoogleLeNet, ResNet, ResNeXt, DenseNet 等。其中,基于 ResNet 的开源人脸识别模型最为常见,如 InsightFacewy1iu/spherefaceageitgey/face_recognition 等。

本文主要介绍一下ResNet, 该模型结构是何凯明大神的团队提出的,用于解决深度学习模型因深度加深而导致的“退化”问题。由于网络深度增加后,梯度消失或者爆炸的问题就会接踵而来,因此模型达不到很优的收敛效果。关于梯度爆炸与消失的问题,可以参考博客详解机器学习中的梯度消失、爆炸原因及其解决方法。针对这个问题,作者提出了一个残差(Residual)的结构,如下:

对于一个简单的 block , 当输入为 x 时其学习到的特征记为 H(x) ,作者通过增加了一个恒等映射(identity mapping),将所需要学习的 H(x) 转换成学习残差 F(x)=H(x)-x 。这一想法源于图像处理中的残差向量编码,通过一个reformulation,将一个问题分解成多个尺度直接的残差问题,能够很好的起到优化训练的效果。除了上图中常规的残差结构外,针对于更深层的 ResNet 网络,还有如下的变体:

该结构的目的主要是为了降低模型的计算和参数量,使模型具有深层的语义表达能力的同时,兼具较快的速度,有利于实际应用需求。常见的 ResNet 网络结构有 18, 34, 50, 101, 152 层,详细如下:

从该表可以看出,ResNet 的结构可以分为 conv1,conv2_x,conv3_x,conv4_x,conv5_x ,共 5 个部分,每个部分的残差结构数目各不相同。关于其层数计算,拿 101 层的网络为例,每层的 block 数目为 conv2_x:3, conv3_x:4,conv4_x:23,conv5_x:3,共计 33 个 block, 再加上 conv1 和模型最后的 FC 层,为 101 层网络。

以下是收集的有关 CNN 网络的论文和博客等资料。

LOSS

人脸识别中所用的 LOSS 真的是百花齐放,从最基础的 SoftMax 到加入各种 trick 的 ArcFace, 从欧氏距离到余弦距离,从无 Margin 到加入 Margin。整理了一下,大概有如下几种:

  • L2-softmax: L2-constrained Softmax Loss for Discriminative Face Verification

    原始的 softmax 未优化提取的人脸特征,而 L2-softmax 添加了一个 L2 约束,使得类内的距离减小。实验结果:在 LFW 上的准确率达到 99.78%, YTF 上的准确率为 96.08%。

    该方法主要针对输入到 Loss Layer 的数据先做一步归一化的操作,然后对该归一化的值放大 α 倍,最后使用普通的 Softmax 函数进行计算。

  • Contrastive Loss: Dimensionality Reduction by Learning an Invariant Mapping

    主要是用在降维中,即本来相似的样本,在经过降维(特征提取)后,在特征空间中,两个样本仍旧相似;而原本不相似的样本,在经过降维后,在特征空间中,两个样本仍旧不相似。在人脸识别中,DeepID 运用了该 loss,结合 Softmax + Contrastive Loss 在 LFW 上的准确率为 99.53%。更多关于 DeepID 的介绍可以参考 Deep learning face representation from predicting 10,000 classes

    该方法主要通过输入两张不同的人脸图像,若为相同的人,即 yij = 1, 就让其 loss 尽可能小, 若未不同的人,即yij = -1, 则让特征之间的距离大于一个固定的间距 m。

  • Triplet Loss: FaceNet: A Unified Embedding for Face Recognition and Clustering

    该 Loss 主要用于优化人脸识别模型,对于输入到模型中的若干个人脸图像,提取其特征并计算相互之间的欧氏距离,选择特定的三元组(a, p, n), 优化类内和类间的距离。FaceNet 仅仅使用 128 维的特征,就在 LFW 上达到了 99.63% 。Triplet Loss 针对于人脸认证的场景可以有较好的提升,强力推荐一波。
    三元组的选取规则为,随机从训练样本中取一个样本,标记为 anchor, 然后再随机选取一个与 anchor 同个类别的样本,标记为 positive, 最后随机选取一个不同类别的样本,标记为 negative。关于三元组的选取规则,里面还可以有很多 trick,通过按样本特征之间的距离选取来替换随机的方式可以有更显著的效果。三元组的损失函数如下:

    triplet loss 选用的为欧式距离,附加一个 α 用于增大类别之间的距离,需要说明的是,公式末尾的 ‘+’ 表示当计算值大于 0 时,该值即为损失值,小于 0 时,损失值为 0。tirplet loss 的缺点为选取三元组的操作复杂繁琐,实现困难。

  • Center Loss: A Discriminative Feature Learning Approach for Deep Face Recognition

    Center Loss 为每个类别都学习一个分类中心,并将每个类别的所有人脸特征都聚集到其对应的类别中心,即使得类内更加紧凑。作者仅使用 0.7 M 的训练样本,7 层的 CNN 在 LFW 上达到了 99.28% 的精度。

    但是该 loss 并不能直接使用,因为对于庞大的训练集而言,要兼顾到所有类别样本的特征是非常低效的。所以作者进行了两个改变,一是基于小批量更新类别中心,每次迭代通过单次迭代每个类别样本的平均特征来更新对应的中心值,二是为了避免少量错误样本导致类别中心波动幅度较大,通过一个标量 α 来控制它的更新学习率。类别中心的更新公式如下:

    δ 函数为当条件满足时返回1, 不满足则返回0, α 的值为[0,1]。最终作者联合了 softmax loss 和 center loss,使得该 loss 可以用于 CNN 网络模型的训练,公式为:

    该 loss 的缺点为,需要为每一个类别保留一个类别中心值,当类别数过大时,需占用的内存较大,对 GPU 的要求很高。

    开源地址:https://github.com/ydwen/caffe-face

  • NormFace: L2 Hypersphere Embedding for Face Verification

    NormFace 从人脸特征的归一化来考虑人脸的分类问题,它对 softmax 添加了2个限制,分别为特征和权重矩阵参数 W 的归一化。因为对于普通的 softmax loss 而言,loss 的大小与特征的模长相关,若一个样本分对了,softmax 继续优化的时候会朝着特征的模增长的方向,但对于整体的分类性能来说并没有很大的意义。且在实际的人脸识别应用中,使用的一般是 cosine 或者欧氏距离,也会导致优化的方向与最终的应用不一致。因此 NormFace 为了限制 softmax 的优化方向,对特征和 W 进行归一化,让 loss 更关注类中心的夹角。作者定义的归一化层为:

    反向传播的梯度更新如下:

    但直接使用归一化层,而不做其他处理时,模型的 loss 将会变得很小,导致模型无法收敛。这是由于使用了归一化层后,直接优化余弦距离,而余弦距离的范围在[-1,1]之间,相比于普通的 softmax loss,这个值通常可以达到(-80,80)。最后作者假设每个类别都有相同的样本数,且完全分离,且对归一化后的特征和权重都乘以一个放大值 L,最终改进的 softmax loss 的公式如下:

    其中 s = L^2, 作者推荐使用自动学习的方式来设定该值。

    开源地址:https://github.com/happynear/NormFace

  • Coco Loss: Rethinking Feature Discrimination and Polymerization for Large-scale Recognition

    Coco Loss 与 NormFace 的思路是一样的,都是为了解决同一个问题,这里就不再说明了。

    开源地址:https://github.com/sciencefans/coco_loss

  • L-softmax: Large Margin Loss: Large-Margin Softmax Loss for Convolutional Neural Networks

    前面介绍的 loss 都是为了拉大分类中心之间的距离,而接下来的 loss 还考虑了人脸识别中另外一个非常重要的问题,就是类之间的距离。NormFace 在优化的时候,若分类正确,就不会再继续压缩类内的间距,对于数量庞大的人脸识别来说,让每个类别的特征都尽可能的靠近,是最优的情况。于是就产生了 Margin 这个超参数。
    第一个比较重要的工作是 L-softmax(Large-Margin Softmax),它的意思是在做分类时,希望不同的类之间能够区分得更开,把同一个类压缩得更紧,但它跟之前的思路有一定的相似性,但并没有通过额外的限制来做,它深入分析了 softmax loss 的形式,直接对这个形式做了精细的改动,把其中的cosθ改成了cosmθ,起到了增加 margin 的效果。其定义如下:

    其中,m 是一个与分类 margin 密切相关的参数,其值越大,类别之间的 margin 也就随之增大,但是训练将会愈加困难。此外,为了简化前向和反向传播,作者构造了一个特定的 ψ(θi) 函数:

    其中, k ∈ [0,m−1]。

    开源地址:https://github.com/wy1iu/LargeMargin_Softmax_Loss

  • A-Softmax loss: SphereFace: Deep Hypersphere Embedding for Face Recognition

    Asoftmax 是在 L-softmax 的基础上进行了微小的改进,增添了两个限制条件:一是 W 的 norm 必须是一个固定的值,例如 1,二是偏置项直接设为0。但是该方法的预测仅取决于 W 和 特征之间的角度,比较难优化。作者提出的 A-Softmax loss 定义如下:

    A-Softmax loss 与 L-softmax 一脉相承,同样训练难度较大,因此实际应用中,通常先使用普通的 softmax loss 进行训练,再慢慢转移到带有 margin 的 A-Softmax loss 进行优化。

    开源地址:https://github.com/wy1iu/sphereface

  • AAM: Face Recognition via Centralized Coordinate Learning

    AAM Softmax 提出了自适应参数 η ,针对不同的角度差异设置不同的值,对于大角度差异系数值设定较小,而小角度差异系数需要足够大才能保证 margin 的宽度。但单独使用 AAM softmax 不稳定,需要和 softmax 一起使用。其定义如下:

    从公式可以看出 AAM softmax 与 A-Softmax 类似,只是将其中的固定参数 m 转变成了一个根据角度可变的值 η。 η 的具体取值方式如下式所示:

    当然,由于其增大类别之间的 margin 的方式依然为相乘的方式,直接训练难以收敛,作者加入了一个带权重的 softmax loss 用于平衡 AAM softmax loss。具体的形式如下:

    其中, λ 为常数,用于平衡两个 loss 的权重,通过实验,作者将其设置为 3。

  • AMSoftmax: Additive Margin Softmax for Face Verification

    AMSoftmax 增大类别之间的 margin 的方式是改变 A-Softmax loss 中对 θ 乘以 m 的方式,转换为 cosθ - m。模型的输入经过特征和权重的归一化后,实际上可以化为:

    因此 Ψ(θ) = cosθ − m 可以简化成 Ψ(x) = x − m,这也使得在反向传播时无需再计算其梯度, 因为 Ψ'(x) = 1。AMSoftmax 的最终计算公式如下:

    AMSoftmax 采用固定尺度因子 s=30, m 可以设置为 0.35 或 0.4 以获得较优的性能。相比于 A-Softmax 性能有一定的提升,且由于其对特征进行了归一化,训练的难度也降低了,可以直接使用其进行模型的训练。

    开源地址:https://github.com/happynear/AMSoftmax

  • ArcFace: Additive Angular Margin Loss for Deep Face Recognition

    ArcFace 的论文总结了这一系列的 margin 方法,做了许多对比实验,其主要思路与 AMSoftmax 相似,将 Ψ(θ) 改为了 cos(θ + m),同样对特征和权重作了归一化处理,采用固定尺寸因子 s=64。其 loss 公式如下:

    ArcFace 论文中给出的不同 loss 在常见测试集上的性能比对:

    最后强烈推荐一波 insightface 开源人脸识别项目,性能强大,基于 mxnet 框架,速度快,占用显存小。

    开源地址: https://github.com/deepinsight/insightface

数据集

Train Dataset

num_id dataset person number image number url
1 CASIA-WebFace 10,575 494,414 https://drive.google.com/file/d/1Of_EVz-yHV7QVWQGihYfvtny9Ne8qXVz/view, or http://www.cbsr.ia.ac.cn/english/CASIA-WebFace/CASIA-WebFace_Agreements.pdf
2 CelebA 10,177 202,599 http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
3 UMDFace(still images) 8,277 367,888 http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
4 UMDFace(video frames) 3,107 3,735,888 http://umdfaces.io/
5 VGGFace2 9,131 ~3,310,000 http://www.robots.ox.ac.uk/~vgg/data/vgg_face2/ need register
6 MS-Celeb-1M ~100,000 ~10,000,000 https://www.msceleb.org/celeb1m/1m not accessible
7 DeepGlint(MS-Celeb-1M-v1c) 86,876 3,923,399 http://trillionpairs.deepglint.com/data need register
8 DeepGlint(Asian-Celeb) 93,979 2,830,146 http://trillionpairs.deepglint.com/data need register
9 IMDB-FACE ~59,000 ~1,700,000 https://github.com/fwang91/IMDb-Face#data-download only url
10 CELEB-500K ~500,000 ~50,000,000 https://github.com/JiajiongCao/CELEB-500K only url, not recommended
11 MegaFace 672,057 4,753,520 http://megaface.cs.washington.edu/dataset/download_training.html need request

Validation Dataset

num_id dataset person number image number url
1 CFP-FP 500 7,000 http://www.cfpw.io/
2 AgeDB-30 570 12,240 https://ibug.doc.ic.ac.uk/resources/agedb/
3 LFW 5,749 13,233 http://vis-www.cs.umass.edu/lfw/#views
4 CALFW 5,749 13,233 http://www.whdeng.cn/CALFW/index.html?reload=true
5 CPLFW 5,749 13,233 http://www.whdeng.cn/CPLFW/index.html?reload=true

Video Test Dataset

num_id dataset person number video number url
1 YTF(YouTube Faces DB) 1,595 3,425 https://www.cs.tau.ac.il/~wolf/ytfaces/
2 IQIYI_VID_DATA -- -- http://challenge.ai.iqiyi.com/

参考资料

——无善无恶心之体, 有善有恶意之动, 知善知恶是良知, 为善去恶是格物
原文地址:https://www.cnblogs.com/danpe/p/10598035.html