人脸采集训练识别

项目概述:

       本地摄像头采集人脸数据集,通过训练得到trainingData.yml模型,加载haarcascade_frontalface_default.xml实现人脸识别。haarcascade_frontalface_default.xml 文件并不是一个完整的人脸识别模型,而是一个用于检测正脸(frontal face)的 Haar 特征级联分类器文件。具体来说,这个 XML 文件包含了经过训练的级联分类器,用于在图像中快速定位和识别人脸区域。这种级联分类器主要基于 Haar 特征,通过使用一系列特征模板来区分对象。该分类器主要用于人脸检测任务,识别出输入图像中可能存在的人脸区域。

haarcascade_frontalface_default.xml文件下载地址:

opencv/data/haarcascades/haarcascade_frontalface_default.xml at master · kipr/opencv · GitHub

1、数据采集

使用在线sqlite3(SQL Online Compiler - Next gen SQL Editor)创建数据库。

 CREATE TABLE students(
   Id int,
   Name varchar(20),
   age INT
 );

 '''
 数据采集 dataset_creater.py
 '''
 ​
 import cv2
 import sqlite3
 ​
 faceDetect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')  # 摄像头中面部识别
 cam = cv2.VideoCapture(0)  # 打开默认的第一个摄像头
 ​
 ​
 def inserttoupdate(Id, Name, age):
     conn = sqlite3.connect("sqlite.db")
     cmd = "SELECT * FROM STUDENTS WHERE ID=" + str(Id)
     cursor = conn.execute(cmd)
     isRecordExist = 0
     for row in cursor:
         isRecordExist = 1
     if isRecordExist == 1:
         conn.execute("UPDATE STUDENTS SET NAME =?,AGE=? WHERE ID=?", (Name, age, Id))
     else:
         conn.execute("INSERT INTO STUDENTS (ID,NAME,AGE) VALUES (?,?,?)", (Id, Name, age))
     conn.commit()
     conn.close()
 ​
 ​
 # 向sqlite3数据库中插入数据
 Id = input('输入用户的ID:')
 Name = input('输入用户的姓名:')
 age = input('输入用户的年龄')
 inserttoupdate(Id, Name, age)
 ​
 sampleNum = 0  # 假设数据集中没有样本
 ​
 while True:
     ret, img = cam.read()
     gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
     faces = faceDetect.detectMultiScale(gray, 1.3, 5)
     for (x, y, w, h) in faces:
         sampleNum = sampleNum + 1  # 如果检测到了人脸+1
         cv2.imwrite("dataset/User." + str(Id) + "." + str(sampleNum) + ".jpg", gray[y:y + h, x:x + w])
         cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
         cv2.waitKey(100)
     cv2.namedWindow('Face', cv2.WINDOW_NORMAL)
     cv2.imshow('Face', img)  # 显示网络摄像头中检测到的面孔
     if cv2.waitKey(5) & 0xFF == 27:  # 按ESC退出
         break
 cam.release()
 cv2.destroyAllWindows()
 ​2、数据训练
'''
 数据训练 trainer.py
 '''
 ​
 import os
 import cv2
 import numpy as np
 from PIL import Image
 ​
 recognizer = cv2.face.LBPHFaceRecognizer_create()  # 创建 LBPH 人脸识别器
 path = "dataset"
 ​
 def getImagesWithID(path):
     imagePaths = [os.path.join(path, f) for f in os.listdir(path)]  # 获取图像路径
     faces = []
     IDs = []
     for imagePath in imagePaths:
         faceImg = Image.open(imagePath).convert('L')  # 打开并转换为灰度图像
         faceNp = np.array(faceImg, 'uint8')
         ID = int(os.path.split(imagePath)[-1].split(".")[1])  # 从文件名中提取ID
         print(ID)
         faces.append(faceNp)
         IDs.append(ID)
         cv2.imshow("Training", faceNp)  # 在窗口中显示训练图像
         cv2.waitKey(100)
     return np.array(IDs), faces
 ​
 Ids, faces = getImagesWithID(path)
 recognizer.train(faces, Ids)  # 使用图像数据进行训绋
 recognizer.save('recognizer/trainingData.yml')  # 保存训练好的模型
 ​
 cv2.destroyAllWindows()  # 关闭所有 OpenCV 窗口
 ​

运行以上代码中如果出现以下错误:

 AttributeError: module 'cv2' has no attribute 'face'

可以重新 pip install opencv-contrib-python

3、人脸分析 
'''
 人脸分析 detect.py
 '''
 ​
 import cv2
 import sqlite3
 ​
 facedetector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
 cam = cv2.VideoCapture(0)
 ​
 recognizer = cv2.face.LBPHFaceRecognizer_create()
 recognizer.read('recognizer/trainingData.yml')
 ​
 ​
 def getprofile(id):
     conn = sqlite3.connect("sqlite.db")
     cmd = "SELECT * FROM STUDENTS WHERE ID=" + str(id)
     cursor = conn.execute(cmd)
     profile = None
     for row in cursor:
         profile = row
     conn.close()
     return profile
 ​
 ​
 id = 0
 while True:
     ret, im = cam.read() # 从摄像头捕获一帧图像,ret 表示是否成功读取帧,im 是捕获的图像。
     gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
     faces = facedetector.detectMultiScale(gray, 1.2, 5)
     for (x, y, w, h) in faces:
         cv2.rectangle(im, (x, y), (x + w, y + h), (225, 0, 0), 2)
         id, conf = recognizer.predict(gray[y:y + h, x:x + w])
         profile = getprofile(id)
         print(profile)
         if profile is not None:
             cv2.putText(im, "Name:" + str(profile[1]), (x, y + h + 20), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 127), 2)
             cv2.putText(im, "Age:" + str(profile[2]), (x, y + h + 45), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 255), 2)
     cv2.imshow('Face', im)
     if cv2.waitKey(5) & 0xFF == 27: # 按ESC退出
         break
 cam.release()
 cv2.destroyAllWindows()

​在人脸识别代码中:

facedetector 是使用的人脸检测器对象,通常是一个基于 Haar 特征的级联分类器。在这段代码中,facedetector 是通过加载名为 'haarcascade_frontalface_default.xml' 的 XML 文件创建的。该 XML 文件包含了训练好的模型,用于检测图像中的人脸。具体来说,这个级联分类器可以根据预先训练好的数据集,通过对输入图像进行特征匹配和分类来识别出人脸。detectMultiScale() 方法用于在图像中检测多个尺度的目标(在这种情况下是人脸)。在 detectMultiScale() 方法中,传入的参数包括灰度图像、每次缩小图像的尺寸比例因子以及定义人脸大小的参数。这个方法会返回检测到的人脸区域的坐标和尺寸,以便后续对每个人脸区域进行识别和处理。总之,facedetector 对象是用于检测输入图像中人脸的重要组件,通过使用 Haar 特征和级联分类器技术,在实时视频流中定位并识别人脸。recognizer.predict() 方法返回两值:识别出的人脸 ID 和与该 ID 相关的置信度(confidence)。

  1. Person ID:

    • 这是表示识别出的人脸属于哪个个体的标识符。

    • 在训练期间,每个被识别的人脸都会分配一个唯一的 ID。

    • 通过这个 ID,可以在数据库中查找对应的个人信息。

  2. Confidence (置信度):

    • 置信度是指识别系统对预测结果的自信程度或确定性水平。

    • 通常用数值来表示,越低表示系统认为识别可能不太可靠,而较高的值则表示系统更有信心认为识别结果准确。

    • 对于人脸识别系统,置信度越低表示系统对于该识别结果的可靠性存在疑问。

因此,recognizer.predict() 返回的两个值可以帮助我们了解识别出的人脸属于哪个个体,并提供了一个指标来评估系统对该识别结果的确定程度。

最后识别结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Conda安装rasterio报错

Conda安装rasterio报错 文章目录 Conda安装rasterio报错问题解决参考 问题 在conda环境中安装rasterio包之后,本来可以正常运行的,但是之后又重新安装了一个gdal,导致原来的引用rasterio的包的程序不可正常运行了 conda install rasterio c…

流畅的python-学习笔记_序列

概念 抽象基类:ABC, Abstract Base Class,ABC还有一个概念,是一个编程语言 序列 内置序列类型 分类 可分为容器类型和扁平类型 容器类型有list, tuple, collections.deque等,存储元素类型可不同&…

分布式架构|打造高效、稳定、灵活的现代IT基石

分布式架构:打造高效、稳定、灵活的现代IT基石 一、独立扩展:应对业务增长与用户激增二、高可用性:确保系统稳定运行三、可维护性:降低系统复杂性四、技术选型灵活性:充分利用各种技术优势五、数据隔离与安全性 随着信…

基于Springboot+Vue的Java项目-旅游网站系统开发实战(附演示视频+源码+LW)

大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &am…

IOS离线打包uniapp的信息时报错如下的解决方法

IOS离线打包uniapp的信息时报错如下的解决方法 问题描述: Extract app intents metadata 0.1 seconds XExtractAppIntentsMetadata(in target HBuilder from project HBuilder-Hello)cd /Users/whb/space/vpt/vptios/HBuilder-Hello/Applications/Xcode.app/Conte…

音视频开发3 视频基础,图片基础

图片像素(Pixel) 一张图片是由多少个 像素 构成的。 例如一张图片是由60x50组成的。 位深度 bit depth RGB表示法 红(Red)、绿(Green)、蓝(Blue) 除了24bit,常见的位深…

(41)5.6-5.7数据结构(栈和队列的应用)

1.栈在括号匹配中的应用 #define _CRT_SECURE_NO_WARNINGS #define MaxSize 10 typedef struct { char data[MaxSize];//静态数组存放栈中元素 int top; //栈顶指针 }SqStack;//初始化栈 void InitStack(SqStack& S);//判断栈是否为空 bool StackEmpty(SqStack S…

寻找身高最相近的小朋友 - 华为OD统一考试(D卷)

OD统一考试(D卷) 分值: 100分 题解: Java / Python / C++ 题目描述 小明今年升学到小学一年级,来到新班级后发现其他小朋友们身高参差不齐,然后就想基于各小朋友和自己的身高差对他们进行排序,请帮他实现排序。 输入描述 第一行为正整数H和N,0<H<200,为小明的…

C++ | Leetcode C++题解之第72题编辑距离

题目&#xff1a; 题解&#xff1a; class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size() 1, vector<int>(word2.size() 1, 0));for (int i 0; i < word1.size(); i) dp[i][0] i;for (int j…

公钥私钥?一文搞懂非对称加密

非对称加密 非对称加密&#xff1a; 通信双方分别创建公钥和私钥&#xff0c;并且保证公钥所加密的信息&#xff0c;只有配对的私钥可以解密&#xff0c;接下来&#xff0c;双方公开交换公钥&#xff0c;通信时&#xff0c;使用对方的公钥进行加密&#xff0c;如此&#xff0…

基于51单片机无线恒温箱恒温控制系统

基于51单片机无线恒温箱恒温控制 &#xff08;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.DS18B20温度传感器测温。 2.按键可以设定温度上下限及温度刷新时间间隔。 3.使用NRF24L01无线模块传输数据 4.温度…

flask网站开发计划

我想写一个flask开发网站的合集文章&#xff0c;该网站主要是采集网络上的文章&#xff08;不同站点&#xff0c;用Python识别出正文内容&#xff09;&#xff0c;然后做成长图形式&#xff0c;发布到flask站点&#xff0c;并提供“下载”按钮&#xff0c;点击下载按钮&#xf…

第3章 WebServer重构

3.1 重构原生Web服务框架 3.1.1 分析原生Web服务框架 在服务端代码的 ClientHandler 中&#xff0c;请求解析、处理请求、返回响应的代码混杂在一起&#xff0c;这样的设计会导致代码难以维护和理解。为了提高代码的可读性、可维护性和可扩展性&#xff0c;我们需要对这些代码…

快速掌握Redis优化要点,告别性能瓶颈!

大家好!我是小米,今天和大家分享一下在Redis中如何进行优化,以提升系统性能。Redis作为一种流行的内存数据库,因其高性能、高可用和数据持久性而受到广泛应用。然而,在实际应用中,我们仍需对Redis进行优化,以满足各种业务需求。接下来,我将从读写方式、KV size、Key数量…

VALSE 2024主旨报告内容解析:以深度学习框架为牵引促进自主AI生态发展

2024年视觉与学习青年学者研讨会&#xff08;VALSE 2024&#xff09;于5月5日到7日在重庆悦来国际会议中心举行。本公众号将全方位地对会议的热点进行报道&#xff0c;方便广大读者跟踪和了解人工智能的前沿理论和技术。欢迎广大读者对文章进行关注、阅读和转发。文章是对报告人…

探秘Flex布局下子元素宽度超出的那些烦心事

嘿&#xff0c;小伙伴们&#xff01;你们有没有遇到过用Flex布局的时候&#xff0c;子元素的宽度莫名其妙地超出了父元素的情况&#xff1f;别着急&#xff0c;今天我就来给大家揭秘这个问题的来龙去脉&#xff0c;以及一些解决方案。让我们一起来深入探讨&#xff01; 发现问…

【Gaea+UE5】创建基本的大型世界场景

目录 效果 步骤 一、在Gaea中生成地形 二、确定导出的地形规模 三、在UE中创建地形 四、验证UE创建的地形规模是否正确 五、使用M4自动地形材质 效果 步骤 一、在Gaea中生成地形 1. 打开Gaea官网下载软件 2. 打开Gaea软件&#xff0c;我们可以选择一个预设的山体 创…

Git === Git概述 Git安装

第1章 Git概述 Git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。 Git易于学习&#xff0c;占地面积小&#xff0c;性能极快。 它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作流分支等特性。其性能优于Subversion…

汇凯金业:通货膨胀对能源行业有何影响

通货膨胀对能源行业有几方面的影响&#xff0c;具体取决于通货膨胀的原因、规模以及持续时间。以下是一些可能的效应&#xff1a; 成本增加&#xff1a;通货膨胀导致能源行业的运营成本上升。这包括原材料、设备、维护和人力成本。如果企业不能完全将成本转嫁给消费者&#xf…

Pytorch入门实战 P09-YOLOv5里面的Backbone模块搭建网络

目录 1、YOLOv5的模型图。 2、BackBone简单介绍。 3、YOLOv5的Backbone文件。 4、YOLOv5Backbone的code部分 5、完整的code部分 6、结果展示 &#xff08;1&#xff09;Adam优化器 &#xff08;2&#xff09;SGD优化器 &#x1f368; 本文为&#x1f517;365天深度学习…