Python-中北大学人工智能OpenCV人脸识别(根据图片训练数据,根据训练好的数据识别人脸)

article/2025/5/7 10:04:36

文章目录

  • 1. 根据训练照片训练数据模型
  • 2. 根据训练的数据文件,进行人脸识别

1. 根据训练照片训练数据模型

在这里插入图片描述
训练流程:

  1. 读取文件夹下的所有文件,使用PIL 库中的Image方法打开图片,并将其转化为灰度图片。
  2. 加载人脸数据分类器,这里直接使用OpenCV库自带的(cv.CascadeClassifier(…))
  3. 使用numpy.array方法,让照片向量化。使用分类器detectMultiScale方法,提取图片脸部特征值。
  4. 将一个人的信息和脸部特征值写入到文件中,达到训练的目的

照片命名格式:学号-1/学号-2+.jpg

import cv2 as cv
import os
from PIL import Image
import numpy as np# 根据jpgForTrainer文件夹中的图片进行训练,随后的训练数据保存到trainer/trainer.ymldef getImageAndLabel(url):# 储存人脸数据faces_msg = []name = []# 保存图片信息imagePaths = [os.path.join(url, f) for f in os.listdir(url)]# 加载分类器detector = cv.CascadeClassifier('../haarcascade_frontalface_alt2.xml')# 遍历图片for pict in imagePaths:fileImg = Image.open(pict).convert('L')  # 打开灰度图像# 图片向量化imgNumpy = np.array(fileImg, 'uint8')face = detector.detectMultiScale(imgNumpy, 1.1, 5)  # 提取图片脸部特征值# 提取图片的学号ids = int(os.path.split(pict)[1].split('-')[0])flag = Falsefor x, y, w, h in face:# 保存脸部数据flag = Truename.append(ids)faces_msg.append(imgNumpy[y:y + h, x:x + w])  # 保存脸部数据if flag:print(f'DEBUG:捕捉到学号为{ids}的人脸,')print('DEBUG')print('id', name)print('face', faces_msg)return faces_msg, nameif __name__ == '__main__':path = "../jpgForTrainer/"# 获取人脸特征和姓名faces, id = getImageAndLabel(path)# 加载识别器recognize = cv.face.LBPHFaceRecognizer_create()recognize.train(faces, np.array(id))# 保存文件recognize.write('../trainer/trainer.yml')

2. 根据训练的数据文件,进行人脸识别

步骤:

  1. 将要识别的图片使用os模块,读取进来
  2. 使用cv2库(检测cv)cv.imread函数打开图片,调用人脸识别函数(自定义)进行识别,函数返回从训练数据里面查找的复合条件的学号,根据图片名称来判断识别是否准确
  3. 人脸识别函数中,使用data = cv.face.LBPHFaceRecognizer_create(),data.read(‘…/trainer/trainer.yml’)来加载训练好的数据。
  4. 使用data.predict函数来预测准确性,准确性在25以内的就可以认为识别成功,将学号写到图片上调用cv.imshow函数进行输出。可以使用cv.resize函数对图片进行缩放后再将识别信息写到图片上。
  5. 最后统计识别学号和照片名称学号对应的比例来计算识别成功率即可。
# 测试人脸识别
# 测试人脸识别
import cv2 as cv
import os# 加载训练数据文件
data = cv.face.LBPHFaceRecognizer_create()
data.read('../trainer/trainer.yml')# 错误数目
fault = 0path = '../jpgForTest'# 根据jpgForTest里面的文件来进行识别测试# 识别模块
def discern(_img):ret = []gray = cv.cvtColor(_img, cv.COLOR_BGR2GRAY)# 加载分类器detector = cv.CascadeClassifier('../haarcascade_frontalface_alt2.xml')face_data = detector.detectMultiScale(gray, 1.1, 5)resize = _imgflag = Falsefor x, y, w, h in face_data:flag = Truecv.rectangle(_img, (x, y,), (x + w, y + h), color=(0, 0, 255), thickness=1)# 人脸识别s_id, confidence = data.predict(gray[y:y + h, x:x + w])resize = cv.resize(_img, dsize=(700, 600))if confidence > 80:# cv.putText(resize, 'UnKnow', (10, 50), cv.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)passelse:print('标签id:', s_id, '置信评分:', confidence)cv.putText(resize, str(s_id), (5, 50), cv.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)ret.append(s_id)if not flag:# 没检测到人脸resize = cv.resize(_img, dsize=(700, 600))cv.putText(resize, 'Not Find Face', (5, 50), cv.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)# 压缩图片输出cv.imshow('result', resize)while True:get = cv.waitKey(1000)if ord(' ') == get or get == -1:breakreturn ret# # 获取训练人的学号,以此来判断陌生人脸是否识别成功
# def getMessage():
#     target = os.listdir('../jpgForTrainer')
#     msg = []
#     for Str in target:
#         tmp = Str.split('-')[0]
#         if tmp not in msg:
#             msg.append(tmp)
#     return msgif __name__ == '__main__':files = os.listdir(path)  # 得到文件夹下的所有文件名称size = len(files)for file in files:  # 遍历文件夹stu_id = file.split('.')[0]print('-------\n' + path + "/" + file + "正在识别")img = cv.imread(path + '/' + file)ret = discern(img)if len(ret) == 0:fault += 1print(f'识别错误应该学号为{stu_id},识别学号为UnKnow')else:for item in ret:if str(item) not in str(stu_id):fault += 1print(f'识别错误应该学号为{stu_id},识别学号为{ret}')print('\n----------\n')print(f'DEBUG:识别失败的个数{fault},测试识别总数{size}')print(f'测试成功概率{((size - fault) / size) * 100}%')cv.destroyAllWindows()

需要注意的是:这个实验使用的haarcascade_frontalface_alt2.xml文件,是OpenCV自带的人脸图像提取算法,需根据实际路径选取

代码中的置信评分越小,越可靠。

参考资料
一天搞定人脸识别项目!

运行结果:
在这里插入图片描述
这个是我用训练集做的,准确度很高,经过测试。实际准确度在40%左右,比较低


http://chatgpt.dhexx.cn/article/WBRjvs5y.shtml

相关文章

李腾飞 java_黑马师资团队之【李腾飞老师】

本帖最后由 火影七代目 于 2017-8-4 16:48 编辑 李腾飞老师在北京传智JavaEE就业254期又一次的创新了数据, 这也体现出来飞哥对学员真心的对待和耐心的授课, 看到下面的话语,也是学员对飞哥的恋恋不舍李腾飞老师在254期评分很高,得…

基于openCV的车牌识别(模板匹配)python版

利用提供的模板进行车牌识别: 模板: 测试数据: 整体思路分为3个步骤:①将图像中车牌位置截取出来;②将车牌安照字符进行分割;③对分割好的字符图像进行模板匹配。实验基于jupyter进行,具体代码…

OpenCV-顶帽运算(TOPHAT)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 原理 形态学是图像处理中常见的名词,图像处理的形态学基本属于数学形态学的范畴,是一门建立在格论和拓扑…

小白都能学会的python+opencv,带你从人脸识别做到车牌识别,成为别人口中赞叹的高手!

一.第一步,对于小白来说,用什么编辑很难选择,怎么下载免费的编辑器也不会,会用电脑下载的又总是被下载许多附带的垃圾软件,这个问题让我来解决,这里我们首先需要安装两个软件以及配置一个pip豆瓣源&#xf…

基于VS与OpenCV的模板匹配学习(2):边缘匹配+图像金字塔

基于VS与OpenCV的模板匹配学习(2) 边缘模板匹配图像金字塔 基于C与OpenCV的模板匹配学习(1)OpenCV matchTemplate()示例 文章目录 基于VS与OpenCV的模板匹配学习(2)边缘模板匹配图像金字塔前言一、边缘检…

Struts2的基本流程的详细介绍

Struts2的基本流程 10级学员 张帅鹏课堂笔记 概述: Struts2框架由三部分构成:核心控制器、业务控制器和用户实现的业务逻辑组件。在这三部分中,struts2框架提供了核心控制器StrutsPrepareAndExecuteFilter,而用户需要实现业务控…

jQuery插件autoComplete介绍(10级学员 张帅鹏总结)

jQuery插件autoComplete介绍 概述:AutoComplete为自动填充,展示之意。用户在使用文本框搜索信息时,使用插件的autoplete方法绑定文本框。当在文本框中输入某个字符时,通过该方法中的指定的数据URL,返回相匹配的数据&a…

C语言 编写Vector方法

Vector是一个单口进出的数组结构有一点像栈的结构。 首先建立这样一个结构体,里面包含一个数组以及一个位置标记,数组来存放进入的元素,标记指向尾部最后一个没有存放东西的数组位置。当然数组元素可以自定义为任何格式,甚至也可…

多组数据的输入方法(c语言实现)

先说方法之前先来浅聊一下scanf 开始进入正题 1.EOF法 EOF(end of file)就是文件的结束&#xff0c;通常来判断文件的操作是否结束的标志。 EOF不是特殊字符&#xff0c;而是定义在头文件<stdio.h>的常量&#xff0c;等于-1&#xff1b; 就如牛客网上的一道题为例&…

c语言:数组插入处理

规定输入9个元素&#xff0c;排序后&#xff0c;再输入一个数要求按原来排序的规律将它插入数组中。 初始化数组函数&#xff1a; void assign_value_to_array(int val[])//数组赋值 {int star;//数组开始位printf("请输入%d个数&#xff1a;",num);for(star0;star&…

电子测量——用C语言设计测量数据误差处理的通用程序

题目要求 参考例2-2-6的解题过程&#xff0c;用C语言或MATLAB设计测量数据误差处理的通用程序&#xff0c;要求如下&#xff1a; &#xff08;1&#xff09;提供测试数据输入、粗大误差判别准则选择等的人机界面&#xff1b; &#xff08;2&#xff09;编写程序使用说明&#…

c语言区简单数据类型,c语言简单数据类型有哪些

c语言中简单的数据类型分别为&#xff1a;1、整型【int、short、long、long long】&#xff1b;2、浮点型【float&#xff0c;double】&#xff1b;3、字符型【char】。 c语言中简单的数据类型分别为&#xff1a; 1、整(数)型int&#xff1a;基本整数型&#xff0c;用于存储整数…

C语言-基本数据类型

C语言中有3种基本数据类型&#xff0c;分别是整型、字符型和实型&#xff08;浮点型&#xff09;&#xff0c;下表列出的是32位平台数据类型的长度及其取值范围 类别名称类型名数据长度取值范围整型[有符号]整型[signed] int32位-2147483648~2147483647(-2^31 ~ 2^31-1)[有符号…

C语言处理excel

思路来源&#xff1a;https://blog.csdn.net/hongzhen91/article/details/57422897 目录 1 写2 读先看 代码&#xff01;结果分析可知 1 写 .csv 是 excel 后缀&#xff0c;跳跃间隔符是 ‘,’ FILE *fp ;fp fopen("./test.csv","w") ; // 写 for (i0 ;…

C语言基础——数据运算

一 运算基础 运算的本质是根据已有数据&#xff0c;进行各种运算处理&#xff0c;得到新的数据。所以&#xff0c;运算的基础就是数据。在数据的表示方法中&#xff0c;声明的变量只是一个空的指代&#xff0c;并没有和具体的数据进行关联。如果要使用变量&#xff0c;就要把数…

C语言数据溢出

文章目录 int 类型char int 类型 unsigned int num -1;printf("%u", num);解析&#xff1a; 首先在寄存器产生一个负数-1&#xff0c;它在计算机中存储的补码是 32个1&#xff0c;共32个二进制位&#xff0c;当按照赋值号赋给无符号num变量时&#xff0c;符号位变成…

C语言 数据处理

在不使用scanf函数如何对输入的数进行逆序输出呢&#xff1f;首先要得到该数的位数&#xff0c;因为需要在顺序输出里使用。 代码如下: int Getfigure(int n) {int tmp0; //计算循环次数while(n ! 0){n / 10;tmp;}return tmp; //该数的位数 } 其次要清楚该处理…

【Keil 5安装教程】

文章目录 一、安装mdk二、激活mdk三、安装STM32芯片包四、安装C51单片机五、激活C51单片机 一、安装mdk 1、在解压的安装包里&#xff0c;点击运行mdk514.exe文件&#xff1b; 2、在弹出的页面中点击NEXT&#xff1b; 3、打勾I Agree&#xff0c;点击Next&#xff1b; 4、在…

keil3 安装教程

安装前先关闭杀毒软件和360卫士&#xff0c;注意安装路径不能有中文&#xff0c;安装包路径也不要有中文。 1.选中【Keiluvision 3 C51版】压缩包&#xff0c;鼠标右击选择【解压到Keil uvision 3 C51版】。 2.双击打开【Keiluvision 3 C51版】文件夹。 3.选中【KEILc51v802…

keil安装指导

keil arm 5.36下载地址 C51 960a下载地址 注册码 这个自己搜索下载 安装指导 注意&#xff1a; 如果你想C51和ARM一起安装&#xff0c;那就先安装C51再ARM版本的。如果你已经先安装完了ARM的也没关系&#xff0c;安装完C51的再重新安装下ARM的就可以 安装C51 双击你下…