机器学习-人脸识别实战(基于支持向量机)

人脸识别实战(基于支持向量机)

首先,导入我们人脸识别所需要的库

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 GridSearcjCY
from sklearn.metrics import classification_report
from sklearn.svm import SVC
from sklearn.decomposition import PCA

导入我们所需的库函数后,我们可以对数据集实例化,查看自己的数据集

lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=40)
#查看数据
plt.imshow(lfw_people.images[0],cmap='gray')
plt.show()

训练我们的模型

# 拆分训练集与测试集
X_train,X_test,y_train,y_test =train_test_split(lfw_people.data, lfw_people.target)
#建立SVM分类模型
model = SVC(kernel='rbf', class_weight='balanced')
model.fit(X_train, y_train)
# 模型预测
predictions = model.predict(X_test)
## 模型评价
print(classification_report(y_test, predictions, target_names=lfw_people.target_names))
#pca降维
n_components = 100
pca = PCA(n_components=n_components, whiten=True).fit(lfw_people.data)

x_train_pca = pca.transform(X_train)
x_test_pca = pca.transform(X_test)
#训练模型
model = SVC(kernel='rbf', class_weight='balanced')
model.fit(x_train_pca, y_train)
predictions = model.predict(x_test_pca)
print(classification_report(y_test, predictions, target_names=target_names))
#网格搜索调参
param_grid = {'C':[0.1, 1, 5, 10, 100],
             'gamma':[0.0005, 0.001, 0.005, 0.01],}
model = GridSearchCV(SVC(kernel='rbf', class_weight='balanced'), param_grid)
model.fit(x_train_pca, y_train)
print(model.best_estimator_)
predictions = model.predict(x_test_pca)
print(classification_report(y_test, predictions, target_names=target_names))

#结果可视化
def plot_gallery(images,titles,h,w,n_row=3,n_col=5):
    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(predictions,y_test,target_names,i):
    pred_name = target_names[predictions[i]].split(' ')[-1]
    true_name = target_names[y_test[i]].split(' ')[-1]
    return 'predicted: %s\ntrue:      %s' % (pred_name, true_name)
# 获取所有图片title
prediction_titles = [title(predictions,y_test,target_names, i) for i in range(len(predictions))]
# 画图
plot_gallery(X_test,prediction_titles, h, w)
plt.show()

结果

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值