来源:人工智能技术干货(AITechStudy)
当今最成功的人工智能应用当属人脸识别了,相关的理论研究非常成熟,相关的博客社区也非常活跃,就连人脸数据集和人脸相关算法也是轻而易举就可以获得。生活中,常见的人脸识别应用有高铁进站人脸识别验证、手机人脸解锁、门禁人脸解锁、人脸识别过道闸机、人脸识别考勤、刷脸登录、刷脸支付及失踪儿童人脸识别查找等等,可以说,人脸识别已经非常广泛深入地融入到我们生活中的方方面面,也许在我们不经意间的场景就有用到了人脸识别技术,那么,人脸识别的工作原理运行机制是怎么样的呢?本篇文章就让我们一起来捋一捋人脸识别的工作原理运行机制!
一般来说,在一次人脸识别流程中,应该包含条件触发、抓取图像、人脸检测、图像预处理、特征提取、特征匹配、活体检测、条件判断及产生动作几个主要动作,其中人脸检测(face detection)、特征提取(feature extraction)、活体检测(liveness detection)是最主要的工作过程,包含了三个最主要的AI算法即人脸检测算法、人脸识别算法及活体检测算法!
人脸识别的一个工作原理运行机制框图可概括为下图:
1. 条件触发
人脸识别的运行需要一定的条件触发,一般比较少用轮询的方式运行,主要是为了省电,比如说手机人脸解锁有些是手机抬起或者按键开启才会触发整套人脸识别流程的,在智能门锁里有些也是带有红外感应只有检测到有人的红外存在才会触发运作,刷脸支付时收银员触发了刷脸收银时才会产生人脸识别流程,这些流程的运作机制大部分都是进入了某个流程需要用到人脸识别时才会触发产生人脸识别,但也有在一些需要高速流通或者对耗电不敏感的场景也会一直进行人脸识别的前期运作如人脸检测,比如高铁站人脸识别验证机,办公楼过道闸机等,如何触发人脸识别运作更多的是考虑到实际应用场景,没有统一的作法。
2. 抓取图像
这部分当然是由摄像头进行图像抓取了,抓取的图像有RGB三通道的也有NIR/Gray单通道的,可由本地摄像头抓取图像后终端直接进行处理,也可由远端摄像头抓取再回传到服务器工作站进行处理,但不管是那种,对于抓取到的图像,往往要求图像质量比较高,毕竟后面的算法都依赖于所抓取图像的质量,否则可靠性就存在问题。所以,在抓取图像时,就会存在很多的工程化做法,比如增加补光灯避免图像亮度差,增加滤光片去除光照影响,安装摄像头角度调试到合适方位尽可能获取到较好的图像,对输入人脸进行一定约束,也有增加一些模糊检测或图像质量检测等算法去除质量较差图像的,总之,所有的措施都是为了保障图像质量符合算法工作要求,当然,如果算法鲁棒性泛化能力足够强大,这部分也是可以不用那么在乎。
3. 人脸检测
人脸检测就是要在一张图像中,找到人脸的位置、大小、角点等信息,目前,常见的人脸检测算法有dlib、mtcnn、dbface、retinaface等等,这些算法基本上都可以在复杂多变动态环境中检测到人脸,并且运行时间基本上是毫秒级极短时间内的,当然运行时间也是要考虑到硬件的运算能力的,不过现在在很多加速推理框架的支持下,不管是CPU/DSP还是GPU,人脸检测算法都是可以加速运行的。人脸检测算法,是非常关键的一个算法,如果检测不到人脸,那么也就无从谈起接下来的人脸特征匹配和活体检测了,通常来说,人脸检测不仅仅是要给出人脸框,还要输出人脸关键点,这是为了后面的图像预处理进行准备的。
4. 图像预处理
人脸检测算法输出人脸框和人脸关键点后,应用拿到这些信息,就需要将人脸从图像中裁剪出来,然后进行相应的图像预处理,比如人脸去光照影响了,人脸再模糊检测了(整张图像质量合适并不代表人脸区域就是符合要求的了),人脸图像格式转换了(有些摄像头抓取到的图像格式是YUV格式的,而大部分算法都是基于RGB或BGR的,这时就需要进行图像格式转换),人脸对齐了(仿射、旋转、缩放等),还有对人脸边框进行一些margin调整,这也取决于接来下所用到该人脸图像的算法在训练时其训练数据的处理方式,最终目的,都是为了提升下一个环节的运行效果,避免因为某些因素引起了算法的性能下降,从而导致整个识别的最终效果变差。
5. 特征提取
常说的人脸识别算法大部分所做的工作都是为了提取人脸特征,这个人脸特征也常叫特征向量,整个人脸识别算法其实相当于对人脸进行数字编码,因此,每一个人脸都会被编码成独立不相交的特征向量,当然这个独立不相交是理想状况的,有时候存在误识别那么说明特征向量是存在相交情况的。人脸识别算法常见的有insightface、facenet、mobilefacenet等等,大部分算法的输入都是112x112x3大小的图像,然后输出的特征常见的是一维的特征向量,输入人脸的大小和特征向量的长度取决于个人,但大部分都是输入(112,112,3)和输出(512),比如insightface就是输入112x112x3的图像然后输出512维的特征向量,但是这个也得权衡整体性能,既要考虑人脸识别的效果也需要考虑特征匹配的耗时,比如,之前笔者所设计的人脸识别算法仅输入112x112x3大小的人脸图像并输出特征向量长度192维,但效果也很好。对于RGB和NIR的图像,因为这两者的通道数不一致,如果要保障同一个人脸识别算法都可以通用,那么还需要进行一定处理才可以,一般可以将NIR叠加为三通道,这样就可以同一模型兼容两种图像格式了。
6. 特征匹配
特征匹配是基于特征提取的流程,特征匹配就是要将人脸识别算法所提取到的特征向量与注册库的特征向量进行匹配以判断是否为同一个人,通常使用的特征匹配算法有欧式距离或者余弦距离,有1:1、1:N及N:N几种匹配形式。当我们得到了一个匹配距离值后,那么就可以根据事先设定好的阈值进行判断是否为同一个人了。欧式距离是越小越好,而余弦距离则是越大越好,当两个特征向量完全同向时,说明它们就是同一张人脸图像了。对于使用哪种特征匹配算法,并不是非常关键的,但是一定要注意的,我们一定要对特征向量进行归一化处理,保障所匹配的特征向量都是处于同一标准之下的,这样,不管是欧式距离还是余弦距离,其实都是等价的,它们的范围都是0到1。此外,对于阈值的设定,一定要针对特定人群特定场景特定需求进行客制化设定,既不能存在较大的误识率也不能存在较高的拒识率,避免安全性不高或者体验性不好,这往往需要多方权衡妥协,没有完美的人脸识别算法。
7. 活体检测
活体检测算法比人脸识别算法还要困难,这是因为活体检测算法更加依赖于细微的图像构造差异,而目前开源的活体检测算法训练数据集都不如人脸识别算法的多,且活体检测算法的攻击形式非常多样不可预见,比如硫酸纸很容易攻破基于近红外人脸的活体检测算法。目前,活体检测算法,主要分为单目活体检测算法、双目活体检测算法,前者有RGB单目活体检测、NIR单目活体检测等等,后者有结构光、TOF、双目RGB及RGBNIR活体检测等等。一般来说,单目活体检测算法成本较低,单目RGB主要是基于人脸图像的细微纹理差异,单目NIR基于近红外的原理天然过滤屏幕攻击,因此,单目NIR效果要比单目RGB效果要好一些,但它们的效果都不如双目活体检测算法。而双目活体检测算法,虽没有成本优势,但性能更加可靠,基于它们所获得的人脸信息往往是带有深度信息的,且在获取到的双目人脸图像中,通常存在较好的活体与非活体区分度,因此,基于双目的活体检测算法慢慢地占据了各大厂商的主流,特别是在金融级支付里,活体检测算法仅有双目形态的。
8. 条件判断
当且仅当特征匹配并且是活体时才可进行下一环节,但要注意,在人脸识别运行过程中,应当要设定一定的timeout过时机制或者运行次数限制,我们不可能让人脸识别算法或者活体检测算法一直试错,避免被攻击或者某种死循环的可能,这是对系统鲁棒性的一种自纠正机制。此外,我们也要注意,对于人脸识别算法和活体检测算法,有可能两者所采用的人脸图像是不一致的,那么就一定要有确保两者是同一个人的判断逻辑,否则就产生漏洞被攻破了。
9. 产生动作
特征匹配并且是活体,满足所有的条件之后,这时,就可以产生任何系统设计所要的功能了,比如开锁、开门、支付等等。
转载此文目的在于传递更多信息,版权归原作者所有。