计算机视觉的应用5-利用PCA降维方法实现简易人脸识别模型

news2024/10/7 8:27:22

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用5-利用PCA降维方法实现简易人脸识别模型,本文将介绍如何使用主成分分析(PCA)实现简易的人脸识别模型。首先,我们将简要介绍PCA的原理及其在人脸识别中的应用。接着,我们将通过实例演示如何使用Python实现PCA降维,并给出完整的代码示例。

文章目录

  • 一、引言
  • 二、PCA原理
  • 三、 PCA在人脸识别中的应用
  • 四、 简易人脸识别模型实现
    • 4.1 数据预处理
    • 4.2 实现PCA降维
    • 4.3 计算欧氏距离进行人脸识别
    • 4.4 代码实现
  • 5. 总结

一、引言

主成分分析(PCA)是一种广泛应用于数据降维、压缩和可视化的技术。它通过线性变换将原始数据转换为一组新的变量(即主成分),其中每个新变量都是原始变量的线性组合,且它们按照重要性进行排序,使得第一个主成分尽量保留原始数据中的信息,而后续主成分则依次捕获剩余的信息。因此,PCA可以将原始数据压缩成更少的维度,从而更容易进行数据分析和可视化。具体来说,假设有m个n维数据样本,将它们表示为一个m x n的矩阵X。在人脸识别领域,PCA可以用于提取人脸图像的主要特征,从而降低数据维度,减少计算量,同时保持较高的识别率。

二、PCA原理

PCA的目标是将高维数据投影到低维空间,同时保持数据的主要特征。具体步骤如下

1.计算数据的均值向量和协方差矩阵;

2.计算协方差矩阵的特征值和特征向量;

3.按降序排列特征值,选择前k个最大的特征值对应的特征向量组成投影矩阵(k为降维后的维度);

4.将数据投影到投影矩阵上,得到降维后的数据。

三、PCA在人脸识别中的应用

在人脸识别问题中,我们可以将图像数据看作是高维空间中的点。通过PCA降维,我们可以将图像投影到低维空间,同时保留主要的特征信息。然后,我们可以通过计算欧氏距离等方法来度量图像间的相似性,从而实现人脸识别。

四、简易人脸识别模型实现

4.1 数据预处理

在开始实现PCA降维之前,我们需要对数据进行预处理。具体步骤如下:

1.读取人脸图像数据;

2.将图像转换为灰度图像;

3.将灰度图像转换为一维向量;

4.将所有图像向量堆叠为一个矩阵。

4.2 实现PCA降维

在实现PCA降维时,我们可以利用Python中的NumPy库提供的函数来完成前述PCA原理中的计算步骤。

4.3 计算欧氏距离进行人脸识别

在完成PCA降维后,我们可以计算测试图像与训练图像在降维空间中的欧氏距离,然后选择距离最近的图像作为识别结果。

4.4 代码实现

以下是使用PCA实现简易人脸识别模型的完整代码:

import numpy as np
import cv2
import os

def load_images(path):
    images = []
    labels = []
    for subdir, dirs, files in os.walk(path):
        for file in files:
            img_path = os.path.join(subdir, file)
            img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
            img = cv2.resize(img, (248, 248))
            img_vector = img.flatten()
            images.append(img_vector)
            labels.append(subdir.split("/")[-1])
    return np.array(images), np.array(labels)

def pca(X, k):
    #print(X.shape)
    mean = np.mean(X, axis=0)
    X_centered = X - mean
    cov_matrix = np.cov(X_centered.T)
    # 使用 atleast_2d 函数将 cov_matrix 转换为至少有两个维度的数组
    cov_matrix = np.atleast_2d(cov_matrix)

    eig_vals, eig_vecs = np.linalg.eig(cov_matrix)
    sorted_indices = np.argsort(eig_vals)[::-1]
    top_k_eig_vecs = eig_vecs[:, sorted_indices[:k]]
    X_centered = X_centered.reshape(-1, 1)
    print(X_centered.shape)
    #top_k_eig_vecs = top_k_eig_vecs.T
    X_pca = X_centered.dot(top_k_eig_vecs)
    return X_pca, top_k_eig_vecs, mean

def euclidean_distance(a, b):
    return np.sqrt(np.sum((a - b) ** 2))

def face_recognition(test_image, train_images, train_labels, eig_vecs, mean):
    test_image_centered = test_image - mean
    test_image_centered =test_image_centered.reshape(-1, 1)

    test_image_pca = test_image_centered.dot(eig_vecs)
    print(test_image_pca.shape)
    min_distance = float("inf")
    best_match = None
    train_images =[train_images]
    for i, train_image_pca in enumerate(train_images):
        print(test_image_pca.shape)
        distance = euclidean_distance(test_image_pca, train_image_pca)
        if distance < min_distance:
            min_distance = distance
            best_match = train_labels[i]
    return best_match

if __name__ == "__main__":
    train_images_path = "图片文件夹"
    test_image_path = "1.png"

    # Load and preprocess images
    train_images, train_labels = load_images(train_images_path)
    print(train_images, train_labels)
    test_image = cv2.imread(test_image_path, cv2.IMREAD_GRAYSCALE)
    test_image = cv2.resize(test_image, (248, 248))
    test_image_vector = test_image.flatten()
    #train_images = np.stack(train_images, axis=1)
    # Perform PCA on training images
    k = 50
    train_images_pca, eig_vecs, mean = pca(train_images[0], k)

    # Perform face recognition
    result = face_recognition(test_image_vector, train_images_pca, train_labels, eig_vecs, mean)
    print("测试的图片类别是:", result)

请注意替换"图片文件夹"“1.png”为实际的训练图像和测试图像路径。

五、总结

文章介绍了利用PCA降维方法实现简易人脸识别模型的原理和实现过程。通过PCA降维,我们可以在保留图像主要特征的同时减少计算量。该方法在实际应用中可能需要进一步优化和改进,例如使用其他距离度量方法或者结合其他特征提取方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

26 KVM热迁移虚拟机

文章目录 26 KVM热迁移虚拟机26.1 总体介绍26.1.1 概述26.1.2 应用场景26.1.3 注意事项和约束限制 26.2 热迁移操作26.2.1 前提条件26.2.2 热迁移脏页率预测&#xff08;可选&#xff09;26.2.3 设置热迁移参数&#xff08;可选&#xff09;26.2.4 热迁移操作&#xff08;共享存…

Linux:文本三剑客之awk

Linux&#xff1a;文本三剑客之awk 一、awk编辑器1.1 awk概述1.2 awk工作原理1.3 awk与sed的区别 二、awk的应用2.1 命令格式2.2 awk常见的内建变量&#xff08;可直接用&#xff09; 三、awk使用3.1 按行输出文本3.2 按字段输出文本3.3 通过管道、双引号调用 Shell 命令 一、a…

【模电实验】日光灯电路及功率因数的提高

实验4 日光灯电路及功率因数的提高 一、实验目的 1&#xff0e;理解提高功率因数的意义并掌握其方法。 2&#xff0e;掌握日光灯电路的联接。 二、原理说明 日光灯电路结构及工作原理 日光灯电路如图4-1所示&#xff0c;日光灯由灯管、镇流器和启辉器三部分组成。 &…

复制带随机指针的链表

&#x1f495;“如果你关注自己已经拥有的&#xff0c;你就会拥有更多。如果你只关注自己没有得到的&#xff0c;你永远不会满足。” - 奥普拉温弗瑞&#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f386;专栏&#xff1a;Java学习&#x1f3…

11. Redis集群(cluster)

11. Redis集群cluster 是什么&#xff1f;能干嘛&#xff1f;集群算法-分片-槽位slot官网出处redis集群的槽位slotredis集群的分片他两的优势slot槽位映射&#xff0c;一般业界有3种解决方案哈希取余分区—致性哈希算法分区3大步骤算法构建一致性哈希环redis服务器IP节点映射k…

【Python sqlite3】零基础也能轻松掌握的学习路线与参考资料

Python sqlite3是Python语言自带的轻量级关系数据库管理系统&#xff0c;它可以让我们在不需要额外的安装和配置下&#xff0c;使用SQLite数据库进行操作和管理。SQLite是一个功能强大的嵌入式数据库&#xff0c;它非常适合在轻量级应用程序中使用&#xff0c;如桌面应用程序、…

ROS学习(4)——launch文件的编写

对于一个复杂的系统,会有十几个、几十个甚至是上百个节点在运行,如果我们每次都是采取“打 开终端、运行 rosrun 指令”来启动应用程序,显得效率非常低。我们需要一个更方便的方式来启动系统。ROS 中提供了“使用 launch 文件 roslaunch”命令来完成系统的启动。具体的实现方法…

Java·Lambda

文章目录 ⚽️1 背景⚽️&#x1f34f;1.1 Lambda表达式的语法&#x1f34f;&#x1f34e;1.2 函数式接口&#x1f34e; &#x1f3c0;2 Lambda表达式的基本使用&#x1f3c0;&#x1f348;2.1 语法精简&#x1f348; &#x1f3c8;3 变量捕获&#x1f3c8;&#x1f3c6;3.1 匿…

Linux Audio (7) DAPM-4 Path/Route添加过程

DAPM-4 Path/Route添加过程 route分类&#xff1a;route转化为Pathcodec驱动add widgetMechine驱动add kcontrol route分类&#xff1a; 常规route {“sink”, NULL, “source”}&#xff0c;其path->connect1 sink widget是Mixer {“Mixer”, name1, “source1”} {“Mixe…

chatgpt赋能Python-python88

Python88 简介 Python88 是一个优秀的 Python 开源库&#xff0c;它提供了许多有用的函数和工具&#xff0c;可用于创建高效的 Web 应用程序&#xff0c;简化数据分析、数据可视化以及机器学习和人工智能任务等。 Python88 帮助开发人员以更简单、更快捷的方式编写代码&#…

VS Code Remote Development

1、Ubuntu 上启用 SSH &#xff08;1&#xff09;打开终端&#xff0c;并且安装openssh-server软件包&#xff1a; sudo apt update sudo apt install openssh-server 当被提示时&#xff0c;输入你的密码并且按 Enter&#xff0c;继续安装。 &#xff08;2&#xff09;安…

RocketMQ消息发送

消息发送示例代码&#xff1a; public static void main(String[] args) throws MQClientException, InterruptedException {DefaultMQProducer producer new DefaultMQProducer("please_rename_unique_group_name");producer.setNamesrvAddr("127.0.0.1:9876…

leetcode-743. 网络延迟时间

1.思路分析&#xff1a; 一道Dijkstra模板题 推荐Dijkstra算法讲解教程 Dijkstra&#xff08;有向图某点到其他所有点的最短路径问题&#xff09; Dijkstra算法的基本思想是贪心策略&#xff0c;每次从未确定最短路径的顶点中选择距离源点最近的一个&#xff0c;然后以该顶点…

Python使用正则表达式

正则表达式&#xff08;Regular Expression&#xff09;&#xff0c;又称规则表达式&#xff0c;是一个计算机科学的概念&#xff0c;通常被用来检索和替换符合某些规则的文本。 1. 正则表达式语法 正则表达式就是记录文本规则的代码。 1. 行定位符 行定位符就是用来描述字…

【STM32G431RBTx】备战蓝桥杯嵌入式→决赛试题→第十二届

文章目录 前言一、题目二、模块初始化三、代码实现interrupt.h:interrupt.c:main.h:main.c: 四、完成效果五、总结 前言 无 一、题目 二、模块初始化 1.LCD这里不用配置&#xff0c;直接使用提供的资源包就行 2.ADC:开启ADCsingle-ended 3.LED:开启PC8-15,PD2输出模式就行了…

MySQL高级(InnoDB引擎)

&#xff08;一&#xff09;逻辑存储结构 表空间&#xff08;ibd文件&#xff09;&#xff0c;会生成ibd文件&#xff0c;一个mysql实例可以对应多个表空间&#xff0c;用于存储记录、索引等数据。 段&#xff0c;分为数据段&#xff08;Leaf node segment&#xff09;、索引段…

学弟研一,有几篇SCI论文,做过前端,读博 or 走开发进国企?

同学你好&#xff0c;在正面先抛开选择就业的方面的问题&#xff0c;其实我觉得生活种的很多选择&#xff0c;都可以从以下的几点进行斟酌与考虑&#xff1a; &#xff08;1&#xff09;你最擅长的是哪个方面&#xff1f;&#xff08;2&#xff09;你的兴趣爱好是在哪个方面&am…

从0开始搭建完整UVM工程(可直接用于实际的工程中)、含源码(包括makefile文件)、可直接运行,及详细注释

一、说明 网上的实现uvm工程代码都是抄自张强所著的《UVM实战》,都是讲所有文件放到一个文件夹,且不涉及到实际工程中的uvm结构,以及多文件层级结构,让人理解起来较为困难,本文则将会从0开始教大家如何搭建一个具有实际工程效果的UVM框架: 其对应的书中的框架图如下所示:…

chatgpt赋能Python-pythoncontinue

简介 Python是一种高级编程语言&#xff0c;受到越来越多的人们的欢迎。其中&#xff0c;continue是Python语言中的一个很重要的关键字&#xff0c;它的出现可以很好地帮助程序员们实现自己的编程目标。在本文中&#xff0c;我们将介绍continue关键字&#xff0c;并解释它在Py…

Fourier分析入门——第5章——连续函数

目录 第 5 章 连续函数 5.1 引言 5.2 内积和正交性(Inner products and orthogonality) 5.3 对称性(Symmetry) 5.4 复数值函数 第 5 章 连续函数 5.1 引言 在前面的章节中&#xff0c;我们只考虑了在有限区间 L 上定义的离散函数的Fourier级数模型。此类函数在实验科学…