在本文中,我們將使用主成分分析和支持向量機來建立人臉識別模型。
首先,讓我們了解PCA和SVM是什么:
主成分分析:主成分分析(PCA)是一種機器學習算法,廣泛應用于探索性數(shù)據(jù)分析和建立預測模型,它通常用于降維,通過將每個數(shù)據(jù)點投影到前幾個主成分上,以獲得低維數(shù)據(jù),同時盡可能保留數(shù)據(jù)的變化。
Matt Brems的文章全面深入地介紹了該算法?,F(xiàn)在,讓我們用更簡單的術(shù)語來理解算法:假設(shè)我們現(xiàn)在正在收集數(shù)據(jù),我們的數(shù)據(jù)集產(chǎn)生了多個變量、多個特征,所有這些都會在不同方面影響結(jié)果。我們可能會選擇刪除某些特征,但這意味著會丟失信息。因此我們開源使用另一種減少特征數(shù)量(減少數(shù)據(jù)維數(shù))的方法,通過提取重要信息并刪除不重要的信息來創(chuàng)建新的特征,這樣,我們的信息就不會丟失,但起到減少特征的作用,而我們模型的過擬合幾率也會減少。支持向量機支持向量機(SVM)是一種用于兩組分類問題的有監(jiān)督機器學習模型,在為每個類別提供一組帶標簽的訓練數(shù)據(jù)后,他們能夠?qū)π碌臏y試數(shù)據(jù)進行分類。
支持向量機基于最大化間隔的平面對數(shù)據(jù)進行分類,決策邊界是直的。支持向量機是一種很好的圖像分類算法,實驗結(jié)果表明,支持向量機在經(jīng)過3-4輪相關(guān)優(yōu)化后,其搜索精度明顯高于傳統(tǒng)的查詢優(yōu)化方案,這對于圖像分割來說也是如此,包括那些使用改進的支持向量機。Marco Peixeiro的文章解釋了需要有一個最大間隔超平面來分類數(shù)據(jù),開源幫助你更好地理解SVM!人臉識別人臉是由許多像素組成的高維數(shù)據(jù)。高維數(shù)據(jù)很難處理,因為不能用二維數(shù)據(jù)的散點圖等簡單技術(shù)進行可視化。我們要做的是利用PCA對數(shù)據(jù)的高維進行降維處理,然后將其輸入到SVM分類器中對圖像進行分類。下面的代碼示例取自關(guān)于eigenfaces的sklearn文檔,我們將一步一步地實現(xiàn)代碼,以了解其復雜性和結(jié)果。導入相關(guān)庫和模塊首先,我們將導入所需的庫和模塊,我們將在后文深入討論我們?yōu)槭裁匆獙胨鼈?。import pylab as pl
import numpy as np
from matplotlib import 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 as RandomizedPCA
from sklearn.svm import SVC
將數(shù)據(jù)加載到Numpy數(shù)組中接下來,我們將數(shù)據(jù)下載到磁盤中,并使用fetch_lfw_people將其作為NumPy數(shù)組加載到sklearn.datasetslfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)
lfw數(shù)據(jù)集包括一個用于研究無約束人臉識別問題的人臉圖像數(shù)據(jù)庫,它從網(wǎng)絡(luò)收集的13000多張照片中包含了超過13000張照片,每個人臉都貼上了照片,1680個人臉在數(shù)據(jù)集中有兩張或兩張以上不同的照片。圖像采用灰度值(像素值=0-255)。
圖像Numpy數(shù)組接下來,我們將尋找圖像數(shù)組圖片的形狀。我們使用NumPy shape屬性,該屬性返回一個元組,每個索引都有對應元素的數(shù)量。
n_samples, h, w = lfw_people.images.shape
np.random.seed(42)
從變量explorer可以看到,我們有1288個樣本(圖片),高度為50px,寬度為37px(50x37=1850個特征)Numpy數(shù)組我們使用lfw_people 的data數(shù)組,直接存儲在X中,我們將在以后的處理中使用這些數(shù)據(jù)。X = lfw_people.data
n_features = X.shape[1]
X中的數(shù)據(jù)有1288個樣本,每個樣本有1850個特征。label接下來,我們將定義label,這些label是圖片所屬人的id。y = lfw_people.target
target_names = lfw_people.target_names
n_classes = target_names.shape[0]
這里,y代表目標,它是每個圖片的標簽。標簽由target_names變量進一步定義,該變量由7個要識別的人的姓名組成。
target是一個1288x1的NumPy數(shù)組,它包含1288張圖片對應名稱的0–6值,因此,如果id=0的目標值為5,則表示該人臉為“Hugo Chavez”,如target_names中所示:
因此,y是數(shù)字形式的目標,target_names是名稱中的任何目標/標簽,n_classes是存儲類數(shù)量的變量,在我們的例子中,我們有7個:Ariel SharonColin PowellDonald RumsfeldGeorge W BushGerhard Schr?derHugo ChavezTony Blair
讓我們打印出變量:print("Total dataset size:")
print("n_samples: %d", n_samples)
print("n_features: %d", n_features)
print("n_classes: %d", n_classes)
所以,我們有1288個樣本(圖片),每個樣本總共有1850個特征(50px37px)和7個類(人)。劃分訓練集和測試集接下來,我們使用sklearn.model_selection將數(shù)據(jù)(X-特征和y-標簽)分為訓練數(shù)據(jù)和測試數(shù)據(jù),其中25%用于測試,其余75%用于訓練模型。X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
以下是變量X-train、X_test、y_train和y_test:
基于PCA的降維方法現(xiàn)在,我們從 sklearn.decomposition中選擇PCA 以訓練模型。我們已經(jīng)在第一段代碼中導入了PCA在我們的例子中,我們在訓練集X_train中總共有966個特征,我們使用PCA(維數(shù)縮減)將它們減少到50個:n_components = 50
pca = RandomizedPCA(n_components=n_components, whiten=True).fit(X_train)
這個過程需要不到一秒鐘的時間,這可以通過使用時間函數(shù)進行驗證(讓我們暫時跳過它)。現(xiàn)在我們將重塑PCA組件并定義特征臉,這是在人臉識別的計算機視覺問題中使用的一組特征向量的名稱:eigenfaces = pca.components_.reshape((n_components, h, w))
如截圖所示,特征臉是一個50×50×37的Numpy數(shù)組,50對應于特征的數(shù)量。接下來,我們使用PCA在X_train 和X_test 上的transform 函數(shù)來降低維數(shù)。X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
從上面的截圖可以看出,通過PCA算法,X_train和X_test的維數(shù)都被降低了,每一個都將特征從1850個減少到50個(正如我們在算法中定義的那樣)。訓練SVM分類器一旦我們完成了降維,就開始分類了。首先,我們將訓練SVM分類模型。我們使用GridSearchCV,這是一個庫函數(shù),它是一種調(diào)整超參數(shù)的方法,它將系統(tǒng)地為網(wǎng)格中指定的算法參數(shù)的每個組合建立和評估模型,并在最佳估計量,參數(shù)在參數(shù)網(wǎng)格中給出:print("Fitting the classifier to the training set")
param_grid = {
'C': [1e3, 5e3, 1e4, 5e4, 1e5],
'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1],
}
clf = GridSearchCV(SVC(kernel='rbf', class_weight='balanced'), param_grid)
clf = clf.fit(X_train_pca, y_train)
print("Best estimator found by grid search:")
print(clf.best_estimator_)
我們數(shù)據(jù)的最佳分類器是SVC,參數(shù)如下:SVC(C=1000, class_weight = ‘balanced’, gamma=0.01)預測現(xiàn)在讓我們在測試數(shù)據(jù)上預測這些人的名字,我們使用從GridSearchCV中找到的分類器,它已經(jīng)在訓練數(shù)據(jù)擬合。print("Predicting the people names on the testing set")
y_pred = clf.predict(X_test_pca)
分類報告和混淆矩陣一旦預測完成,讓我們打印分類報告,它顯示了模型的精度、召回率、F1分數(shù)和支持分數(shù),這使我們對分類器的行為有了更深入的直覺。print(classification_report(y_test, y_pred, target_names=target_names))
讓我們打印混淆矩陣:print(confusion_matrix(y_test, y_pred, labels=range(n_classes)))
混淆矩陣打印真正例、假正例和假反例的值,并提供分類器的概述。繪圖最后,我們將繪制人物肖像和特征臉!我們將定義兩個函數(shù):title在測試集的一部分繪制預測結(jié)果,plot_gallery通過繪制它們來評估預測: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: %strue: %s' % (pred_name, true_name)
def plot_gallery(images, titles, h, w, n_row=3, n_col=4):
"""繪制肖像庫的幫助函數(shù)"""
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(())
現(xiàn)在讓我們在測試集的一部分繪制預測結(jié)果: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)
現(xiàn)在讓我們繪制特征面。我們使用在上面代碼塊中定義的eigenfaces變量。eigenface_titles = ["eigenface %d" % i for i in range(eigenfaces.shape[0])]
plot_gallery(eigenfaces, eigenface_titles, h, w)
plt.show()
最后,我們來繪制PCA+SVM模型用于人臉識別的精度:from sklearn.metrics import accuracy_score
score = accuracy_score(y_test, y_pred)
print(score)
我們的準確分數(shù)是0.81!雖然這并不是一個完美的分數(shù),還有很大的改進空間,但PCA和SVM的人臉識別為我們提供了進一步強大算法的起點!結(jié)論本文利用PCA和SVM建立了一個人臉識別模型。主成分分析算法被用來減少數(shù)據(jù)的維數(shù),然后利用支持向量機進行分類,通過超參數(shù)調(diào)整尋找最佳估計量。我們對這些肖像進行了分類,準確度得分為0.81。
責任編輯:gt
-
人臉識別
+關(guān)注
關(guān)注
76文章
4021瀏覽量
82387 -
機器學習
+關(guān)注
關(guān)注
66文章
8447瀏覽量
133130
發(fā)布評論請先 登錄
相關(guān)推薦
人臉識別技術(shù)的算法原理解析
FacenetPytorch人臉識別方案--基于米爾全志T527開發(fā)板
深度識別人臉識別在任務中為什么有很強大的建模能力
如何設(shè)計人臉識別的神經(jīng)網(wǎng)絡(luò)
人臉識別模型訓練失敗原因有哪些
人臉檢測模型有哪些
人臉檢測和人臉識別的區(qū)別是什么
人臉檢測與識別的方法有哪些
人臉識別閘機在樓宇出入中的應用
![<b class='flag-5'>人臉</b><b class='flag-5'>識別</b>閘機在樓宇出入中的應用](https://file.elecfans.com/web2/M00/1E/2B/pYYBAGGV_P2AZONnAAARVt9Y38I104.jpg)
評論