日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

机器学习之基于SVM实现多类人脸识别

發布時間:2023/12/15 pytorch 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习之基于SVM实现多类人脸识别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前利用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,cross_val_score#用于交叉驗證 import warnings warnings.filterwarnings("ignore")#忽略警告信息plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號

2.導入數據

def Get_data():x_train = np.zeros((200,112*92))y_test = np.zeros((200,112*92))for i in range(1,41):for j in range(1,6):x_train[(i-1)*5+j-1] = plt.imread('E:/tmp/.keras/datasets/Fisher_Faces/orl_faces/s'+str(i)+'/'+str(j)+'.pgm').reshape(112*92)#40個人的前5張圖片,共200張y_test[(i-1)*5+j-1] = plt.imread('E:/tmp/.keras/datasets/Fisher_Faces/orl_faces/s'+str(i)+'/'+str(j+5)+'.pgm').reshape(112*92)#40個人的后5張圖片,共200張x_labels = [i for i in range(1,41) for j in range(5)]#設立訓練集標簽y_labels = [i for i in range(1,41) for j in range(5)]#設立測試集標簽return x_train,x_labels,y_test,y_labels

歸一化

scaler = MinMaxScaler().fit(x_train) x_train = scaler.transform(x_train) y_test = scaler.transform(y_test)

3.SVM函數

#設立降維數 tmp = [i for i in range(10,201,10) ] #設立核函數 kernel = ['rbf','linear','poly','sigmoid'] def SVM(x_train,x_labels,y_test,y_labels,tmp,kernel):y = np.zeros((len(kernel),len(tmp)))z = np.zeros((len(kernel),len(tmp)))for i in range(len(tmp)):print('降至{}維'.format(tmp[i]))# pca降維pca = PCA(n_components=tmp[i]).fit(x_train)#利用PCA降維x_pca = pca.transform(x_train)#訓練集降維得到數據y_pca = pca.transform(y_test)#測試集降維得到數據# SVMfor j in range(len(kernel)):svm = SVC(kernel=kernel[j],gamma='auto').fit(x_pca,x_labels)#利用訓練集的數據訓練得到SVMy[j,i] = cross_val_score(SVC(kernel=kernel[j],gamma='auto'),x_pca,x_labels,cv=5).mean()#5折交叉驗證,得到訓練集的準確率z[j,i] = svm.score(y_pca,y_labels)#利用訓練好的SVM對測試集進行測試,得到測試集的準確率return y,z

在不同的核函數下,降維至不同的維數所得到的準確率如下圖所示(包含訓練集與測試集):

對比一下四種核函數下,訓練集與測試集的準確率:

由圖可見:linear核函數的效果最好。

努力加油a啊

總結

以上是生活随笔為你收集整理的机器学习之基于SVM实现多类人脸识别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。