首页 » 刷脸背后:人脸检测 人脸识别 人脸检索 » 刷脸背后:人脸检测 人脸识别 人脸检索全文在线阅读

《刷脸背后:人脸检测 人脸识别 人脸检索》6.3 OpenCV中的3种人脸识别算法

关灯直达底部

OpenCV从2.4版本开始支持人脸识别功能,本书所用的版本是2.6.10,Python版本为3.4。OpenCV主要提供3种人脸识别算法,分别是Eigenfaces[12]、Fisherfaces[13]、Local Binary Patterns Histograms[14](LBP,局部二值模式直方图)。Eigenfaces和Fisherfaces都是整体特征,而LBP则是局部特征,可以降低特征向量维度。OpenCV人脸识别的官方参考文档链接为:http://docs.opencv.org/2.6.10/modules/contrib/doc/facerec/facerec_tutorial.html。

6.3.1 Eigenfaces

1.算法原理

假设一张图片的尺寸为m×n像素,那么该图片对应一个长度为m×n的特征向量。所以,一张200×200像素的图片就对应了一个长度为40 000维的特征向量。但并不是这40 000个特征都对我们识别图像有帮助,我们想要的是最能代表图片信息的主要特征向量(40 000维中的一部分维)。主成分分析(Principal Component Analysis,PCA)由Karl Pearson(1901)和Harold Hotelling(1933)提出,它将一系列相关的属性(维)转换成更小的不相关属性集合(来源:OpenCV人脸识别的官方参考文档)。一个高维度的数据中,通常只有一部分维度代表有用的信息,而PCA就能发现高维数据中的主成分(主要属性)。PCA算法原理如下:

(1)计算数据集平均值。

(2)根据数据集平均值计算该数据集的协方差。

(3)求出协方差的特征向量和对应的特征值。

(4)根据特征值降序排列特征向量,前k个主成分就是k个最大的特征值对应的特征向量。

2.算法流程

整体操作步骤如下(来源:OpenCV人脸识别的官方参考文档)。

(1)运行源码opencv_frprocess_data文件夹下的create_csv.py文件,将图片路径和标签信息保存到at.csv文件中。

(2)编译源码文件夹opencv_fr下的facerec_eigenfaces.cpp文件,生成可执行文件。

具体步骤如下。

1)数据预处理

(1)使用AT&T Facedatabase[15]数据库,该数据库包含40个人,每个人有10张图片,其中某些人的图片在不同时间采集,有微弱的光照变化和面部表情变化。

(2)运行源代码opencv_frprocess_data文件夹下的create_csv.py文件,将图片路径和标签信息保存到at.csv文件中。在使用之前,读者需要修改自己的图片路径。

命令形式:

create_csv.py [图片数据所在路径,需要指定到该路径下包含s*的文件夹]

OpenCV提供的create_csv.py文件内容如下:

2)分类识别

(1)编译源码文件夹opencv_fr下的facerec_eigenfaces.cpp文件,生成的可执行文件命名为FaceRec_EigenFaces.exe。

(2)使用FaceRec_EigenFaces.exe命令:

FaceRec_EigenFaces.exe [图片列表文件] [输出图片的保存路径,可选]

例:

facerec_eigenfaces.cpp文件是OpenCV官方网站提供的源程序,其内容如下:

3.算法结果

经测试,该算法能正确预测测试图片的标签。

输出为:测试图片的预测标签,前10个特征向量对应的特征值如下所示。

使用了JET模式色图的10个Eigenfaces如图6-8所示,从这些图中我们可以看出,Eigenfaces不仅对面部特征进行了编码,而且对图片中的光照也进行了编码(第四张图中的右侧光,第五张图中的左侧光)。

图6-8 使用了JET模式色图的10个Eigenfaces

使用特征向量重新构建的人脸图像如图6-9所示。重新构建一个较好的人脸图像需要多个特征向量,从图6-9中可以看出,10个特征向量不足以重新构建人脸图像。50个特征向量可能足够重新构建人脸图像,对于AT&T Facedatabase来说,300个特征向量可以重新构建一个较好的人脸图像(来源:OpenCV人脸识别的官方参考文档)。

图6-9 使用特征向量重新构建的人脸图像

6.3.2 Fisherfaces

1.算法原理

Eigenfaces主要基于PCA实现,但是仍有一些不足,因为该PCA是无监督的,没有考虑类间变化,如输入数据的主要变化是光照,经过PCA处理后,该数据不再具有可区分信息(来源:OpenCV人脸识别的官方参考文档)。

线性鉴别分析[16](Linear Discriminant Analysis,LDA)主要是处理特定类的降维,最大化类间的离散度、最小化类内的离散度。Fisherfaces主要基于LDA实现。

2.算法流程

整体操作步骤如下。

(1)运行源码opencv_frprocess_data文件夹下的create_csv.py文件,将图片路径和标签信息保存到at.csv文件中。

(2)编译源码文件夹opencv_fr下的facerec_fisherfaces.cpp文件,生成可执行文件。

具体步骤如下。

1)数据预处理

同6.3.1节。

2)分类识别

编译源码文件夹opencv_fr下的facerec_fisherfaces.cpp文件,生成FaceRec_FisherFaces.exe可执行文件。

FaceRec_FisherFaces.exe命令:

FaceRec_FisherFaces.exe [图片列表文件] [输出图片的保存路径,可选]

例:

facerec_fisherfaces.cpp文件是OpenCV官方网站提供的源程序,其内容如下:

3.算法结果

经测试,本算法能正确预测测试图片的标签。

输出为:测试图片的预测标签,此处只输出了前16个类别的特征值,如下所示。

输出16个类的Fisherface如图6-10所示,输出16个类的Fisherface重新构建后的图像如图6-11所示。

图6-10 16个类的Fisherface

图6-11 16个类的Fisherface重新构建后的图像

6.3.3 Local Binary Patterns Histograms

1.算法原理

Eigenfaces和Fisherfaces考虑的是整体特征,Eigenfaces最大化整体离散度,由于数据内部变化可能会导致分类识别,如光照变化等;为了保留类间可区分信息,于是就有了基于LDA实现的Fisherfaces,在特定场景下,它优于Eigenfaces。

Local Binary Patterns Histograms的主要思想是:通过比较图片中像素和与它相邻的像素对局部进行求和。取一个像素作为中心,对相邻的像素进行比较,如果中心像素的值大于或等于相邻像素的值,则把该相邻像素标为1,否则标为0。对于图片中的每个像素,会得到一个二进制序列,如00001111。一个中心像素周围的8个像素,可以得到28种组合,这种方法称为LBP或LBP编码。

为了具有尺度不变性,使用一个给定半径的圆来定义近邻,这种方法称为扩展LBP。

2.算法流程

整体操作步骤如下。

(1)运行源码opencv_frprocess_data文件夹下的create_csv.py文件,将图片路径和标签信息保存到at.csv文件中。

(2)编译源码文件夹opencv_fr下的facerec_lbph.cpp文件,生成可执行文件。

具体步骤如下。

1)数据预处理

同6.3.1节。

2)分类识别

编译源码文件夹opencv_fr下的facerec_lbph.cpp文件,假设生成FaceRec_LBPH.exe可执行文件。

FaceRec_LBPH.exe命令:

FaceRec_LBPH.exe [图片列表文件] [输出图片的保存路径,可选]

例:

FaceRec_LBPH.exe F:paperbookcodeopencv_frprocess_dataat. csv

facerec_lbph.cpp文件是OpenCV官方网站提供的源程序,其内容如下:

3.算法结果

经测试,该算法能正确预测测试图片中的标签。

输出为:测试图片的预测标签,模型信息如下所示。