一文搞懂人脸识别那点事---人脸识别方案summary

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的概念,它是根据不同的任务来自主学习出针对某个特定任务的度量距离函数。通过计算两张图片之间的相似度,使得输入图片被归入到相似度大的图片类别中去。通常的目标是使同类样本之间的距离尽可能缩小,不同类样本之间的距离尽可能放大。

Triplet loss是这么干的,搞三种图片进去,图A,与图A同类的图,与图A不是同类的图,然后损失函数如下,目的就是让同类的图更近,不同类的图更远。
L = m a x ( d ( a , p ) − d ( a , n ) + m a r g i n , 0 ) L=max(d(a,p)−d(a,n)+margin,0) L=max(d(a,p)d(a,n)+margin,0)
在这里插入图片描述

Part 2.3.3 L-Softmax

到L-Softmax,人们就开始直接搞一个间距给损失函数,下图中第一个是softmax做十分类的二维特征图,可以看出来是分开了,但是很拥挤。如果放一张训练集之外的图可能就分错了。

这里我对这个图做一个解释,首先数据实验是将损失函数前的embedding层定为二维(X1,X2)也就对应着图里的横纵坐标;然后在正式损失之前有个全连接层,对于这个W维度应该是(2,class)这里实验是对手写数字体做实验,所以class=10,这里我们认为W=(W_1,W_2,W_3,…,W_10)代表10个子权重,其实我们去看 W ⋅ X = ∣ ∣ W ∣ ∣ ∗ ∣ X ∣ ∗ c o s θ = ( ∣ ∣ W 1 ∣ ∣ ∗ ∣ X ∣ ∗ c o s θ 1 , ∣ ∣ W 2 ∣ ∣ ∗ ∣ X ∣ ∗ c o s θ 2 , . . . ) W\cdot X= ||W||*|X| *cos\theta = ( ||W_1||*|X| *cos\theta_1,||W_2||*|X| *cos\theta_2,...) WX=WXcosθ=(W1Xcosθ1,W2Xcosθ2,...)最后每一项代表该类的得分,也就是哪一项值大就更属于哪一类。此时权重是一个可调量,我们认为他是平面内十个向量,然后同样一个X看他和谁的点乘更大就更好。再者由于cos在0-180度内是单调函数,所以角度越小越好,||W||越大越好。

在这里插入图片描述
L-Softmax就对 θ \theta θ做了个间距,如下公式,对于不是本类的还是原来操作(注意这里写为 W ⋅ X = ∣ ∣ W ∣ ∣ ∗ ∣ ∣ X ∣ ∣ ∗ c o s θ W\cdot X=||W||*||X||*cos\theta WX=WXcosθ),对于本类,我们把角度 θ \theta θ变成 m θ m\theta mθ,此处m代表提升的倍数,这样让他本来可能模型认为分类不错,但是我们强行把角度增大,使得效果不是很好,这会模型只能说好吧,按照这个继续去优化,去适应这个间隙。

在这里插入图片描述
另外为了损失函数单调,我们搞了个条件限制mt在这里插入图片描述
然后我们再看上面那张彩图,对于不同m,投射出来的间隙确实不一样,之间的间隙越来越大。m越大分割的类间距越大,类内间距越小,聚类的效果越好,当然这个值也不能太大,可能会不收敛。

在这里插入图片描述

Part 2.3.4 SphereFace( A-softmax)

SphereFace是在L-Softmax的基础上将权重进行归一化,L-Softmax会同时从角度和权重长度上区分不同类别,而SphereFace只从角度上去区分不同类别(因为||W|| = 1了)
在这里插入图片描述
这里可以用他论文里这张图,这里(a)和(b)是softmax loss的结果;(c)和(d)是限制W1和W2向量的模等于1,而且b1和b2偏置等于0,称为modified softmax loss;(e)和(f)是angular softmax loss;我们能看出softmax点比较散,类间距几乎没有,我们把W1标准化,b=0发现,产生了一定间距,进而他做了margin发现间距更大了。之前的L-softmax没有对权重归一化,使得类的结果还要考虑W,这样测间距就比较复杂,A-softmax只需要衡量角度即可。
在这里插入图片描述

Part 2.3.5 CosFace( LMSL: Large Margin Cosine Loss)

CosFace的思想和SphereFace( A-softmax)的思想接近,其中主要做了以下三点的改进:

  • loss的形式做了稍微的改变,将超参数m由乘法运算变成了减法运算
  • 不仅对权重进行了正则化,还对特征进行了正则化。
  • 对归一化后的值乘上一个scale参数,超球面过小时,分类映射到超球面上不好分类,这个scale参数可以扩大超球面体积,这是后面的损失一直在用的观点。

在这里插入图片描述

Part 2.3.6 ArcFace

ArcFace是在CosFace基础上又改了下,前面有过对于角度乘以一个margin,这里它直接在角度上加一个margin,得到了一个很好的结果,如下所示。
在这里插入图片描述
论文中对多个损失函数做了一个对比,如下图所示,普通softmax就是分开即可,类间距几乎没有,SpherFace在角度上乘以margin可以增加内间距,但是存在角度为0的地方会有交集,这是一个问题;ArcFace也是在角度上做的margin,他是直接加一个margin,就解决了0度角的交集;CosFace则是在角度的cos值基础上加了一个margin也能在cosi基础上做好间距。
在这里插入图片描述

Part 3 InsightFace

Part 3.1 代码结构

我做了这么一张图,大概展示代码的整个结构,Insightface源码在这:https://github.com/deepinsight/insightface#pretrained-models
我们如果只关注人脸识别部分,更多的要去看src以及recognition部分代码
在这里插入图片描述

Part 3.2 人脸识别实验

这里我们以搭建一个人脸识别方案的例子展开,首先需要准备数据,数据准备完后我们需要对数据进行人脸识别+对齐,这部分可以采用MTCNN方法,在src/align中,附上我的实际操作总结:insightface数据制作全过程记录然后对于对齐好的数据,我们可以进行用insightface提供的模型做初步验证,可以参考:insightface测试recognition验证集效果全过程测试结束,我们可以进行训练,可以参考:insightface中recognition训练过程

Part 4 人脸识别部署

(待补充)


幸福是靠自己正确的!用黄晓明的一句话,我不管你怎么想,我只说我要怎样!加油!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、主要内容:OpenCV能够实现强大丰富的图像处理,但是它缺少一个能够支持它运行的界面。Csharp经过多年的发展,得益于它的“所见及所得”能力,非常方便编写界面。这两者如果能够“双剑合璧”,将有效帮助实际工作产出。本课着重推荐GOCW采用“Csharp基于CLR直接调用Opencv编写的算法库”方法,能够将最新的OpenCV技术引入进来,同时保证生成程序的最小化。    为了进一步说明Csharp和OpenCV的结合使用,首先一个较为完整的基于winform实现答题卡识别的例子,相比较之前的实现,本次进一步贴近生产实际、内涵丰富,对算法也进行了进一步提炼。同时我们对WPF下对OpenCV函数的调用、OpenCV.js的调用进行相关教授。       二、课程结构1、 EmguCV、OpenCVSharp和GOCW之间进行比较(方便代码编写、能够融入最新的算法、速度有保障、方便调试找错、拒绝黑箱化);2、视频采集模块的构建,视频采集和图像处理之间的关系;3、视频采集专用的SDK和“陪练”系统的介绍;4、在视频增强类项目中和图像处理项目中,算法的选择;5、Csharp界面设计、图片的存储和其他构建设计;6、较为完整的答题卡识别例子,兼顾界面设计和算法分析;8、WPF基于GOCW也同样可以基于GOCW实现算法调用;webForm虽然也可以通过类似方法调用,但是OpenCV.JS的方法更现代高效。9、关于软件部署的相关要点和窍门。       三、知识要点:1、基本环境构建和程序框架;2、CLR基本原理和应用方法;3、接入、采集、模拟输入;4、图像处理,通过构建循环采集图片;5、增强和实时处理;6、基于投影等技术的答题卡识别算法;7、存储、转换;8、部署交付。        课程能够帮助你掌握Csharp调用Opencv的基本方法,获得相应框架代码和指导;从而进一步提升实现“基于图像处理”的解决方案能力。  
Faster R-CNN是一种目标检测算法,用于在图像中定位和识别物体。它是R-CNN算法的改进版本,通过引入区域提议网络(Region Proposal Network,RPN)来提高检测的速度。 Faster R-CNN的工作流程可以分为两个阶段:区域提议和物体分类。 在区域提议阶段,首先使用卷积神经网络(CNN)对输入图像进行特征提取。然后,RPN通过滑动窗口在特征图上生成一系列候选区域。每个候选区域都有一个边界框(bounding box)和一个预测得分。RPN通过一个二分类器来判断每个候选区域是否包含感兴趣的物体,并根据得分对候选区域进行排序。 在物体分类阶段,对于每个候选区域,使用RoI池化层将其映射为固定大小的特征向量。然后,这些特征向量通过全连接层进行分类和回归,得到每个候选区域的类别预测和边界框坐标调整。 整个网络采用端到端的训练方式,在训练过程中同时优化RPN和分类网络。训练时,通过计算候选区域与真实标注框之间的IoU(交并比)来确定正负样本,并使用多任务损失函数进行优化。 Faster R-CNN相比于R-CNN,通过引入RPN网络实现了端到端的训练,避免了繁琐的候选区域提取过程,大大提高了检测的速度和准确性。同时,Faster R-CNN还可以通过改变RPN的输出尺度来检测不同大小的物体。这使得Faster R-CNN成为目标检测领域的重要方法之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值