![计算机视觉与深度学习实战:以MATLAB、Python为工具](https://wfqqreader-1252317822.image.myqcloud.com/cover/457/30918457/b_30918457.jpg)
7.3 程序实现
7.3.1 人脸建库
假设对一个维数为M×N的人脸图像矩阵进行向量化处理,则可以得到一个长度为M×N的向量。因此,我们可以将一张112×92的人脸图像看作一个长度为10304的向量。如果建立一个1×10304维的空间,则我们可以将该人脸图像看作此空间中的一点。将维数相同的人脸图像集合映射到这个空间后可以得到相应的点集,且具有较高的维度值。为了便于分析,可以结合人脸结构的相似性,通过PCA降维来得到一个低维子空间,将该低维子空间称为脸空间。PCA降维的主要思想是寻找能够定义脸空间的基向量集合,这些基向量能最大程度地描述某人脸图像在集合空间中的分布情况。
1.人脸空间
假设人脸图像的维数为M×N,脸空间的基向量长度为M×N,则该基向量可以由原始人脸图像的线性组合来获得。因此,对于一幅维数为M×N的人脸图像数字矩阵,通过每列相连的方式可以构成一个大小为D=M×N维的列向量,并将D记作人脸图像的维数,即脸空间的维数。
假设 n 是训练样本的数量,xj表示第j 幅人脸图像形成的人脸向量,则训练样本集合的协方差矩阵为:
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/101_1.jpg?sign=1739290567-goi7dzwgQIJ5WPq9bOWShh1RNdEcAKpL-0-89085d38129c59d35b346dfc5ecb2841)
式中,u为训练样本的平均图像向量:
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/101_2.jpg?sign=1739290567-KLfe9HXjKUAD9RL048WuTFKJPHinXXIX-0-545562ca34c946f50d45d64e6942300c)
令A=[ x1-u x2-u… xn-u],则Sr=AAT ,其维数为D× D。
根据K-L变换的原理,新坐标系的基向量由矩阵AAT的非零特征值所对应的特征向量组成。一般而言,如果直接计算大规模矩阵的特征值和特征向量,则将面临较大的计算量,所以根据矩阵的特点,可以采用奇异值分解(SVD)定理,通过求解AAT的特征值和特征向量来获得AAT的特征值和特征向量。
2.特征脸计算
依据SVD定理,令li(i=1,2,…,r)为矩阵AAT的r个非零特征值,vi为AAT对应li的特征向量,则AAT的正交归一化特征向量ui为:
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/101_3.jpg?sign=1739290567-P3JgXIVzZRTd3KcYgngJMeaMj0EOjwAI-0-440a0e4029dd8f382f9b54a7fb808528)
因此,特征脸空间的定义为:w=(u1,u2,…,ur)。
将训练样本投影到“特征脸”空间,能够得到一组投影向量Ω=wTu,可构成人脸识别的数据库。在识别时,首先将每幅待识别的人脸图像都投影到“特征脸”空间得到投影系数向量;然后利用最近邻分类器来比较其与库中人脸的位置,从而识别该图像是否是库中的人脸,如果不是则返回未知信息;最后,判断是哪个人的脸。
7.3.2 人脸识别
PCA人脸识别属于模式识别的一个应用,一般包括如下步骤:人脸图像预处理及向量化;加载人脸库,训练形成特征子空间;将训练图像和待识别图像投影到该特征子空间上;选择一定的距离函数进行模式识别。
本案例所涉及的人脸样本均取自英国剑桥大学的ORL(Olivetti Research Laboratory)人脸库,该库作为标准人脸数据库被广泛应用于多种人脸检测、识别场景。ORL人脸库包含40组,每组都对应1个人的10幅人脸图像,因此共计400幅人脸正面图像。其中,每幅图像的大小均固定为92×112,采集于不同时间、光线轻微变化的环境条件下,不同的图像可能存在包括姿态、光照和表情上的差别。其中的部分图像如图7-4所示。
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/102_1.jpg?sign=1739290567-KARqKyUTyCiRIPsinMjmjqngcfvWZWei-0-6df960037e78b1902b729d082523623a)
图7-4 ORL人脸数据库中的5幅图像
ORL数据库提供了经过预处理的人脸集合,可以方便地获取训练集和测试集。例如,选取每组图像的前5张人脸作为训练样本,后5张人脸作为测试样本。在一般情况下,增加训练样本的数量会增加人脸特征库的容量,并可能对人脸识别核心算法的时间和空间复杂度带来指数级的增加。通过对待识别图像与原训练库的对比及欧式距离识别,在识别结果的显示窗口中一共显示了整个人脸图像库中最小的10个欧氏距离,它们的排列也是从小到大进行的。这10个欧氏距离也分别代表了与实验中选取的待识别的人脸图像最相近的10幅人脸图像。因此,选择距离最近的目标,就可以得到我们实验所需识别的人脸图像。
7.3.3 人脸二维码
为了提高实验编码性能及充分利用不同编程语言的优势,本案例选择使用ZXing 1.6实现对条码或二维码的处理。ZXing作为一个经典的条码或二维码识别的开源类库,是一个开源Java类库,用于解析多种格式的1D/2D条形码,能够方便地对QR二维码、Data Matrix、UPC的1D条码进行解码。利用Java语言跨平台的特点,该类库提供了多种平台下的客户端,包括J2ME、J2SE和Android等,本实验选择Windows平台下的MATLAB对其Jar包的调用来实现对QR二维码的处理。
在归一化人脸库后,对库中的每组人脸都选择一定数量的图像构成训练集,其余的构成测试集。假设归一化后的图像为n×m维,按列相连就构成了N=n×m维向量,可视为N维空间中的一个点,进而能够通过K-L变换用一个低维子空间描述这个图像。所有训练样本的协方差矩阵为:
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/103_1.jpg?sign=1739290567-OFWeBw6ACtnJIwQUyWroMss9W3GGu8oz-0-985f0f63c8ae7b636c0c466e1e7f562a)
式中,A=(φ1,φ2,…,φm),φ1=x1-mx,mx是平均人脸,M是训练人脸数,协方差矩阵C1是一个N×N的矩阵,N是xi的维数。这3个矩阵的定义是等价的。根据前面章节的论述,为了方便计算特征值和特征向量,本实验选用第2个公式作为待处理矩阵。根据K-L变换原理,所计算的新坐标系由矩阵AAT的非零特征值所对应的特征向量组成。在实际处理过程中,如果直接对N×N大小矩阵C1计算其特征值和正交归一化的特征向量,则有较高的运算复杂度。根据奇异值分解(SVD)原理,可以通过求解ATA的特征值和特征向量来获得AAT的特征值和特征向量。本实验对ORL人脸库PCA降维的过程进行了函数封装。核心代码如下:
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/103_2.jpg?sign=1739290567-t9gCUlFSVG2qsKvkPwzzAVuwih2hoFXB-0-d7f3bc55cb26b993984097011de708fc)
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/104_1.jpg?sign=1739290567-Yw5Uy2XMoeyeFXxNs03gFn0SIaWTsEkJ-0-7b01fac3375d3f94ec5c44cf703eab5a)
因此,本实验首先对所有图片进行投影,然后对测试图片进行同样的投影,采用欧式距离作为判别函数对投影系数进行识别。本实验将对ORL人脸图像进行降维及QR二维码编码、解码,对主要过程进行验证。
(1)首先,载入人脸图像并进行PCA降维处理。
(2)其次,对降维数据进行编码并显示。
(3)最后,对二维码进行缓存并解码,识别人脸。
以上过程的入口脚本代码如下:
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/104_2.jpg?sign=1739290567-nDnCvEjHOF6O8mT5kUcZznW2lv4Dhtnu-0-7ad6a3f8ce1731faf842ee79fa8d8a90)
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/105_1.jpg?sign=1739290567-08PMcHcImmkgiBM081MJiMTdRVw3BuHY-0-757ce7162c90b46de31d199bb692d8ae)
在实验过程中,为调用方便,将根据输入的内容进行QR编码的过程进行函数封装。核心代码如下:
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/105_2.jpg?sign=1739290567-98wIGiU3nTtUssqnp2JQy3aj77iw8b5W-0-019433d873f832b37f0b2b5debdf9f4b)
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/106_1.jpg?sign=1739290567-2y6dmDsbN8m2z31VAOIG74DJ3IE4Z1eg-0-d37abb6fab886292a37ed97c93240e35)
在实验过程中,为调用方便,将根据输入的内容进行QR译码的过程进行函数封装。核心代码如下:
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/106_2.jpg?sign=1739290567-oMaLi1Lr3VAazANU4qzX8tMV3eWHYXYt-0-73e7347015cdd11e7f1105a66b8040af)
以某张人脸为例,进行人脸图像的降维及编解码运算所得到的效果如图7-5~图7-7所示。
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/106_3.jpg?sign=1739290567-V4j1DrmnFtsClsHAJRe33K7niRBt3zWN-0-22f1876cd06e4826c05290014479b10e)
图7-5 人脸图像
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/106_4.jpg?sign=1739290567-bgaVjAIENXksXiVrRnAOF9viXxBsTS8D-0-0439527261c67b7b1fe13488d4058899)
图7-6 人脸二维码
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/106_5.jpg?sign=1739290567-KnVNzE0qdilXkJUtmCp0yaZbeoQFiLfS-0-170d44819a4a63290aa4d4616664457f)
图7-7 识别人脸
在实验过程中,由于在编码之前对原始系数向量进行了数据裁剪,省略了部分数据,所以识别结果显得有些模糊,但依然可以明确地看出人脸的轮廓,这有利于减少对二维码数据进行存取的压力。
为了便于演示,本实验还基于MATLAB GUI进行软件系统设计,增加人工交互的便捷性,软件运行界面包括控制面板和图像显示区域,如图7-8所示。
![](https://epubservercos.yuewen.com/C5D702/16793575804223706/epubprivate/OEBPS/Images/107_1.jpg?sign=1739290567-fA3J7SoQT45U7wlbiPSSZJvEDEBQQZnV-0-a54539b73ad3d2a27474ccc8f1cab8a6)
图7-8 软件系统实验
实验结果表明,采用PCA人脸降维得到关键数据,并调用zxing类库执行QR的编译码,具有较高的实验效率,能有效压缩人脸数据,便于识别。此外,程序调用了第三方类库来实现二维码的编译码,要求具备JDK 1.6及以上版本的运行环境。