判断两张人脸图片的相似度,学术上叫做人脸对比,实际上是一对一的关系。而人脸识别一般就是一对多的关系,即在多张图片中找到哪两个图片中的是相同的人。
总的来说,人脸识别主要分为三个部分:人脸检测,人脸校正和人脸识别。
常用的方法现在已经比较成熟了,主要分为基于统计的和基于深度学习的两种方法。
基于深度学习的:
基于深度学习的主要就是卷积神经网络了,卷积神经网络的基本原理就是用卷积核作为一个滑动“窗口”在图像矩阵上去滑动,将与卷积核相类似的特征放大,然后再进行池化,池化的作用主要就是降低卷积层输出特征向量的规模,防止过拟合,然后再经过若干个卷积和池化层,最终利用SoftMax等整理后输出结果。
大规模神经网络可以实现检测,校正和识别三个部分,可以最终直接输出人脸的特征,好处就是识别率很高很高,缺点就是在CPU条件下运算速度会较慢。
基于统计的方法:
(1)人脸检测:haar,HOG特征,一般结合adaboost算法以取得较好的运算效果
(2)人脸校正:由于人脸识别主要有用的是人脸的轮廓,其肤色,光照等等相比之下并不重要,而人脸校正主要是将不同姿态的人脸进行所谓的“摆正”,也称之为人脸对齐,这样使得输出的人脸特征具有可比性,这个基本原理是计算机图形学中仿射变换。这部分现在一般用卷积神经网络处理得就比较好了。
(3)人脸识别:Haar,Hog,LBP算法本身就是用来提取特征的,一般对于人脸用LBP特征比较合适,将特征提取出来后可能还需要降维,一般结合PCA主成分分析的方法。也有用LDA算法来处理的。
基于统计的方法好处是在CPU下运算较快,缺点是识别率相对较低,因为特征都是人工首先指定好的,并不像深度学习那样“自主”。
当特征都提取出来之后,就可以计算特征之间的差距了,这是最简单的,距离计算的方法有:
余弦距离,欧氏距离,马氏距离,皮尔逊相关系数,对于某些特定的场景还可能是汉明距离~~~
所以,对于google开源的一款人脸识别引擎,就事采用了统计和深度学习结合的方法,使用基于统计的方法来定位人脸,使用深度学习来提取人脸特征,这样兼顾了速度和准确率。
值得一提的是,在人脸识别过程之前,有些方法往往还有一些预处理,一般是高斯低通滤波器,主要是用于滤出高斯噪声,还有一些使图像更为平滑的预处理。
开源库:
开源的人脸识别库也不少,国内比较著名的有中科院山世光教授组的SeetaFace引擎,但是该代码在部署的时候会有些小坑,一般认为是人脸识别开源出来的一股清流。
除此之外,比较著名的还有FaceBook的DeepFace、Google的FaceNet、汤晓鸥教授的DeepID,以及github上的一系列开源产品(包括算法)。
领取专属 10元无门槛券
私享最新 技术干货