(原标题:人脸识别自助发卡应用的开发经验分享)
作为从B/S转战C/S开发初学者,我最近在做运输车辆通行卡自助收发应用,并第一次用到了人脸识别功能。同时也复盘了一些开发经验,总结出来便于初次应用人脸识别的朋友进行参考。
其实这种运输车辆通行卡自助收发应用与信用卡自助发卡机、社保卡自助发卡机的原理有些相似,该自助发卡机在借助人脸识别和身份证读取确认后,发卡机会匹配后端数据,并将取卡人、取卡时间、卡片权限等信息录入卡片,随后吐出卡片,用户取卡后可进行后续通行操作。该自助发卡机可自动放行ETC车辆,在有效提升高速收费站入口通行能力的同时,能切实减轻一线收费员工作强度。
下图是发卡机部分的基本流程,只需要把一些操作步骤进行封装,通过串口发送命令就可以实现相应功能,身份证信息则通过读卡器进行读取。
进一步简单描述一下项目背景和需求:
项目使用成本要低
这个项目比较小,在人脸识别的功能上并没有额外预算,所以首选免费的人脸识别算法。
项目安全性精准性要高
之所以引入人脸识别,主要是为了保证本人取卡,专人专卡,确保精准管理、杜绝冒领冒用,在人脸识别算法中还需要加入活体检测功能,自动地、高效地辨别人脸真假。
项目能实现毫秒级离线识别
该项目地点的网络环境比较差,为避免因为网络故障导致无法取卡,优先选择可离线使用的人脸识别算法。
综合考虑下,我选择了虹软视觉开发平台的ArcFace SDK。虹软开放平台免费的ArcFace SDK具备的离线激活功能,可以满足不支持公网接入的场景,其次功能相当完整,自带IR/RGB双目活体检测,进一步优化了抵御面具、视频、照片的防攻击性能,即使在室外逆光、强光等复杂环境下,也有上佳效果。另外,虹软开发平台最新出的ArcFace SDK 4.0版本,更新了针对佩戴口罩下的活体检测和人脸识别功能。
另外,ArcFace SDK的使用也相对简单。在官网注册开发者之后,新建应用,就能得到全新的APP_ID和SDK_KEY,之后下载开发包配置到程序中。
下图就是人脸识别的界面,右侧是身份证照片以及识别反馈,左侧是拍摄画面。
开发时用到了三个引擎,第一个是图片模式下的人脸检测引擎:
第二个是视频模式下的人脸检测引擎:
第三个是视频专用FR引擎,进行活体检测:
视频处理使用的是AForge.Video 视频处理类库,然后在电脑上接上USB摄像头,通过此类库就可以调用摄像头的开关了,至于具体的人脸识别要放在视频流渲染事件上了。
首先需要获取身份信息,所以要将身份证放在身份证阅读器上,并把身份信息中的人脸照片拿出来作为人脸注册照。利用ArcFcae SDK的相关接口,可以从注册照中提取人脸识别特征值。
之后,我们要从摄像头的视频流中获取一帧图片,作为识别照也进行人脸识别特征值提取。值得注意的是,ArcFcae本身支持多人脸识别,但由于人证核验为1:1人脸识别,因此为了排除多余人脸的干扰,我们可以选取检测到的最大人脸,进行特征值提取。
在获得识别照和注册照的特征值之后,就可以用算法进行比对,得到一个相似度的数据。这里需要注意人脸识别算法只会给出一个相似值,而不是直接说明照片和人是否为同一人。最终输出的结果还需人为设置一个阈值,譬如相似度超过90%,我们就可以认定是同一个人。当然阈值也不是越高越好,具体设置需要根据项目的实际情况来做权衡。
这样已经完成基础的人脸识别了,但活体检测功能还没有加入。如果缺乏活体检测功能,或者活体检测相对初级,人脸识别设备就可能被打印出的人脸照片或者照片活化视频攻破。
因此,活体检测在自助设备这类无人值守场景下基本上不可或缺。虹软ArcFace自带的活体检测有单目RGB活体检测和IR双目红外活体检测两种。
单目RGB活体检测通过分析采集摩尔纹、成像畸形、反射率等人像破绽来识别活体,或者基于红外图像天然滤除特定波段光线的特征,通过多维度的识别依据保证了识别的准确性,有效抵御基于屏幕成像的假脸攻击。
而IR双目红外活体是在RGB单目活体的算法能力基础上,加入了红外摄像头,对于屏幕成像和纸张照片类的防御力也更加优秀,相对RGB活体成本有所提高,不过就该项目而言暂时不需要这么高的需求。
在加入活体检测之后,所有流程基本完成,最后还需要进行引擎的释放,否则多次操作之后就会出现因为内存泄漏而导致闪退的现象。
这个做法能达到目的,但是比较僵硬,在咨询虹软开放平台的技术专家后,我发现应该根据实际业务需求,在程序启动时,有选择的初始化对应的算法属性,避免在运行中多次做初始化和反初始化的操作,否则会导致资源波动过大以及产生内存碎片。引擎在程序结束或当前界面关闭时释放即可。
总体而言比较顺利,虽然是第一次集成人脸识别,这可能和ArcFace容易上手也有关系。希望这篇内容能对大家有帮助。