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

《刷脸背后:人脸检测 人脸识别 人脸检索》7.7 PCA算法

关灯直达底部

PCA(Principal Component Analysis)是一种常用的数据分析方法。它利用线性代数中的线性变换将原始图像变换成一组各维度线性无关的表示,可用于提取数据的主要特征分量,也适用于图像数据(高维数据)的降维。

在本节中,我们先将图像调整到合适的尺寸,然后再对所有图像进行PCA处理。这样就解决了图像间检索速度慢的问题。我们使用的PCA算法是非监督式的,它能很好地挑选代表所有样本的属性。下面我们来具体阐述PCA算法的使用与具体实现。

7.7.1 PCA算法的使用

使用Windows 7操作系统,以及CodeBlocks+OpenCV2.4.9的软件环境。

运行相关程序的步骤如下:

(1)使用CodeBlocks打开“PCA+Cosdistance”项目下的FaceResearch.cbp文件。

(2)打开Sources源文件中的main.cpp文件,修改图像集所属文件夹名称及图像的格式。代码如下所示:

imgData = readImg(/"image30x40/",/"jpg/"); //读入所有训练集

(3)读入测试图像的完整路径。代码如下所示:

Mat singleImg = imread(filename,0); //读入测试图像

(4)运行Sources源文件中的main.cpp文件即可。

7.7.2 PCA算法原理

对于大量多维数据来说,变量之间相互关联,多重共线性会导致解空间的不稳定,从而导致结果的不连贯;多维度数据具有稀疏性,过多的变量会阻碍我们查找数据中的内在规律。因此,为了更好、更快地计算两个图像之间的差异,我们需要对原始图像进行PCA降维。其作用有三:(1)减少预测变量的个数;(2)确保这些变量之间是相互独立的,去除了噪声,发现数据中的模式,从而增加变量的代表性和变量间的区分度;(3)提供一个框架来解释结果[4]。

PCA的算法思想如下[5]:假设有m个实例,n维数据。第一步,将原始数据按列组成n行m列矩阵X;第二步,将X的每一行进行零均值化,也就是减去这一行的均值;第三步,求出协方差矩阵,以及其特征值及对应的特征向量;第四步,将特征向量按照对应特征值的大小从上到下按行排列成矩阵,取前k行组成矩阵p;第五步,y=pX即为降维到k维后的数据。PCA的实质就是在尽可能好地代表原来特征的情况下,将原来特征进行变换、映射至低纬度空间中。

降维的实现[6]:PCA降维的目的就是“降噪”和“去冗余”。降噪的目的就是使保留下来的维度间的相关性尽可能小,也就是说让协方差矩阵中非对角线元素都基本为零。这一步在线性代数中称为矩阵对角化。对角化后的矩阵的对角线上是协方差矩阵的特征值,它有两层含义:第一层,它是各个维度上的新方差;第二层,它是各个维度本身应该拥有的能量。这就是我们为何一直将方差与能量等同的原因。而“去冗余”的目的就是使保留下来的维度含有的“能量”(方差)尽可能最大。首先我们需要知道,协方差矩阵度量的是维度与维度之间的关系,而非样本与样本之间。协方差矩阵的主对角线上的元素是各个维度上的方差(能量)。其他元素是两两维度间的协方差(相关性)。在除噪对角化后的协方差矩阵的对角线上较小的新方差对应的就是那些该舍掉的维度。因此,我们只取那些含有较大能量(特征值)的维度,其余的舍掉即可。PCA线性数学原理实质其实就是对角化协方差矩阵。

PCA的过程如下:

(1)特征中心化,即每一维的数据都减去该维的均值。这里的“维”指的就是一个特征(或属性),变换之后每一维的均值都变成了0。假如原始数据是一个矩阵A,我们将每一列减去该列均值后,得到矩阵B。

(2)计算矩阵B的协方差矩阵C。

(3)计算协方差矩阵C的特征值和特征向量。

(4)挑选出大的特征值对应的特征向量,得到新的数据集。

7.7.3 PCA算法实现

PCA算法的具体实现步骤如下。

1.前期处理

其中,readImg函数如下:把灰度图像调整成大小为30×40像素的图像,并对图像进行reshape、pushback处理,存储到一个Mat变量里面。

2.在图像集上进行PCA操作

构建PCA,其中第一个参数表示将矩阵形式表示的图像数据以行向量形式表示,如尺寸为30×40像素的图像,表示为1行×1200列。若有20张图像,此时的imgData就是一个20行×1200列的Mat。第三个参数CV_PCA_DATA_AS_ROW表示的是矩阵的每一行代表一个样本。第四个参数0.9表示选择构成90%的能量的特征值,调用OpenCV中PCA算法,将Mat imgData 投影到特征空间生成pcaFeature。上面已经提到,PCA降维的目的是去除噪声,发现数据中的模式;确保变量相互独立;提高运行速度。

3.输入测试图像

输入测试图像,展开成1行×1200列,存储于一个test-Mat 变量里,并将测试图像test-Mat也投影到特征空间(测试图像要经过上述两个步骤相同的处理)。

4.求余弦相似度

将两个图像的表示分别视为两个行向量,求这两个向量之间的内积(或称为点积)。它们之间的相似值在0和1之间浮动,1表示和测试图像相同,余弦相似值越大,表示两个图像的相似度越大。在本实验中,相似图像(和输入图像为同一个人的图像)的值大多都在0.90以上。

calculateCosEuDis函数参考本章7.2节相关内容。

7.7.4 PCA算法的实验数据、实验结果及分析

1.实验数据

图像库中的图像为“..PCA+Cosdistanceimage30×40”路径下的所有(497张)图像。

输入的查询图像为“..PCA+Cosdistanceimage30×40”路径下的S001-001.jpg图像。

image30×40图像集的说明:以其中一张图像的名称为例,“s001-001.jpg”就代表第一个人的第一张图像,“s001-002.jpg”就表示第一个人的第二张图像。类似地,“s002-001.jpg”代表第二个人的第一张图像。

2.实验结果

以下是部分测试结果。

查询图像如图7-5所示。

图7-5 查询图像(3)

检索出的部分相似图像如图7-6所示。

图7-6 检索出的部分相似图像(3)

实验结果为“..PCA+Cosdistance”路径下的similityPCAFeature.txt文件。其中每一行代表图像的序号和相似度。图像的顺序包含在“..PCA+Cosdistance”路径下的FileName.txt文件。

表7-3所示是我们整理出来的部分实验结果。

表7-3 部分实验结果(3)

续表

续表

3.实验分析

本算法可用于相同或相似图像的查找。本算法中相似图像与查询图像之间的最小余弦相似度的阈值为0.89。查准率为43/46×100%=93.5%,查全率为43/43×100%=100%。