机器学习实验八--基于pca的人脸识别
基于pca的人脸识别
- 引言:pca
- 1.pca是什么
- 2.PCA算法的基本步骤
- 实例:人脸识别
- 1.实验目的
- 2.实现步骤
- 3.代码实现
- 4.实验结果
- 5.实验总结
引言:pca
1.pca是什么
pca是一种统计方法,它可以通过正交变换将一组可能相关的变量转换成一组线性不相关的变量,这组新的变量被称为主成分。PCA常用于高维数据的降维,通过保留最重要的几个主成分来简化数据集,同时尽可能保留原始数据的信息。
2.PCA算法的基本步骤
- 数据标准化:对原始数据进行预处理,使得每个特征的均值为0,标准差为1。这一步是为了消除不同量纲对数据分析的影响。
- 构建协方差矩阵:计算数据的协方差矩阵,协方差矩阵能够反映不同特征之间的相关性。
- 计算协方差矩阵的特征值和特征向量:特征值和特征向量能够揭示数据的内在结构。特征值越大,对应的特征向量在数据集中的重要性越高。
- 选择主成分:根据特征值的大小,选择前k个最大的特征值对应的特征向量作为主成分。通常会选择累计贡献率达到一定比例(如85%)的特征向量。
- 形成特征向量矩阵:将选定的特征向量组成一个矩阵,这个矩阵将用于将原始数据转换到新的特征空间。
- 数据转换:使用特征向量矩阵将原始数据转换到新的特征空间,得到降维后的数据。
实例:人脸识别
1.实验目的
- 理解PCA原理:通过实践掌握主成分分析(PCA)算法的核心思想及其在降维中的应用
- 应用PCA处理图像数据:学习如何将PCA应用于高维图像数据,特别是人脸识别领域
- 探索特征提取:了解PCA如何提取图像的主要特征(特征脸)及其在人脸表示中的作用
- 评估降维效果:通过图像重建实验,直观理解不同数量主成分对图像质量的影响
2.实现步骤
- 数据准备
• 加载ORL人脸数据集(包含40个人的400张人脸图像)
• 将每张112×92像素的灰度图像转换为10304维的向量
• 构建数据矩阵(每行代表一张图像) - 数据预处理
• 计算并减去平均脸(数据集中所有图像的平均)
• 中心化数据(使数据均值为0) - PCA分析
• 使用sklearn的PCA进行主成分分析
• 提取前50个主成分
• 可视化前5个特征脸(主成分) - 方差分析
• 绘制累计解释方差图
• 观察不同数量主成分对数据方差的解释程度 - 图像重建
• 选择样本图像进行重建
• 分别使用10、30、50个主成分重建图像
• 对比重建图像与原始图像的质量差异 - 结果分析
• 观察特征脸的特点
• 分析主成分数量对重建质量的影响
• 评估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_imagesX = np.zeros((total_images, img_size[0] * img_size[1]))image_count = 0for 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_arrayimage_count += 1except 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的PCApca = 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如何自动提取数据的主要变化模式,这些特征脸实际上构成了人脸图像的基础成分。
相关文章:

机器学习实验八--基于pca的人脸识别
基于pca的人脸识别 引言:pca1.pca是什么2.PCA算法的基本步骤 实例:人脸识别1.实验目的2.实现步骤3.代码实现4.实验结果5.实验总结 引言:pca 1.pca是什么 pca是一种统计方法,它可以通过正交变换将一组可能相关的变量转换成一组线…...
UDP包大小与丢包率的关系:原理分析与优化实践
文章目录 📦 UDP包大小与丢包率的关系:原理分析与优化实践一、核心结论:UDP包大小如何影响丢包率?二、技术原理解析:为什么大UDP包更容易丢失?1️⃣ MTU限制与IP分片(关键机制)2️⃣…...
ubuntu 端口复用
需求描述:复用服务器的 80端口,同时处理 ssh 和 http 请求,也就是 ssh 连接和 http 访问服务器的时候都可以指定 80 端口,然后服务器可以正确分发请求给 ssh 或者 http。 此时,ssh 监听的端口为 22,而 htt…...
Registry和docker有什么关系?
当遇到多个服务器需要同时传docker镜像的时候,一个一个的传效率会非常慢且压力完全在发送方的网络带宽;可以参考git hub,通常我们会用git push将代码传到git hub,如果谁需要代码用git pull就可以拉到自己的机器上,dock…...
C++11实现TCP网络通讯服务端处理逻辑简化版
以下是使用C11实现的TCP服务端处理逻辑,包含循环读取数据、帧头检测(AABBCC)及4376字节数据包处理: cpp #include <iostream>#include <vector>#include <cstring>#include <unistd.h>#include <arp…...
python3.9带 C++绑定的基础镜像
FROM ubuntu:20.04 # 设置非交互式环境变量(避免apt安装时提示时区选择) ENV DEBIAN_FRONTENDnoninteractive RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 安装基础编译工具和依赖 # 添加Python 3.9 PPA并安装依赖 RUN apt-get upda…...
Elasticsearch中的语义搜索(Semantic Search)介绍
Elasticsearch中的**语义搜索(Semantic Search)**是一种基于文本语义理解的搜索技术,它能够超越传统的关键词匹配,识别查询与文档之间的语义相关性,从而提供更精准、更符合用户意图的搜索结果。这种技术通过捕捉文本背后的含义、上下文和概念关联,解决了传统搜索中常见的…...

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

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

ubuntu屏幕复制
在ubnuntu20中没有办法正常使用镜像功能,这里提供一下复制屏幕的操作. 使用xrandr查看所有的显示器情况 这里我发现自己的电脑没有办法直接设置分辨率,但是外接的显示器可以设置,从命令行来说就是设置: xrandr --output HDMI-0 --mode 1920x1080那怎么样才能将原生电脑屏幕换…...
Flutter嵌入式开发实战 ——从树莓派到智能家居控制面板,打造工业级交互终端
一、为何选择Flutter开发嵌入式设备? 1. 跨平台能力降维打击 特性传统方案Flutter方案开发效率需分别开发Android/Linux一套代码多端部署内存占用200MB (QtWeb引擎)<80MB (Release模式)热重载支持不支持支持 2. 工业级硬件支持实测 树莓派4B:1080…...

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

验证电机理论与性能:电机试验平板提升测试效率
电机试验平板提升测试效率是验证电机理论与性能的重要环节之一。通过在平板上进行电机试验,可以对电机的性能参数进行准确测量和分析,从而验证电机的理论设计是否符合实际表现。同时,提升测试效率可以加快试验过程,节约时间和成本…...
Vue.js应用结合Redis数据库:实践与优化
一、概述 Vue.js是一个用于构建用户界面的渐进式JavaScript框架,适用于开发单页面应用(SPA)。Redis是一个高性能的内存数据结构存储,用作数据库、缓存和消息中间件。将Vue.js与Redis结合,可以实现高效的数据管理和快速…...

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为例,下载解压后&…...
更新Java的环境变量后VScode/cursor里面还是之前的环境变量
最近我就遇到这个问题,这个一般是安装了多个版本的Java,并设置好环境变量,但VScode/cursor内部环境变量却没有改变 解决办法 打开设置,或者直接快捷键CTRL,搜索Java:Home编辑settings.json文件 把以下部分改为正确的…...

【设计模式-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、手机谷歌浏览器打开网站 
简述什么是Hbase数据库? Hbase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,它利用HBase技术在HDFS上提供了类似于Bigtable的能力。换句话说,Hbase是Apache Hadoop生态系统中的一部分,可以为大数据应用提供快速的随机…...

python版若依框架开发:项目结构解析
python版若依框架开发 从0起步,扬帆起航。 python版若依部署代码生成指南,迅速落地CURD!项目结构解析 文章目录 python版若依框架开发前端后端 前端 后端...
国产linux系统(银河麒麟,统信uos)使用 PageOffice在线编辑word文件保存数据同时保存文件
在实际应用中,例如在线签订合同的时候,合同的签订日期,合同号等等这些信息既要保存到数据库,合同签订后又要将整个合同文件保存起来。这时候就需要用到PageOffice的保存数据区域数据的同时保存整个文件的功能。 后端代码 后端打…...

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网关的远程遥控接收端连接研究
在港口码头作业中,遥控器因其精确的操作控制和稳定的性能,已成为起重机货物装卸作业的重要辅助工具。然而,在某港口码头实施无线遥控器远程控制掘进机的过程中,由于通信协议的不兼容,遭遇了技术难题。具体而言…...

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