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个类(人)。划分训练集和测试集接下来,我们使用sklearn.model_selection将数据(X-特征和y-标签)分为训练数据和测试数据,其中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的降维方法现在,我们从 sklearn.decomposition中选择PCA 以训练模型。我们已经在第一段代码中导入了PCA在我们的例子中,我们在训练集X_train中总共有966个特征,我们使用PCA(维数缩减)将它们减少到50个:n_components = 50
pca = RandomizedPCA(n_components=n_components, whiten=True).fit(X_train)
这个过程需要不到一秒钟的时间,这可以通过使用时间函数进行验证(让我们暂时跳过它)。现在我们将重塑PCA组件并定义特征脸,这是在人脸识别的计算机视觉问题中使用的一组特征向量的名称:eigenfaces = pca.components_.reshape((n_components, h, w))
如截图所示,特征脸是一个50×50×37的Numpy数组,50对应于特征的数量。接下来,我们使用PCA在X_train 和X_test 上的transform 函数来降低维数。X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
从上面的截图可以看出,通过PCA算法,X_train和X_test的维数都被降低了,每一个都将特征从1850个减少到50个(正如我们在算法中定义的那样)。训练SVM分类器一旦我们完成了降维,就开始分类了。首先,我们将训练SVM分类模型。我们使用GridSearchCV,这是一个库函数,它是一种调整超参数的方法,它将系统地为网格中指定的算法参数的每个组合建立和评估模型,并在最佳估计量,参数在参数网格中给出: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_)
我们数据的最佳分类器是SVC,参数如下:SVC(C=1000, class_weight = ‘balanced’, gamma=0.01)预测现在让我们在测试数据上预测这些人的名字,我们使用从GridSearchCV中找到的分类器,它已经在训练数据拟合。print("Predicting the people names on the testing set")
y_pred = clf.predict(X_test_pca)
分类报告和混淆矩阵一旦预测完成,让我们打印分类报告,它显示了模型的精度、召回率、F1分数和支持分数,这使我们对分类器的行为有了更深入的直觉。print(classification_report(y_test, y_pred, target_names=target_names))
让我们打印混淆矩阵:print(confusion_matrix(y_test, y_pred, labels=range(n_classes)))
混淆矩阵打印真正例、假正例和假反例的值,并提供分类器的概述。绘图最后,我们将绘制人物肖像和特征脸!我们将定义两个函数:title在测试集的一部分绘制预测结果,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):
"""绘制肖像库的帮助函数"""
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(())
现在让我们在测试集的一部分绘制预测结果: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)
现在让我们绘制特征面。我们使用在上面代码块中定义的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)
我们的准确分数是0.81!虽然这并不是一个完美的分数,还有很大的改进空间,但PCA和SVM的人脸识别为我们提供了进一步强大算法的起点!结论本文利用PCA和SVM建立了一个人脸识别模型。主成分分析算法被用来减少数据的维数,然后利用支持向量机进行分类,通过超参数调整寻找最佳估计量。我们对这些肖像进行了分类,准确度得分为0.81。
最新活动更多
-
11月28日立即报名>>> 2024工程师系列—工业电子技术在线会议
-
12月19日立即报名>> 【线下会议】OFweek 2024(第九届)物联网产业大会
-
即日-12.26火热报名中>> OFweek2024中国智造CIO在线峰会
-
即日-2025.8.1立即下载>> 《2024智能制造产业高端化、智能化、绿色化发展蓝皮书》
-
精彩回顾立即查看>> 2024 智能家居出海论坛
-
精彩回顾立即查看>> 【在线会议】多物理场仿真助跑新能源汽车
推荐专题
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论