目前在学习论文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
下载: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)。
这个指标的意思是我们拿一对不同的人的照片去测试的时候,如果两个人的特征向量之差超过了设定的阈值(也就是把这两个人认成了同一个人)的次数比上所有不同的人的pairs的对比次数。也就是把不同的人识别成同一个人的概率啦。当然是越小越好
那么TAR则是表示正确接受的比例。就是同一个人的照片被判别为同一个人的概率。
一般我们会计算的是在FAR为多少(比如 )的情况下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。