3.4 svm人脸识别

python代码:

from __future__ import print_function
from time import time
import logging
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 GridSearchCV
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.decomposition import PCA
from sklearn.svm import SVC


def main():
    logging.basicConfig( level=logging.INFO ,format='%(asctime)s %(message)s' )
    peoples = fetch_lfw_people( min_faces_per_person=70 )
    # 下面介绍数据预处理和分类
    # 返回多少个图
    shapes,h,w = peoples.images.shape

    # X是特征向量的矩阵,每一行是个实例,每一列是个特征值
    X = peoples.data
    # n_featers表示的就是维度
    n_features = X.shape[1]  # 维度:每个人会提取多少的特征值

    # 提取每个实例对应每个人脸,目标分类标记,不同的人的身份
    y = peoples.target
    target_names = peoples.target_names
    n_classes = target_names.shape[0]    #多少行,shape就是多少行,多少个人,多少类

    # 下面开始拆分数据,分成训练集和测试集,有个现成的函数,通过调用train_test_split;来分成两部分
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.25)

    # 数据降维,因为特征值的维度还是比较高
    n_components = 150

    t0 = time()  # 计算出打印每一步需要的时间
    pca = PCA(n_components=n_components, whiten=True).fit(X_train)
    eigenfaces = pca.components_.reshape((n_components, h, w))

    t0 = time()
    X_train_pca = pca.transform(X_train)  # 特征量中训练集所有的特征向量通过pca转换成更低维的矩阵
    X_test_pca = pca.transform(X_test)

    # param_grid把参数设置成了不同的值,C:权重;gamma:多少的特征点将被使用,因为我们不知道多少特征点最好,选择了不同的组合
    param_grid = {'C': [1e3, 5e3, 1e4, 5e4, 1e5],
                  'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1], }
    # 把所有我们所列参数的组合都放在SVC里面进行计算,最后看出哪一组函数的表现度最好
    clf = GridSearchCV(SVC(kernel='rbf'), param_grid)
    # 其实建模非常非常简单,主要是数据的预处理麻烦
    clf = clf.fit(X_train_pca, y_train)

    # 测试集预测看看准确率能到多少
    y_pred = clf.predict(X_test_pca)
    # print(classification_report(y_test, y_pred, target_names=target_names)) #预测精确度
    # print(confusion_matrix(y_test, y_pred, labels=range(n_classes))) #混淆矩阵

    # 把预测出来的人名存起来
    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)

    # 降维后的图片
    eigenface_titles = ['eigenface %d' %i for i in range(eigenfaces.shape[0])]
    # 提取过特征向量之后的脸是什么样子
    plot_gallery(eigenfaces, eigenface_titles, h, w)

# 把预测的函数归类标签和实际函数归类标签,比如布什
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]
    flag = "No"
    if pred_name == true_name:
        flag = "Yes"
    result = " flag:{0}\n predicted :{1} \n true : {2} ".format(flag,pred_name,true_name)
    return result

#把数据可视化的可以看到,把需要打印的图打印出来
def plot_gallery(images,titles,h,w,n_row=3,n_col=4):
    """Helper function to plot a gallery of portraits"""
    #在figure上建立一个图当背景
    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(())
    plt.show()

main()

人脸识别结果:

降维后结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值