之前利用Fisher线性分类器实现过多类人脸识别,这次还是同样的数据集,利用SVM实现人脸识别。
数据集如下所示:一共是40个人的人脸照片,每个人有10张图片。
1.实验原理
1.利用SVM实现人脸识别的结构如下所示:
2.利用主成分分析 PCA 实现特征提取
图像识别中,常常用矩阵来表示人脸图像。然而,高维图像数据对整个识别系统的识别
速度有限的,也不利于实时识别系统的实现。降维技术是解决这一问题的常用方法,使数据
从原始图像高维空间转化为维数大大减小的特征空间,同时,又保留原始图像数据的绝大部
分信息。
主成分分析利用 K-L 变换得到高维图像空间的一组正交基,保留其中较大的特征值对应的正交基,组成特征脸空间。将 PCA 用于人脸图像的最优表示,应用主分量重构人脸,提出特征脸(Eigenface)的概念,用 PCA 实现人脸图像的紧致表示,认为任何一幅图像都可以用一组特征脸的线性加权和来近似重构,其权重系数可以通过将人脸图像在本征脸空间投影得到,然后用投影到低维空间中基函数上的系数来表示人脸并进行识别,并采用**奇异值分解(SVD)**算法简化了特征脸的计算。计算流程如下所示:
3. SVM 分类器设计
支持向量机(Support Vector Machine,SVM)是在统计学理论的基础上发展起来的新一代学习算法,它在文本分类、手写识别、图像分类、生物信息学等领域中获得较好的应用。
SVM 是一个二分器,只能用于 2 类样本的分类,现在我们将它推广到多类问题。对 SVM 进行推广到能够处理多类问题。可采用一对一的投票策略。将 A、B、C、D 4 类样本分成多个两类分类训练集,即(A,B)、(A,C)、(A,D)、(B,C)、(B,D)、(C,D),得到 6 个(对于n 类问题,为 n(n-1)/2 个)SVM 二分器。在测试的时候,把测试样本 x 依次送入这 6 个二分器,采取投票形式,最后得到一组结果。投票是以如下方式进行。
初始化:vote(A)=vote(B)=vote(C )=vote (D)=0.
投票过程:
如果使用训练集(A,B)得到的分类器将 x 判定为 A 类,则 vote(A)=vote(A)+1,否则vote(B)=vote(B)+1.
如果使用(A,C)训练的分类器将 x 判定为 A 类,则 vote(A)=vote(A)+1,否则 vote( C)=vote(C )+1;
如果使用(C,D)训练的分类器将 x 判定为 C 类,则vote( C)=vote( C)+1,否则 vote(D)=vote(D)+1。
最终判决:
Max(vote(A),vote(B),vote©,vote(D))。如有两个以上的最大值,则一般可以简单的取第一个最大值所对应的类别。
2.实验内容
1.数据库的选择
选取 ORL 人脸数据库作为实验样本,总共 40 个人,每人 10 幅图像,图像大小为112*92 像素。图像本身已经经过处理,不需要进行归一化和校准等工作。实验样本分为训练样本和测试样本。首先设置训练样本集,选择 40 个人前 5 张图片作为训练样本,进行训练。然后设置测试样本集,将 40 个人后 5 张图片作为测试样本,进行选取识别。
2.实验要求
1)分别使用 PCA 降维到 20,50,100,200,然后训练分类器,对比分类结果,画出对比曲线;
2) 变换 SVM 的 kernel 函数,如分别使用径向基函数和多项式核函数训练分类器,对比分类结果,画出对比曲线;
3) 使用交叉验证方法,变换训练集及测试集,分析分类结果。
3.代码实现
1.导入库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.model_selection import KFold