The Summary Of Face Recognition
[全文共计7162字,预计阅读15分钟,消耗脑容量20MB]
人脸识别包含人脸检测、人脸对齐、人脸识别三个步骤。
首先利用人脸检测(FaceDetiction)识别图像中所有人脸,回归人脸的boundbox。
然后对于识别出的人脸,可能会有歪头的,如果直接做recognition可能准确率较低,所以>我们需要做一步人脸对齐(FaceAlign),把所有人脸转为一个标准(正方形内,两眼对齐,嘴巴两侧对齐…)。
最后我们需要对所有的人脸做识别,提取特征与员工特征库进行对比。

Part 1 FaceDetiction
人脸检测(待总结…)

Part 2 FaceRecognition
其实人脸识别可以从两个角度做,之前人们一直是当成分类任务做,现在更多的是1:1特征对比;
先说分类任务,我们先对数据进行人脸检测以及对齐得到一个对齐后的人脸数据集,在训练集中每个类(标签/人)下有许多图片(都是对齐好的),然后对数据做一个分类任务,常规的分类模型有googlenet、resnet、densenet、mobilenet(移动端)等等,目标函数用softmax损失函数。
后者1:1比对,把分类网络当成特征提取器提取特征,和人脸库对比,欧氏距离小于一定阈值就认为比对成功。这里注意的是人脸库里面是标准照片直接前向传播得到的embedding 特征层。

Part 2.1 InsightFace框架
我们先看一下insightface的框架是怎么做的。这我自己画的一个简单的图,其实很简单,人脸识别分类代码分为两部分,一部分在特征提取网络,用成熟的分类网络提取特征,得到embedding向量,可以看为FaceImage2Vector。这个维度可以自己设计,大家都选的512(抱歉,一个特别的日子,我们一起默哀一会。)然后常规做法,我们会用全连接层转到class_num维度,这时搞一个softmax去做损失即可。后来,大佬们就觉得损失不够好开始改,这个我在2.2中去介绍一下这一系列损失函数的变化。

然后接下来,我们看一下人脸识别代码怎么评测?
Part 2.2 模型评测
对于普通分类问题,可能我们考察一个模型好坏,主要看测试集准确率就可以;对于人脸识别问题,我们有开集和闭集之说,闭集是指训练集与测试集人物一样,不会出现不认识的人,一般只在我们的某个领域,比如某个公司不会来外人。但实际不可能,人脸是个很大的开集,我们的训练集不可能囊括所有人,你训练一个模型,比如公司内部,万一有个别的人来了,这破机器认为他就是内部的人,因为可能模型不能很好的区分开。所以这就有了开集测试的重要性。
实际我们做人脸识别考察是在我们的库里训练一个更好的特征提取器,这个提取器拥有很好的区分能力。如果只在闭集测试,那就看准确率就行;如果在开集测试,我们就要看他在其他数据集上的区分度,怎么测?我们取样N对图像,看每一对两个图像是否属于一个类,我们搞一个阈值,两个图像的特征(由特征提取器提取)欧氏距离小于阈值就认为属于一个类,否则不属于一个类。我们看他能实现多高的准确率。
做1:1认证,我们需要准备一个pair测试文件,格式如下:
图A地址 图B地址 0/1(代表着是否为同类)
这里注意两张图片是不同图片,大概可能会有3000正例(同类),3000负例。做比对之后我们会有一个结果
TP代表正确识别为正例的样本(原来是正例) TN正确识别为负例的样本(原来是负例)
FP代表错误识别为正例的样本(原来是负例) FN错误识别为负例的样本(原来是正例)
TN+FP代表测试负例,也就是类间测试次数
TP+FN代表测试正例,也就是类内测试次数
(这里类内测试是指同属于一个类的样本测试,看他们是否足够接近,类间测试是对于不同类的测试,看他们距离是否足够大)
FN为错误识别为负例的样本,也是错误接受的次数
FP同理代表错误拒绝的次数
然后我们会用以下指标考查:
(1)准确率:实验中直接采用(TP+TN)/SUM;考察越高越好。
TPR召回率:TP/(TP+FN);考察越高越好
FPR假正例率:FP/(TN+FP);考察越低越好
(2)FAR误识率:FAR = 错误接受次数/类间测试次数=FN/(TN+FP);考察越低越好。
(3)FRR拒识率:FRR = 错误拒绝次数/类内测试次数=FP/(TP+FN);考察越低越好。
Part 2.3 损失函数回顾
人脸识别和一般的分类任务不太一样,他更大的特点在于类目多,我们训练13亿人,要让他对地球人进行适应,并且类间差距可能也小,样本有时不均衡,数据不多。所以对于人脸识别要求有更好的泛化能力、容错能力。我们从基本的softmax一点一点看一看
Part 2.3.1 softmax损失
softmax损失函数是最经典的损失函数,用于多分类问题;softmax损失作用于标签所对应类Y_i的得分,优化提高它的概率得分,所以对于闭集的分类能有一个好的结果;

然而我们了解人脸识别一般是开集的,测试集是所有可能进入你的检测系统的人,有两个问题?一则来了一个外人,你是否能把他排出去?二则稍微脸上变了点,你是否能很好地分开?softmax做损失在训练集能很好的分开,但是不能很好的增加类外间距,减小类内间距。
这里补充一下什么是类内间距,类外间距?
划分多个类,无非是把它映射到某一个featuremap,然后做一个超平面,把它们分开,类内间距,就是一个类自己的划分区域最大伸展距离,其实就是它的空间。类外间距就是每个类区域之间的间距。我们想要的结果是他们之间的间隔大一点,这样会有一定的容错能力,泛化能力;类内的间隔小一些,这样聚类效果更好一些。
随后大家就开始增大类外间距,减小类内间距的探索。
Part 2.3.2 Triplet Loss
Triplet loss属于Metric Learning, 相比起softmax, 它可以方便地训练大规模数据集,不受显存的限制。缺点是过于关注局部,导致难以训练且收敛时间长
这里提一下Metric Learning的概念,它是根据不同的任务来自主学习出针对某个特定任务的度量距离函数。通过计算两张图片之间的相似度,使得输入图片被归入到相似度大的图片类别中去。通常的目标是使同类样本之间的距离尽可能缩小,不同类样本之间的距离

本文深入解析人脸识别技术,涵盖人脸检测、对齐及识别三大核心步骤。详细介绍InsightFace框架,包括特征提取、1:1特征对比及模型评测。探讨多种损失函数如softmax、TripletLoss、L-Softmax等在人脸识别中的应用与优化。
最低0.47元/天 解锁文章
1029

被折叠的 条评论
为什么被折叠?



