人脸识别主流算法

人脸识别技术大致以归结为基于几何特征、基于模板和基于模型的方法三类。基于几何特征的方法进行正面人脸识别是通过提取人的眼部、嘴部和鼻部等特征点的位置和眼睛等有特征的面部器官的几何形状作为面部分类特征,但实验显示结果很差。其次是基于模板的方法,该方法可以分为特征脸方法、奇异(SVD)分解方法、线性判别分析方法和基于深度学习的方法等。最后是基于模型的方法,主要分为基于隐马尔可(HMM)夫模型方法和主动形状模型方法等[1, 7]。

目前使用较多的则为基于深度学习的人脸识别方法,得益于机器学习和深度学习的发展,人脸识别技术发展到了一个新的高度。基于深度的人脸识别算法有DeepFace、DeepID、基于C++ 深度学习库Dlib的ResNet人脸识别算法、FaceNet、Face++ 、Arcface和百度人脸识别算法等。其在LFW数据集上测试结果见表1。

表1 主流人脸识别算法LFW测试结果

模型 准确率 (LFW数据集) DeepFace 97.35%[2] DeepID 99.15%[3] FaceNet 99.63%[4] Face++ 99.50%[5] Arcface 99.53%[6] Baidu 99.77% Dlib (ResNet) 99.38%

表中LFW (Labeled Faces in the Wild) 人脸数据库主要用来研究非受限情况下的人脸识别问题,LFW数据集测试指标是人脸识别算法性能的一个重要指标。

人脸识别流程

通常,人脸识别主要流程如图1所示:

图1 人脸识别流程

1. 人脸检测:从给定图像中进行检测并判断出该图像中是否包含人脸;

2. 人脸定位:在检测出的人脸图像中定位M(常见有68、98和106)个人脸特征点,一般采用左右眼、左右嘴角和鼻子这五个关键点;

图2 人脸关键点定位示意图

3. 人脸对齐:根据特征点对人脸图像进行矫正;

图3 人脸对齐示意图

4. 人脸特征表示:根据人脸中定位的M个特征点计算人脸特征N维向量(常见有128、256、512维等);

图4 人脸特征表示示意图

5. 人脸检索:根据人面部特征向量从面部特征库中检索出相似的人脸,相似度通常用欧氏距离或余弦夹角来度量[8]。

欧氏距离是源自欧氏空间中两点间的距离公式,如图5。

图5 欧式空间两点距离图

a) 二维平面上两点 与 间的欧氏距离可表示为:

(1)

b) 三维空间两点 与 间的欧氏距离可表示为:

(2)

c) 两个n 维向量 与 间的欧氏距离:

(3)

表示成向量运算的形式为:

(4)

人脸比对

人脸比对主要的实现流程为将当前从摄像头获取到的含有面部的图像信息进行特征提取,并与数据库里面的所以面部特征信息进行相似度判别,从而实现人脸识别的功能。这里使用欧氏距离作为相似度判别依据,通过计算两个向量之间的欧式距离,欧式距离越小,说明两个向量越相似,也说明两张人脸越相似,根据式(3),两个向量间的欧式距离公式,通过Python实现两个维度相同的向量的欧式距离的计算如下。

Python计算两个维度相同的向量的欧氏距离代码示例

import numpy as np      #     导入numpy库

# #声明两个长度相同的列表

x = [1, 2, 3, 4, 5]

y = [3, 4, 5, 2, 1]

# #将列表转换为numpy数组

x_array = np.array(x)

y_array = np.array(y)

# #计算x_array与y_array之间的欧氏距离

distance = np.sqrt(np.sum(np.square(x_array - y_array)))

print(distance)

>>> distance = 5.656854249492381

如上所示,已经完成并实现两个维度相同的向量的欧式距离的计算,但在实际项目中要实现的是1:N 的向量欧式距离的计算,即用一个特征向量与数据库中的N个特征向量进行计算并找出最小结果。

实现该1:N 的计算的传统方法为使用For循环计算,但通过实测发现,在数据量非常大的时候使用循环计算会耗费大量时间,无法实现实时人脸识别,即使使用新的进程用于计算也无法达到实时的效果。因此摒弃了传统的循环计算,采用矩阵与矩阵的计算,可以说数据量非常庞大的情况下使用矩阵间的运算与使用循环计算在速度上二者根本就不在同一个数量级上。

但两个矩阵间的运算需要参与运算的矩阵有相同的维度,就需将1:N 的运算转化成N:N 的运算,因此可以借助有着高性能科学计算和数据分析的基础科学函数库NumPy来实现1:N 转化成N:N 的运算。使用NumPy进行两个矩阵的运算时,不需要考虑矩阵间的维度是否一致,NumPy会自动判断并扩充两个矩阵的维度使参与运算的矩阵维度一致,这主要得益于NumPy的广播机制(Broadcasting),广播机制示意图如图6。

图6 NumPy广播机制示意图

1:N的人脸特征向量计算Python代码实现如下

def get_distance(array_feature_unknown, arrays_feature_known):

"""

计算两个128D向量数组间的欧式距离

:param array_feature_unknown: 未知的人脸特征数据数组

:param arrays_feature_known: 已知的人脸特征数据数组

"""

# # 计算两个特征数组之间的欧氏距离

array_distance = np.sqrt(np.sum(np.square(array_feature_unknown - arrays_feature_known), axis=1))

min_distance_value = np.min(array_distance) # 找到欧氏距离的最小值

if min_distance_value < 0.4:

# # np.where()# 返回值为元组类型:(array([index, index, index]), ),第一个元素为满足查询条件的[index]

min_distance = np.where(array_distance == min_distance_value)

# # min_distance[0]获取元组中的第一个元素,即index

# # min_distance[0][0]获取index中的第一个元素,即最小值的index,即在arrays_feature_known的索引

min_distance_index = min_distance[0][0]

参考

庞珊珊,熊建设.人脸识别技术和算法综述[J].中国新技术新产品,2009,11:14.Wang M , Deng W . Deep Face Recognition: A Survey[J]. arXiv, 2018.Yi S , Wang X , Tang X . Deep Learning Face Representation by Joint Identification-Verification[J]. Advances in neural information processing systems, 2014, 27.F Schroff, Kalenichenko D , Philbin J . FaceNet: A Unified Embedding for Face Recognition and Clustering[J]. 2015 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2015.Zhou E , Cao Z , Yin Q . Naive-Deep Face Recognition: Touching the Limit of LFW Benchmark or Not?[J]. Computer Science, 2015.Deng J , Guo J , Zafeiriou S . ArcFace: Additive Angular Margin Loss for Deep Face Recognition[J]. 2018.左腾.人脸识别技术综述[J].软件导刊,2017,1602:182-185.郭瑞,张淑玲,汪小芬.人脸识别特征提取方法和相似度匹配方法研究[J].计算机工程,2006,11:225-227+247.

相关链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。