基于YOLOv8的人脸识别系统

文章目录

一.前言

二.原理阐述

三.源代码

四.代码改进

五.流程概述 


一.前言

        原开源项目是对于某时段校园门口学生出入的视频,使用YOLOv8目标检测算法以及yolov8l-face模型将目标换算成只检测人脸, 通过该模型中的track技术实现检测出的人脸进行自动跟踪, 通过跟踪到的人脸使用dlib库中的的dlib_face_recognition_resnet_model_v1模型来检测人脸的特征 根据返回的128个特征值可以存进dataset数据集中进行进一步的训练,已得到更好的匹配效果 同时对于可以检测到特征值的人脸会自行进行判断是否是学校内的学生,如果是学生的话可以通过,呈绿色效果 而未检测到的人脸将呈现红色效果, 正中央记录出能识别出的人脸的数量。

参考博客

Github链接


二.原理阐述

1.人脸检测

人脸检测是通过YOLO(You Only Look Once)模型实现的。YOLO是一种基于深度学习的目标检测算法,能够直接从输入图像中预测目标的位置(边界框)和类别。

原理:

YOLO将输入图像划分为多个格子(grid cells),每个格子负责检测其中心点落在该格子内的目标。

模型输出每个格子中目标的坐标框(坐标、宽高)、置信度(目标存在的概率)和类别信息。

在本代码中,使用了YOLOv8的轻量级版本(yolov8n-face.pt),专门用于人脸检测。

应用:

YOLO模型在每一帧图像上运行,输出人脸的边界框(x1,y1,x2,y2),这些边界框用于定位图像中的人脸区域。

2.特征提取

特征提取是通过dlib的人脸关键点检测器和人脸识别模型来实现的。

原理:

①人脸关键点检测:

使用 dlib.shape_predictor 模型( shape_predictor_68_face_landmarks.dat ),基于人脸检测框,提取人脸的68个关键点(如眼睛、鼻子、嘴巴等位置)。

②人脸特征提取:

使用 dlib.face_recognition_model_v1 模型,基于关键点,提取人脸的128维特征向量。这些特征向量是人脸的唯一标识,用于后续的身份对比。

应用:

对于每一帧中检测到的人脸,提取其特征向量,用于与已知人脸特征进行比对。

3.特征比对

特征比对是通过计算欧氏距离实现的。

原理:

对于检测到的人脸特征向量和已知人脸特征向量,计算它们之间的欧氏距离。

欧氏距离越小,表示两个特征向量越相似。

设置一个阈值(如0.8),如果距离小于阈值,则认为是同一个人;否则认为是陌生人。

应用:

在每一帧中,将检测到的人脸特征与已知人脸特征库逐一比对,确定身份。

4.实时推流

实时推流是通过FFmpeg实现的,将处理后的视频帧推送到RTSP服务器。

原理:

FFmpeg是一个强大的多媒体处理工具,支持音视频的编码、解码、转码和推流。

通过FFmpeg的命令行工具,将处理后的视频帧(原始像素数据)编码为 H.264格式,并推送到RTSP服务器。

RTSP(Real-Time Streaming Protocol)是一种流媒体传输协议,用于实时视频流的传输和控制。

应用:

在代码中,FFmpeg作为子进程运行,通过管道接收每一帧的像素数据,并将其编码后推流到指定的RTSP地址。


三.源代码

源代码实现了一个基于人脸检测与识别的视频处理系统,主要功能包括:实时人脸检测、随机生成姓名、人脸特征提取与保存,以及在视频中实时标注人脸信息。

'''这段代码实现了一个完整的人脸检测与识别系统,结合了 YOLOv8 的高效目标检测能力和 dlib 的人脸关键点检测与特征提取功能。
它能够实时处理视频流,检测人脸并标记随机生成的姓名,同时将识别到的人脸保存到文件夹中'''
import cv2
from ultralytics import YOLO
from faker import Faker
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import os
import dlib

# 人脸关键点检测器
predictor_path = "model/shape_predictor_68_face_landmarks.dat"
# 人脸识别模型、提取特征值
face_rec_model_path = "model/dlib_face_recognition_resnet_model_v1.dat"
# 加载模型
# 人脸检测
detector = dlib.get_frontal_face_detector()
# 关键点检测
sp = dlib.shape_predictor(predictor_path)
# 编码
facerec = dlib.face_recognition_model_v1(face_rec_model_path)

# 实例化YOLO模型并将其移动到设备上
model = YOLO('model/yolov8n-face.pt')

# 创建一个Faker对象用于生成随机姓名sms
faker = Faker(locale='zh_CN')

# 打开视频文件并获取视频参数

video_path =r'D:\01_liuhairui\YOLOv8-Detection-Project-main\media\zhu.mp4'
# video_path = "media/00009.MTS"
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))

# 设置输出视频参数
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# out = cv2.VideoWriter('result/Student.mp4', fourcc, fps, size, True)


# 判断人脸照片是否有特征
def judge_character(image):
    # 人脸检测
    dets = detector(image, 1)
    if len(dets) == 1:
        # 关键点
        shape = sp(image, dets[0])
        # 提取特征
        # 获取到128位的编码
        face_descriptor = facerec.compute_face_descriptor(image, shape)
        v = np.array(face_descriptor)
        return v
    else:
        return None


# cv2将标识结果可视化
def box_label(origin, studentId, image, b, label='', txt_color=(255, 255, 255)):
    # 得到目标矩形框的左上角和右下角坐标(xx,yy)
    p1, p2 = (int(b[0]), int(b[1])), (int(b[2]), int(b[3]))
    # 获取可以识别出的人脸的文件夹中的所有文件名
    rec_file_names = os.listdir('rec-face')
    # 将每个人的人脸单独提取出来
    face = origin[int(b[1]):int(b[3]), int(b[0]):int(b[2])]
    face2 = cv2.cvtColor(face, cv2.COLOR_BGR2RGB)
    result = judge_character(face2)
    # 如果识别出来则记录进识别列表
    if result is not None and track_id_number not in rec_list:
        rec_list.append(track_id_number)
    # 如果检测出人脸则使用绿色框框出来
    # 因为后续该人脸截取到的图片不一定能提取到人脸特征,所以识别出来后面可能不会显示绿色
    # 将识别出来的id记录下来,这样子后续即使识别不出人脸特征也能直接给其框出绿色方框
    if result is not None or track_id_number in rec_list:
        # 如果文件夹中识别出该人脸则存入进文件夹
        if f'{int(studentId)}-{label}.png' not in rec_file_names:
            cv

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

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

相关文章

C# 背景 透明 抗锯齿 (效果完美)

主要是通过 P/Invoke 技术调用 Windows API 函数 gdi32.dll/user32.dll,同时定义了一些结构体来配合这些 API 函数的使用,常用于处理图形绘制、窗口显示等操作。 运行查看效果 局部放大,抗锯齿效果很不错,尾巴毛毛清晰可见。 using System; u…

Windows10 将Docker虚拟磁盘文件ext4.vhdx迁移至D盘

今天打开电脑发现之前迁移到D盘的ext4.vdx居然占有80多个G不得不重新清理一下了 于是先删除了d盘的ext4.vdx文件 注销了原来的 wsl --unregister docker-desktopwsl --unregister docker-desktop-data 确认 WSL 发行版状态: 运行以下命令以确认当前的 WSL 发行版…

OpenCV二值化处理

1.1. 为什么需要二值化操作 二值化操作将灰度图像转换为黑白图像,即将图像中的像素值分为两类:前景(通常为白色,值为 255)和背景(通常为黑色,值为 0)。二值化的主要目的是简化图像&…

深入了解 DevOps 基础架构:可追溯性的关键作用

在当今竞争激烈的软件环境中,快速交付强大的应用程序至关重要。尽管如此,在不影响质量的情况下保持速度可能是一项艰巨的任务,这就是 DevOps 中的可追溯性发挥作用的地方。通过提供软件开发生命周期 (SDLC) 的透明视图…

由浅入深学习大语言模型RLHF(PPO强化学习- v1浅浅的)

最近,随着DeepSeek的爆火,GRPO也走进了视野中。为了更好的学习GRPO,需要对PPO的强化学习有一个深入的理解,那么写一篇文章加深理解吧。纵观网上的文章,要么说PPO原理,各种复杂的公式看了就晕,要…

【Java八股文】08-计算机网络面试篇

【Java八股文】08-计算机网络面试篇 计算机网络面试篇网络模型网络OSI模型和TCP/IP模型分别介绍一下键入网址到网页显示,期间发生了什么? 应用层- HTTP应用层有哪些协议?HTTP是什么及HTTP报文有哪些部分?HTTP是怎么传输数据的HTTP…

【Linux】Linux 文件系统——有关 inode 不足的案例

ℹ️大家好,我是练小杰,今天周二了,明天星期三,还有三天就是星期五了,坚持住啊各位!!!😆 本文是对之前Linux文件权限中的inode号进行实例讨论,看到博客有错误…

SpringBoot整合Redis和Redision锁

参考文章 1.Redis 1.导入依赖 <!--Redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.c…

亲测可用,IDEA中使用满血版DeepSeek R1!支持深度思考!免费!免配置!

作者&#xff1a;程序员 Hollis 之前介绍过在IDEA中使用DeepSeek的方案&#xff0c;但是很多人表示还是用的不够爽&#xff0c;比如用CodeChat的方案&#xff0c;只支持V3版本&#xff0c;不支持带推理的R1。想要配置R1的话有特别的麻烦。 那么&#xff0c;今天&#xff0c;给…

一周学会Flask3 Python Web开发-Debug模式开启

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 默认情况&#xff0c;项目开发是普通模式&#xff0c;也就是你修改了代码&#xff0c;必须重启项目&#xff0c;新代码才生效&…

某手sig3-ios算法 Chomper黑盒调用

Chomper-iOS界的Unidbg 最近在学习中发现一个Chomper框架&#xff0c;Chomper 是一个模拟执行iOS可执行文件的框架&#xff0c;类似于安卓端大名鼎鼎的Unidbg。 这篇文章使用Chomper模拟执行某手的sig3算法&#xff0c;初步熟悉该框架。这里只熟悉模拟执行步骤以及一些常见的…

PyTorch 深度学习框架中 torch.cuda.empty_cache() 的妙用与注意事项

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在使用 PyTorch 进行深度学习模型训练与调优过程中&#xff0c;torch.cuda.empty_cache() 方法作为一种高效工具被广泛采用&#xff1b;但其正确应用要求充分理解该方法的功能及最佳实践。下文将对该方…

巧用GitHub的CICD功能免费打包部署前端项目

近年来&#xff0c;随着前端技术的发展&#xff0c;前端项目的构建和打包过程变得越来越复杂&#xff0c;占用的资源也越来越多。我有一台云服务器&#xff0c;原本打算使用Docker进行部署&#xff0c;以简化操作流程。然而&#xff0c;只要执行sudo docker-compose -f deploy/…

配置Api自动生成

我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/TVlJdMgYLoDJrsxAwMgcCE14nxt 使用Springfox Swagger生成API&#xff0c;并导入Postman&#xff0c;完成API单元测试 Swagger: 是一套API定义的规范&#xff0c;按照这套规范的要求去定义接口及接口相关信息&#xff0c;再通过可…

【JMeter使用-2】JMeter中Java Request采样器的使用指南

Apache JMeter 是一款功能强大的性能测试工具&#xff0c;支持多种协议和测试场景。除了内置的采样器&#xff08;如HTTP请求、FTP请求等&#xff09;&#xff0c;JMeter还允许通过 Java Request采样器 调用自定义的Java代码&#xff0c;从而实现更复杂的测试逻辑。本文将详细介…

将Google文档导入WordPress:简单实用的几种方法

Google文档是内容创作者非常实用的写作工具。它支持在线编辑、多人协作&#xff0c;并能够自动保存内容。但当我们想把Google文档中的内容导入WordPress网站时&#xff0c;可能会遇到一些小麻烦&#xff0c;比如格式错乱、图片丢失等问题。本文将为大家介绍几种简单实用的方法&…

Android开发-深入解析Android中的AIDL及其应用场景

深入解析 Android 中的 AIDL 及其应用场景 1. 前言2. AIDL 的核心概念3. AIDL 的实现步骤3.1. 定义 AIDL 接口文件3.2. 实现服务端&#xff08;Service&#xff09;3.3. 客户端绑定与调用 4. AIDL 的典型应用场景4.1. 多进程应用4.2. 与系统服务交互4.3. 高性能 IPC4.4. 跨应用…

PWM(脉宽调制)技术详解:从基础到应用实践示例

PWM&#xff08;脉宽调制&#xff09;技术详解&#xff1a;从基础到应用实践示例 目录 PWM&#xff08;脉宽调制&#xff09;技术详解&#xff1a;从基础到应用实践示例学前思考&#xff1a;一、PWM概述二、PWM的基本原理三、PWM的应用场景四、PWM的硬件配置与使用五、PWM的编程…

谷粒商城—分布式高级②.md

认证服务 1. 环境搭建 创建gulimall-auth-server模块,导依赖,引入login.html和reg.html,并把静态资源放到nginx的static目录下 2. 注册功能 (1) 验证码倒计时 //点击发送验证码按钮触发下面函数 $("#sendCode").click(function () {//如果有disabled,说明最近…

Nginx(详解以及如何使用)

目录 1. 什么是Nginx&#xff1f; 2. 为什么使用nginx? 3. 安装nginx 3.1?安装nginx的依赖插件 3.2 下载nginx ?3.3?创建一个目录作为nginx的安装路径 ?3.4?解压 ?3.5?进入解压后的目录 3.6?指定nginx的安装路径 ?3.7?编译和安装nginx 3.8 启动nginx ?…