基於SVM的人臉識別分類

2021-10-06 19:05:13 字數 3695 閱讀 1480

#from __future__ import print_function #__future__模組,把下乙個新版本的特性匯入到當前版本,於是我們就可以在當前版本中測試一些新版本的特性

#我的python版本是3.6.4.所以不需要這個

from time import time #對程式執行時間計時用的

import logging #列印程式進展日誌用的

import matplotlib.pyplot as plt #繪圖用的

from sklearn.model_selection import train_test_split

from sklearn.datasets import fetch_lfw_people

from sklearn.model_selection import gridsearchcv

from sklearn.metrics import classification_report

from sklearn.metrics import confusion_matrix

from sklearn.decomposition import pca

from sklearn.svm import svc

logging.basicconfig(level=logging.info,format='%(asctime)s %(message)s')

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 #特徵向量矩陣

n_feature=x.shape[1]#每個人有多少個特徵值

y=lfw_people.target

target_names=lfw_people.target_names

n_classes=target_names.shape[0] #多少類

print("total dataset size")

print("n_samples:",n_samples)

print("n_feature:",n_feature)

print("n_classes:",n_classes)

x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25) #選取0.25的測試集

#降維n_components=150 #pca演算法中所要保留的主成分個數n,也即保留下來的特徵個數n

print("extracting the top %d eigenfaces from %d faces" % (n_components,x_train.shape[0]))

t0=time()

pca=pca(svd_solver='randomized',n_components=n_components,whiten=true).fit(x_train)#訓練乙個pca模型

print("train pca in %0.3fs" % (time()-t0))

eigenfaces = pca.components_.reshape((n_components,h,w)) #提取出來特徵值之後的矩陣

print("prijecting the input data on the eigenfaces orthonarmal basis")

t0=time()

x_train_pca = pca.transform(x_train) #將訓練集與測試集降維

x_test_pca = pca.transform(x_test)

print("done pca in %0.3fs" % (time()-t0))

#終於到svm訓練了

print("fiting the classifier to the training set")

t0=time()

param_grid =#gamma核函式裡多少個特徵點會被使用}#對引數嘗試不同的值

clf = gridsearchcv(svc(kernel='rbf'),param_grid)

clf=clf.fit(x_train_pca,y_train)

print("done fiting in %0.3fs" % (time()-t0))

print("best estimotor found by grid search:")

print(clf.best_estimator_)

print("predicting people's names on the test set")

t0=time()

y_pred = clf.predict(x_test_pca)

print("done predicting 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_classes)))#這個也是,生成的矩陣的意思是有多少個被分為此類。

#把分類完的圖畫出來12個。

#這個函式就是畫圖的

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\n true: %s" %(pred_name,true_name)

predicted_titles=[title(y_pred,y_test,target_names,i) for i in range(y_pred.shape[0])] #這個for迴圈的用法很簡介

plot_gallery(x_test,predicted_titles,h,w)

eigenfaces_titles=["eigenface %d " % i for i in range(eigenfaces.shape[0])]

plot_gallery(eigenfaces,eigenfaces_titles,h,w)

plt.show()

基於SVM的人臉識別

usr bin python coding utf 8 import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import fetch lfw people import seaborn as sns sns...

基於opencv的人臉識別

1前言參考的是 這篇用的是dlib的對齊還加了mask。本文方法 人臉檢測 shiqiyu libfacedetection opencv提取ptr類 2 facedetect.h include include include include include facedetect dll.h us...

基於Opencv的人臉識別

要進行人臉的識別的訓練,首先我們要對openv中人臉識別類facerecognizer要有乙個了解,可以參考這個部落格對facerecognizer 有乙個了解 這個部落格對人臉的訓練解釋的很好,具體怎麼訓練可以閱讀這個部落格。關於人臉識別 我們有一下兩個步驟 1.利用pca變換的人臉識別,對人臉進...