基于YOLOv8的人脸识别系统

news2025/2/22 1:16:51

文章目录

一.前言

二.原理阐述

三.源代码

四.代码改进

五.流程概述 


一.前言

        原开源项目是对于某时段校园门口学生出入的视频,使用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

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

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

相关文章

论文笔记-WSDM2024-LLMRec

论文笔记-WSDM2024-LLMRec: Large Language Models with Graph Augmentation for Recommendation LLMRec: 基于图增强的大模型推荐摘要1.引言2.前言2.1使用图嵌入推荐2.2使用辅助信息推荐2.3使用数据增强推荐 3.方法3.1LLM作为隐式反馈增强器3.2基于LLM的辅助信息增强3.2.1用户…

计算四个锚点TOA定位中GDOP的详细步骤和MATLAB例程

该MATLAB代码演示了在三维空间中,使用四个锚点的TOA(到达时间)定位技术计算几何精度衰减因子(GDOP)的过程。如需帮助,或有导航、定位滤波相关的代码定制需求,请联系作者 文章目录 DOP计算原理MATLAB例程运行结果示例关键点说明扩展方向另有文章: 多锚点Wi-Fi定位和基站…

Lookup Join显著增强,Paimon1.0版本如何做的?

Hi,大家好,我们又满血复活了。 2025年开年更新频率不快,一方面是大模型如火如荼,也一直在补相关知识;另外一方面,新的一年里身体健康被我摆到了第一位,不会像前几年那么卷了。 后续我们的更新会…

Vue前端开发-Vant组件之Button组件

Vant 有丰富的UI组件,而基础组件是全部组件的核心,基础组件中将常用的元素做了二次的开发,封装成Vant格式组件,如按钮、图片和布局等,这些封装后的Vant组件,提供了更多面向实际应用的属性和事件&#xff0c…

DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方DeepSeek接入)

前言 在当今数字化时代,AI编程助手已成为提升开发效率的利器。DeepSeek作为一款强大的AI模型,凭借其出色的性能和开源免费的优势,成为许多开发者的首选。今天,就让我们一起探索如何将DeepSeek接入PyCharm,实现高效、智…

【Linux网络编程】应用层协议HTTP(请求方法,状态码,重定向,cookie,session)

🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 ​ Linux网络编程笔记: https://blog.cs…

健康养生:从生活细节开启活力之旅

在忙碌的现代生活里,健康养生不再是一个抽象概念,而是关乎生活质量的关键。其实,只要掌握日常养生要点,就能轻松开启活力满满的健康生活。 饮食是健康的基石。每日饮食需遵循 “彩虹原则”,摄入多种颜色食物。早餐时&…

DeepSeek + Mermaid编辑器——常规绘图

下面这张图出自:由清华大学出品的 《DeepSeek:从入门到精通》。 作为纯文本生成模型,DeepSeek虽不具备多媒体内容生成接口,但其开放式架构允许通过API接口与图像合成引擎、数据可视化工具等第三方系统进行协同工作,最终…

【拥抱AI】GPT Researcher的诞生

一、GPT Researcher 研究过程总结 GPT Researcher 是一个开源的自主智能体,旨在通过利用人工智能技术实现高效、全面且客观的在线研究。它通过一系列创新的设计和优化,解决了传统研究工具(如 AutoGPT)中存在的问题,如…

Redis7——基础篇(三)

前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二) 接上期内容:上期完成了Redis的基本…

MySQL登录问题总结

不管何种数据库,使用的第一步都是先登录。 MySQL命令行登录语句:mysql -u username -P port -p -D database_name 登录MySQL的报错一般从报错信息都能得到反馈,常见报错原因分析如下,实例中的以test用户为例,登录环境为…

Redis 持久化:从零到掌握

Redis 作为一款广泛使用的内存数据库,虽然核心功能是基于内存提供高性能的数据存取,但在实际应用中,数据的持久化是不可忽视的。毕竟,内存中的数据一旦出现故障或重启,就会面临数据丢失的风险。因此,Redis …

Mybatis MyBatis框架的缓存 一级缓存

1. 缓存的概念 缓存的概念 在内存中临时存储数据,速度快,可以减少数据库的访问次数。经常需要查询,不经常修改的数据,不是特别重要的数据都适合于存储到缓存中。 2.Mybatis缓存 mybatis包含了一个非常强大的查询缓存特性&#…

第1章大型互联网公司的基础架构——1.6 RPC服务

你可能在1.1节的引言中注意到业务服务层包括HTTP服务和RPC服务,两者的定位不一样。一般来说,一个业务场景的核心逻辑都是在RPC服务中实现的,强调的是服务于后台系统内部,所谓的“微服务”主要指的就是RPC服务;而HTTP服…

idea-gradle打包运行配置

最近接触了一个项目,使用gradle做为构建工具,这里记录一波,毕竟平时使用的都是maven idea 配置 这里有个坑,Gradle Wrapper,配置的地址gradle下载超时 这个配置修改成阿里的 第一张 第二张 第二张配置的jvm貌似没啥用…

(新版本onenet)stm32+esp8266/01s mqtt连接onenet上报温湿度和远程控制(含小程序)

物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 前言 之前在学校获得了一个新玩意:ESP-01sWIFI模块,去搜了一下这个小东西很有玩点,远程控制LED啥的,然后我就想…

一键部署开源DeepSeek并集成到钉钉

一键部署开源DeepSeek并集成到钉钉 简介: DeepSeek发布了两款先进AI模型V3和R1,分别适用于对话AI、内容生成及推理任务。由于官方API流量限制,阿里云推出了私有化部署方案,无需编写代码即可完成部署,并通过计算巢AppF…

【爬虫基础】第一部分 网络通讯 P1/3

前言 1.知识点碎片化:每个网站实现的技术相似但是有区别,要求我们根据不同的网站使用不同的应对手段。主要是常用的一些网站爬取技术。 2.学习难度:入门比web简单,但后期难度要比web难,在于爬虫工程师与网站开发及运维…

车载音频配置(二)

目录 OEM 自定义的车载音频上下文 动态音频区配置 向前兼容性 Android 14 车载音频配置 在 Android 14 中,AAOS 引入了 OEM 插件服务,使你可以更主动地管理由车载音频服务监督的音频行为。 随着新的插件服务的引入,车载音频配置文件中添加了以下更改: • OEM 自定义的车…

级联选择器多选动态加载

一.级联展示 注:因为级联选择器这里是动态加载,因此如果上来选中一级就需要加载出后面三级的全部数据,依然会很卡,因此,和产品协商把一二级多选框去掉了,这样也避免了你选择一级不能实现子级被全部选中的问…