这算是作者的一篇实践科普文,随着面部识别技术的兴起,在安全方面的应用会更广泛。作者首先阐述了面部识别功能实现的原理,再从一款小的隐私笔记应用做起,如何讲面部识别功能带入产品中。挺多技术性术语,看起来有些头疼,加上wiki会好一些。
原文链接:mobile app facial recognition feature
原文作者:Nataliia Kharchenko
想象一下,可以实时分析用户在与应用或者网站交互时的情绪反应。或者你的家庭设备可以识别出你,然后放送你最喜欢的电视频道。
是的,今天这篇文章是关于面部识别技术的,我们将分析我们实现这项技术的一次经历,以及更多的探索。
为什么面部识别技术正在崛起?
面部识别并不是新鲜的技术,但它预示了未来几年的新增长机会。驱动进步的主要因素是,各个领域都有潜在的应用场景。这里举一些例子:
系统安全
面部识别可以在安全认证方面得到广泛认证。不久前,Amazon发明了一种认证方法,“用户认证图像分析”。它可以通过用户在镜头前执行某种动作(微笑或眨眼),来进行身份认证。
用户安全
Caterpillar已经应用面部识别技术来解决司机疲劳的问题,通过一款特殊的应用来进行评估。通过不断分析他们眼睛和头部的位置,系统可以决定是否需要提醒操作员。
这些例子不仅需要软件,还需要摄像机,服务器和其他基础。这是一种低资源的方法,也是我们主题的焦点。
移动应用的创建者并没有忽视面部识别技术的增长。事实上,他们正在考虑以非常规方式应用该技术。我们接触的客户也更多地希望将这项技术加入到应用中去。让我来阐述这其中的一种体验,以及我们实现功能所需的铺垫。
面部识别技术如何工作的?
面部识别是图像分析技术的增强应用,输入的类型是图像或视频流。输出是识别结果,验证图像或视频中出现的对象。一般来说,面部识别系统的工作方式如下,通常被定义为一个五步过程:
-面部检测和追踪
-面部对齐校正
-特征提取
-功能匹配
-面部识别
面部检测是识别扫描图像内人脸额度过程。特征提取涉及获取相关面部图像-面部区域(例如眼睛间距),差异,角度和比例-来确定对象是否是人。最后,系统会尝试识别人脸并将其与储存在数据库中的名称进行匹配。
有许多面部识别方法,所有的算法的主要区别在于特征计算,以及它们数据集之间的比对。我们选择的方法是主成分分析以及神经网络的组合。我们来看看这些算法是如何工作的。
主组成分析
主组成分析(Principal component analysis PCA)是面部识别中最流行和精细的算法之一。图像被表示为小维矢量,然后将其与来自数据库的基准矢量进行比较。PCA的主要目的是降低特征维度,让它们能够描述不同的面部“典型”特征。这是它的工作原理。
首先,将输入的人脸训练集转换成一个公共数据矩阵。
将面容的训练集转换为单个矩阵使用这个矩阵,输入的图像被分解成一组线性系数,称为主成分或特征脸。
计算每个面部图像,算法通常需要5~300个特征面。其余的组件识别图像中的面部和背景噪点之间的微小差异。事实上,识别过程涉及比较未知图像的主要组成部分与所有其他图像的组成部分。
主成分分析已得到充分的验证。但是,在亮度和面部表情发生明显变化的情况下,该方法的有效性显著降低。解决这个问题的方法是使用Fisher线性判别式(Fisherface)。实验表明,在背光或面部图像阴影的条件下,Fisherface仍具有95%的效率,而特征脸的方法效率为53%。
训练好的一组特征脸的例子人工神经网络
人工神经网络是面部识别的流行方法。它们用于特征提取和决策。最广泛使用的选项之一是建立在多层感知器上的网络,该网络允许根据预训练网络对输入图像进行分类。
神经网络通过一组学习实例进行训练。在训练期间,神经网络自动提取关键特征,确定它们的重要性并建立它们之间的关系。假设训练的神经网络将能够训练中获得的经验用于未知图像,这要归功于其泛化能力。
卷积神经网络在分析视觉图像方面表现出最好的结果,因为它们考虑到图像的二维拓扑结构能力,与多层感知器相反。这就是为什么卷积神经网络受规模变化,偏差,转向,角度和其他改变的影响较小。
卷积神经网络的结构示意图作为一个相对耗时的过程,经过训练的神经网络对于面部识别有不错的表现,并降低了错误率。主要问题是为数据库添加新的基础脸部,这需要对整个数据库集重新进行网络训练。
一般来说,主成分分析和神经网络的结合如下。脸部是从图像中提取出来的,并用一组PCA的特征脸来描述。然后通过学习描述分类,来识别人脸。
面部识别项目实践
项目状况
需要实践面部识别功能的应用程序可能是一个简单的笔记应用。它允许注册用户可以安全地创建,存储和查看保密短信笔记,使用面部识别作为访问它们的安全方式。
当用户第一次允许应用时,他们必须创建一个新账户或登录已有账户,创建一个账户是一个简单快速的过程,让用户可以通过设备的摄像头捕捉脸部的一系列照片。
当应用启动,它开始运行面部识别引擎。然后请求用户面向镜头,面部识别引擎通过捕捉用户面部数据来评估。如果面部数据与与存储在本地的安全数据匹配,则文本内容被解密并在屏幕上显示。面部识别引擎每隔n秒连续评估用户的面部数据,如果捕捉的数据不匹配,则内容模糊,就像这样。
应用中的面部识别功能用OpenCV进行面部识别
OpenCV是一个开源库,最初旨在实现各种应用中的计算机视觉和机器学习。一般来说,OpenCV用于检测对象的基础设施,可以对其进行训练以检测任何对象,包括面部。它的工具箱包含数以千计的优化算法以满足各种用途。这就是OpenCV陈伟理想选择的原因。
这里有三种方法可以将OpenCV添加到自己的iOS项目中:
-使用CocoaPods:pod”OpenCV”
-获取并添加官方iOS框架版本到项目中
-使用GitHub的源码,并按说明构建自己的库
OpenCV足以实现面部识别这两项基本任务:检测和识别。
面部检测
这个库里有许多可用的面部检测和面部特征设置,甚至是微笑。检测是通过训练进行的。在训练过程中,决策树通过正确的图像(有面孔的人)和错误的图像(没有面孔的人)进行优化。
培训的过程,旨在确定正确的特征,以及它们的比例和权重。加载这些参数来初始化分类器。在检测过程中,受训练的分类器在输入的图片像素上移动,并在不同比例下进行,以便能够检测到不同尺寸的面部。
OpenCV中的特征脸有些因素可能会影响系统的训练:
-一个是用于训练的图像质量,以及如何裁剪它们。为了统一输入的图像,我们在注册的屏幕上添加了一个矩形区域,用于显示用户脸部相对于相机的位置和距离。
-准确培训所需图像的数量也是一个因素,对于我们的系统,我们认为九个图像就足够了。
-你也可以考虑让用户拍摄他们脸部的侧面照,以获得更好地识别性能。
面部识别
OpenCV中有三种基本的人脸识别算法:特征脸,Fisherface和本地二进制模式直方图(local binary patterns histograms)。你可以在OpenCV文档中了解它们的信息。在我们的项目中,我们使用LBPH算法,因为可以更新用户输入而不需要对系统进行全面训练
为什么OpenCV不是我们项目的最佳选择
在尝试使用OpenCV的潜力来实践项目后,我们得出这个结论:这个平台并不是我们项目的正确工具。因为OpenCV的神经网络并不适用于实时识别。它很好地识别图像中的脸部,适合社交网络应用。但是随着识别条件变化,例如光照以及发型变化,系统可能无法正常工作。
这是我们切换到另一个面部识别平台的主要原因。
用KAIROS逐步进行面部识别
商场上有许多面部识别的技术支持商。Kairo就是不错的。我们选择iOS应用的Kairos SDK或者Kairos API实行面部识别功能。我们为项目选择了Kairos API。
面部检测和识别的原理几乎与OpenCV一样,所以美欧必要重复基础知识。下面是如何Kairos工作。
在注册过程中,应用访问设备的相机获取用户图像。我们需要将九个图像存储在数据库中。
Kairos的图像注册功能可以将图像存储在创建的库中。这些图像需要一个ID(用户名字)。还需要一个名称来标记它。使用的参数是image: 公开访问的URL,上传文件或者base64编码的照片subject_id: 脸部的标记符gallery_name: gallery标记符。
识别
该库使用神经网络来学习脸部特征并创建脸部模板。每次授权时,都会将图像的模板与存储的模板进行比较。库中可能相匹配的图像。
结果分析
在输入的图像与存储的模板匹配时,应用会显示主题的ID并授权访问。该应用返回两个参数结果:名称和概率(置信水平)。默认情况下,识别的阈值为80%。这意味着如果置信度低于80%,API会认为它不是匹配的。你也可以调整参数的高低,但是80%的阈值是最佳的,因为如果再高,会有被失误的风险。
拒绝的响应
如果输入的图像与存储在数据库中的数据不匹配,则应用的图像和文本为模糊。
问题与解决方案
我们面临的主要问题是内存分配。由于图像处理需要持续访问设备的RAM,因此设备过热。解决方法是连接处理图像的多线程OpenCV库,并直接访问CPU。
当用户试图摄像时,如果强光在用户身后,我们还没有解决的办法。
结论
尽管所有的面部识别都有局限性,例如化妆,光照,图像质量变化等,但是技术正在逐渐地流行起来,并最终成为用户日常生活中的一部分。提供简单实现面部技术的平台使用不同的算法,可以用于各种特定的场景。
我们试图展示我们在特定项目中的经验,正如你所看见的,使用面部识别功能的想法并不是那么容易实现。我们遇到了一些问题,并试图找到解决方案,更有效的工作。
网友评论