简易机器学习笔记(十一)opencv 简易使用-人脸识别、分类任务

news2024/11/18 2:41:11

前言

前段时间摸了下机器学习,然后我发现其实openCV还是一个很浩瀚的库的,现在也正在写一篇有关yolo的博客,不过感觉理论偏多,所以在学yolo之前先摸一下opencv,简单先写个项目感受感受opencv。

流程

openCV实际上已经有一个比较完整的模型了,下载在haarcascades

这里我们下haarcascade_frontalface_default.xml以备用。

在做人脸识别的时候流程就比较简单了

  1. 读取图片
  2. 创建Haar级联器
  3. 图片转灰度图(可以不转,转了能更快而已)
  4. 通过Haar级联分类器来检测人脸面部特征,返回faces结构
  5. 使用openCV的接口,在原图上框选出结果,并展示

编码

这里代码偏简单,就不过多介绍了

import numpy as np
import cv2

img = './faces/lena.bmp'
#脸部Haar级联器
facer_path = './faces/haarcascade_frontalface_default.xml'
facer = cv2.CascadeClassifier(facer_path)

img = cv2.imread(img)

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)


#执行人脸识别

#现在可以使用Haar级联分类器来检测人脸和其他面部特征

faces = facer.detectMultiScale(gray,1.35,3)

for(x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
    roi_img = img[y:y+h, x:x+w]

cv2.imshow('img', img)
cv2.waitKey()

结果:
在这里插入图片描述

进阶

且不看运行的结果如何,但从结果你就可以看出来,这里只是把人脸从图片中框出来了。但这还不够,我们实际上不仅希望你可以把人脸圈出来,还希望能把人脸分类,比如A是A,B是B这样。

OpenCV提供了3种人脸识别方法,分别是Eigenfaces、Fisherfaces和LBPH。这3种方法都是通过对比样本的特征最终实现人脸识别。因为这3种算法提取特征的方式不一样,侧重点不同,所以不能分出孰优孰劣,只能说每种方法都有各自的识别风格。 OpenCV为每一种人脸识别方法都提供了创建识别器、训练识别器和识别3种方法,这3种方法的语法非常相似。我这里只简单说说Eigenfaces怎么调用,至于其他的两种读者感兴趣可以自己去搜索。

Eigenfaces人脸识别器

Eigenfaces也叫作“特征脸”。Eigenfaces通过PCA(主成分分析)方法将人脸数据转换到另外一个空间维度做相似性计算。在计算过程中,算法可以忽略一些无关紧要的数据,仅识别一些具有代表性的特征数据,最后根据这些特征识别人脸。 开发者需要通过以下3种方法完成人脸识别操作。

(1)通过cv2.face.EigenFaceRecognizer_create()方法创建Eigenfaces人脸识别器,其语法如下:

recognizer = cv2.face.EigenFaceRecognizer_create(num_components, threshold)

参数说明:

num_components:可选参数,PCA方法中保留的分量个数,建议使用默认值。

threshold:可选参数,人脸识别时使用的阈值,建议使用默认值。

返回值说明:

recognizer:创建的Eigenfaces人脸识别器对象。

(2)创建识别器对象后,需要通过对象的train()方法训练识别器。建议每个人都给出2幅以上的人脸图像作为训练样本。train()方法的语法如下:

recognizer.train(src, labels)

对象说明:

recognizer:已有的Eigenfaces人脸识别器对象。 参数说明:

src:用来训练的人脸图像样本列表,格式为list。样本图像必须宽、高一致。

labels:样本对应的标签,格式为数组,元素类型为整数。数组长度必须与样本列表长度相同。样本与标签按照插入顺序一一对应。

(3)训练识别器后可以通过识别器的predict()方法识别人脸,该方法对比样本的特征,给出最相近的结果和评分,其语法如下:

label, confidence = recognizer.predict(src)

对象说明:

recognizer:已有的Eigenfaces人脸识别器对象。 参数说明:

src:需要识别的人脸图像,该图像宽、高必须与样本一致。 返回值说明:

label:与样本匹配程度最高的标签值。

confidence:匹配程度最高的信用度评分。评分小于5000匹配程度较高,0分表示2幅图像完全一样。 下面通过一个实例来演示Eigenfaces人脸识别器的用法。

确定流程

最后我们来确定一下流程:

  1. 读取数据
  2. 创建特征脸识别器
  3. 输入图片和labels开始训练
  4. 输入需要识别的人脸图像
  5. 得到输出

我这里把我的训练集整理了以下,名称打在前面。我这里照片是我自己找的,具体的图片训练集大伙可以自己去设定。

在这里插入图片描述

具体代码如下,代码的功能可以参考注释

import numpy as np
import cv2
import os

face_path = './faces'
photos = list()
labels = list()

# 设置期望的图像大小
desired_size = (811, 843)
#定义labels
names = {"0":"mengzi","1":"qy","2":"lx","3":"qq"}
# 从当前路径中读取到所有的file
for root, dirs, files in os.walk(face_path):
    for file in files:
        if '.xml' in file:
            continue
        img_path = os.path.join(root, file)
        img = cv2.imread(img_path, 0)
        # 图片需要设置到期望大小,因为模型输入的图片大小都必须是统一值,否则会无法训练
        img_resized = cv2.resize(img, desired_size) 
        # 根据图片的人脸,对应到names,插入到labels  
        if 'mengzi' in file: 
            # 读取图像并调整大小 
            labels.append(0)
        elif 'qy' in file:
            labels.append(1)
        elif 'lx' in file:
            labels.append(2)
        elif 'qq' in file:
            labels.append(3)
        else:
            continue
        photos.append(img_resized)



#创建人脸识别器
recognizer = cv2.face.EigenFaceRecognizer_create()
recognizer.train(photos, np.array(labels))

# 读取测试图像并调整大小
target = cv2.imread(face_path + '/test5.jpg', 0)
target_resized = cv2.resize(target, desired_size)

#输出待识别对象
label, confidence = recognizer.predict(target_resized)

print('confidence = ' + str(confidence))
print(names[str(label)])

结果

这里代码其实也能看得出,最后之能输出图片中人物的label和执行度,这样我们倒是完成了一个分类的工作。但是这里有个问题,就是我们不仅仅需要分类,还需要知道人脸的具体位置。

结合Haar级联器和Eigenfaces人脸识别器实现人脸划分

前言

刚刚说了两种,一个是划分区域,一个是打标签,那么能不能即划分区域,又打上标签呢?当然是可以的,接下来就简单说说怎么做。

流程

实际上流程就是把两个模式结合起来,先使用Haar级联器划分出脸部区域,然后再用Eigenfaces人脸识别器去检查分出的脸部区域的对象名称,然后将标签放在图片上即可。

  1. 加载Haar级联分类器
  2. 读取文件并训练Eigenfaces人脸识别器
  3. 读取目标图片
  4. 通过Haar级联分类器扫描得到目标图片中的所有人脸框
  5. 对所有人脸框使用Eigenfaces人脸识别器进行识别
  6. 画上方框,并打上标签

代码

代码如下:

import numpy as np
import cv2
import os

# 加载Haar级联分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
face_path = './faces'
photos = list()
labels = list()

# 读取学习图片
desired_size = (811, 843)
names = {"0":"mengzi","1":"qy","2":"lx","3":"qq","4":"ch"}
for root, dirs, files in os.walk(face_path):
    for file in files:
        if '.xml' in file:
            continue
        img_path = os.path.join(root, file)
        img = cv2.imread(img_path, 0)
        img_resized = cv2.resize(img, desired_size)
        
        if 'mengzi' in file: 
            # 读取图像并调整大小 
            labels.append(0)
        elif 'qy' in file:
            labels.append(1)
        elif 'lx' in file:
            labels.append(2)
        elif 'qq' in file:
            labels.append(3)
        elif 'ch' in file:
            labels.append(4)
        else:
            continue
        photos.append(img_resized)



# 训练人脸识别器
recognizer = cv2.face.EigenFaceRecognizer_create()
recognizer.train(photos, np.array(labels))
# 读取测试图像
target = cv2.imread(face_path + '/test_ch.jpg')
target_gray = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY)

# 检测人脸
faces = face_cascade.detectMultiScale(target_gray, scaleFactor=1.2, minNeighbors=5, minSize=(30, 30))

# 对于每个检测到的人脸
for (x, y, w, h) in faces:
    # 在原图上绘制矩形框出人脸
    cv2.rectangle(target, (x, y), (x+w, y+h), (255, 0, 0), 2)
    
    # 提取人脸区域并调整到期望大小
    face_region = target_gray[y:y+h, x:x+w]
    face_resized = cv2.resize(face_region, desired_size)
    
    # 使用EigenFaceRecognizer进行预测
    label, confidence = recognizer.predict(face_resized)
    
    # 将识别的名字和置信度打印在图像上方
    cv2.putText(target, f'{names[str(label)]} - {confidence:.2f}', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36,255,12), 2)

# 显示图像
cv2.imshow('Face Recognition', target)
cv2.waitKey(0)
cv2.destroyAllWindows()

测试结果:
虽然打了马赛克,但是实际上结果是可以置信的。在这里,还可以根据置信程度来对不同的人脸进行筛选,比如不想要的脸或者置信程度不高的脸可以再进行舍弃。
在这里插入图片描述

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

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

相关文章

Dell 机架式服务器 - 高级定制

Dell 机架式服务器 - 高级定制 1. Dell Technologies2.1. Servers & Storage (服务器及存储) -> Servers2.2. Rack Servers (机架式服务器)2.3. Shop2.4. PowerEdge Rack Servers (PowerEdge 机架式服务器)2.5. PowerEdge R760 Rack Server (PowerEdge R760 机架式服务器…

vivado Revision Control

2020.2 只需要git 管理 prj.xpr 和 prj.srcs/ https://china.xilinx.com/video/hardware/ip-revision-control.html Using Vivado Design Suite with Revision Control https://www.xilinx.com/video/hardware/vivado-design-suite-revision-control.html http://www.xi…

基于STM32F103和ESP8266的Wi-Fi模块驱动程序设计与优化

基于STM32F103和ESP8266的Wi-Fi模块驱动程序设计和优化是一个重要的任务,它将使STM32F103微控制器能够与ESP8266模块进行通信并实现无线网络连接。在本文中,我们将介绍如何设计和优化这样的驱动程序,并提供相关的代码示例。 1. 系统概述 Wi…

【微服务】日志搜集elasticsearch+kibana+filebeat(单机)

日志搜集eskibanafilebeat(单机) 日志直接输出到es中,适用于日志量小的项目 基于7.17.16版本 主要配置在于filebeat, es kibana配置改动不大 环境部署 es kibana单机环境部署 略 解压即可 常见报错,百度即可。 记录…

easyexcel 3.0.x 版本实现指定列 锁定以及指定列隐藏

1:效果示例 2:代码示例: UnLockCell.java package com.example.juc.zhujie;/*** Author * Date Created in 2023/12/19 10:09* DESCRIPTION:* Version V1.0*/import java.lang.annotation.*;/*** 用于标记锁定哪些列不需要锁定* author 12…

强化学习应用(四):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法,用于解决基于马尔可夫决策过程(MDP)的问题。它通过学习一个价值函数来指导智能体在环境中做出决策,以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

通义灵码 - 免费的阿里云 VS code Jetbrains AI 编码辅助工具

系列文章目录 前言 通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力,并针对阿里云 SDK/OpenAPI 的使用…

GPT Store,是否会成为下一个App Store?

经历了一场风波后,原本计划推出的GPT Store终于成功上线。OpenAI在北京时间1月11日推出了GPT Store,被广泛视为类似于苹果的"App Store",为人工智能应用生态系统迈出了重要一步。然而,OpenAI要想将GPT Store打造成苹果般…

Salesforce财务状况分析

纵观Salesforce发展史和十几年财报中的信息,Salesforce从中小企业CRM服务的蓝海市场切入,但受限于中小企业的生命周期价值和每用户平均收入小且获客成本和流失率不对等,蓝海同时也是死海。 Salesforce通过收购逐渐补足品牌和产品两块短板&am…

py的函数讲解

前言:本章节我们来讲函数,主播略微感觉到有点小难,友友们需要认真看 目录 一.初始函数 1.1关于函数 1.2举例 1.3小结 二.函数的基础语法 2.1关于函数的语法 2.2举例 2.3小结 三.函数的参数 3.1关于函数的参数 3.2举例 3.3小结 四.函数的返回…

专业课120+总分380+海南大学838信号与系统考研经验分享-电子信息,信息与通信,人工智能,生物医学

今年专业课120,总分380顺利被海大录取,总结一下这一年来的复习经验,希望对大家复习有借鉴。特别提醒这两年专业课海南大学838信号与系统难度比较大,还考察了IDTFT,DTFT等,对离散域的考察颇多,不…

一文读懂ERP、OMS、WMS、TMS(2/2)

目录 二、ERP、OMS、WMS、TMS的区别 2.1 ERP (Enterprise Resource Planning) 企业资源计划 2.2 OMS (Order Management System) 订单管理系统 2.3 WMS (Warehouse Management System) 仓库管理系统 2.4 TMS (Transportation Management System) 运输管理系统 二、ERP、OM…

算法学习系列(十九):DFS、BFS

目录 引言一、DFS1.排列数字2.n-皇后问题 二、BFS1.走迷宫2.八数码问题 引言 关于这个DFS与BFS的问题非常的常见,其实这两个就是搜索的方式不一样而已,核心思想非常容易懂,题目的话也是做一道记一道,还是要针对题来看&#xff0c…

Vim一键配置指南,打造高效率C++开发环境

文章目录 前言安装与卸载功能演示gcc/g升级问题 前言 Vim作为当下最受欢迎的文本编译器之一,不仅具有强大的文本编辑功能,还提供了高度的可定制性。用户可以根据自己的喜好自定义配置,并且通过自己编写插件或者使用现有的插件来扩展Vim的功能…

uniapp 查找不到uview-ui文件怎么办?

用官方的方式总是报:文件查找失败:uview-ui at main.js 解决方案: 1.先安装uview-ui npm install uview-ui 下载成功是这样的: 而不是这样的: 这样的原因是你的项目里没有package.json包,先执行 npm …

学习Vue封装的过渡与动画总结

今天学习了Vue封装的过渡与动画&#xff0c;接下来说一下Vue是如何实现的&#xff0c;首先原生的方法是在style元素中给指定元素添加过渡的过渡或动画&#xff0c;但Vue就不需要直接获取到需要过渡或动画的元素&#xff0c;而是使用一个<transition>的标签来包裹住想要过…

使用推测解码 (Speculative Decoding) 使 Whisper 实现 2 倍的推理加速

Open AI 推出的 Whisper 是一个通用语音转录模型&#xff0c;在各种基准和音频条件下都取得了非常棒的结果。最新的 large-v3 模型登顶了 OpenASR 排行榜&#xff0c;被评为最佳的开源英语语音转录模型。该模型在 Common Voice 15 数据集的 58 种语言中也展现出了强大的多语言性…

基于SpringBoot的洗衣店管理系统

基于SpringBoot的洗衣店管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 可视化展示 用户界面 管理员界面 摘要 洗衣店管理系统基于Spring Boot框…

ChatGpt使用技巧

通用类技巧 角色扮演 比如让ChatGpt扮演500强营销专家 告诉ChatGpt你的身份。初学者、或是有一定能力、知识的学习者等 限制ChatGpt回答长度 100~200字之间 让ChatGpt一步一步思考 他会预测下一个单词&#xff0c;根据prompt进行生成 明确你的要求和目的 说清楚问题&#x…

SVN切换账户

前言&#xff08;svn切换&#xff09; 本文章简单写下SVN账户切换操作 linux 1.删除目录 ~/.subversion/auth/ 下的所有文件。 2.再次操作svn时可重新输入用户名和密码。 windows (1)在工程中单击右键,单击"TortoiseSVN"。 (2)选择"Setting"。 (3)选择&quo…