当前位置: 首页 > article >正文

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

在这里插入图片描述

引言

随着人工智能技术的发展,人脸识别已经成为日常生活中的常见技术,被广泛应用于安全验证、个性化服务等多个领域。本教程将指导你如何使用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应用界面来增强用户体验。


http://www.kler.cn/a/294148.html

相关文章:

  • Vue3 -- 项目配置之stylelint【企业级项目配置保姆级教程3】
  • 【MySQL 保姆级教学】事务的自动提交和手动提交(重点)--上(13)
  • 基于node一键发布到服务器的js脚本
  • 【云原生系列--Longhorn的部署】
  • 开源模型应用落地-qwen模型小试-Qwen2.5-7B-Instruct-tool usage入门-集成心知天气(二)
  • 4-6-2.C# 数据容器 - ArrayList 扩展(ArrayList 注意事项、ArrayList 存储对象的特性、ArrayList 与数组的转换)
  • django学习入门系列之第十点《django中数据库操作--创建与删除表》
  • OpenCV下的无标定校正(stereoRectifyUncalibrated)
  • 如何解决PCDN技术与边缘计算技术融合后的安全和隐私问题(壹)?
  • Linux——redis
  • day47——面向对象特征之继承
  • 【AI】Pytorch_模型构建
  • Form 表单的 resetFields() 失效原因
  • 站在 AI 与 Web3 的交汇路口,EraAI 如何带领投资者进入智能化决策时代?
  • C++中匿名命名空间的主要使用方法
  • OpenCV直方图计算
  • neon指令
  • 【Moveit2官方教程】使用 MoveIt Task Constructor (MTC) 框架来定义和执行一个机器人任务
  • 奇异递归模板模式(Curiously Recurring Template Pattern)
  • 未雨绸缪:环保专包二级资质续期工程师招聘时间策略
  • Python和MATLAB(Java)及Arduino和Raspberry Pi(树莓派)点扩展函数导图
  • TYPE-C USB设计
  • [数据集][目标检测]轮胎检测数据集VOC+YOLO格式4629张1类别
  • 等保测评:如何构建安全的远程工作环境
  • 工作:GX WORKS标签的分类
  • Seata环境搭建