把归一化为-1到1的图像数据、特征点提取模型的参数还有人脸数据库输入到人脸比对的函数接口face_recgnition,即可得人脸认证结果。程序接口的简单调用方式如下所示:
人脸比对算法的准确率方面是以查准率为保证的,AUC (Area under curve)=0.998,ROC曲线图如下所示:
我们设计的比对模型主要特点是模型参数少、计算量少并能保证高的准确率,一定程度上适合在嵌入端进行布置。对比其他人脸比对模型差异如下表格所示:
far@1e-3表示将反例判定为正例的概率控制在千分之一以下时,模型仍能保持的准确率;
dlib在实际测试中,存在detector检测不出人脸的情况,导致最终效果与官网上有一定差异;
resnet-18为pytorch的playground标准模型;
lfw/agedb_30/cfp_ff为标准人脸比对测试库,测试过程中图片已经过人脸居中处理。
五人脸反欺诈
从技术角度来说,人脸是唯一不需要用户配合就可以采集的生物特征信息。人脸不同于指纹、掌纹、虹膜等,用户不愿意被采集信息就无法获得高质量的特征信息。人脸信息简单易得,而且质量还好,所以这引发了有关个人数据安全性的思考。而且在没有设计人脸反欺诈算法的人脸识别系统使用手机、ipad或是打印的图片等都能对轻松欺骗系统。
所以我们采用多传感器融合技术的方案,使用红外对管与图像传感器数据进行深度学习来判断是否存在欺诈。红外对管进行用户距离的判断,距离过近则怀疑欺诈行为。图像传感器用深度学习算法进行二分类,把正常用户行为与欺诈用户行为分为两类,对欺诈用户进行排除。
二分类算法能够有效抵抗一定距离的手机、ipad或是打印图片的欺诈攻击。对人脸欺诈数据集与普通人脸数据集预测如图所示:
本二分类算法在100万张图片中准确分类的概率为98.89%,所以并不会对整体系统的准确率进行影响,保障系统的可靠性。
六算法优化
在使用神经网络算法解决问题的时候,算法效率问题是必要的考量的。特别是在资源与算力不足的嵌入式端,更是头等大问题。除了依托TensorFlow、Keras等开源框架,根据其前向传播的原理写成C++程序,还有必要的编译优化外,模型权重参数的清洗和算法计算的向量化都是比较有效的手段。
1、模型权重参数清洗
权重参数清洗对神经网络算法的效率影响相当大,没有进行清洗的权重参数访问与操作非常低效,与清洗后的权重参数相比往往能效率相差6-8倍。这差距在算力不足的嵌入式端非常明显,往往决定一个算法是否能落地。具体的方法就是先读取原模型进行重组,让参数变得紧凑且能在计算时连续访问计算,最后获得重组后的模型与对应的重组模型的计算方法。这个步骤需要一定的优化实践经验以达到满意的效果,对模型读取效率与运算效率都会有显著的提高。
2、算法计算向量化
对于算法的向量化的做法就是让算法的计算能够使用向量乘加等运算,而特别是在使用神经网络算法情况下,大量的计算没有前后相关性且执行相类似的步骤,所以向量化计算会对算法有明显的提升,一般能把算法效率提升三倍左右。
使用NEON指令集的SIMD指令取代ARM通用的SISD指令,是一个常用的算法向量化方法。在基于ARMV7-A和ARMV7-R的体系架构上基本采用了NEON技术,ARMV8也支持并与ARMV7兼容。
以IMX6ULL芯片为例,可以通过查阅官方的参考手册查看其NEON相关信息:
下面举例说明普通的编程写法与NEON instrinsics编程、NEON assembly编程区别。以下为普通的编程写法:
以下为转化为NEON instrinsics的编程: