深度学习框架人脸识别介绍

简介

基于深度卷积网络的人脸识别,流程基本上一致,如下图所示,可以看做是一个基本框架:

图1 人脸识别基本框架

由上图,可以看到,人脸识别分为以下几个主要步骤:

  1. 输入图像:可以做一些图像前处理操作,比如:调整亮度、去噪等
  2. 人脸检测:检测人脸位置,可以加入一些活体检测之类的算法
  3. 人脸对齐:实际场景中,人脸一般都是歪的,需要基于人脸关键点进行对齐
  4. 人脸裁剪:将对齐后人脸抠出,作为后续深度特征网络的输入
  5. 人脸特征提取:通过DCNN网络,对人脸图进行建模,得到人脸特征
  6. 人脸特征比对:使用比对算法,比对不同人脸特征,比如:余弦距离、欧氏距离等

详细介绍

Input Image -> Detect

输入:原始的可能含有人脸的图像

输出:活体人脸位置的bounding box

这一步称之为“人脸检测”(Face Detection),可以使用dlib、OpenCV现有的人脸检测方法,比如传统计算机视觉中的方法(Hog、Haar等特征)、深度学习YOLO等。

对人脸检测这一步感兴趣的可以参考下列资料:
dlib的实现: dlib C++ Library: Dlib 18.6 released: Make your own object detector!
openCV的实现:Face Detection using Haar Cascades

在金融等高安全场景,对检测到的人脸,还需判断是否为照片和视频等非活体人脸,需要将检测到的人脸输入活体分类网络,筛选出活体人脸。

另外,一般在进行该步骤之前,会进行图像预处理操作,这部分工作可能很多很复杂,比如:减少图像中的噪声干扰、提高清晰度,还有包括图像滤波、变换、转码、模数转化等,如下图所示,原始图像人脸太暗,需要先提个亮度,然后发现噪点太多,再做个降噪.....一顿操作后,感觉效果可以了,然后再进行之后流程:

图2 图像预处理

Detect -> Transform -> Crop

输入:原始图像 + 人脸位置bounding box

输出:“校准”过的只含有人脸的图像

对于输入的原始图像 + bounding box,这一步要做的事情就是要检测人脸中的关键点,然后根据这些关键点对人脸做对齐校准。所谓关键点(landmark),就是下图所示的绿色的点,通常是眼角的位置、鼻子的位置、脸的轮廓点等等,关键点个数有很多类型,可以参考资料(点击查看)。有了这些关键点后,我们就可以把人脸“校准”,或者说是“对齐”。解释一下:就是原先人脸可能比较歪,这里根据关键点,使用仿射变换将人脸统一“摆正”,尽量去消除姿势不同带来的误差。这一步我们一般叫Face Alignment(人脸对齐)。人脸对齐后,就可以进行人脸图扣取了。

图3 人脸对齐

对于人脸对齐感兴趣的,可以参考如下传统方法,特点是比较快,对应的论文是:
https://www.semanticscholar.org/paper/One-millisecond-face-alignment-with-an-ensemble-of-Kazemi-Sullivan/d78b6a5b0dcaa81b1faea5fb0000045a62513567?p2df
人脸关键点:
人脸关键点检测的数据集与核心方法发展综述 - 极市社区

Crop -> Representation

输入:校准后的单张人脸图像(抠图后)

输出:人脸特征向量

这一步就是使用深度卷积网络,将输入的人脸图像,转换成一个向量的表示。在insightface中,使用的向量是512x1的,也就是一个512维的向量,该维度取决于特征网络,如下图是人脸特征提取网络示意图:

图4 人脸特征网络示意图

图5 人脸特征网络功能图

通过图4,不难发现,该网络就是一个分类网络,而实际特征提取的时候,只需要到conv5_3,,换言之,实际使用时,提取人脸特征,一般就是到卷积层的最后一层,而训练时,一般需要完整的分类网络(基于训练可行性)。

在理想的情况下,我们希望人脸特征向量具备如下性质:

  1. 同一个人的人脸图像,特征向量之间差异比较小
  2. 不同人的人脸图像,特征向量之间差异比较大

举个例子,如下是手写0-9数字CNN分类网络,让最后一层的向量变成2维后,可视化出来每一类对应的二维向量表示,图中每个颜色代表一个类别:

图6 手写0-9可视化特征向量

从图中可以看出,直接采用softmax训练得到的结果,不太符合我们理想特征的特点:我们希望同类尽可能接近,不同类尽可能的远,而图中,不同类之间距离很近,而同类之间(比如紫色)距离很远。

那么训练人脸特征的正确姿势是什么呢?其实有很多种方法,如下图所示,展示了几种损失函数类型。

图7 不同类型损失函数

损失函数介绍,可以参考如下:
人脸识别损失函数综述(附开源实现) - 知乎

通过设计不同的loss,最大程度达到我们理想的特征,如下图是采用center loss(中心点)训练后,可视化的MINIST(0-9分类)特征图分布,相对于图6,更加接近理想特征。

图8 采用center loss后的手写0-9可视化特征向量图

center loss介绍可以参考如下:
http://ydwen.github.io/papers/WenECCV16.pdf

Recognition

经过上述流程,可以训练出人脸特征提取模型,之后就是基于该模型进行人脸比对,人脸比对有几个场景:

  • 人脸验证(Face Identification):就是检测A、B是否是属于同一个人。只需要计算向量之间的距离,设定合适的报警阈值(threshold)即可。
  • 人脸识别(Face Recognition):这个应用是最多的,给定一张图片,检测数据库中与之最相似的人脸。显然可以被转换为一个求距离的最近邻问题。
  • 人脸聚类(Face Clustering):在数据库中对人脸进行聚类,直接K-Means即可。
关于向量距离计算,人脸识别一般采用余弦距离,其他还有欧氏距离、汉明距离、标准化欧式距离等,详细可以参考:
特征向量的距离度量 - 知乎
常用聚类算法,可以参考:

常用聚类算法 - 知乎

参考:

  1. https://arxiv.org/abs/1801.07698
  2. 『算法理论学』基于深度人脸识别流程介绍 - 云+社区 - 腾讯云
  3. 人脸识别长篇研究 | 技术与流程(二) - 知乎
  4. 硬核科普:一文看懂人脸识别技术流程-面包板社区
  5. 人脸关键点检测的数据集与核心方法发展综述 - 极市社区
  6. 人脸识别损失函数综述(附开源实现) - 知乎
  7. http://ydwen.github.io/papers/WenECCV16.pdf
  8. 特征向量的距离度量 - 知乎
  9. 常用聚类算法 - 知乎

  • 13
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python Keras是一种深度学习框架,可以用于实现人脸识别任务。人脸识别是一种常见的计算机视觉任务,通过深度学习技术,可以从图像中自动识别和识别出人脸。下面是一种可能的实现人脸识别的步骤: 1. 数据收集:首先,需要收集包含不同人脸的图像数据集。这些数据集应包含来自不同实例和环境的人脸图像。 2. 数据预处理:对收集到的人脸图像进行预处理,包括图像的大小调整、灰度化、去噪和直方图均衡化等操作。这些步骤可提高人脸识别的准确性和鲁棒性。 3. 搭建深度学习模型:使用Python Keras框架来搭建深度学习模型。可以选择用于后续任务的不同模型架构,如卷积神经网络(CNN)和人脸识别特定模型。Keras提供了许多预先训练好的模型,如VGG16和ResNet等,这些模型已经在大型图像数据集上进行了训练,可以提供良好的性能。 4. 模型训练:使用预处理后的人脸图像数据集对深度学习模型进行训练。这包括将数据集划分为训练集和测试集,以评估模型的性能。通过在训练集上迭代多次来调整模型的权重和参数,以最小化损失函数,提高模型的准确性。 5. 模型测试和评估:使用测试集评估经过训练的模型的性能。通过计算准确率、召回率和F1分数等指标来评估模型的性能。可以根据需求对模型进行调整和改进。 6. 部署模型和人脸识别:在模型训练和评估后,可以将模型部署到实际应用中。例如,可以构建一个应用程序,通过摄像头捕获图像,并使用已训练好的模型识别人脸。可以将识别结果与数据库中存储的人脸信息进行比对,以确认身份。 总之,Python Keras提供了丰富的工具和技术,可以实现人脸识别任务。通过收集数据、预处理、模型搭建、训练、评估和部署等步骤,可以构建一个准确和鲁棒的人脸识别系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值