基于svm和pca的人脸识别案例分析

数据集介绍

LFW (Labeled Faces in the Wild) 人脸数据库是由美国马萨诸塞州立大学阿默斯特分校计算机视觉实验室整理完成的数据库,主要用来研究非受限情况下的人脸识别问题。LFW 数据库主要是从互联网上搜集图像,而不是实验室,一共含有13000 多张人脸图像,每张图像都被标识出对应的人的名字,其中有1680 人对应不只一张图像,即大约1680个人包含两个以上的人脸。LFW数据集主要测试人脸识别的准确率。

代码实现

from time import time               #记录时间
import logging                      #打印程序的运行日志
import matplotlib.pyplot as plt
from sklearn.cross_validation import train_test_split   #划分训练集和测试集
from sklearn.datasets import fetch_lfw_people           #导入数据集(名人)
from sklearn.grid_search import GridSearchCV            #调试函数的参数
from sklearn.metrics import classification_report       #显示分类报告,显示主要的分类指标,准确率,召回率以及F1得分
from sklearn.metrics import confusion_matrix            #对真实类别和预测类别做出判断,用矩阵形式表示出来
from sklearn.decomposition import RandomizedPCA         #pca降维
from sklearn.svm import SVC                             #svm的svc方程
from sklearn.cluster.tests.test_k_means import n_samples

#训练集:sklearn自带的人脸图片数据集
lfw_people = fetch_lfw_people(min_faces_per_person=70,resize=0.4)
n_samples,h,w = lfw_people.images.shape     #实例数目、h、w
x = lfw_people.data                         #所有的训练数据,1288张图片,每张图片1850个特征值
n_features = x.shape[1]                     #特征向量的维度1850
y =lfw_people.target                        #对应的人脸标记
target_names = lfw_people.target_names      #需要识别的人名字
n_class = target_names.shape[0]             #几个人需要识别

print("total dataset size:")
print("n_samples: %d" % n_samples)
print("n_features: %d" % n_features)
print("n_class: %d" % n_class)
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)
n_components = 150
t0 = time()
#随机将高维的特征向量降低为低维的,先建立模型
pca = RandomizedPCA(n_components=n_components,whiten=True).fit(x_train)
print("done in %0.3fs" %(time() - t0))
#提取人脸的特征值
eigenfaces = pca.components_.reshape((n_components,h,w))            #将人脸特征转化为特征向量集
print(‘projecting the input data on the eigenfaces orthonomal basis‘)
t0 = time()
#进行数据模型降维,降成了150
x_train_pca = pca.transform(x_train)
x_test_pca = pca.transform(x_test)
print("done in %0.3fs" % (time() - t0))
print("fitting the classfier to the training set")
t0 = time()
#C 是对错误部分的惩罚;gamma 合成点
para_grid = {‘C‘:[1e3,5e3,1e4,5e4,1e5],‘gamma‘:[0.0001,0.0005,0.0001,0.005,0.01,0.1],}
#rbf处理图像较好,C和gamma组合,穷举出最好的一个组合 使用GridSearchCV进行自由组合,最终确定合适的组合
clf = GridSearchCV(SVC(kernel=‘rbf‘),para_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("predict the 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,y_pred,target_names=target_names))
print(confusion_matrix(y_test,y_pred,labels=range(n_class)))

def plot_gallery(images,titles,h,w,n_row = 3,n_col = 4):
    plt.figure(figsize=(1.8*n_col,2.4*n_row))
    plt.subplots_adjust(bottom = 0,left = .01,right = .99,top = .90,hspace = .35)
    for i in range(n_row * n_col):
        plt.subplot(n_row,n_col,i+1)
        plt.imshow(images[i].reshape((h,w)),cmap=plt.cm.gray)
        plt.title(titles[i],size = 12)
        plt.xticks()
        plt.yticks()

def title(y_pred,y_test,target_names,i):
    pred_name = target_names[y_pred[i]].rsplit(‘ ‘,1)[-1]
    true_name = target_names[y_test[i]].rsplit(‘ ‘,1)[-1]
    return ‘predicted : %s \nture: %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)
eigenface_title = ["eigenface %d" % i for i in range(eigenfaces.shape[0])]
plot_gallery(eigenfaces,eigenface_title,h,w)
plt.show()

结果

total dataset size:
n_samples: 1288
n_features: 1850
n_class: 7
done in 0.270s
projecting the input data on the eigenfaces orthonomal basis
done in 0.040s
fitting the classfier to the training set
done in 30.796s
best estimator found by grid search:
SVC(C=1000.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape=‘ovr‘, degree=3, gamma=0.005, kernel=‘rbf‘,
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)
predict the people‘s name on the test set
done in 0.125s
                                precision    recall  f1-score   support

Ariel Sharon                0.91        0.67      0.77        15
Colin Powell                0.80        0.82      0.81        45
Donald Rumsfeld        0.96        0.61      0.75        41
George W Bush          0.79        0.96      0.87       144
Gerhard Schroeder     0.95        0.63      0.76        30
Hugo Chavez              1.00        0.79      0.88        19
Tony Blair                    0.86        0.89      0.88        28
avg / total                    0.85        0.84      0.83       322
混淆矩阵
[[ 10   2   0   3   0   0   0]
 [  1  37   0   7   0   0   0]
 [  0   1  25  13   1   0   1]
 [  0   4   1 138   0   0   1]
 [  0   1   0   8  19   0   2]
 [  0   1   0   3   0  15   0]
 [  0   0   0   3   0   0  25]]

原文地址:https://blog.51cto.com/13646338/2417291

时间: 2024-10-01 06:06:10

基于svm和pca的人脸识别案例分析的相关文章

基于QT和OpenCV的人脸识别系统

1 系统方案设计 1.1 引言 人脸是一个常见而复杂的视觉模式,人脸所反映的视觉信息在人与人的交流和交往中有着重 要的作用和意义,对人脸进行处理和分析在视频监控.出入口控制.视频会议以及人机交互等领 域都有着广泛的应用前景,因此是模式识别和计算机视觉领域持续的研究热点. 本系统在 FriendlyARM Tiny6410 开发板基础上,利用 OpenCV 计算机视觉库和 QT 图形库,通 过普通的 USB 摄像头实现了自动人脸识别,准确率较高,方便易用. 1.2 系统总体架构 "人脸识别&quo

基于SVM+HOG的花生品种识别

早在大二时,导师做过一个花生品种识别的程序,但当时用于品种识别的特征是自定义特征:而我的当初的本科毕业设计则是基于SVM + HOG的人脸识别:在后来的工作学习中,又用到了HOG特征,想着是不是之前的花生品种的识别也能用Hog特征进行识别:正所谓学以致用,也能巩固下刚刚所学的知识: 所谓的Hog特征与SVM网上资料一大堆,而且讲解得非常详细,在这里不在做过多的讲解: 本程序的开发环境,主要是依赖于VS2013 + OpenCV2.4.9,开发环境,请自行配置,那么,下面贴出代码,不足之处,请各位

基于Triplet loss函数训练人脸识别深度网络(Open Face)

Git:  http://cmusatyalab.github.io/openface/ FaceNet's innovation comes from four distinct factors: (a) thetriplet loss, (b) their triplet selection procedure, (c) training with 100 million to 200 million labeled images, and (d) (not discussed here)

C#实现基于ffmpeg加虹软的人脸识别

关于人脸识别 目前的人脸识别已经相对成熟,有各种收费免费的商业方案和开源方案,其中OpenCV很早就支持了人脸识别,在我选择人脸 识别开发库时,也横向对比了三种库,包括在线识别的百度.开源的OpenCV和商业库虹软(中小型规模免费). 百度的人脸识别,才上线不久,文档不太完善,之前联系百度,官方也给了我基于Android的Example,但是不太符合我的需 求,一是照片需要上传至百度服务器(这个是最大的问题),其次,人脸的定位需要自行去实现(捕获到人脸后上传进行识别). OpenCV很早以前就用

基于opencv3.0下的人脸识别和识别部分的高斯模糊处理

如题 这里将任务分解为三大部分: 1.录播放视频 2.人脸识别 3.部分高斯模糊 其中重点放在人脸识别和部分高斯模糊上 1.录播放视频(以opencv中的VideoCapture类进行实现) 首先罗列下操作环境:win10+vs2013+opencv3.0+单摄像头 opencv中提供了VideoCapture和CvCapture对视频进行操作 其中官方给出CvCapture的API为 实例化CvCapture对象的时候,需要调用cvCaptureFromCAM(int device)进行实例化

微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流. 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友的动态,而朋友圈中或虚或实的状态更新,似乎都在证明自己的"有趣",寻找那份或有或无的存在感. 有人选择在朋友圈记录生活的点滴,有人选择在朋友圈展示自己的观点.有时我们想去展示自己,有时又想去窥探着别人的生活,而有时又不想别人过多的了解自己的生活,或是屏蔽对方,或是不给对方看朋友圈,又或是不

基于汉王云API的人脸识别

http://down.51cto.com/data/2076078 源码地址,使用汉王云API,得预先申请汉王API key

基于SPARK SQL 读写ORACLE 的简单案例分析常见问题

该文章出自上海harli,偷偷地把女神的东西拿出来,希望女神不要介意. 一.概述 本文主要内容包含Spark SQL读写Oracle表数据的简单案例,并针对案例中比较常见的几个问题给出解决方法. 最后从常见的java.lang.ClassNotFoundException(无法找到驱动类)的异常问题出发,分析相关的几种解决方法,以及各个解决方法之间的异同点. 二.案例中比较常见问题及其解决方法 2.1 启动 首先查看Spark 官网给出的SparkSQL的编程指南部分(http://spark.

PCA人脸识别

PCA方法由于其在降维和特征提取方面的有效性,在人脸识别领域得到了广泛的应用. 其基本原理是:利用K-L变换抽取人脸的主要成分,构成特征脸空间,识别时将测试图像投影到此空间,得到一组投影系数,通过与各个人脸图像比较进行识别. 进行人脸识别的过程,主要由训练阶段和识别阶段组成: 训练阶段 第一步:写出训练样本矩阵,其中向量xi为由第i个图像的每一列向量堆叠成一列的MN维列向量,即把矩阵向量化.假设训练集有200个样本,,由灰度图组成,每个样本大小为M*N. 第二步:计算平均脸 Ψ=1200∑i=1