揭秘人脸识别--当前人脸识别的最佳实践

     本文翻译自Demystifying Face Recognition,其总结和实践了迄今为止人脸识别领域众多的trick

     在网上和研究论文中可以看到很多有关人脸识别相关的文章,大多数都只是介绍或者解释一些新的技术而没有更深入的讨论。当然也有一些开箱即用的开源库,而且还取得了不错的结果,其中的代表就是 OpenFaceDLib 和 FaceNet。但是如果这些已有的算法不能满足我们的需求时怎么办呢?有没有提升性能的方法呢?那些方法真的有效吗?由于充斥着大量的文章,没有统一的处理流程,并没有很多系统分析的信息。
      在本文中我们试图通过调研直到2017年的文章去改变这个现状。我们将会展示那些能够提升性能的方法,验证作者的想法并且回答那些困扰我们已久的问题。最近几年出现了很多人脸识别相关的方法,我们希望能够覆盖这些,比如 

    • TripletLoss
    • CenterLoss
    • LargeMarginSoftMax
    • L2 normalization
    • Cosine-Product vs Inner-Product
    • Face Specific Augmentation
    • Learning using 3D model
    • Multi-Task Loss

        我们希望这些评估能够对其他和人脸识别相近的任务同样有效,比如图像检索、一眼分类。首先让我们看下人脸识别相关的评估,幸亏有了它们,我们才能验证改进是否对整个系统有效。
人脸识别评估标准
        作为机器学习的一部分,人脸识别已经出现了相当长的时间了,但直到2008年才有快速的发展,其中一个主要的原因就是出现了一个叫做 LFW 的基准(非自然场景标注人脸),和之前最大的区别就是它的图片来自于自然场景而不是特定的环境。主要的测试是基于判断两张图片是不是同一个人。现在很多算法能够轻易达到近乎完美的水平,大约是99.5%。但是这么好的成绩并不能保证在实际应用中取得更好的性能。这也是他的扩展版本名为BLUFR提出的原因,BLUFR包含两个测试,在固定错误接受率下的验证准群里以及更为接近产品形态的识别协议。
        在2015的论文中提出了一个名为 IARPA Janus Benchmark A 的评估库,它和BLUFR很相似,但是确实基于模板图的。每个模板是基于数个标准,最大的区别在于图像的质量和难度。此外,在测试中的图是从视频中抓取的,相比单幅图像要有更低的质量。作者还试图通过为每个人建立模板而不是独立的互相比较。模板取决于用户的姿态,可以选取为最小、最大或者特征的平均值。

图片

         此外,在2017年还引入了IJB,不仅仅是测试图片数量更多了,还引入了新的评估协议以及人脸聚类协议。
最后再来看下 MegaFace,正如名字所述,这是一个大规模人脸识别基准(类似于图像分类中的ImageNet),包含超过一百万张图片(远比lfw和IJB要多的多)。它由三部分组成,混淆集,以及用来测试普通场景的facescrub和用于测试年龄变化影响的FGNet。和其他已知的基准一样,它也包含两个协议:验证(超过40亿对人脸)和识别。在挑战1中,研究者可以根据训练集的大小徐拿着两个不同的(小规模,小于50万张图或者反之大规模)。在2016年引入的挑战2中,参赛者必须使用同样的训练集,包含大约五百万张图,这么做的目的是为了测试网络结构和算法本身而不是数据集,而在挑战1中每个人都可以使用它们自己的数据集。
         但是基准集之间如何比较呢?在一个测试上好在另一个上表现如何呢?论文A Light CNN for Deep Face Representation with Noisy Labels给了一个很好的参考。分析结果不难发现,在大多数基准上提升是差不多的,但是也有一些例外,比如,在lfw上仅高0.5%的模型在BLUFR上可能就会高出20%。如果想看我们的模型是否有细微的提升,那么应该选择更难的基准,比如说BLUFR。
人脸识别新技术 
        人脸识别主要的方法都是基于深度学习的,研究者们在争夺更大的训练集、新的结构和损失函数来获取更好的性能。当前最好的人脸识别技术来自于 Vocoord,它是MegaFace的冠军以及NIST的亚军。但是不幸的是我们无从知晓他们或得如此高分数的细节。但是仍然有相当多的研究者公开了他们的方法,其中一些甚至能在lfw上取得高于99.5%的成绩。一些是通过大的训练集在超过二百万张图上训练,另外一些试图去改变流水线(数据准备)或者添加新的损失函数(比如说centerloss)。然而,他们中的大多数都只是在自己的流水线上才有提升,不同的研究者之前很难比较,因为我们不能清晰的获取学习中的结果,比如说:

人脸应该怎样做预处理?

什么样的数据增强是有效的?

什么样的附加特征有效?

什么损失函数最好?

        这是由于每个研究者都使用了自己的一些概念来提升模型,但是实践者更希望知道当前技术的限制,因此在可控条件下验证这些想法就变得非常重要。很多私人公司有这些知识,但是他们不想公开这些秘密。
      SphereFace提供了当前lfw上的结果,很有意思的是它还给出了训练集的大小以及网络结构的数量。
 

扫描二维码关注公众号,回复: 3184191 查看本文章

图片


       虽然这并不是所有可用的结果,但是确实给了现有算法的总体性能。目前lfw上最好的记过是99.83%由Glasix公司获得,他们这样描述自己的方法的:

We followed the Unrestricted, Labeled Outside Data protocol. The ratio of White to Black to Asian is 1:1:1 in the train set, which contains 100,000 individuals and 2 million face images. We spent a week training the networks which contain a improved resnet34 layer and a improved triplet loss layer on a Dual Maxwell-Gtx titan x machine with a four-stage training method.

      如果你想获得更多的结果,参考如下链接:

本文的目的 


        本文的目的是建立人脸识别所有获得基准集上最高分数公开可用的算法。
        为了获取有竞争力的结果,我们将会测试如下想法:

数据预处理

数据增强技术

损失函数

优化算法

选择网络结构

       为了能在实验中获取确定的结论,限制以及初始的假设是很有必要的:

限制:

算法在 CASIA-WebFace 训练,它有一万人的五十万张图

90%用来训练,10%用来验证

       在测试时每张图片仅提取一个特征(所以不会使用镜像trick) 

              只使用一个模型,所以不会有多个模型间的特征融合
              初始学习率选定在 0.1, 0.04, 0.01, 0.001
        为了降低学习率,将会检测是否已达到平台期
   初始的假设
        CASIA使用MTCNN算法
        基本的数据增强手段是镜像

 



     数据集的大小以及输入图片是为了抱枕高质量的方法,同时减少所需的时间,以及获取最终结果的时间和有限的计算能力。为了判别方法的好坏,将会考虑两个结果:lfw和lfw-blufr(他们同样的图片有同样的特征)。此外对于最好的模型还会在IJB-A和MegaFace上测试。IJB-A所需的模板图是由均值得到的。
     每个实验都将和选择的使用简单方法的基准(数据->网络结构->损失)比较,这将允许我们来评估提出的方法是否真的有效。然而这种方式并不总是完美的,有时候只有当各个要素组合在一起的时候才会生效。不幸的是本文会丢掉这些信息。因此,在所有的实验完成后,还有有一个大规模实验来获得最好的结果。但是我们会从那些对最终结果影响不大厉害的因素开始,此外,我们还会测试自己的注意来验证他们是否合理。
     每个类型的实验都会有一个报告,长度取决于相关的主题,我们最终希望这能形成大约4-5个报告。

图片


    我们将会从上图中所有处理的开始进行实验,首先是数据准备和预处理,然后通过数据增强来尝试获取更好的结果,接下来是各种损失函数,最后利用我们所获取的知识来调节网络结构。
    大概就是这么多,我们希望你能明白上述的每个步骤。我们先来实现下基准方法,以后所有实验的基础。
基线
    根据假设,数据库选定了(CASIA-WebFace),输入图片通过MTCNN检测人脸,并且只使用镜像来增强数据,并且使用交叉熵损失来优化,那么流水线最后一个要素就是网络结构了。过去的几年里我们不断的听到各种各样不同的想法比如说ResNet, Inception or DenseNet,此外人脸识别社区还引入了他们自己的网络结构,比如
FaceResNet, SphereNet, LightCNN or FudanNet。目前我们只考虑那些我们知道性能以及对计算能力要求不大高的结构。我们还会考虑那些老一些的结构比如LeNet, DeepID,** DeepID2+** and CASIA以此来分析2014年以后的结构是否真的有效。
    这并不是最终的结构选择,我们只是想得到一个合理的基准结构,这可以用来帮助我们进行其他的测试。由于有太多的实验要做,我们只是希望单签的流水线工作的很好并且我的实现能够达到论文中描述的性能。
网络结构概述
LeNet - 最流行的卷积神经网络结构. 输入: 28x24.

DeepID - One of the first specialized networks used for Face Recognition. Comparing to LeNet, it have more filters and final feature comes from merging data from two layers. Input image: 42x36.

DeepID2+ - Extension of DeepID, have much more number of filters and features size is now 512. Input image:56x48.

Casia-Net - Architecture proposed after success of VGG and GoogLeNet. It use concept of kernel 3x3 and Average Pooling.

Light-CNN- The author propose to use MFMas a activation function, which is extension of MaxOut. In his experiments it is better than ReLUELU or even PReLU.

FaceResNet - Architecture proposed by author of CenterLoss and RangeLoss, which use residual connection, like in ResNet. But it does not use BatchNorm and replaces the Relu activation functions with the PRELu functions.

SphereFace - New version of FaceResNet which mainly replace each MaxPool by Convolution with stride equal to 2.

Fudan-Arch -Idea of FaceResNet but with Batchnorm.

    上面大多数结构还都包含了Dropout,而另外一些还包含了正则化方法。如果我们只是按照论文的描述由于设置的不同会造成无法比较。这也是为什么我们忽略特殊正则化方法(比如centerloss)并且有每个网络结构有两组结果的原因。这还能帮助我们验证当前实现的有效性。为了评估每个网络我们还使用多个结果和训练所需的时间。每个网络结构将会选择最低loss的结果,这也意味着尽管另一个epoch在lfw上有更高的识别率也不会被选择。
结果
 

Name Validation Loss Validation Accuracy LFW LFW Blufr1 -Rank1 LFW Blufr2-FAR 0.1% Time per Epoch Epoch to best val loss Time to covnverge J
1 LeNet 4.905 29% 83.4% 3.11% 9.32% 1.5m 29 44m  
2 LeNet-dropout 6.094 14% 83.6% 1.63% 7.23% 1.5m 29 44m  
3 DeepID 2.98 54.5% 89.4% 11.63% 33.87% 1.5m 20 30m  
4 DeepID-dropout 3.13 46.4% 91% 14.40% 45.11% 1.5m 28 42m  
5 DeepID2+ 2.32 67% 91.1% 21.12% 45.43% 2m 13 26m  
6 DeepID2+-dropout 1.62 75.5% 94% 37.71% 70.39% 2m 29 1h  
7 CasiaNet 1.53 77% 96.7% 41.39% 80.73% 8m 18 2.5h  
8 CasiaNet-dropout 1.3 81.1% 97.1% 50.78% 86.72% 8m 33 4.5h  
9 FaceResNet 1.34 81.7% 96.76% 52.94% 80.11% 16m 9 2.4h  
10 FaceResNet-dropout 1.02 86.9% 97.76% 64.39% 89.11% 16m 13 3.4h  
11 Light-CNN9 2.11 71.2% 94.1% 33.21% 66.72% 9m 12 1.4h  
12 Light-CNN9-dropout 1.18 84.2% 97.6% 56.53% 87.87% 9m 29 4.4h  
13 Light-CNN29 1.563 78.9% 96.3% 40.04% 79.33% 20m 9 3h  
14 Light-CNN29-dropout 1.098 86.5% 98.31% 58.26% 91.75% 20m 31 11h  
15 SphereFace-20 1.59 79.2% 96.2% 48.63% 77.21% 11m 11 2h  
16 SphereFace-20-dropout 1.078 86.1% 97.65% 60.71% 87.68% 11m 16 3h  
17 SphereFace-64 1.26 83% 96.8% 57.23% 84.28% 35m 11 6.4h  
18 SphereFace-64-dropout 0.979 87.4% 97.75% 66.59% 90.67% 35m 16 9.4h  
19 Fudan-Fast 1.14 83.7% 97% 49.39% 83.42% 17m 8 2.2h  
20 Fudan-Fast-dropout 0.943 88.2% 98% 63.40% 90.00% 17m 20 5.6h  
21 Fudan-Full 1.13 85.5% 97.65% 60.23% 86.81% 40m 25 16.6h  
22 Fudan-Full-dropout 0.93 88.4% 98.1% 63.05% 90.11% 40m 21 14h

    首先让我们看下使用了Dropout的机构,这里没有明显的赢家,Fudan-Full, SphereFace64 and Light-CNN29总体上是可比的,它们每个都有一个指标最好(validation loss, LFW, BLUFR)。和它们很接近的FaceResNet,训练则要快的多。很有意思的是在lfw上获得97%性能的网络直到BLUFR上才看出差距。例如,CASIA和SphereFace64在flw仅有0.7%的差距在BLUFR上被放大成了16%。
    那没有使用Dropout的结构呢?很明显赢家是 Fudan-Full,接下来是SphereFace64 and FaceResNet。正如自觉上所示,它们的结构帮助完成了正则化。从这些比较中我们可以推断什么结构适合测试数据和新的损失函数,因为它能给我们展示细微的改进。在我们的测试中是Light-CNN29 ,它过拟合了还。
    为了更细致的分析,我们选择了FaceResNet, Light-CNN29, SphereFace64 and FudanFull.
                   IJB-A

Name TAR@FAR 0.01% TAR@FAR 0.1% TAR@FAR 1% TAR@FAR 10% Rank-1 Rank-5
1 FaceResNet-dropout 53.04±5.37 71.90±3.02 84.45±1.42 93.14±0.77 91.37±0.95 95.71±0.62
2 Light-CNN29-dropout 55.72±11.13 73.02±5.46 86.75±1.42 94.41±0.78 91.37±1.19 96.29±0.90
3 SphereFace-64-dropout 54.93±7.75 72.75±5.08 86.02±1.11 93.89±0.71 92.09±1.20 95.98±0.60
4 Fudan-Full-dropout 21.97±13.40 40.92±8.88 71.69±3.45 93.17±1.03 88.93±1.55 94.30±1.20

   总体上而言 Light-CNN29 获胜了,它只在Rank-1上差了一点点。但是 SphereFace64有所下降,而FundanFull 表现确实相当糟糕,目前还不知道是什么原因造成的。
              Mega Face

Name Rank-1 VR@FAR=10−6
1 FaceResNet-dropout 53.55% 61.80%
2 Light-CNN29-dropout 53.37% 64.70%
3 SphereFace-64-dropout 54.13% 63.31%
4 Fudan-Full-dropout 55.84% 57.24%


在MegaFace上识别协议是FudanFull,而比对协议是 Light-CNN29好。


    综上所述,如果选择测试中最好的网络的话是Light-CNN29,接下来是Sphere64。FudanFull也不错,但是在某些场景会变成很糟糕。仔细的分析这些网络结构就会发现,共同的因素是使用了残差链接。但是他们的激活函数缺各不相同,有的用池化,有的用步长为2的卷积还有的用batchnorm。当我们把这些结果和论文实现进行比较的时候大多数还是非常吻合的,一个例外就是SphereFace,如果不使用Dropout的话会过拟合,尽管原论文并没有使用。
    当考虑到训练所需的时间时,很明显FaceResNet优势很大,它只比最好的模型稍差,但是训练时间却是3倍短,这也是为什么FaceResNet被选作基线的原因,它将会伴随我们整个实验流程。特别的,根据场景需要两个版本的FaceResNet都会用到,为了减少新技术的过拟合时会选用原始的结构,否则就是使用带Dropout的版本。

数据噪声的影响

训练数据不能超过10%的噪声

如果能够获得低于10%噪声的数据的话,很值得去做这件事情

通过添加随机干扰扩充训练集并不是一个好的主意


数据对齐的影响

1.什么对齐方法是最好的?我们应该在乎它吗?

最好的方法是Spherface提出的

2.应该给图片添加多大的pad呢?

不超过20个像素

3.我们应该使用什么变换呢?

相似变化

4.关键点的质量真的重要吗?

当你使用5个点的时候,对最终结果没有太大的影响

5.标准脸上关键点的数量和位置对精度有影响吗?

影响很大

6.是否可以通过学习的方式来实现人脸对齐?

STN表明可以,它能获取略低于SphereFace的精度

数据增强总结

1.放仿射变换确实是一种有效的方法,推荐在你的每个任务中使用裁剪、缩放和旋转或者一次性全上

2.Dropout/随机擦除是一种有效的方法,可能帮你获得最好的模型

3.混合图像强度是一个非常强的正则化,一般只有当你的模型足够好的时候来说会帮你获得更好的模型

4.颜色变换不能提供性能上的提升,不要寄太多期望

5.组合几种不同的方法提供更好的结果,但是要把他们当做超参数谨慎的对待

1.http://blcv.pl/static/2017/11/07/demystifying-face-recognition-i-introduction/
2.http://blcv.pl/static/2017/11/08/demystifying-face-recognition-ii-baseline/
3.http://blcv.pl/static/2017/11/09/demystifying-face-recognition-iii-noise/
4.http://blcv.pl/static//2017/12/28/demystifying-face-recognition-iii-face-preprocessing/

猜你喜欢

转载自blog.csdn.net/minstyrain/article/details/82563460