人脸入门

目前在学习论文SphereFace:Deep Hypersphere Embedding for Face Recognition.将一些预备知识总结与本文。

一. 数据集部分

1.CASIA-WebFace

来源:Learning face representation from scratch

共有10575个不同个体,一共494414张面部图像。

2.VGG faces

来源:Deep face recognition 2015年的BMVC论文。下载地址:http://www.robots.ox.ac.uk/~vgg/data/vgg_face/ 

数据集说明:2622个id。

版本2:9131 id。同上下载地址。

3. CelebA数据集

来源:Deep learning face attributes in the wild

介绍:CelebA是CelebFaces Attribute的缩写,意即名人人脸属性数据集,其包含10,177个名人身份的202,599张人脸图片,每张图片都做好了特征标记,包含人脸bbox标注框、5个人脸特征点坐标以及40个属性标记,CelebA由香港中文大学开放提供,广泛用于人脸相关的计算机视觉训练任务,可用于人脸属性标识训练、人脸检测训练以及landmark标记等,官方网址:Large-scale CelebFaces Attributes (CelebA) Dataset

4. CACD 2000数据集

来源:Face recognition and retrieval using cross-age regerence coding with cross-age celebrity dataset

介绍:数据集包含2000名年龄在16岁至62岁之间的名人的16万多张照片。共有163,446 images 。

下载地址:http://bcsiriuschen.github.io/CARC/  (我的网盘也有)

5. LFW数据集(人脸比对数据集)

来源:Labeled faces in the wild:A database for studying face recognition in unconstrained environments

 
无约束自然场景人脸识别数据集,该数据集由13233多张全世界知名人士互联网自然场景不同朝向、表情和光照环境人脸图片组成,共有5749人,其中有1680人有2张或2张以上人脸图片。每张人脸图片都有其唯一的姓名ID和序号加以区分。
LFW数据集主要测试人脸识别的准确率,该数据库从中随机选择了6000对人脸组成了人脸辨识图片对,其中3000对属于同一个人2张人脸照片,3000对属于不同的人每人1张人脸照片。测试过程LFW给出一对照片,询问测试中的系统两张照片是不是同一个人,系统给出“是”或“否”的答案。通过6000对人脸测试结果的系统答案与真实答案的比值可以得到人脸识别准确率。

下载:http://vis-www.cs.umass.edu/lfw/index.html#download 

二. 预处理部分

对包含人脸的图像进行人脸框识别人脸对齐人脸剪裁。目前我整理了三种方式来得到裁好的人脸:

  • 利用https://github.com/RiweiChen/FaceTools可以一步到位直接得到处理好的结果(但是只能在win下使用,python2下使用稳定,但是漏检人脸还不少
  • 根据香港中文大学提供的人脸框检测和人脸特征点检测的windows二进制程序实现。 http://mmlab.ie.cuhk.edu.hk/archive/CNN_FacePoint.htm
  • 利用 MTCNN 算法来识别框和人脸关键点landmarks。这需要进一步处理,即根据landmarks得到一个变换矩阵,再将变换后的图像裁剪出来。(Pytorch实现,漏检好像很少,但一小部分结果不太精确

暂时来看,方法3)还是相对可取的。 

三. SphereFace代码(Pytorch)的研究

1)数据预处理的问题

代码train.py中的src_pts用来存放landmarks,然后利用函数alignment(img,src_pts)实现对齐后的结果。注意代码提供的landmarks的顺序和MTCNN算法提供的顺序略有不同。而且数值大小而有些偏差。我通过几个例子发现代码提供的landmarks比我利用 MTCNN 算法检测到的landmarks更准确一些。说明方式3)不是最准确的实现方式。暂时不讨论准确与否,这里说明一下具体差别:

例如在D:人脸代码sphereface_pytorch-masterdata中的casia_landmark.txt文件,第一行为:

0000045/001.jpg 0 96 114 151 104 127 139 110 176 154 170

共有12个元素。第一个为图像名,第二个为图像ID,剩下10个元素,分别为左眼,右眼,鼻子,左嘴,右嘴的landmark坐标。

所以src_pts的内容是:【【96,114】,【151,104】,【127,139】,【110,176】,【154,170】】

而MTCNN的组织方式是直接产生landmarks:

array([[ 91.47854 , 152.12856 , 125.03657 , 107.52206 , 157.33965 ,
        114.140945, 104.736916, 138.18289 , 178.11989 , 169.56583 ]],
      dtype=float32)

所以相应的src_pts应该按列来取:【【91.5,114.1】,【152.1,104.7】,【125.0,138.2】,【107.5,178.1】,【157.3,169.6】】

可以看到还是有一些数值上的差别。另外,利用这个pytorch版本的MTCNN对0000045/005.jpg 进行检测时,发现误差特别大,所以这个代码还是不要用做训练预处理的好。

但目前好没有找到作者提供的andmarks的具体实现方式。

2)数据数目问题

在casia_landmark.txt中,只有 454590 images of 10574 identites。和最初的数据10575个不同个体,一共494414张数据不同。我觉得作者可能做了一些筛选吧。

四. 评价指标

FAR    TAR      TAR @ FAR=0.00100

虽然跑库的时候我们一般还是看Accuracy或者Recall,不过其实实际应用的时候更多的是会用TAR(True Accept Rate)和FAR(False Accept Rate)。

FAR = frac{非同人分数>T}{非同人比较的次数}  \

这个指标的意思是我们拿一对不同的人的照片去测试的时候,如果两个人的特征向量之差超过了设定的阈值(也就是把这两个人认成了同一个人)的次数比上所有不同的人的pairs的对比次数。也就是把不同的人识别成同一个人的概率啦。当然是越小越好

那么TAR则是表示正确接受的比例。就是同一个人的照片被判别为同一个人的概率。

TAR = frac{同人分数>T}{同人比较的次数} \

一般我们会计算的是在FAR为多少(比如 10^{-3} )的情况下TAR为多少


来源:知乎

TAR @ FAR=0.00100
我们阅读论文的时候经常看到,TAR = ** @ FAR=0.00100 这样的算法性能报告,意思是说在FAR=0.00100的情况下TAR=**。之所以采用这种形式是因为在不同的FAR下度量的TAR是会不同的。我们可以考虑,增大相似度阈值T的话,可以减小FAR使错误接受的比例降低,但是同时,TAR也会减小,FRR会增加,使错误拒接的比例增加。这相当于提高了标准,会有更少的图像对满足相似度的要求。相反,减小相似度阈值T的话,可以增大TAR使正确接受的比例增加,FRR会减小是错误拒绝的比例减小,但是同时FAR也会增加,使错误接受的人增加。
我们考虑极端情况,相似度阈值T设置为1,这样的话,所有的人都将被拒绝,绝对不会发生错误接受,也不存在正确接受,FRR=1,FAR=0,TAR =0。相反,可以把相似度阈值T设置为0。
所以可以看到在报告TAR时,必须说明FAR=0.00100才是有意义的,否则的话,我把FAR设置为1(所有不同的也被全部接受),我的算法的TAR就能达到1。
一般在评价算法的性能时,我们会统计 FAR=0.001/FAR=0.01时,FRR的值作为参考。FRR值越小,TAR越大, 性能越好。
来源:CSDN

五. 实现细节

arcface等具体实现中,将BN层的参数分离出来不进行权重衰减,为了提高泛化能力。

# separate batch_norm parameters from others; do not do weight decay for batch_norm parameters to improve the generalizability

六. 训练trick

  • 标签平滑mixup操作来降低过拟合问题
  • IBNnet,ABN(Adaptive Batch Normalization)
  • IdependentComponent(IC)层。
  • BN和dropout的结合使用:https://zhuanlan.zhihu.com/p/33101420、 界 | 如何通过方差偏移理解批归一化与Dropout之间的冲突。 一般而言同时利用dropout和BN会导致性能下降。但比较有意思的是 Wide ResNet(WRN),若在每个 Bottleneck 的两个卷积层之间加上 Dropout,性能却可以得到稳定的提升。解决方案:

    第一个方案比较简单,不过在现代主流网络的实现里面似乎都没有了,记得BN没出来以前好像大家也都这么做过,就是拒绝“variance shift”,把Dropout放在所有BN层的后面就完事了。鉴于现在所有BN层之后其实没什么层了,基本就到输出了,所以统一放在softmax前的最后一层上。对于CIFAR10总体比较有效,在CIFAR100上较小的drop ratio起到了作用。另外作者发现去年ImageNet的冠军SENet里面也用到了这个技巧,他们在最后一层采用了0.2的Drop ratio,作者做了测试,的确是有接近0.2个点的稳定提升。 顺带把ResNeXt和ResNet-200这几个也做了,同样也很稳定。

    第二个方案启发自Dropout原文里提到的一种高斯Dropout,是对Dropout形式的一种拓展。作者进一步拓展了高斯Dropout,提出了一个均匀分布Dropout,这样做带来了一个好处就是这个形式的Dropout(又称为“Uout”)对方差的偏移的敏感度降低了,总得来说就是整体方差偏地没有那么厉害了。可以看得出来实验性能整体上比第一个方案好,这个方法显得更加稳定。

  • WN,SN等
  • ASPP

七. unconstrained set-bsed face recognition (set和template一个意思?)

论文 Multi-Prototype Networks for Unconstrained Set-based Face Recognition中提到:IJB-A数据集的引入,这个问题受到了更大的关注。许多结构用来解决这个问题:Bilinear CNN, Pooling Faces, PAMs等。然鹅这些方法没有考虑一个集合下人脸的模态差异(modality variance)?这样做会丢失许多信息。网络的输入是a pair of face media sets,输出匹配的结果。

 GhostVLAD for set-based face recognition 中提到了文章解决的是template-based face recognition。

 无约束人脸识别竞赛

原文地址:https://www.cnblogs.com/king-lps/p/10733961.html