机器学习之基于LDA的人脸识别

news2024/11/15 11:51:01

目录

LDA降维

思想

matlab代码

fisherface

思想

matlab代码

人脸识别

思想

matlab代码


LDA降维

思想

首先,代码通过使用dir函数获取指定路径下所有以".bmp"结尾的文件,并存储在变量pictures中。

然后,定义了一些参数:people表示人数,personPictureNumber表示每个人的图像数量,Dimension表示图像的维度大小,pictureNumber表示总图像数量。

接下来,创建一个空矩阵sample,用于存储所有图像的向量表示。然后利用循环遍历每个图片,并将其读取、转换为双精度类型,并将其转换为列向量picture。最后将该列向量添加到sample矩阵中。

接下来是LDA部分的代码。首先定义了两个空的矩阵SbSw,分别表示类间散度矩阵和类内散度矩阵。然后,通过循环遍历每个人的图像,计算出每个人图像的均值向量,并计算出类间散度矩阵Sb。同时,将每个人图像的均值向量存储在meanPerson中。接下来,计算类内散度矩阵Sw,循环遍历每个图像,计算出每个图像与其对应人的均值向量之差,并计算出类内散度矩阵Sw

然后根据不同模型进行不同处理构建协方差矩阵,然后提取特征向量。

matlab代码

pictures=dir('C:\Users\Yezi\Desktop\机器学习\face10080\*.bmp');
people=15;
personPictureNumber=11;
Dimension=100*80;
pictureNumber=people*personPictureNumber;
sample=[];
for i=1:pictureNumber
    picture=imread("C:\Users\Yezi\Desktop\机器学习\face10080\"+pictures(i).name);
    picture=double(picture);
    picture=picture(:);
    sample=[sample,picture];
end

% LDA
meanPerson=[];
meanTotal=mean(sample,2);
Sb=zeros(Dimension,Dimension);
for i=0:people-1
    temp=sample(:,i*personPictureNumber+1:(i+1)*personPictureNumber);
    one=mean(temp,2)-meanTotal;
    Sb=Sb+one*one';
    meanPerson=[meanPerson,mean(temp,2)]; 
end
Sb=Sb/people;
Sw=zeros(Dimension,Dimension);
for i=1:pictureNumber
    one=sample(:,i)-meanPerson(floor((i-1)/personPictureNumber)+1);
    Sw=Sw+one*one';
end
Sw=Sw/pictureNumber;

% 经典
covMatrix=pinv(Sw)*Sb;
% 正则
% Sb=Sb+eye(Dimension)*10^-6;
% covMatrix=pinv(Sw)*Sb;
% 减法
% covMatrix=Sb-Sw;

[egienvectors,diagonalMatrix]=eig(covMatrix);
egienvalues=diag(diagonalMatrix);
[egienvalues,order]=sort(egienvalues,'descend');
egienvectors=egienvectors(:,order);

fisherface

思想

首先,将样本矩阵sample中的第一列取出,表示选择了一个人脸图像作为重建的源图像,存储在变量oneFace中。

然后,通过循环遍历特征维度,从1到8逐渐增加。在每个循环中,选取特征向量矩阵egienvectors中的前dimension列,表示选择了部分特征向量用于重建。这些特征向量被存储在变量egienvector中。

接下来,通过将特征向量矩阵egienvector与其转置的乘积与源图像oneFace相乘,得到重建的人脸图像rebuildFace。然后,通过reshape函数将rebuildFace重新变换回100x80的图像矩阵。

然后,使用subplot函数将多个子图排列在一个2x4的网格上,其中每个子图显示一个特征维度下的重建人脸图像。imshow函数显示重建的人脸图像,并使用mat2gray函数将图像数据转换为灰度范围[0,1]内的值。xlabel函数设置子图的标题,显示当前特征维度。

通过以上的循环和绘图操作,代码可以展示在不同的特征维度下,对原始人脸图像的重建效果。随着特征维度的增加,重建图像将逐渐接近源图像,并展示出更多的细节和结构信息。

matlab代码

oneFace=sample(:,1);
for dimension=1:1:8
    egienvector=egienvectors(:,1:dimension);
    rebuildFace=egienvector*(egienvector'*oneFace);
    rebuildFace=reshape(rebuildFace,100,80);
    subplot(2,4,dimension);
    imshow(mat2gray(rebuildFace));
    xlabel(sprintf("dimension=%d",dimension));
end

人脸识别

思想

首先,定义训练样本数trainNumber和测试样本数testNumber,并创建了空的训练数据矩阵trainData和测试数据矩阵testData

然后,通过两个循环将样本矩阵sample中的数据按照一定规则划分为训练数据和测试数据。第一个循环根据不同的人数进行迭代,并将每个人的前trainNumber个图像添加到trainData中。第二个循环同样根据不同的人数进行迭代,并将每个人的后面的testNumber个图像添加到testData中。

接下来,定义了空的结果矩阵result,用于存储不同特征维度下的分类准确率。

然后,通过两个嵌套循环遍历K近邻算法的参数:knnKdimension。在每个循环中,选择特征向量矩阵egienvectors中的前dimension列,表示选择了部分特征向量进行降维。这些特征向量被存储在变量egienvector中。

接下来,通过矩阵乘法运算将训练数据和测试数据投影到特征向量所构成的子空间中,得到降维后的训练数据trainDataTemp和测试数据testDataTemp

然后,定义了变量error用于记录分类错误的样本数量。通过计算测试数据的数量和训练数据的数量,进行两个嵌套循环遍历测试数据。在每个测试样本中,计算与所有训练样本之间的欧式距离,并对距离进行排序。然后,根据K近邻算法的思想,选择距离最近的knnK个训练样本作为邻居。

接下来,根据邻居的类别信息,判断测试样本的类别。如果邻居中只有一个类别出现次数最多,则将该类别作为测试样本的预测类别;否则,使用出现次数最多的类别作为预测类别。

最后,统计错误分类的样本数量,并计算分类准确率。将准确率存储在结果矩阵result中。

最后,通过调用plot函数,将特征维度dimension作为横轴,分类准确率result作为纵轴进行绘图,展示不同特征维度下的分类准确率曲线。

matlab代码

trainNumber=4;
testNumber=3;
trainData=[];
testData=[];
for i=0:people-1
    trainData=[trainData,sample(:,i*personPictureNumber+1:i*personPictureNumber+trainNumber)];
end
for i=0:people-1
    testData=[testData,sample(:,i*personPictureNumber+trainNumber+1:i*personPictureNumber+personPictureNumber)];
end
result=[];
for knnK=1:1
    for dimension=1:1:10
        egienvector=egienvectors(:,1:dimension);
        trainDataTemp=egienvector'*trainData;
        testDataTemp=egienvector'*testData;
        error=0;
        testDataNumber=size(testDataTemp,2);
        trainDataNumber=size(trainDataTemp,2);
        for i=1:testDataNumber
            distances=[];
            for j=1:trainDataNumber
               distance=0;
               for k=1:dimension
                  distance=distance+(testDataTemp(k,i)-trainDataTemp(k,j))^2; 
               end
               distances=[distances,distance];
            end
            [distances,index]=sort(distances);
            rightIndex=floor((i-1)/testNumber)+1;
            testIndex=0;
            knn=[];
            for k=1:knnK
               knn=[knn,floor((index(k)-1)/trainNumber)+1];
            end
            [modeIndex,times]=mode(knn);
            if times==1
                testIndex=knn(1);
            else
                testIndex=modeIndex;
            end
            if testIndex~=rightIndex
                error=error+1;
            end
        end
        rate=(testDataNumber-error)/testDataNumber;
        result=[result,rate];
    end
end
X=1:1:10;
plot(X,result);

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

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

相关文章

SSMP整合案例(6) 业务service层逻辑编写

之前呢 我们就还是将数据层的结构搭好了 那么 接下来就是业务层 可能有些开发人员会存在一定的误区 将业务层和数据层的函数命名混为一谈 例如 我们有个 users 表 那么 我们要做一个登录功能 那么 业务层的接口毋庸置疑叫 login 接收两个参数 userName userPassword 然后 数据…

FAQ常见问题如何从本地转为全线上版?

随着互联网的发展,越来越多的企业开始将常见问题FAQ从本地转移到全线上版,以提高用户体验和减少企业成本。本文将从以下几个方面进行阐述,如何将FAQ从本地转为全线上版。 一、整理FAQ 首先,企业需要对已有的FAQ进行整理&#xf…

极致呈现系列之:Echarts平行坐标系的多维度分析

目录 平行坐标系简介平行坐标系的常用配置项Vue3中创建平行坐标系美化平行坐标系样式美化 平行坐标系简介 平行坐标系是一种将多个维度的数值以平行的直线绘制在坐标系上的可视化方式。通过绘制多条平行直线,并将数据点映射到这些直线上,我们可以直观地…

【小沐学Web】Node.js搭建HTTPS 服务器

文章目录 1、简介1.1 HTTPS协议1.2 Node.js中的HTTPS 2、生成自签名证书2.1 key文件2.2 csr文件2.3 crt文件 4、代码测试4.1 Node.js简介4.2 Node.js的http模块4.3 Node.js的Express模块4.4 Node.js的https模块4.5 Node.js的httpsexpress模块 结语 1、简介 1.1 HTTPS协议 HTTP…

QT6之多线程控制——互斥量和信号量

在程序中,通常竞争使用临界资源,但如果不加限制就很可能出现异常或未达到预期的结果。 临界资源一次仅允许被一个线程使用,它可以是一块内存、一个数据结构、一个文件或者任何其他具有排他性使用的东西。 这些必须互斥执行的代码段称为“临界区(Critical…

使用VmWare安装黑苹果系统

目录 1.介绍2.破解安装VMware3.unlocker解锁虚拟机3.1 关闭VMware相关的进程3.2 执行安装命令 4.VmWare创建虚拟机5. 下载并配置镜像以及虚拟机设置5.1 修改镜像5.2 修改虚拟机安装路径文件内容 6. 选择镜像启动虚拟机7.安装macOS系统7.1 开启此虚拟机7.2 选择语言->简体中文…

TEC半导体热电温控技术在复合相变材料储热性能测试中的应用

摘要:针对定形相变复合材料热性能测试中ASTM C1784动态热流计法和ASTM C518稳态热流计法的高精度可编程快速温度控制问题,本文提出了采用单独两路TEC半导体热电加热制冷模组作为执行机构的解决方案。解决方案中还配备了不同加热功率的TEC控制电源模块、高…

Netty 聊天室项目案例

1. 登入 在连接建立好之后,客户端发送登入,将登入消息封装为LoginRequestMessage这个类的对象, ctx.writeAndFlush(loginRequestMessage);)使用ctx发送,注意入站处理器调用写相关方法,会触发出站处理器&am…

金升阳|过压保护是什么意思?过压保护电路的构建

过压保护是指在电路中加入一种保护措施,以避免电路过压而导致器件损坏、安全事故等情况的发生。在实际工程中,过压保护电路通常由过压检测电路和过压保护器件组成。本文将详细介绍过压保护的原理、过压保护电路的构建方法、常见的过压保护器件以及应用实…

【LLMs 入门实战 】第二式:MiniGPT4 模型学习与实战

2023年4月17日,多模态问答模型MiniGPT-4发布,实现了GPT-4里的宣传效果《MiniGPT-4: Enhancing Vision-language Understanding with Advanced Large Language Models》《MiniGPT-4:使用高级大语言模型增强视觉语言理解》 模型介绍模型架构微调…

如何在conda环境中正确地使用pip

导言: 在conda环境下使用pip安装库时,许多时候会出现一些奇怪的现象,即用pip安装完成后在该conda环境下却没有该库。本文将说明该问题出现的原因,修复方式和如何正确地在conda环境中使用pip。 问题现象 复现: 新建环…

1-html

一 HTML 初体验 1 HTML 定义 HTML 超文本标记语言——HyperText Markup Language。 超文本是什么&#xff1f;链接标记是什么&#xff1f; 标记也叫标签&#xff0c;带尖括号的文本 2 标签语法 标签成对出现&#xff0c;中间包裹内容<>里面放英文字母&#xff08;标签…

Vim 自定义配色

本文首发于我的个人博客&#xff0c;欢迎点击访问&#xff0c;无广告节面简洁&#xff01; 最近重新开始学习Vim装上了WSL2&#xff0c;但发现Windows Terminal和vim的组合还是有很多问题需要解决的&#xff0c;由其默认的配色在某些状态下根本看不清字体&#xff0c;所以折腾…

小满vue3笔记(含源码解读)

第一章 1.mvvm架构 2.回顾vue2对比vue3 区别&#xff1a; vue2选项式api vue3组合式api 关于这两个的区别&#xff0c;你可以不准确的理解为&#xff0c;选项式api更贴近原生标准html文件结构&#xff1b; 而组合式api就像在html标签中写css&#xff1b;当然做了优化&…

最新大麦网抢票脚本-Python实战

学习时候的一个小例子&#xff0c;python挺有趣的&#xff0c;希望技术可以更进步 我也不多说啥了直接上图 系统:win10 python 版本:3.8.10 需要安装的库:selenium 安装方法: pip install selenium 抢H5版本也写了&#xff0c;但是速度有点慢2…5 就不发了 不如用autojs写感…

前端vue入门(纯代码)15

【16.Vue的过渡与动画】 1.点击切换按钮&#xff1a;实现某一元素的显示/隐藏 Test.vue文件中 <template><div><!-- 点击事件触发后&#xff0c;isShow取反 --><!-- 通过点击按钮让h1标签出现或者消失 --><button click"isShow !isShow&qu…

哈工大计算机网络课程网络层协议详解之:DHCP协议

哈工大计算机网络课程网络层协议详解之&#xff1a;DHCP协议 文章目录 哈工大计算机网络课程网络层协议详解之&#xff1a;DHCP协议如何获得IP地址&#xff1f;硬编码动态主机配置协议-DHCP&#xff1a;&#xff08;Dynamic Host Configuration Protocol&#xff09; 动态主机配…

设计模式篇(Java):前言(UML类图、七大原则)

编写软件过程中&#xff0c;程序员面临着来自耦合性&#xff0c;内聚性以及可维护性&#xff0c;可扩展性&#xff0c;重用性&#xff0c;灵活性等多方面的挑战&#xff0c;设计模式是为了让程序(软件)&#xff0c;具有更好&#xff1a; 代码重用性 (即&#xff1a;相同功能的…

Web自动化测试平台的设计与落地

目录 前言 一、目标和定位 二、平台特点 三、系统架构 四、相关技术栈 五、UI概览 六、待完善部分 总结&#xff1a; 前言 我最初开始接触Web自动化测试的时候&#xff0c;没有直接的领路人&#xff0c;测试行业知识也远不及如今这么丰富和易获取&#xff0c;当时我对于…