基于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 velse: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

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

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

相关文章

✨ 索引有哪些缺点以及具体有哪些索引类型

索引的定义与原理 索引是数据库中用于提高数据检索效率的数据结构。它就像是书籍的目录,通过目录可以快速定位到所需内容的页码,而在数据库中,索引可以帮助数据库系统快速找到符合查询条件的数据行,而不必对整个表进行扫描。 其…

TCP...

什么是TCP? TCP是面向连接的、可靠的、基于字节流的传输层通信协议 面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多,是无法做到的;字节流&#xff…

工业通信协议 EtherNet/IP 全面解析

工业通信协议 EtherNet/IP 全面解析 EtherNet/IP(以太网工业协议)是一种基于标准以太网的工业自动化通信协议,由 ODVA(开放设备网供应商协会) 管理。它融合了 CIP(通用工业协议) 和以太网技术&…

react+typescript,初始化与项目配置

1,创建项目 npx create-react-app music --template typescript 2,配置项目别名 npm install craco/cracoalpha -D 1,最外层与src平级创建 craco.config.jsconst path require(path)const resolve (dir) > path.resolve(__dirname, d…

JAVA Kotlin Androd 使用String.format()格式化日期

在以前的开发中,日期格式化一直使用的是SimpleDateFormat进行格式化。今天发现String.format也可以格式化。当 然,两种方式的优劣没有进行深入分析。 val date Date()//月,日,星期,AM/PM//Fue 1 (Sat) pmval fullDate…

deepseek:三个月备考高级系统架构师

一、备考总体规划(2025年2月11日 - 2025年5月) 1. 第一阶段:基础夯实(2025年2月11日 - 2025年3月10日) 目标:快速掌握系统架构师考试的核心知识点。 重点内容: 计算机组成原理、操作系统、数据…

rust笔记2-特质trait

Rust中的Trait技术 1. Trait的由来 Trait是Rust中实现多态(polymorphism)的核心机制之一。它的设计灵感来自于Haskell的类型类(Type Class)和C的概念(Concepts)。Trait允许你定义一组方法签名,…

linux 安装启动zookeeper全过程及遇到的坑

1、下载安装zookeeper 参考文章:https://blog.csdn.net/weixin_48887095/article/details/132397448 2、启动失败 1、启动失败JAVA_HOME is not set and java could not be found in PATH 已安装 JAVA 配置了JAVA_HOME,还是报错解决方法:参考&#xf…

网络安全中的机器学习

当涉及到网络安全时,技术一直是保护系统免受攻击和数据泄露的关键。在这篇论文中,我将介绍一些当前在网络安全领域使用的关键技术,包括加密,身份验证和防火墙。 首先,加密是网络安全中最常见的技术之一。加密是指使用算…

windows上vscode cmake工程搭建

安装vscode插件: 1.按装fastc(主要是安装MinGW\mingw64比较方便) 2.安装C,cmake,cmake tools插件 3.准备工作完成之后,按F1,选择cmake:Quick Start就可以创建一个cmake工程。 4.设置Cmake: G…

燧光 XimmerseMR SDK接入Unity

官网SDK文档连接: RhinoX Unity XR SDK 一:下载SDK 下载链接:RhinoX Unity XR SDK 二:打开Unity项目,添加Package 1、先添加XR Core Utilties包和XR Interaction Toolkit包 2、导 2、再导入下载好的燧光SDK 三&…

基于flask+vue框架的的医院预约挂号系统i1616(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,医生,科室信息,就诊信息,医院概况,挂号信息,诊断信息,取消挂号 开题报告内容 基于FlaskVue框架的医院预约挂号系统开题报告 一、研究背景与意义 随着医疗技术的不断进步和人们健康意识的日益增强,医院就诊量逐年增加。传统的现场…

【电机控制器】ESP32-C3语言模型——豆包

【电机控制器】ESP32-C3语言模型——豆包 文章目录 [TOC](文章目录) 前言一、简介二、代码三、实验结果四、参考资料总结 前言 使用工具&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、简介 二、代码 #include <WiFi.h> #inc…

linux核心命令

linux核心命令 目录&#xff1a;1. ls2. alias3. cd4. clear5. date6. cat7. head 和 tail8. less 和 more9. od10. cp 和 scp11. touch12. mkdir 和 rmdir13. rm14. find15. grep16. diff17. file18. mv19. wc 目录&#xff1a; 1. ls 相关知识点 用于列出目录内容。常用选项…

Cross-correlation 加速算法公式推导

Cross-correlation 加速算法公式推导 引言正文引言 由于使用点对点的计算方式过于消耗计算机的算力,尤其是当信号采样点数超过 1000 时,计算机需要计算 1 0 6 10^6 10

【论文阅读】SAM-CP:将SAM与组合提示结合起来的多功能分割

导言 近年来&#xff0c;视觉基础模型的快速发展推动了多模态理解的进步&#xff0c;尤其是在图像分割任务中。例如&#xff0c;Segment Anything模型&#xff08;SAM&#xff09;在图像Mask分割上表现出色&#xff0c;但在语义及实例分割方面仍存在局限。本文提出的SAM-CP&am…

Javascript网页设计案例:通过PDFLib实现一款PDF分割工具,分割方式自定义-完整源代码,开箱即用

功能预览 一、工具简介 PDF 分割工具支持以下核心功能: 拖放或上传 PDF 文件:用户可以通过拖放或点击上传 PDF 文件。两种分割模式: 指定范围:用户可以指定起始页和结束页,提取特定范围的内容。固定间距:用户可以设置间隔页数(例如每 5 页分割一次),工具会自动完成分…

Docker 安装和配置 Nginx 详细图文教程

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

RD-搭建测试环境

测试团队职责 环境验证&#xff1a;确保开发部署的测试环境可访问&#xff0c;页面/接口无阻塞问题&#xff1b; 配置检查**&#xff1a;核对数据库连接、接口域名、HT证书等关键配置&#xff1b; 数据准备**&#xff1a;导入基线数据&#xff0c;隔离测试与生产数据&#xff1…

科普mfc100.dll丢失怎么办?有没有简单的方法修复mfc100.dll文件

当电脑频繁弹窗提示“mfc100.dll丢失”或应用程序突然闪退时&#xff0c;这个看似普通的系统文件已成为影响用户体验的核心痛点。作为微软基础类库&#xff08;MFC&#xff09;的核心组件&#xff0c;mfc100.dll直接关联着Visual Studio 2010开发的大量软件运行命脉。从工业设计…