原理

主要过程

  1. 人脸检测
  2. 特征提取
  3. 人脸识别

人脸检测

首先找到一张图片中的所有人脸,现在有可靠的解决方案HOG(Histogram of Oriented Gradients)方向梯度直方图,一种能够检测物体轮廓的算法。也可以采用预训练的 CNN 模型进行图片中的人脸检测,基于 CNN 模型比基于 HOG 特征模型的人脸检测准确度更高, 但是需要更多的计算资源。

端侧因为资源有限,一般使用 HOG算法即可。为了进一步降低计算量,首先要把图片转化为灰度图后,再使用 HOG。我们分析每个像素以及其周围的像素,根据明暗度画一个箭头,箭头的指向代表了像素逐渐变暗的方向,如果我们重复操作每一个像素,最终像素会被箭头取代。这些箭头被称为梯度(gradients),它们能显示出图像从明亮到黑暗流动的过程。

我们将图像分割成16x16像素的小方块。在每个小方块中,计算出每个主方向有多少个剃度(有多少指向上,指向右上,指向右等)。然后用指向性最强的那个方向箭头来代替原来那个小方块。

最终结果,我们把原始图像转换成一个非常简单的HOG表达形式,它可以很轻松的捕获面部的基本结构。

可视化效果:

人脸对齐

在使用 HOG 获得包含人脸的矩形框后,第二步要做的就是人脸对齐(Face Alignment)。原始图片中人脸的姿态、位置可能较大的区别,为了之后统一处理,要把人脸“摆正”。为此,需要检测人脸中的关键点(Landmark),如眼睛的位置、鼻子的位置、嘴巴的位置、脸的轮廓点等。根据这些关键点可以使用仿射变换将人脸统一校准,以尽量消除姿势不同带来的误差,人脸对齐的过程如下图所示。

算法的基本思路是找到68个人脸上普遍存在的点(称为特征点, landmark)。

  • 下巴轮廓17个点 [0-16]
  • 左眉毛5个点 [17-21]
  • 右眉毛5个点 [22-26]
  • 鼻梁4个点 [27-30]
  • 鼻尖5个点 [31-35]
  • 左眼6个点 [36-41]
  • 右眼6个点 [42-47]
  • 外嘴唇12个点 [48-59]
  • 内嘴唇8个点 [60-67]

有了这68个点,我们就可以知道眼睛和嘴巴在哪儿了,后续才能将图片进行旋转,缩放和错切,使得眼睛和嘴巴尽可能的靠近中心

特征提取

计算机如何分辨不同的两张人脸?

训练一个深度卷积神经网络,训练让它为脸部生成128个测量值。目标是相似的人脸输出的测量值相近。 网上有些提供了开源的已经训练好的模型,我们可以直接拿来用。

人脸识别

虽然被叫做人脸识别,但更准确的名字应该是「人脸比对」。人脸识别的背后,是一张待比对图片和人脸底库中的所有照片进行比对,从而判别图片中人员的身份。

根据人脸底库中照片数量的不同,可以将人脸比对分为1:1和1:N,由于数量不同这两种方法的计算量和计算方法也不尽相同。

1:1最常见的场景就是人证比对,用于核验身份证和人是否一致。

1:N是1张人脸和底库中的N张人脸进行比对。比如在考勤机中,我们的人脸底库中包含全公司的所有人脸照片。当上班打卡时,考勤机采集到人脸输入系统,经过比对后输出员工身份。这种情况下计算量相对较大,时效性和识别精度太低又会影响用户体验,所以一般会综合考虑权衡,在设备的参数中标注所支持的人脸数量。

具体的做法是把待比对图片的特征值和数据库的特征值进行比对,并计算欧氏距离,得到欧氏距离值,比较数值大小,取距离数值最小,并且小于预设的误差值,我们就能为这个最小距离对应的姓名就是图片上人脸对应的人。

face_recognition

face_recognition 可以说是世界上最简单的人脸识别库了。你可以通过Python引用或者命令行的形式使用它,来管理和识别人脸。该软件包使用dlib中最先进的人脸识别深度学习算法,使得识别准确率在《Labled Faces in the world》测试基准下达到了99.38%。它同时提供了一个叫face_recognition的命令行工具,以便你可以用命令行对一个文件夹中的图片进行识别操作。

Face Recognition 通过 Python 语言将dlib这一 C++ 图形库封装为一个非常简单就可以实现人脸识别的 API 库,屏蔽了人脸识别的算法细节,大大降低了人脸识别功能的开发难度。

步骤:

  • 人脸检测:找出所有的面孔
  • 检测面部特征点: 使用特征点矫正姿态,将侧脸转为正脸
  • 给脸部编码:根据面部特征点计算这个面孔的特征值(特征向量)
  • 从编码中找出人的名字:与已知面孔进行特征值比对,寻找匹配的面孔,得到人名

api

face_recognition.face_locations(img, number_of_times_to_upsample=1, model='hog’)

face_recognition.face_encodings(face_image, known_face_locations=None, num_jitters=1, model='small’)

face_recognition.face_distance(face_encodings, face_to_compare)

安装

安装 face_regconition,依赖与 dlib,dlib 编译时,至少需要 1.5G 的虚拟内存,60M 的 tmp 空间。

参考:

https://blog.csdn.net/qq_40985985/article/details/106136330
https://zhuanlan.zhihu.com/p/44169338
https://blog.csdn.net/wc781708249/article/details/78562902
https://cloud.tencent.com/developer/article/1401153
https://zhuanlan.zhihu.com/p/365274033
https://www.cnblogs.com/xiaoyh/p/11874270.html
https://blog.csdn.net/weixin_38145317/article/details/89174366
https://zhuanlan.zhihu.com/p/85829145
https://zhuanlan.zhihu.com/p/45827914
https://cloud.tencent.com/developer/article/1487964
https://zhuanlan.zhihu.com/p/32961280
https://www.jianshu.com/p/107803778086
https://blog.csdn.net/matafeiyanll/article/details/104449660
https://blog.csdn.net/qq_31673689/article/details/79370412
https://www.jianshu.com/p/4f4b673ad87a
https://face-recognition.readthedocs.io/en/latest/face_recognition.html
https://www.cnblogs.com/wjw1014/p/10259180.html
https://www.cnblogs.com/shouhuxianjian/p/10138209.html

标签: none

添加新评论