基于PCA+SVM人脸识别系统的设计与实现代码大全

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于PCA+SVM人脸识别系统的设计与实现
1.1题目的主要研究内容
(1)工作的主要描述
本文主要研究了利用主成分分析算法并结合支持向量机分类器实现对人脸图像的识别,具体研究内容如下:
1.图像预处理。

由于受到光照条件、拍摄角度、图像像素大小不同等因素的影响,摄取到的人脸图像往往无法直接进行识别,为达到系统识别要求,提高识别率,需要对获取的人脸图像进行预处理。

图像预处理的过程包括图像的灰度变换、图像直方图均衡化、图像的平滑处理、图像的几何归一化等。

2.特征提取。

特征提取是人脸识别系统中最关键的技术之一,本文利用SVD 定理算法对人脸进行特征提取和特征选择,进而建立一个降维后的特征人脸子空间,降维后的人脸图像大大节省了系统的数据计算量,从而大大缩短了识别时间,为系统的实时性提供了可行性。

3.特征识别。

人脸图像的分类识别是人脸识别系统中的一个环节,即将待测人脸图像的提取特征送给分类器和数据库中已提取的人脸特征相似度进行比较,通过相似性和根据特定标准确定待测人脸的属性的过程来进行分类。

传统的基于PCA的人脸识别算法利用距离函数实现人脸的分类,但该方法准确率较低,本文引入SVM分类器,通过SVM分类器对人脸进行分类识别,并设计了基于PCA+SVM的人脸识别系统,通过仿真实验对改进后系统与传统的基于PCA的人脸识别算法在识别率和识别速度进行了测试和比较,证明了改进后的基于PCA+SVM的人脸识别系统在识别率上要明显优于改进前的系统。

4.系统实现。

本文对基于PCA+SVM的人脸识别系统进行了总体设计,并利用ORL人脸数据库在AI Studio软件上运行python程序,对人脸识别系统的实现进行仿真,最终实现人脸识别功能。

(2)系统流程图
1.2 题目研究的工作基础或实验条件
(1)windows10
(2)AI Studio进行python演示
1.3 数据集描述
首先建立预存、待识别人脸数据库,然后对预存人脸数据库进行训练,得到预存人脸库的特征脸空间,随后读取一张待识别人脸图像,降低维数和进行标准化,通过SVM分类器对待识别图像进行分类识别,最后显示识别人脸图像具体运行步骤如下:
1、建立预存人脸库和待识别人脸库。

2、然后将建立好的人脸图像进行预处理。

3、识别过程是先选择预存人脸库,对预存人脸库进行训练,得到特征脸空间。

4、选择待识别人脸,利用本系统所选用的主成分分析算法和SVM分类器,找出与测试样本数据匹配的人脸库图像,计算待识别人脸库的识别率。

5、最后将匹配结果通过用户界面呈现出来。

a)建立预存人脸数据库、待识别人脸数据库。

为了便于实现系统仿真,此次系统实验基于英国ORL人脸数据库,该人脸数据库共40名测试人员,每名测试人员有10张表情不一的人脸图像,为了验证系统的实用性,实验过程中将自己拍摄的10张照片进行预处理,实现归一化后替换ORL人脸数据库的第40个人的10张图像,组成新的人脸数据库。

实验选取ORL人脸数据库40名测试人员每名测试者的前5张图像,共200张作为预存人脸数据库,选取每名测试者的后5张图像共200张作为待识别人脸数据库,人脸表情、角度都有一定幅度的变化,每张图像的大小都是112x92,图像的格式为pgm。

我们基于以上原则建立预存人脸和待识别人脸数据库。

部分ORL人脸数据库图像如图所示:
b)人脸图像预处理。

本次实验采用的是英国ORL 人脸数据库及少量自建人脸库,我们需要对少量自建人脸图像进行归一化处理。

对于图像的预处理,利用Python软件对自建图像的进行了图像的灰度变换、图像的直方图均衡化、图像的平滑处理、图像的几何归一化处理等,得到了较好的处理效果。

c)训练预存人脸数据库。

(1)基于PCA+SVM的人脸识别算法训练阶段的流程,具体步骤是:(1)计算预存人脸数据库中人脸的平均脸。

(2)计算每张图像与平均脸的差值矩阵,形成偏差矩阵,通过K-L变换和SVD 定理得到预存人脸数据库中所有图像样本的协方差矩阵的特征向量和特征值。

(3)将人脸偏差矩阵投影到由特征向量构成的空间中,得到特征脸空间。

(4)计算已建立的待测人脸数据库的识别准确率和识别速度。

1.4特征提取过程描述
因为文中使用ORL 人脸库,所以对于任意的一张图片都可以用一个含有 10304 个元素的向量表示,可以理解为每张图片有 10304 个维度,本文中训练集有 200 张图片,所以训练集可表示为 200*10304 的矩阵 Y ,行表示样本序列,列表示为每个样本的特征。

对矩阵 Y (200*10304)的每一列减去这一列的均值得到矩阵 J ,我们可知矩阵 J 的任意一列的均值为 0。

然后计算矩阵 J 的协方差矩阵 X 和矩阵 X 的特征值和特征向量,将所得到特征值从大到小依次排列,取其前20个特征值所对应的特征向量,所选出的 20 个特征向量就是20 个主成分分量。

假设向量b 的元素为 b i ,主成分分量为c i,,那么图像a i 的新表示方法为:a inew=∑bbbb 20b =0,a inew 中含有a i 的绝大部分信息。

这样我们就把原来需要10304 个特征表示的图像现在只需要 20 个特征可以很好的表示出来。

1.5分类过程描述
通过SVM 分类器进行分类识别,具体步骤是:
1)把待识别人脸图像做灰度变换,生成一维列向量, 再计算预存人脸图像与均值的差值,将差值图像投影到特征脸空间,使得每个预存人脸图像和待识别人脸图像在特征脸空间上都有一个坐标。

2)利用SVM 分类器对特征脸空间进行分类,实现人脸识别。

3)输出的人脸图像及名字和预测的相符。

流程图如图所示:
1.6主要程序代码(要求必须有注释)
#调包区
From__future__import print_ function
from time import time
import logging
import cv2
import matplotlib. pyplot as plt
from numpy import
import numpy as np
from sklearn.model selection import train test split, GridSearchCV
from sklearn.metrics import classification_report, confusion_matrix
from sklearn. decomposition import PCA
from sklearn. svmimport SVM
Import zipfile
import 05
#这里是解压数据集
import zipfile
extracting= zipfile.ZipFile( ./data/data76601/ crop images.zip')
extracting.extractall(ldata/crop images )
#本项目中画图部分:进行定义画图函数、特征脸展示部分、预测结果展示部分
def plot gallery(images, titles, h, w,n row=4, n co1=4)
#这里的两个4代表最终表示一行有几张图,一列有几张图
"""Helper function to plot a gallery. of portraits"""
plt. figure(figsize=(2:1* n col, 2.8*n row)) #确定了图片的尺寸
plt.subplots_ adjust(bottom=0, left=.01, right=.99, top=.90, wspace-=.75, hspace=.35)
for i in range(n row-* n col):
plt. subplot(n row, n col,i+1) #n_row行,n_co1列,位置是第i+1个,从1开始# cmap:颜色图谱(colormap),默认绘制为RGB (A)颜色空间
plt.imshow(images[i].reshape((h, w)), cmap=plt.cm.gray) #画图
plt.title(titles[i],size=12)
pIt.xticks(O)
plt.yticks())
def get name(file dir):
def get_ name(file_ dir):
"""这个函数用来得到七个人名和数字组成的字典
:param file_ dir
:新数据的名字
:return:返回一个字典+一个二维列表
"""
all_ dirs=[]
all_ path= []
count= e
for root, dirs, files in os.walk(file_ dir):#分别从文件地址中,读出根地址、子目录、文件名
all dirs. append(dirs)#子目录就是这个人的名字,所以要存下来
temp=[]
if count== 0
count+= 1
contiue
for file in files:
temp .append(os.path. join(root,file))#这里每次循环存的就是一个人78张照片地址
count += 1
all path.append(temp)#得到7*70的照片地址,二维的
all dirs= all dirs[e] #得到一维的人脸照片名
number= [i fori in range(7)]
name dict三dict(zip(numben; a1l_ dirs)) #得到人名字典
return name dict, allpath#返回的分别是名字字典7、二维7*70图片地址
name_dict= []
all_path =[]
File_new_path=r’./data/crop_images’
#从自己写的模块里获取名字+所有图片的二维地址
name_dict,all_path = get_ name(file _new path)
print(name dict)path = get_ name(file _new path)
print(np. shape(all path)
All_data_set=[]
All_data_label=[]
def get_ Image():
for i in range(7):
for j in range(50):
images_ path = all_ path[i][j]
img = cv2 Amread(images_ path)
img _gray = cv2.cvtColor(img, cv2.COLOR BGR2GRAY) # 改为灰度图,颜色空间转换函数
h, w = img. gray. shape
img col = img. gray.reshape(h * w)
all data set.append(img col) # 存图片,一维的
all_ data_ label. append(i) #这个地方作lable还是要数字才行
return h,w
h, w=get_Image()print(h,w)
#改成数组
x= array(alldata_set)
y = array(all data label)
n_ samples, n_features - x.shape
n_classes=len(unique(y))
target names =[]
for i in range(7):
Names= name dict[i]
target names. append(names)
print("total dataset size:")
print("n_ samples: %d"% n_samples)#图片总量
print("n_features: %d" %n_features) # 每张图片内按尺寸定的数量,行列尺寸相乘
print("n_ classes: %d" % n_classes)# 标签总量
print(h,w) #每张图片尺寸
#这个部分是提取特征脸的过程
n_ components = 95 #定义取的特征脸数量,经过测试: 95准确率相对高
print("Extracting the top %d eigenfaces from %d faces" % (n_components,x _train. shape[0]))
t0 = time()
#选择一种svd方式,whiten是种数据预处理方式,;会损失些数据信息,但可获得更好的预测结果
Pca=РСA(n_components=n_components,svd_solver='full',whiten=True).fit(X train) # 经过测试, full最好
print("done in %0.3fs" % (time() - t0))
eigenfaces = pca. components -. reshape((n components, h, w))# 特征脸
print("Projecting the input data on the eigenfaces orthonormal basis ")
T0= time()
Х_train_ pca= pca. transform(X_ train)#得到训练集投影系数
x_ test. pca= pca.transform(X_ test) #得到测试集投影系数
# 接下来我们就会使用投影系数来进行训练
print("done in%0.3fs"% (time() -t0))
# 最后我们得到了特征脸
#plot the gallery of the most significative eigenfaces画出最有意义的面孔
Eigenface_titles= ["eigenface %d" % i for i in range(eigenfaces.shape[0])]
Plot_gallery(eigenfaces, eigenface_titles, h,w)
plt. show()
#这个部分就是进行训练了,采用的是SVM,最终得到不错的SVM分类器
print("Fitting the classifier to the training set") #将分类器拟合到训练集
T0 = time()
‘c为惩罚因子,越大模型对训练数据拟合程度越高,gamma是高斯核参数’
Param_grid ={'C': [5e2,1e3,5e3, 1e4, 5e4,1e5],
gamma :[0.0001,0.0005,0.001,0.002,0.0009,0.005,0.01, 0.1],}
#要选取一系列可能是最优的超参数c和gamma,然后在下面中找到最优的
#分类器是svc组成的这个高斯核(RBF) +balanced防止过拟合
c1f = GridSearchCV(SVC(kernel= 'rbf', class_ weight= 'balanced'),param_
grid)
#超参数自动搜索模块,按你的要求,在你给的超参数里选一个最合适的
#表示调整各类别权重,权重与该类中样本数成反比,防止模型过于拟合某个样本数量过大的类
clf = clf.fit(X_train_pca, y_train)
print("done in %0.3fs" % (time() - t0))
print("Best estimator found by grid search:") # 用网格搜索找到最佳估计量print(clf .best_ estimator ) # 看一下都有哪些分类器弄好了的超参数
下面用训练好的分类器进行预测
Print (“Predicting people’s name on the test set”)#在测试集中预测人们的名字
T0= time()
Y_pred =clf.predict(x_ test_pca) # 进行预测
print("done in %0.3fs" % (time()- t0))
print(classification_report(y_test, У_pred,target_ names=target names)) # 查准率/查全率/F1值/测试样本数
print(confusion_matrix(y_test,y_pred,labels=range(n_classes)))
Plot the result of the prediction on a portion of the test set
#在测试集的一部分上绘制预测结果
def title(y_pred, y_test, target_nanes, i) :
Pred_name=target_names[y_pred[i]-1]
True_name=target_ namea(y_ pred[il -1]
return 'predictnd: %s\n true:%s’%(pred_name,true_name)
prediction_ titles [title(y_pred, y_test, target_names, i) for i in range(y_pred. shape[0])]
Plot_gallery(x_ test, prediction_titles, h, w)
p1t.show()
1.7 运行结果及分析
图1:
图2:
本章主要基于PCA+SVM人脸识别算法,设计构建了整个人脸识别仿真系统,利用AI Studio软件和ORL标准人脸数据库对该人脸识别系统进行了仿真实验,结果表明,该系统能够顺利实现人脸识别功能。

相关文档
最新文档