当前位置: 首页 > article >正文

OpenCv高阶(十六)——Fisherface人脸识别

文章目录

  • 前言
  • 一、Fisherface人脸识别原理
    • 1. 核心思想:LDA与Fisher准则
    • 2. 实现步骤
      • (1) 数据预处理
      • (2) 计算类内散布矩阵 SW对每个类别(每个人)计算均值向量 μi:
      • (3) 计算类间散布矩阵 SB
      • (4) 求解投影矩阵 W
      • (5) 降维与分类
    • 3. Fisherface vs. Eigenface
    • 4. 优缺点
  • 二、Fisherface人脸识别代码
    • 1、导入依赖库
    • 2、定义在OpenCV图像上添加中文文本的函数
    • 3、定义图像预处理函数
    • 4、主程序
  • ---------- 数据准备阶段 ----------
  • ---------- 模型训练阶段 ----------
  • ------------ 预测阶段 ---------------
  • ---------- 结果可视化 ----------
  • 总结


前言

人脸识别作为计算机视觉领域的核心课题之一,在安全监控、身份认证、人机交互等领域具有广泛的应用前景。早期的经典方法如Eigenface(基于主成分分析,PCA)通过无监督降维提取人脸的主要特征,但其忽略了类别标签信息,对光照、表情等类内变化敏感,导致分类性能受限。为解决这一问题,Belhumeur等人于1997年提出了Fisherface方法,将线性判别分析(Linear Discriminant Analysis, LDA)引入人脸识别领域。该方法通过有监督学习,最大化不同人脸间的差异,同时压缩同一人脸在不同条件下的类内差异,从而显著提升了识别鲁棒性。

一、Fisherface人脸识别原理

Fisherface是一种基于线性判别分析(Linear Discriminant Analysis, LDA)的人脸识别方法,由Belhumeur等人在1997年提出。其核心思想是通过最大化类间差异(不同人脸之间的差异)并最小化类内差异(同一人脸在不同条件下的差异),找到最优的投影方向,从而实现高效的人脸分类。以下是其原理的详细解释:

1. 核心思想:LDA与Fisher准则

LDA目标:在降维过程中,找到一个投影矩阵,使得投影后的数据满足:

类间散布(Between-class scatter)最大化:不同类别(不同人)的数据尽可能分开。

类内散布(Within-class scatter)最小化:同一类别(同一人)的数据尽可能聚集。

Fisher准则:通过最大化类间散布与类内散布的比值,找到最优投影方向:

在这里插入图片描述

2. 实现步骤

(1) 数据预处理

将人脸图像转换为灰度图,并归一化为相同尺寸(如100×100像素)。

将每张图像展平为一个列向量(维度为D×1,如10000维)。

(2) 计算类内散布矩阵 SW对每个类别(每个人)计算均值向量 μi:

在这里插入图片描述
在这里插入图片描述

(3) 计算类间散布矩阵 SB

计算全局均值向量 μ:
在这里插入图片描述

(4) 求解投影矩阵 W

通过广义特征值分解求解:
在这里插入图片描述

(5) 降维与分类

将原始数据投影到低维空间:
在这里插入图片描述
在低维空间中使用分类器(如KNN、SVM)进行分类。

3. Fisherface vs. Eigenface

Eigenface(PCA):基于主成分分析(PCA),最大化全局方差,无监督方法。对光照、姿态变化敏感。

Fisherface(LDA):结合类别信息,最大化类间差异、最小化类内差异,有监督方法。对光照、表情等变化更具鲁棒性。

4. 优缺点

优点:
利用类别信息,分类性能优于PCA。
对类内变化(如光照、表情)有更好的鲁棒性。

缺点:
需要类别标签,属于有监督方法。
当样本数远小于特征维度时(如小样本问题),SW 可能奇异(不可逆),需先通过PCA降维(称为Fisherfaces的常见实现方式)。

二、Fisherface人脸识别代码

1、导入依赖库

import cv2               # OpenCV库,用于图像处理和计算机视觉任务
import numpy as np       # 数值计算库
from PIL import Image, ImageFont, ImageDraw  # 图像处理库(用于添加中文文本)

2、定义在OpenCV图像上添加中文文本的函数

def cv2AddChineseText(img, text, position, textColor=(0,255,0), textSize=30):"""功能:在OpenCV图像上添加中文文本参数:img: 输入图像(OpenCV格式的numpy数组)text: 要添加的中文文本position: 文本位置坐标 (x,y)textColor: 文本颜色 (B,G,R)textSize: 字体大小返回:添加文本后的图像(OpenCV格式)"""# 将OpenCV的BGR图像转换为PIL的RGB格式if(isinstance(img, np.ndarray)):img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))# 创建PIL绘图对象draw = ImageDraw.Draw(img)# 加载中文字体(注意字体文件路径需要存在)fontStyle = ImageFont.truetype('../data/simhei.ttf', textSize, encoding='utf-8')# 在指定位置绘制文本draw.text(position, text, textColor, font=fontStyle)# 将PIL图像转回OpenCV格式(BGR)return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

3、定义图像预处理函数

def image_re(img):"""功能:读取图像并进行预处理处理步骤:1. 以灰度模式读取图像2. 调整尺寸为120x180像素3. 将图像添加到全局列表images中"""a = cv2.imread(img, 0)  # 参数0表示灰度模式读取a = cv2.resize(a, (120, 180))  # 统一图像尺寸images.append(a)          # 添加到训练集列表

4、主程序

---------- 数据准备阶段 ----------

if __name__ == "__main__":images = []  # 存储训练图像的列# 加载训练图像(注意路径需要存在)image_re('../data/face-detect/lyf1.png')  # 刘亦菲样本1image_re('../data/face-detect/lyf2.png')  # 刘亦菲样本2image_re('../data/face-detect/pyc1.png')  # 彭逸畅样本1image_re('../data/face-detect/pyc2.png')  # 彭逸畅样本2# 创建对应标签(0=刘亦菲,1=彭逸畅)labels = [0, 0, 1, 1]  # 每个样本对应的类别标签# 加载待识别的测试图像pre_image = cv2.imread('../data/face-detect/pyc.png', 0)  # 灰度读取pre_image = cv2.resize(pre_image, (120, 180))            # 调整尺寸

---------- 模型训练阶段 ----------

 # 创建FisherFace识别器(需要安装opencv-contrib-python)recognizer = cv2.face.FisherFaceRecognizer_create(threshold=5000)# 训练模型recognizer.train(images, np.array(labels))  # 输入图像列表和标签数组

------------ 预测阶段 ---------------

 # 进行预测,返回预测标签和置信度label, confidence = recognizer.predict(pre_image)# 创建标签到姓名的映射字典dic = {0: '刘亦菲', 1: '彭逸畅', -1: '无法识别'}  # -1为默认未知类别

---------- 结果可视化 ----------

   # 读取原始彩色图像并添加识别结果文本result_img = cv2AddChineseText(cv2.imread('../data/face-detect/pyc.png').copy(),  # 原始彩色图像dic[label],                                         # 识别结果文本(30, 10),                                           # 文本位置textColor=(0, 255, 0)                               # 绿色文本)# 显示结果图像cv2.imshow('Face Recognition Result', result_img)cv2.waitKey(0)  # 等待按键后关闭窗口

最终效果:

在这里插入图片描述

与之前的人脸识别项目相同,此处依然可以调用摄像头,具体实现方法和LBPH实现方法相同。

总结

Fisherface作为基于线性判别分析(LDA)的经典人脸识别方法,通过有监督的投影方向优化,在特征空间中实现了类间差异的最大化与类内差异的最小化。相较于无监督的Eigenface方法,Fisherface充分挖掘了类别标签信息,显著提升了人脸在复杂光照、表情等变化下的识别精度。然而,该方法在小样本场景下面临类内散布矩阵奇异性的问题,常需结合PCA进行预处理以缓解维度灾难。

尽管深度学习方法已在人脸识别中取得突破性进展,Fisherface的理论框架仍具有重要价值。其在低维特征提取与可解释性方面的优势,使其在嵌入式设备、轻量级系统中保有应用潜力。未来,结合传统方法与深度学习的特点,或可进一步推动人脸识别技术在鲁棒性、效率与泛化能力上的均衡发展。

相关文章:

OpenCv高阶(十六)——Fisherface人脸识别

文章目录 前言一、Fisherface人脸识别原理1. 核心思想:LDA与Fisher准则2. 实现步骤(1) 数据预处理(2) 计算类内散布矩阵 SW对每个类别(每个人)计算均值向量 μi:(3) 计算类间散布矩阵 SB(4) 求解投影矩阵 W(5) 降维与分类 3. Fish…...

Unity3D 异步加载材质显示问题排查

前言 在Unity3D中异步加载材质后未正确显示的问题,通常涉及资源加载流程、材质引用或Shader配置。以下是逐步排查和解决问题的方案: 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀! …...

【Django Serializer】一篇文章详解 Django 序列化器

第一章 Django 序列化器概述 1.1 序列化器的定义 1.1.1 序列化与反序列化的概念 1. 序列化 想象你有一个装满各种物品(数据对象)的大箱子(数据库),但是你要把这些物品通过一个狭窄的管道(网络&#xff…...

二分算法的补充说明

在上一节中我们简单介绍了二分算法,通过区分小于等于,大于或者小于,大于等于我们可以求出它们的边界值。 具体方法是先看一下要求哪里的边界值,分成两部分让如果求小于等于的右边界,我们根据条件让rightmid-1,leftmid…...

C++:array容器

array容器是序列容器&#xff0c;它的特点是&#xff1a;静态&#xff0c;固定数目。可以看作更安全的数组。 它还有一些成员函数&#xff0c;如begin&#xff08;&#xff09;&#xff1a;返回指向容器中第一个元素的随机访问迭代器。 #include<iostream>//数组容器 #…...

java每日精进 5.19【Excel 导入导出】

基于 EasyExcel 实现 Excel 的读写操作&#xff0c;可用于实现最常见的 Excel 导入导出等功能。 Excel 导入导出功能涉及前后端协作&#xff0c;后端处理数据查询、文件生成和解析&#xff0c;前端提供用户交互和文件下载/上传界面。以下是全流程解析&#xff0c;分为导出流程…...

java基础(api)

包&#xff1a; 导包&#xff0c;不同包的程序名相同。 但是要用两个的话可以这样子写&#xff1a; String String概述 String的常用方法 String使用时的注意事项 String的应用案例...

CentOS7/Ubuntu SSH配置允许ROOT密码登录

CentOS7 打开SSHD配置文件 vim /etc/ssh/sshd_config 找到注释行&#xff0c;如果没有就添加。 #PermitRootLogin yes 把注释取消掉。 执行下述命令&#xff0c;重启SSHD服务即可。 systemctl restart sshd.service Ubuntu 先安装SSH服务器&#xff0c;CentOS7默认就安…...

C++ HTTP框架推荐

1. Crow 特点&#xff1a;高性能异步框架&#xff0c;支持Linux、macOS和Windows 优势&#xff1a; 轻量级&#xff1a;整个框架只有一个头文件&#xff0c;易于集成到项目中 简单易用&#xff1a;API设计简洁直观&#xff0c;学习曲线平缓 高性能&#xff1a;基于Boost.Asi…...

算法打卡第二天

5.爬楼梯(动态规划) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2…...

VSCode推出开源Github Copilot:AI编程新纪元

文章目录 开源决策的背后GitHub Copilot的演进历程Copilot Chat核心功能解析1. 聊天界面集成2. 代码理解与生成3. 多文件编辑能力4. 智能代理模式 开源后的影响与展望对开发者的影响对AI编程工具市场的影响未来发展方向 如何开始使用GitHub Copilot结语相关学习资源 在AI编程助…...

Mujoco 学习系列(四)官方模型仓库 mujoco_menagerie

mujoco 官方在 Github 上发布了一个他们自己整理的高质量的模型仓库&#xff0c;这个仓库是一个持续维护的项目&#xff0c;里面包含了目前市面上常见的人形机器人、机械臂、底盘等模型&#xff0c;对于初学者而言是一个非常好的学习资料&#xff0c;无论是想在仿真环境中尝试还…...

代码走读 Go 语言 Map 的实现

序言 在日常的开发当中&#xff0c;我们一定离不开一个数据结构字典。不仅可以存储关联数据对&#xff0c;还可以在 O(1) 的时间复杂度进行查找。很久之前在 一篇文章带你实现 哈希表 介绍了相关的原理以及简单的实现。所以这篇文章中我们就不多赘述哈希表的原理&#xff0c;而…...

PostgreSQL14 +patroni+etcd+haproxy+keepalived 集群部署指南

使用postgresql etcd patroni haproxy keepalived可以实现PG的高可用集群&#xff0c;其中&#xff0c;以postgresql做数据库&#xff0c;Patroni监控本地的PostgreSQL状态&#xff0c;并将本地PostgreSQL信息/状态写入etcd来存储集群状态&#xff0c;所以&#xff0c;patr…...

数据结构知识点汇总

1、在数据结构中&#xff0c;随机访问是指能够直接访问任一元素&#xff0c;而不需要从特定的起始位置开始&#xff0c;也不需要按顺序访问其他元素。这种访问方式通常不涉及遍历。例如&#xff0c;数组&#xff08;array&#xff09;支持随机访问&#xff0c;你可以直接通过索…...

雅思英语考试基本介绍

考试分类 雅思&#xff08;国际英语语言测试系统&#xff0c;International English Language Testing System 即IELTS&#xff09;主要分为两大类&#xff1a; 学术类&#xff08;A类&#xff09; 这是我可能会选择的一种&#xff08;✓&#xff09;&#xff0c;专为申请大学…...

基于YOLO11深度学习的变压器漏油检测系统【Python源码+Pyqt5界面+数据集+安装使用教程+训练代码】【附下载链接】

文章目录 引言软件主界面源码目录文件说明一、环境安装(1)安装python(2)安装软件所需的依赖库 二、软件核心功能介绍及效果演示(1)软件核心功能(2)软件效果演示 三、模型的训练、评估与推理(1)数据集准备与训练(2)训练结果评估(3)使用训练好的模型识别 四、完整相关文件及源码下…...

线上 Linux 环境 MySQL 磁盘 IO 高负载深度排查与性能优化实战

目录 一、线上告警 二、问题诊断 1. 系统层面排查 2. 数据库层面分析 三、参数调优 1. sync_binlog 参数优化 2. innodb_flush_log_at_trx_commit 参数调整 四、其他优化建议 1. 日志文件位置调整 2. 生产环境核心参数配置模板 3. 突发 IO 高负载应急响应方案 五、…...

【洛谷 P9025】 [CCC2021 S3] Lunch Concert 题解

题目&#xff1a; 洛谷 P9025 分析&#xff1a; 为了解决这个问题&#xff0c;我们需要找到一个整数位置 c 来举办音乐会&#xff0c;使得所有人移动到能听到音乐会的位置的时间总和最小。每个人移动后的位置应该在其听力范围内&#xff0c;并且尽可能靠近自己的初始位置以减少…...

Python 包管理工具核心指令uvx解析

uvx 是 Python 包管理工具 uv 的重要组成部分&#xff0c;主要用于在隔离环境中快速运行 Python 命令行工具或脚本&#xff0c;无需永久安装工具包。以下是其核心功能和使用场景的详细解析&#xff1a; 一、uvx 的定位与核心功能 工具执行器的角色 uvx 是 uv tool run 的别名&a…...

苍穹外卖05 Redis常用命令在Java中操作Redis_Spring Data Redis使用方式店铺营业状态设置

2-8 Redis常用命令 02 02-Redis入门 ctrlc :快捷结束进程 配置密码&#xff1a; 以后再启动客户端的时候就需要进行密码的配置了。使用-a 在图形化界面中创建链接&#xff1a; 启动成功了。 03 03-Redis常用数据类型 04 04-Redis常用命令_字符串操作命令 05 05-Redis常用命令…...

AI工程师系列——面向copilot编程

前言 ​ 笔者已经使用copilot协助开发有一段时间了,但一直没有总结一个协助代码开发的案例,特别是怎么问copilot,按照什么顺序问,哪些方面可以高效的生成需要的代码,这一次,笔者以IP解析需求为例,沉淀一个实践案例,供大家参考 当然,其实也不局限于copilot本身,类似…...

【竖排繁体识别】如何将竖排繁体图片文字识别转横排繁体,转横排简体导出文本文档,基于WPF和腾讯OCR的实现方案

一、应用场景 在古籍数字化、繁体文档处理、两岸三地文化交流等场景中,经常需要将竖排繁体文字转换为横排文字。例如: 古籍研究人员需要将竖排繁体文献转换为现代横排简体格式以便编辑和研究出版行业需要将繁体竖排排版转换为简体横排格式两岸三地交流中需要将繁体竖排文档转…...

梳理Spring Boot中三种异常处理

在 Spring Boot 中处理异常确实有多个方式&#xff0c;比如使用 ControllerAdvice、 BasicErrorController、HandlerExceptionResolver等。不同方式适合不同的场景&#xff0c;下面是对这些方式的分析以及如何选择的建议&#xff1a; &#x1f9e9; 1. ControllerAdvice Exce…...

NFS服务器实验

实验要求 架设一台NFS服务器&#xff0c;并按照以下要求配置 1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 2、开放/nfs/upload目录&#xff0c;为192.168.xxx.0/24网段主机可以上传目录&#xff0c;并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210 3…...

ffmpeg 转换视频格式

使用FFmpeg将视频转换为MP4格式的常用命令&#xff1a; ffmpeg -i input.mov -c:v libx264 -crf 23 -c:a aac output.mp4 -i input.avi&#xff1a;指定输入文件 -c:v libx264&#xff1a;使用H.264视频编码器 -crf 23&#xff1a;控制视频质量&#xff08;范围18-28&#…...

Java进阶之新特性

Java新特性 参考 官网&#xff1a;https://docs.oracle.com/en/ JDK5新特性 1.自动装箱与拆箱 自动装箱的过程&#xff1a;每当需要一种类型的对象时&#xff0c;这种基本类型就自动地封装到与它相同类型的包装类中。 自动拆箱的过程&#xff1a;每当需要一个值时&#xf…...

Python基础学习-Day32

面对一个全新的官方库&#xff0c;是否可以借助官方文档的写法了解其如何使用。 我们以pdpbox这个机器学习解释性库来介绍如何使用官方文档。 大多数 Python 库都会有官方文档&#xff0c;里面包含了函数的详细说明、用法示例以及版本兼容性信息。 通常查询方式包含以下2种&…...

离线服务器算法部署环境配置

本文将详细记录我如何为一台全新的离线服务器配置必要的运行环境&#xff0c;包括基础编译工具、NVIDIA显卡驱动以及NVIDIA-Docker&#xff0c;以便顺利部署深度学习算法。 前提条件&#xff1a; 目标离线服务器已安装操作系统&#xff08;本文以Ubuntu 18.04为例&#xff09…...

AIGC工具平台-卡通图片2D转绘3D

本模块是一款智能化的2D转3D图像处理工具&#xff0c;能够将卡通风格的2D图片自动转换为高质量3D渲染模型&#xff0c;让平面图像焕发立体生机。借助先进的AI深度学习算法&#xff0c;该工具可以精准识别角色轮廓、光影关系、材质纹理等关键元素&#xff0c;自动生成逼真的3D形…...