机器学习实验八--基于pca的人脸识别

news2025/6/7 0:23:00

基于pca的人脸识别

  • 引言:pca
    • 1.pca是什么
    • 2.PCA算法的基本步骤
  • 实例:人脸识别
    • 1.实验目的
    • 2.实现步骤
    • 3.代码实现
    • 4.实验结果
    • 5.实验总结

引言:pca

1.pca是什么

pca是一种统计方法,它可以通过正交变换将一组可能相关的变量转换成一组线性不相关的变量,这组新的变量被称为主成分。PCA常用于高维数据的降维,通过保留最重要的几个主成分来简化数据集,同时尽可能保留原始数据的信息。

2.PCA算法的基本步骤

  1. 数据标准化:对原始数据进行预处理,使得每个特征的均值为0,标准差为1。这一步是为了消除不同量纲对数据分析的影响。
  2. 构建协方差矩阵:计算数据的协方差矩阵,协方差矩阵能够反映不同特征之间的相关性。
  3. 计算协方差矩阵的特征值和特征向量:特征值和特征向量能够揭示数据的内在结构。特征值越大,对应的特征向量在数据集中的重要性越高。
  4. 选择主成分:根据特征值的大小,选择前k个最大的特征值对应的特征向量作为主成分。通常会选择累计贡献率达到一定比例(如85%)的特征向量。
  5. 形成特征向量矩阵:将选定的特征向量组成一个矩阵,这个矩阵将用于将原始数据转换到新的特征空间。
  6. 数据转换:使用特征向量矩阵将原始数据转换到新的特征空间,得到降维后的数据。

实例:人脸识别

1.实验目的

  1. 理解PCA原理:通过实践掌握主成分分析(PCA)算法的核心思想及其在降维中的应用
  2. 应用PCA处理图像数据:学习如何将PCA应用于高维图像数据,特别是人脸识别领域
  3. 探索特征提取:了解PCA如何提取图像的主要特征(特征脸)及其在人脸表示中的作用
  4. 评估降维效果:通过图像重建实验,直观理解不同数量主成分对图像质量的影响

2.实现步骤

  1. 数据准备
    • 加载ORL人脸数据集(包含40个人的400张人脸图像)
    • 将每张112×92像素的灰度图像转换为10304维的向量
    • 构建数据矩阵(每行代表一张图像)
  2. 数据预处理
    • 计算并减去平均脸(数据集中所有图像的平均)
    • 中心化数据(使数据均值为0)
  3. PCA分析
    • 使用sklearn的PCA进行主成分分析
    • 提取前50个主成分
    • 可视化前5个特征脸(主成分)
  4. 方差分析
    • 绘制累计解释方差图
    • 观察不同数量主成分对数据方差的解释程度
  5. 图像重建
    • 选择样本图像进行重建
    • 分别使用10、30、50个主成分重建图像
    • 对比重建图像与原始图像的质量差异
  6. 结果分析
    • 观察特征脸的特点
    • 分析主成分数量对重建质量的影响
    • 评估PCA在图像压缩和特征提取中的效果

3.代码实现

import os
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

# 1. 加载ORL人脸数据集
def load_orl_faces(data_path, num_persons=40, num_images=10, img_size=(112, 92)):
    """
    加载ORL人脸数据集
    参数:
        data_path: 数据集路径
        num_persons: 人数(默认40)
        num_images: 每人图像数(默认10)
        img_size: 图像尺寸(默认112×92)
    返回:
        X: 图像矩阵(每行一个图像)
        image_shape: 图像原始形状
    """
    total_images = num_persons * num_images
    X = np.zeros((total_images, img_size[0] * img_size[1]))
    image_count = 0
    
    for person in range(1, num_persons + 1):
        person_dir = os.path.join(data_path, f's{person}')
        
        for img_num in range(1, num_images + 1):
            img_path = os.path.join(person_dir, f'{img_num}.pgm')
            
            if os.path.exists(img_path):
                try:
                    img = Image.open(img_path).convert('L')
                    img_array = np.array(img).flatten()
                    X[image_count] = img_array
                    image_count += 1
                except Exception as e:
                    print(f"处理文件 {img_path} 时出错: {str(e)}")
            else:
                print(f"警告: 未找到文件 {img_path}")
    
    # 只保留成功加载的图像
    X = X[:image_count]
    return X, img_size

# 2. PCA降维与可视化
def pca_analysis(X, image_shape, n_components=50):
    """
    PCA分析与人脸重建
    参数:
        X: 图像矩阵
        image_shape: 图像原始形状
        n_components: 保留的主成分数量
    """
    # 数据标准化
    mean_face = np.mean(X, axis=0)
    X_centered = X - mean_face
    
    # 使用sklearn的PCA
    pca = PCA(n_components=n_components)
    X_pca = pca.fit_transform(X_centered)
    
    # 可视化前几个特征脸
    plt.figure(figsize=(15, 5))
    for i in range(5):
        eigenface = pca.components_[i].reshape(image_shape)
        plt.subplot(1, 5, i+1)
        plt.imshow(eigenface, cmap='gray')
        plt.title(f'Eigenface {i+1}')
        plt.axis('off')
    plt.suptitle('Top 5 Eigenfaces')
    plt.show()
    
    # 显示方差解释率
    plt.figure(figsize=(10, 5))
    plt.plot(np.cumsum(pca.explained_variance_ratio_))
    plt.xlabel('Number of Components')
    plt.ylabel('Cumulative Explained Variance')
    plt.title('Explained Variance by PCA Components')
    plt.grid()
    plt.show()
    
    return pca, mean_face, X_pca

# 3. 图像重建与对比
def reconstruct_and_compare(pca, mean_face, X_pca, image_shape, sample_indices=[0, 10, 20]):
    """
    重建图像并与原始图像对比
    参数:
        pca: PCA模型
        mean_face: 平均脸
        X_pca: PCA降维后的数据
        image_shape: 图像形状
        sample_indices: 要显示的样本索引
    """
    plt.figure(figsize=(15, 5 * len(sample_indices)))
    
    for i, idx in enumerate(sample_indices):
        # 原始图像
        original_img = mean_face + X_pca[idx] @ pca.components_
        
        # 使用不同数量的主成分重建
        plt.subplot(len(sample_indices), 4, i*4 + 1)
        plt.imshow(original_img.reshape(image_shape), cmap='gray')
        plt.title(f'Original Image {idx}')
        plt.axis('off')
        
        for j, n in enumerate([10, 30, 50]):
            # 使用前n个主成分重建
            reconstructed = mean_face + X_pca[idx, :n] @ pca.components_[:n]
            
            plt.subplot(len(sample_indices), 4, i*4 + j + 2)
            plt.imshow(reconstructed.reshape(image_shape), cmap='gray')
            plt.title(f'{n} Components')
            plt.axis('off')
    
    plt.suptitle('Image Reconstruction with Different Numbers of PCA Components')
    plt.tight_layout()
    plt.show()

# 主程序
def main():
    # 数据集路径 - 替换为你的实际路径
    dataset_path = r'C:\Users\62755\Downloads\ORL_Faces'
    
    # 1. 加载数据
    X, image_shape = load_orl_faces(dataset_path)
    print(f"成功加载 {X.shape[0]} 张人脸图像,每张图像维度 {X.shape[1]}")
    
    # 2. PCA分析
    pca, mean_face, X_pca = pca_analysis(X, image_shape, n_components=50)
    
    # 3. 重建与对比
    reconstruct_and_compare(pca, mean_face, X_pca, image_shape)

if __name__ == "__main__":
    main()

4.实验结果

请添加图片描述
图像重建对比图:
请添加图片描述

累计解释方差图:
累计解释方差图

5.实验总结

通过本次基于PCA的人脸识别实验,我深入理解了主成分分析的核心原理及其在实际问题中的应用价值。实验过程中,我不仅掌握了如何将高维图像数据转化为适合PCA处理的矩阵形式,还学会了数据标准化和中心化的预处理方法。通过可视化特征脸,我直观认识到PCA如何自动提取数据的主要变化模式,这些特征脸实际上构成了人脸图像的基础成分。

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

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

相关文章

LabVIEW的AMC架构解析

此LabVIEW 程序基于消息队列(Message Queue)机制构建 AMC 架构,核心包含消息生成(MessageGenerator )与消息处理(Message Processor )两大循环,通过队列传递事件与指令,实…

MySQL 索引:为使用 B+树作为索引数据结构,而非 B树、哈希表或二叉树?

在数据库的世界里,性能是永恒的追求。而索引,作为提升查询速度的利器,其底层数据结构的选择至关重要。如果你深入了解过 MySQL(尤其是其主流存储引擎 InnoDB),你会发现它不约而同地选择了 B树 作为索引的主…

ubuntu屏幕复制

在ubnuntu20中没有办法正常使用镜像功能,这里提供一下复制屏幕的操作. 使用xrandr查看所有的显示器情况 这里我发现自己的电脑没有办法直接设置分辨率,但是外接的显示器可以设置,从命令行来说就是设置: xrandr --output HDMI-0 --mode 1920x1080那怎么样才能将原生电脑屏幕换…

Spring WebFlux 整合AI大模型实现流式输出

前言 最近赶上AI的热潮,很多业务都在接入AI大模型相关的接口去方便的实现一些功能,后端需要做的是接入AI模型接口,并整合成流式输出到前端,下面有一些经验和踩过的坑。 集成 Spring WebFlux是全新的Reactive Web技术栈&#xf…

验证电机理论与性能:电机试验平板提升测试效率

电机试验平板提升测试效率是验证电机理论与性能的重要环节之一。通过在平板上进行电机试验,可以对电机的性能参数进行准确测量和分析,从而验证电机的理论设计是否符合实际表现。同时,提升测试效率可以加快试验过程,节约时间和成本…

Simplicity studio SDK下载和安装,创建工程

下载SDK工具地址 Simplicity Studio - Silicon Labs 选择适合自己电脑的版本。 这个就使用你自己的邮箱注册一个就可以了,我是用的公司邮箱注册的。 下载完成: 安装 下载完成后右键点击安装,一路下一步 安装完成后,程序自动打…

OpenCV——Mac系统搭建OpenCV的Java环境

这里写目录标题 一、源码编译安装1.1、下载源码包1.2、cmake安装1.3、java配置1.4、测试 二、Maven引入2.1、添加Maven依赖2.2、加载本地库 一、源码编译安装 1.1、下载源码包 官网下载opencv包:https://opencv.org/releases/ 以4.6.0为例,下载解压后&…

【设计模式-3.4】结构型——代理模式

说明:说明:本文介绍结构型设计模式之一的代理模式 定义 代理模式(Proxy Pattern)指为其他对象提供一种代理,以控制对这个对象的访问,属于结构型设计模式。(引自《设计模式就该这样学》P158&am…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Sound Board(音响控制面板)

📅 我们继续 50 个小项目挑战!—— SoundBoard 组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ 🎯 组件目标 实现一个响应式按钮面板,点…

关于大数据的基础知识(一)——定义特征结构要素

成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于大数据的基础知识(一&a…

chrome使用手机调试触屏web

chrome://inspect/#devices 1、手机开启调试模式、打开usb调试 2、手机谷歌浏览器打开网站 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f1ef2d2c017c477ba55a57338ae13fc8.jpeg#pic_center 使用谷歌浏览器打开chrome://inspect/#devices 刷新浏览器点击inspect…

python版若依框架开发:项目结构解析

python版若依框架开发 从0起步,扬帆起航。 python版若依部署代码生成指南,迅速落地CURD!项目结构解析 文章目录 python版若依框架开发前端后端 前端 后端

day34- 系统编程之 网络编程(TCP)

一、补充 ip地址:除了本机地址如:192.168.0.151还可以使用(自己测试)本地回环地址(127.0.0.1)或者使用htonl(INADDR_ANY); 二、模式 C/S 模式 ->服务器/客户端模型:TCP传输控制协议 2.1 …

鸿蒙jsonToArkTS_工具exe版本来了

前言导读 相信大家在学习鸿蒙开发过程中最痛苦的就是编写model 类 特别是那种复杂的json的时候对不对, 这时候有一个自动化的工具给你生成model是不是很开心。我们今天要分享的就是这个工具 JsonToArkTs 的用法 工具地址 https://gitee.com/qiuyu123/jsontomodel…

DeviceNet转Modbus TCP网关的远程遥控接收端连接研究

在港口码头作业中,遥控器因其精确的操作控制和稳定的性能,已成为起重机货物装卸作业的重要辅助工具。然而,在某港口码头实施无线遥控器远程控制掘进机的过程中,由于通信协议的不兼容,遭遇了技术难题。具体而言&#xf…

ASP.NET Core 中间件深度解析:构建灵活高效的请求处理管道

在现代Web应用开发中,请求处理管道的设计和实现至关重要。ASP.NET Core通过其中间件(Middleware)系统提供了一种高度灵活、可扩展的方式来构建请求处理管道。本文将全面深入地探讨ASP.NET Core中间件的概念、工作原理、实现方式以及最佳实践,帮助开发者掌…

从0到1认识ElasticStack

一、ES集群部署 操作系统Ubuntu22.04LTS/主机名IP地址主机配置elk9110.0.0.91/244Core8GB100GB磁盘elk9210.0.0.92/244Core8GB100GB磁盘elk9310.0.0.93/244Core8GB100GB磁盘 1. 什么是ElasticStack? # 官网 https://www.elastic.co/ ElasticStack早期名称为elk。 elk分别…

I2C 外设知识体系:从基础到 STM32 硬件实现

文章目录 I2C外设简介I2C 通信实现方式对比1. 软件模拟 I2C2. 硬件实现 I2C STM32 I2C 外设核心功能1. 硬件特性2. 寄存器与引脚 I2C框图一、引脚接口二、数据处理模块三、时钟控制模块四、控制逻辑模块五、辅助功能 I2C基本结构主机发送一、7 位主发送序列二、10 位主发送序列…

文件索引:数组、二叉树、二叉排序树、平衡树、红黑树、B树、B+树

参考链接:https://www.bilibili.com/video/BV1mY4y1W7pS 数据结构可视化工具:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 问题引出:一般是什么原因导致从磁盘查找数据效率低? 通过索引来更快的查询数据&a…

《仿盒马》app开发技术分享-- 商品搜索页(顶部搜索bar热门搜索)(端云一体)

开发准备 随着开发功能的逐渐深入,我们的应用逐渐趋于完善,现在我们需要继续在首页给没有使用按钮以及组件添加对应的功能,这一节我们要实现的功能是商品搜索页面,这个页面我们从上到下开始实现功能,首先就是一个搜索…