基于LDA+SVM实现人脸识别模型

news2024/11/26 8:37:17

基于LDA+SVM实现人脸识别模型

描述

人脸识别(图像识别)是机器学习领域十经典的应用,在本质上,人脸识别属于监督学习中的分类问题。前面章节中我们已经学习了支持向量机(SVM),该算法在图像分类领域应用非常广泛,本任务要求结合学过的数据降维算法(LDA、PCA),使用SVM构建人脸识别模型,对比评估不同降维算法下的识别准确率。数据集采用lfw人脸数据集。

本任务的主要工作内容:

1、 lfw数据集的下载与加载查看

2、 应用LDA对数据集降维

3、 应用PCA对数据集降维

4、 对比降维前后模型的表现

5、 对比两种降维算法的区别

源码下载

环境

  • 操作系统:Windows 10、Ubuntu18.04

  • 工具软件:Anaconda3 2019、Python3.7

  • 硬件环境:无特殊要求

  • 依赖库列表

    matplotlib   	3.3.4
    scikit-learn	0.24.2
    

分析

LFW (Labeled Faces in the Wild) 人脸数据集是由美国马萨诸塞州立大学阿默斯特分校计算机视觉实验室整理完成的经典数据集,主要用来研究人脸识别问题。该数据集包含5749个人的13233张脸部图片,每个人的图片数量不固定,图片尺寸为62×47,即数据的特征维度为62×47=2914,特征空间非常大,需要首先进行降维,之后再建模。

本任务涉及以下几个环节:

a)下载LFW人脸数据集

b)加载、查看数据集

c)分别使用LDA、PCA算法进行数据降维

d)在降维后的数据集上构建SVM模型并评估、预测

实施

1、下载LFW人脸数据集

下载地址:http://vis-www.cs.umass.edu/lfw/#download

请添加图片描述

打开页面,在下方找到下载链接,如图所示:

请添加图片描述

下载数据文件 lfw-funneled.tgz,保存到scikit-learn数据目录中,具体为:

WindowsC:\Users\实际用户名\scikit_learn_data\lfw_home
Linux~\scikit_learn_data\lfw_home

2、加载、查看人脸数据集

from sklearn.datasets import fetch_lfw_people
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis 
import matplotlib.pyplot as plt

# 加载人脸数据集(选取具有不少于60张图片的人)
faces = fetch_lfw_people(min_faces_per_person=60)
print(faces.target_names) # 数据集中的人名(共8个,即8个类别)
print(faces.images.shape) # 图像大小:1348张图片,每张图片尺寸为62*47=2914
print(faces.data.shape) # 样本数据大小:1348张图片,每张图片包含2914个特征维度
print(faces.target.shape) # 标签数组(1348张图片每一张对应的姓名编号0~7)

# 查看部分人脸图片
fig, ax = plt.subplots(2,5) # 生成2行5列的子图,查看10张图片
for i, axi in enumerate(ax.flat):
    axi.imshow(faces.images[i], cmap='bone') # 显示人脸图片
    axi.set(xticks=[], yticks=[], xlabel=faces.target_names[faces.target[i]]) # 显示姓名
    
plt.show()

结果如下:
请添加图片描述

结果分析:

  • 数据集中的八个人名,代表八个类别
  • 样本图像大小:1348张图片,没张图片尺寸为62×47=2914

3、分别使用LDA、PCA算法进行数据降维

# LDA人脸数据降维,将2914个维度降为7个

# 注意LDA降维需要提供标签信息(target)
lda = LinearDiscriminantAnalysis(n_components=7).fit(faces.data, faces.target)
data_lda = lda.transform(faces.data) # 降维转换
print('LDA:', data_lda.shape) # 查看数据维度

# PCA降维(2914降为150)
pca = PCA(n_components=150).fit(faces.data) # 利用PCA算法降维
data_pca = pca.transform(faces.data) # 降维转换
print('PCA:', data_pca.shape) # 查看数据维度

结果如下:

LDA: (1348, 7)
PCA: (1348, 150)

4、使用SVM算法建立人脸识别模型,评估并预测

# 根据不同的数据集建立SVM模型并评估、预测
def build_eval(data, target, label, n=20, x=1):
    X_train, X_test, y_train, y_test = train_test_split(data, target, random_state=9) # 拆分数据集
    model = SVC(C=10, gamma='scale').fit(X_train, y_train) # 创建SVM分类模型
    score = model.score(X_test, y_test) # 在测试集上评估模型成绩
    print(label, score) # 打印模型成绩
    

    y_pred = model.predict(X_test[:n]) # 预测前n张照片的姓名编号
    print('人脸识别:', y_pred) # 预测结果
    print('实际结果:', y_test[:n]) # 实际结果
    
    # 预测第x张图片的姓名
    y_name = faces.target_names[model.predict([X_test[x]])]
    y_real = faces.target_names[y_test[x]]
    print('第 {} 张人脸图片被识别为 {},实际为 {}\n'.format(x, y_name[0], y_real))

# 分别使用降维前、LDA降维和PCA降维后的数据进行建模、评估、预测
build_eval(faces.data, faces.target, '降维前,SVM模型识别准确率')    
build_eval(data_pca, faces.target, 'PCA降维,SVM模型识别准确率')
build_eval(data_lda, faces.target, 'LDA降维,SVM模型识别准确率')

结果如下:

请添加图片描述

可以看到,LDA+SVM人脸识别模型的准确率达到99.7%,LDA降维在图像处理中具有较大的优势,相对于PCA算法,LDA在降维时考虑了样本的标签,因此在分类任务的数据降维中更常用。需要注意的是,LDA属于监督学习算法。

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

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

相关文章

专为智能设备安全打造 | 基于ACM32 MCU的智能断路器方案

随着我国电网建设的快速发展,数字化变电站成为建设和研究的热点,数字化变电站的核心在于一次设备的智能化与二次设备的网络化,对于断路器这种极其重要的电力一次设备而言,其智能化的实现有十分重要的意义,断路器智能化…

耗时半月,终于把牛客网上的软件测试面试八股文整理成了PDF合集(测试基础+linux+MySQL+接口测试+自动化测试+测试框架+jmeter测试+测试开发)

大家好,最近有不少小伙伴在后台留言,近期的面试越来越难了,要背的八股文越来越多了,考察得越来越细,越来越底层,明摆着就是想让我们徒手造航母嘛!实在是太为难我们这些程序员了。 这不&#xf…

【Git】速食Git,一文学会Git使用

1.什么是版本控制 版本控制是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。【通俗来说就跟我们所玩的游戏一样,不断地更新迭代游戏内容,比如…

微服务高级篇学习【4】之多级缓存

文章目录前言一 多级缓存二 JVM进程缓存2.1 案例导入2.1.1 使用docker安装mysql2.1.2 修改配置2.1.3 导入项目工程2.1.4 导入商品查询页面2.1.5 反向代理2.2 初识Caffeine2.3 实现JVM进程缓存三 Lua脚本入门3.1 安装Lua3.2 Lua语法学习四 实现多级缓存4.1 OpenResty简介4.2 Ope…

STK实例场景创建及TLE文件导入

学习过程主要参考杨颖、王琦老师的《STK在计算机仿真中的应用》。(值得注意的是,书中的STK版本为5.X,我使用的版本为11.6) 创建实例场景 在默认的工具条单击第一个按钮(或File→New),并设置场…

【NAS群晖drive异地访问】远程连接drive挂载电脑硬盘「内网穿透」

文章目录前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用3. 结语转发自CSDN远程穿透的文章:【群晖…

魔兽世界私服架设教程—魔兽大服务器合并列表

都说魔兽世界是最经典的网游,可惜我沉迷于程序的世界, 用以下命令down源码 git clone git://github.com/mangos/mangos.git 编译的时候会出错,找不到以下两个文件 revision.h SystemConfig.h 其实以上文件只是简单的定义同个编译的宏而…

第一章 初识NANO板卡

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少。 本文链接:第一章 初识NANO…

事实胜于雄辩,苹果MacOs能不能玩儿机器/深度(ml/dl)学习(Python3.10/Tensorflow2)

坊间有传MacOs系统不适合机器(ml)学习和深度(dl)学习,这是板上钉钉的刻板印象,就好像有人说女生不适合编程一样的离谱。现而今,无论是Pytorch框架的MPS模式,还是最新的Tensorflow2框架,都已经可以在M1/M2芯片的Mac系统…

Transformer中的注意力机制及代码

文章目录1、简介2、原理2.1 什么是注意力机制2.2 注意力机制在NLP中解决了什么问题2.3 注意力机制公式解读2.4 注意力机制计算过程3、单头注意力机制与多头注意力机制4、代码4.1 代码14.2 代码21、简介 最近在学习transformer,首先学习了多头注意力机制&#xff0c…

Spring MVC(2)-跨域、CORS、XSS、 CSFR

同源和跨域 同源 什么是同源?请求的“协议ip(域名)端口”被称之为“源”。 如果当前页面的url和在当前页面中要访问的url具有相同的源,那么我们称这两个请求“同源”,即它们来自或者去往同一个服务器。 跨域 什么是跨域?如果…

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域应用

【自选】 时间地点:2023年7月22日-28日【乌鲁木齐】时间地点:2023年8月12日-18日【福建泉州】 【六天实践教学、提供全部资料】 专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门…

Android有官方的GPS定位API,为什么还要使用百度/高德定位SDK ?

1. 背景 小组在一个Demo项目中,图省事准备使用官方的GPS定位API。 但在我的印象中,官方的定位API是不好用的,一般都是用 高德地图/百度地图 的定位SDK的。 使用官方的定位API获取定位的话,在办公室调试的时候,可能室内…

技术人的管理学-业务管理

主要内容前言制定计划遇到的问题?过程监控遇到的问题?复盘改进遇到的问题?通过PDCA循环解决业务管理问题总结前言 没有人天生就会管理,优秀的管理者都是在知行合一的过程中成长起来的,他们既需要系统的管理知识&#…

数据结构_第十三关(2):快速排序

目录 1.快速排序 原理: 代码如下(递归实现): 性能比较 快速排序的特性总结 2.快速排序的优化 1)三数取中优化: 2)小区间优化: 3. 挖坑法(快排的另一种思路&#…

Android Jetpack 从使用到源码深耕【调度任务组件WorkManager 从实践到原理 】(三)

本文,是Jetpack 调度任务组件WorkManager 从实践到原理系列文章的最后一篇,本文我们将对WorkManager 任务的具体执行源码,进行深入的解读。 大家坐好,我们要开始飙车了。 1.任务的具体执行 书接上文,我们既然知道了WorkManager,既然把worker包装为了workrequset,然后…

本地生活为什么会迎来爆发?点赋科技带你了解这些关键点

随着全球疫情的结束和加速数字化转型进程,本地生活市场已经成为了经济发展的亮点。本地生活指的是人们在生活中所需的一切服务和消费,例如美食、购物、医疗保健、教育培训等各种类别。点赋科技就和大家来聊聊其中的一些关键点。 以下是本地生活迎来爆发的…

网络编程套接字( TCP )

目录 1、实现一个TCP网络程序(单进程版) 1.1、服务端serverTcp.cc文件 服务端创建套接字 服务端绑定 服务端监听 服务端获取连接 服务端提供服务 服务端main函数命令行参数 服务端serverTcp.cc总代码 1.2、客户端clientTcp.cc文件 客户端main函数命令行…

【Java技术指南】「JPA编程专题」让你不再对JPA技术中的“持久化型注解”感到陌生了

JPA编程专题JPA的介绍JPA的介绍分析JPA注解总览JPA实体型注解EntityTableTableGeneratorTableGenerator 属性TemporalTransientColumnColumn 属性ColumnUniqueConstraint属性状态VersionVersionEmbeddable 和 EmbeddedEmbeddedEmbeddedIdMappedSuperclassEntityListenersEntity…

30分钟Maven 从入门到精通

一、什么是Maven Maven 是一个流行的 Java 项目构建和管理工具,它包含了一个项目对象模型 (POM Project Object Model) 一组标准集合。不仅简化了我们开发过程中对jar包依赖的导入,还对项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等所有…