百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

利用PCA和SVM算法建立人脸识别模型

toyiye 2024-06-21 12:27 8 浏览 0 评论

在本文中,我们将学习使用主成分分析(PCA)和支持向量机(SVM)来建立人脸识别模型。

首先,我们来看看PCA和SVM的介绍:

主成分分析:

主成分分析(PCA)是一种机器学习算法,广泛应用于探索性数据分析和建立预测模型。它通常用于降维,方法是将每个数据点投影到前几个主成分上,以获得低维数据,同时尽可能保留数据的变化。

Matt Brems的文章(https://medium.com/u/55680478461) 全面深入地介绍了该算法。现在,让我们用更简单的术语来解释:

假设我们手头有一个问题,我们正在收集数据,而我们的数据集产生了多个变量、多个特征,它们会在不同方面影响结果。如果选择删除某些特征,又会丢失信息,而我们不希望这样,对吗?

因此,另一种减少特征数量(减少数据维数)的方法是通过提取重要信息并删除最不重要的信息来创建新的特征。这样,我们的信息就不会丢失,而特征也会减少,过拟合模型的几率也会减少。


支持向量机

支持向量机(SVM)是一种用于两组分类问题的有监督机器学习模型。在为每个类别提供一组带标签的训练数据后,它能够对新的测试数据进行分类。

支持向量机基于最大化间隔的平面对数据进行分类,它的决策边界是直的,是一种很好的图像分类算法。实验结果表明,支持向量机在经过3-4轮相关反馈后,其搜索精度明显高于传统的查询优化方案,对于图像分割系统也是如此,包括那些使用改进的支持向量机的系统。

Marco Peixeiro的文章(https://towardsdatascience.com/the-complete-guide-to-support-vector-machine-svm-f1a820d8af0b) 说明了需要一个最大间隔超平面来分类数据。读后你会更好地理解SVM!


人脸识别

人脸是由许多像素组成的高维数据。高维数据很难处理,也不能用二维数据的散点图等简单技术可视化。

我们要做的是利用PCA对数据的高维进行降维处理,然后将其输入到SVM分类器中对图像进行分类。

接下来进入编码部分!

下面的代码示例取自关于eigenfaces的sklearn文档。我们将一步一步地检查代码,以了解其复杂性和结果。

导入相关库和模块

首先导入所需的库和模块。后文将深入讨论为什么要导入它们。

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

将数据加载到Numpy数组中

接下来将数据下载到磁盘中,并使用fetch_lfw_people将其作为NumPy数组加载sklearn.datasets。

lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)

lfw数据集包括一个用于研究无约束人脸识别问题的人脸照片数据库,其中有从网络收集的13000多张包含人脸的照片。1680名照片中的人在数据集中有两张或两张以上不同的照片。

图像采用灰度(像素值=0-255)。

图像Numpy数组

接下来、寻找图像数组图片的形状。我们将使用NumPy shape属性,该属性返回一个元组,每个索引都有对应元素的数量。

n_samples, h, w = lfw_people.images.shape
np.random.seed(42)

从变量explorer可以看到,我们有1288个样本(图片),高度为50px,宽度为37px(50x37=1850个特征)。

Numpy数组

我们将使用lfw_people 的data数组,直接存储在X中,我们将在以后的处理中使用这些数据。

X = lfw_people.data
n_features = X.shape[1]

X中的数据有1288个样本,每个样本有1850个特征。

目标名称和标签

接下来定义标签,这些标签是图片所属的人的id。

y = lfw_people.target
target_names = lfw_people.target_names
n_classes = target_names.shape[0]

这里,y代表目标,它是每个图片的标签。标签由target_names变量进一步定义,该变量由7个要识别的人的姓名组成。

target是一个1288x1的NumPy数组,它包含1288张图片对应名称的0–6值。因此,如果id 0的目标值为5,则表示“Hugo Chavez”,如target_names中所示:

因此,y是数字形式的目标,target_names是名称中的任何目标/标签,n_classes是存储类数量的变量,在这个例子中有7个目标:

  1. Ariel Sharon
  2. Colin Powell
  3. Donald Rumsfeld
  4. George W Bush
  5. Gerhard Schr?der
  6. Hugo Chavez
  7. Tony 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将数据(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_trainX_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,这是一个库函数,它是一种调整超参数的方法。它将系统地为网格中指定的算法参数的每个组合建立和评估模型,并在最佳估计量('best_estimator_')参数网格中给出:

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: %s\ntrue:      %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。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码