如何构建你自己的实时人脸识别系统

在这里插入图片描述

引言

随着人工智能技术的发展,人脸识别已经成为日常生活中的常见技术,被广泛应用于安全验证、个性化服务等多个领域。本教程将指导你如何使用Python编程语言结合OpenCVface_recognition库来构建一个基本的人脸识别系统。我们将从安装必要的库开始,逐步引导你完成数据集的准备、人脸编码以及最终的实时人脸识别。

环境准备

在开始之前,请确保你的环境中已经安装了Python 3.x版本。以下是本教程中将会用到的主要库及其安装方法:

安装 OpenCV

OpenCV 是一个开源的计算机视觉库,它提供了许多图像处理和视频分析的功能。

pip install opencv-python

安装 Face Recognition

face_recognition 是一个高级别的接口,它简化了面部识别的过程,基于dlib库。

pip install face_recognition

如果安装过程中遇到问题,请检查是否已安装dlib的依赖项,并确保支持面部识别所需的模型已下载。

数据集准备

为了训练我们的模型,我们需要收集一组包含已知人物的脸部图像。这些图像可以从网上获取,也可以是你自己拍摄的照片。请注意,使用他人照片时应确保拥有适当的许可。

创建数据集

  1. 在项目目录下创建一个名为dataset的文件夹。
  2. 为每个人创建一个子文件夹,并将他们的照片放入相应的文件夹内。
  3. 确保每张图片都有足够的清晰度,并且包含了正脸。

人脸编码

face_recognition 库使用了一种称为“面部编码”的技术,该技术将人脸转换为一组128维的数字向量,这些向量可以用来比较两张面孔是否属于同一个人。

编码人脸数据

我们将编写一个脚本来遍历数据集中所有的图片,并提取它们的面部编码。此脚本还将保存这些编码以及对应的人物名字,供后续识别使用。

import face_recognition
import os
import pickle

def encode_faces(dataset_folder):
    # 初始化一个字典来存储人脸编码和对应的名字
    known_face_encodings = []
    known_face_names = []

    # 遍历数据集中的每个人
    for name in os.listdir(dataset_folder):
        person_folder = os.path.join(dataset_folder, name)
        if not os.path.isdir(person_folder):
            continue  # 跳过非目录项
        
        # 对每个人的每个图片进行处理
        for image_file in os.listdir(person_folder):
            image_path = os.path.join(person_folder, image_file)
            
            # 加载图片并获取其脸部编码
            face_image = face_recognition.load_image_file(image_path)
            try:
                encoding = face_recognition.face_encodings(face_image)[0]
                known_face_encodings.append(encoding)
                known_face_names.append(name)
            except IndexError:
                print(f"警告: 图像 {image_path} 中未检测到脸部。")

    # 将编码和名称保存到文件中
    with open('face_data.pkl', 'wb') as f:
        pickle.dump((known_face_encodings, known_face_names), f)
    
    return known_face_encodings, known_face_names

# 调用函数
encode_faces('dataset')

在这里插入图片描述

实现实时人脸识别

现在我们有了已知人物的面部编码,接下来我们将使用这些编码来进行实时的人脸识别。

捕获视频流

我们将使用OpenCV的 VideoCapture 类来打开默认摄像头,并读取视频帧。

处理每一帧

对于每一帧,我们首先将其从BGR色彩空间转换为RGB色彩空间,然后检测每一帧中的所有脸部位置,并计算它们的编码。

显示识别结果

最后,我们在视频帧上绘制矩形框和标签,显示识别出的人物名字。

import cv2

def recognize_faces():
    video_capture = cv2.VideoCapture(0)

    # 加载之前保存的编码和姓名
    with open('face_data.pkl', 'rb') as f:
        known_face_encodings, known_face_names = pickle.load(f)

    while True:
        ret, frame = video_capture.read()
        
        # 如果没有正确读取帧,则退出循环
        if not ret:
            break

        # BGR to RGB
        rgb_frame = frame[:, :, ::-1]

        # 检测脸部位置
        face_locations = face_recognition.face_locations(rgb_frame)
        face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

        for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
            matches = face_recognition.compare_faces(known_face_encodings, face_encoding)
            name = "Unknown"

            # 查找最接近的匹配
            face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)
            best_match_index = face_distances.argmin()
            if matches[best_match_index]:
                name = known_face_names[best_match_index]

            # 绘制框和标签
            cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
            cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
            font = cv2.FONT_HERSHEY_DUPLEX
            cv2.putText(frame, name, (left + 6, bottom - 6), font, 0.5, (255, 255, 255), 1)

        # 显示视频流
        cv2.imshow('Video', frame)

        # 按 'q' 键退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # 清理
    video_capture.release()
    cv2.destroyAllWindows()

# 运行人脸识别
recognize_faces()

结论

通过以上步骤,你已经成功地建立了一个简单的人脸识别系统。这个系统可以实时捕获视频流,并对其中出现的人脸进行检测和识别。虽然这是一个基础版本,但它为更复杂的项目奠定了坚实的基础。未来你可以考虑添加更多功能,如多人同时识别、更高的准确性或是开发一个Web应用界面来增强用户体验。

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

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

相关文章

C++ 设计模式——解释器模式

目录 C 设计模式——解释器模式1. 主要组成成分2. 逐步构建解释器模式步骤1: 定义抽象表达式步骤2: 实现终结符表达式步骤3: 实现非终结符表达式步骤4: 构建语法树步骤5: 实现内存管理步骤6: 创建上下文和客户端 3. 解释器模式 UML 图UML 图解析 4. 解释器模式的优点5. 解释器模…

生日贺卡录放音芯片,多段音频录音ic生产厂商,NVF04M-32minute

可以录音播放的生日贺卡与传统的纸质贺卡相比,它有着创意以及个性的特点,仅需少量的电子元器件,即可实现录音功能,搭配上文字,让声音存储在生日贺卡里,让贺卡也变得有温度,祝福我想亲口对TA说。…

fantastic-admin前端+django后端,初始化全流程记录

fantastic-admin前端是我目前看到最完善的前端框架,只需要简单的设置就可以快速开始项目。 但是我本人的能力有限,对前端知识一知半解,之前废了九牛二虎之力才跑通了前后端流程,由于新的项目需要,有了开发新后台的想法…

【有啥问啥】大模型应用中的哈希链推理任务

大模型应用中的哈希链推理任务 随着人工智能技术的快速发展,尤其是大模型(如GPT、BERT、Vision Transformer等)的广泛应用,确保数据处理和模型推理的透明性与安全性变得愈发重要。哈希链推理任务作为一种技术手段,能够…

学习计算机网络

a类0~127,b类128~191,c类192~223 网络地址:看子网掩码,分网络位和主机位,后面是主机位,主机位全部为0,网络地址。 直接广播地址:看子网掩码,分网络位和主机位&#xff…

Jenkins构建CI/CD

CI/CD 软件开发的连续方法基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性。从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预。 它涉及在每次小迭代中不断构建,测试和部署代码更改,从而减少…

vue2+ueditor集成秀米编辑器

一、百度富文本编辑器 1.首先下载 百度富文本编辑器 下载地址:GitHub - fex-team/ueditor: rich text 富文本编辑器 2.把下载好的文件整理好 放在图片目录下 3. 安装插件vue-ueditor-wrap npm install vue-ueditor-wrap 4.在你所需要展示的页面 引入vue-uedito…

判断给定的一个不限长的数字串大小变化趋势、经典面试题:猴子排成圈踢出求最后剩下大王编号以及Debian服务器php中安装IMAP扩展各种报错解决过程

一、判断给定的一个不限长的数字串大小变化趋势 自制了一道面试题:给定一个不限长的数字字符串,判断每一位数字的大小变化趋势是否是^或v趋势,如果是就返回true,如果不是就返回false。比如121即属于^,322129即属于v。这…

Verilog和Matlab实现RGB888互转YUV444

文章目录 一、色彩空间1.1 RGB色彩空间1.2 CMYK色彩空间1.3 YUV色彩空间 二、色彩空间转换公式2.1 RGB转CMYK2.2 CMYK转RGB2.3 RGB888转YUV4442.4 YUV444转RGB888 三、MATLAB实现RGB888转YUV4443.1 matlab代码3.2 matlab结果 四、Verilog实现RGB888转YUV444 一、色彩空间 色彩空…

【区块链 + 物联网】区块链边缘计算网关设备 | FISCO BCOS应用案例

目前边缘端设备主要以人工智能应用为主,或以数据采集网络设备为主,还未有区块链边缘计算网关设备,难以 在依托终端设备的传统行业中进行区块链 应用。本项目研制区块链边缘计算网关,将区块链、计算与网络集成 在一起,…

单片机学习笔记

一、单片机帝国的诞生与发展 1.1 单片机的基本概念 单片机是一种集成电路芯片,采用超大规模的集成电路把具有数据处理功能的中央处理器存储器、输入输出端口、外围电路和相关外设集成在一块硅片上构成一个小而完整的微型计算机系统。 一般而言,单片机也…

Java语言程序设计基础篇_编程练习题**17.21 (十六进制编辑器)

目录 题目:**17.21 (十六进制编辑器) 代码示例 结果展示 题目:**17.21 (十六进制编辑器) 编写一个 GUI 应用程序,让用户在文本域输入一个文件名,然后按回车键,在文本域显示它的十六进制表达形式。用户也可以修改十六…

分类预测|基于蜣螂优化极限梯度提升决策树的数据分类预测Matlab程序DBO-Xgboost 多特征输入单输出 含基础模型

分类预测|基于蜣螂优化极限梯度提升决策树的数据分类预测Matlab程序DBO-Xgboost 多特征输入单输出 含基础模型 文章目录 一、基本原理1. 数据准备2. XGBoost模型建立3. DBO优化XGBoost参数4. 模型训练5. 模型评估6. 结果分析与应用原理总结 二、实验结果三、核心代码四、代码获…

1-9 图像膨胀 opencv树莓派4B 入门系列笔记

目录 一、提前准备 二、代码详解 kernel np.ones((3, 3), np.uint8) _, binary_image cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) dilated_image cv2.dilate(binary_image, kernel, iterations1) 三、运行现象 四、完整代码 五、完整工程贴出 一、提前准备 …

scrapy 爬取微博(一)【最新超详细解析】:创建微博爬取工程

本项目属于个人学习记录,爬取的数据会于12小时内销毁,且不可用于商用。 1 初始化环境 首先我们需要有python环境,先安装一下python,然后配置环境变量,这边给出windows的配置: 我这边的安装目录是D:\pyt…

PHP轻量级高性能HTTP服务框架 - webman

摘要 webman 是一款基于 workerman 开发的高性能 HTTP 服务框架。webman 用于替代传统的 php-fpm 架构,提供超高性能可扩展的 HTTP 服务。你可以用 webman 开发网站,也可以开发 HTTP 接口或者微服务。 除此之外,webman 还支持自定义进程&am…

Django发送邮件

【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 Django 5框架Web应用开发_夏天又到了的博客-CSDN博客 本文学习怎么使用Django发送邮件。 尽管使用Python的smtplib模块发送电子邮件…

vant 动态查询下拉菜单(可用)

动态查询item项 <van-form submit"onSubmit" ref"formRef"><Title title"企业信息" title-line title-size"19" class"ml-[18px] mb-[18px]"></Title><van-cell-group inset class"py-[18px]&quo…

【JavaSE基础】Java 基础知识

Java 转义字符 Java 常用的转义字符 在控制台&#xff0c;输入 tab 键&#xff0c;可以实现命令补全 转义字符含义作用\t制表符一个制表位&#xff0c;实现对齐的功能\n &#xff1a;换行符\n换行符一个换行符\r回车符一个回车键 System.out.println(“韩顺平教育\r 北京”);&…

pod基础和镜像拉取策略

目录 pod概念 pod的分类 1.基础容器 pause 2.初始化容器 init 实验&#xff1a;定义初始化容器 init容器的作用 实验&#xff1a;如何在容器内部进行挂载 镜像拉取策略 pod概念 pod是k8s里面的最小单位&#xff0c;pod也是最小化运行容器的资源对象。容器是基于pod在k…