訂閱
糾錯
加入自媒體

PCA和SVM是什么?該如何建立人臉識別模型?

讓我們打印出變量: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個類(人)。劃分訓(xùn)練集和測試集接下來,我們使用sklearn.model_selection將數(shù)據(jù)(X-特征和y-標(biāo)簽)分為訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù),其中25%用于測試,其余75%用于訓(xùn)練模型。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 以訓(xùn)練模型。我們已經(jīng)在第一段代碼中導(dǎo)入了PCA在我們的例子中,我們在訓(xùn)練集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對應(yīng)于特征的數(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個(正如我們在算法中定義的那樣)。訓(xùn)練SVM分類器一旦我們完成了降維,就開始分類了。首先,我們將訓(xùn)練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)預(yù)測現(xiàn)在讓我們在測試數(shù)據(jù)上預(yù)測這些人的名字,我們使用從GridSearchCV中找到的分類器,它已經(jīng)在訓(xùn)練數(shù)據(jù)擬合。print("Predicting the people names on the testing set")
y_pred = clf.predict(X_test_pca)

分類報告和混淆矩陣一旦預(yù)測完成,讓我們打印分類報告,它顯示了模型的精度、召回率、F1分?jǐn)?shù)和支持分?jǐn)?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在測試集的一部分繪制預(yù)測結(jié)果,plot_gallery通過繪制它們來評估預(yù)測: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)在讓我們在測試集的一部分繪制預(yù)測結(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)

我們的準(zhǔn)確分?jǐn)?shù)是0.81!雖然這并不是一個完美的分?jǐn)?shù),還有很大的改進空間,但PCA和SVM的人臉識別為我們提供了進一步強大算法的起點!結(jié)論本文利用PCA和SVM建立了一個人臉識別模型。主成分分析算法被用來減少數(shù)據(jù)的維數(shù),然后利用支持向量機進行分類,通過超參數(shù)調(diào)整尋找最佳估計量。我們對這些肖像進行了分類,準(zhǔn)確度得分為0.81。

<上一頁  1  2  3  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

    掃碼關(guān)注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯
    x
    *文字標(biāo)題:
    *糾錯內(nèi)容:
    聯(lián)系郵箱:
    *驗 證 碼:

    粵公網(wǎng)安備 44030502002758號