人脸识别简介

概念

人脸识别(Face Recognition)是一种依据人的面部特征进行身份识别,定位,查找的一种生物识别技术。生物特征识别技术所研究的生物特征包括脸、指纹、手掌纹、虹膜、视网膜、声音(语音)、体形、个人习惯(例如敲击键盘的力度和频率、签字)等,相应的识别技术就有人脸识别、指纹识别、掌纹识别、虹膜识别、视网膜识别、语音识别(用语音识别可以进行身份识别,也可以进行语音内容的识别,只有前者属于生物特征识别技术)、体形识别、键盘敲击识别、签字识别等。

人脸识别特点

人脸识别的优点:

  • 直观:可以通过观察比较人脸来直接区分和确认身份,具有同类特性的还有语音识别,指纹识别不具备该特性。
  • 非强制性:人脸识别是利用可见光获取人脸图像信息,不同于指纹识别或者虹膜识别需要利用电子压力传感器采集指纹,人为配合才能完成采集。
  • 非接触性:用户在进行人脸识别的时候,并不需要和相关的摄影设备直接接触。
  • 并发性:实际应用场景中,人脸识别技术可以进行多个人脸的分拣、判断及识别。

人脸识别的难点:

  • 识别率依赖环境:光照环境,人脸图像位置,清晰度,遮挡物等,都会影响识别成功率。
  • 人脸相似性:人类脸部存在相似性,不同个体之间的区别不大,所有的人脸的结构都相似,需要有足够智能的算法来区分出不同个体。
  • 人脸易变性:同样的人脸,也会面临着面部衰老,变化(胡须,眉毛等),人为改变(眼镜,化妆,整容等)等因素,增加识别的难度。
  • 人为因素:通过各种手段,人为的制造模拟的人脸图像(静态图片,3D模型等)。

人脸识别步骤

人脸识别主要流程如下

1.图像采集(Image Capture)

人脸图像分为静态图像和动态图像,静态图像是指照片和静态的纸质图片等,动态图像主要来自于摄像机实时拍摄采集或者已有视频。

2.人脸检测(Face Detection)

人脸检测就是找出图像中所有的人脸

能够实现人脸检测的算法非常多,原理也各不相同。最著名的当属 Viola-Jones 在 2001 年提出的算法,他们通过 Haar 特征和 AdaBoost 去训练级联分类器(Cascade Classfier)获得实时效果很好的人脸检测器,检测流程如下:

  • 图像预处理(将提取到的图片统一大小和灰度化)

    一般来说,计算机中的彩色图片都是由若干个色彩通道累积出来的,比如 RGB 模式的图片,有红色通道(Red),绿色通道(Green)和蓝色通道(Blue),这三个通道都是灰度图,比如一个点由8位来表示,则一个通道可以表示 2^8=256 个灰度。那样三个通道进行叠加以后可以表3*8=24位种色彩,也就是我们常说的24位真彩。对这样的图片做处理,无疑是一件很复杂的事,所以有必要先将彩色图转为灰度图,那样可以就减少数据量(颜色信息对于人脸识别没有作用)。灰度化和减少图片大小后,数据计算量和资源损耗大大减少,检测速度增加。

  • 构造级联分类器(Cascade Classfier)

    什么是级联的分类器呢?级联分类器是由若干个简单分类器级联成的一个大的分类器,被检测的窗口依次通过每一个分类器,可以通过所有分类器的窗口即可判定为目标区域。

    加载已经训练好的内置模型 haarcascade_frontalface_alt.xml,构建级联分类器。分类器可以加载不同类型的模型,OpenCV 内置了很多模型

    基础分类器以 Haar特征为输入,以 0/1 为输出,0表示未匹配,1表示匹配。其中 Haar 模型特征分为3种

    • 边界特征,包含四种
    • 线性特征,包含8种
    • 中心围绕特征,包含两种

      分类器可以运用不同的模型对预处理后的图片提取出不同的特征值,特征值是检测人脸的关键数据。不同的模型直接影响检测的成功率,这里用的是 OpenCV 已经训练好的数据模型,不同的厂商可能都会有自己的模型训练方法。

  • 运用 AdaBoost 算法进行检测

    将级联分类器和待检测图片一起 利用 AdaBoost 算法就能检测出图片中是否存在人脸,具体 AdaBoost 算法的原理,相对比较复杂,这里就不介绍了,可以详细查看 Wikipedia

iOS 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 图片灰度化
cv::Mat matImage;
UIImageToMat(image, matImage);

// 转换颜色空间
cv::Mat gray;
cvtColor(matImage, gray, CV_BGR2GRAY);

// 加载级联器
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_alt" ofType:@"xml"];
cv::CascadeClassifier classifier;
classifier.load(filePath.UTF8String);

// 运用 AdaBoost 算法进行人脸检测
std::vector<cv::Rect> faces;
classifier.detectMultiScale(gray, faces, 1.1, 2, 0, cv::Size(30, 30));

// 是否包含人脸
BOOL hasFace = faces.size() > 0;

3.人脸校准(Face Alignment)

人脸校准是给一张脸,找出特征点的位置,比如鼻子左侧,鼻孔下侧,瞳孔位置,上嘴唇下侧等等点的位置,如下图:

图中红色的框就是在做 Detection,白色的点就是在做 Alignment。

找到人脸上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]

就可以知道眼睛和嘴巴在哪儿了,后续将图片进行旋转,缩放和错切,使得眼睛和嘴巴尽可能的靠近中心,人脸基本上就对齐了,经过校准之后人脸的识别率会更高。

4.人脸识别(Face Identification)

人脸识别这一块变数是最大的,有相对简单的离线方案,仅仅需要内置一些基础的样本数据,利用相关的算法就可以实现简单的识别功能。但这种方式实现的功能相对较弱,漏检率较高。另一种相对完善的方案是通过后台大数据配合深度学习,对统一实体自动构建出多种多样的数据模型,包括正面和反面的数据模型,来提高识别成功率。OpenCV 自带了三个人脸识别算法:Eigenfaces,Fisherfaces 和局部二值模式直方图 (LBPH)。这些算法都可以进行深度学习。

活体检测

人脸检测方法多种多样,但所有的方法都会面临着各种各样的欺诈手段,常见的3种为:

  • 合法的用户人脸照片
  • 合法的用户人脸视频
  • 合法的用户3D模型或者面具头套

面对这些欺诈手段时,一般采用活体检测技术来解决,活体检测实现的手段多种多样:

  • 基于运动检测,常见的有眨眼,动嘴等,该方式用户交互成本较高,欺诈成本较低。
  • 基于微纹理,利用假人脸经过二次采集后呈现与真实人脸的纹理差异检测
  • 基于多光谱,基于皮肤和其他材质在光谱放射率上的差异检测

目前大部分免费或者开源的人脸识别代码库都不带活体检测功能,这里收集了一些开源代码备用

opencv_contrib

EyeBlickCheck

Zeusee-Face-Anti-spoofing

行业现状

人脸识别系统的研究始于20世纪60年代,80年代后随着计算机技术和光学成像技术的发展得到提高,而真正进入初级的应用阶段则在90年后期。人脸识别系统成功的关键在于是否拥有尖端的核心算法,并使识别结果具有实用化的识别率和识别速度。国内的人脸识别企业较多,下图列举了目前人脸识别排行榜前几位的企业

其中前四家企业细分领域如下图

主要客户对比

盈利模式

企业开放 SDK

企业开放的人脸识别 SDK 分为在线和离线两种方案,在线方案以服务端为主,通过服务端对接 SDK 提供的 API,客户端只需要跟自己的服务端交互即可。这种方案适合服务端资源较充裕,而且对人脸识别及时性要求不是非常高的情况下使用。同时服务端可以充分利用大数据和深度学习相结合,发展出更多的应用场景。离线方案,是指客户端直接嵌入 SDK 供应商提供的离线 SDK,不需要与服务器交互,直接能够获取到识别后的结果。该方案使用场景较单一,适合轻量级接入到客户端,不依赖网络。

下面是部分人脸识别厂商的对比

企业 公开提供 SDK 支持离线 SDK 收费方案 产品缺陷
旷视(Face++) 单平台按年收费 暂无
商汤(SenseTime) 未公开 暂无
云从 未公开 暂无
依图 未公开 暂无
百度 按授权码个数收费 iOS 端不支持离线 SDK
腾讯优图 按 API 调用次数收费 不支持离线 SDK
阿里云 按 API 调用次数收费 不支持离线 SDK
虹软(ArcSoft) 永久免费、闭源(每年授权一次) 识别率一般,活体检测功能只在 Android 端公测

开源项目

OpenCV

OpenCV 是一个基于 BSD 许可(开源)发行的跨平台计算机视觉库,包括人机互动,图像分割,人脸识别,机器视觉等应用领域的开源成果。

OpenFace

基于 FaceNet 和 OpenCV 的实现的 OpenFace 开源库,是用 Python 开发的服务端程序。OpenFace 最主要的特色是依赖大数据进行基于深度神经网络的学习。

SeetaFace

中科院 山世光 老师开源,包含人脸检测,人脸对齐,人脸识别三个模块。基于 OpenCV 开发,同时对算法做了一些改进。但是在人脸检测速度上相对较慢,漏检率较高,这里有实测样本

开源方案商业化落地的缺陷

  • 漏检率较高
  • 1 : N (多人识别)的识别率较低,识别较慢
  • 活体检测功能较弱
  • 离线方案没有深度学习能力

Demo演示

ArcFaceDemo

行业应用和产品落地讨论

有了上面的技术探索和实践,大家可以讨论一下,人脸识别在织语产品上的落地方案。