Python实现人脸识别功能

Python实现人脸识别功能

闲来没事,记录一下前几天学习的人脸识别小项目。

要想实现人脸识别,我们首先要搞明白,人脸识别主要分为哪些步骤?为了提高人脸识别的准确性,我们首先要把图像或视频中的人脸检测出来,然后使用分类网络,对检测到的人脸进行分类。

概括起来,主要包括:人脸检测人脸分类两个部分。

人脸检测

人脸检测部分我们直接使用现成的 MTCNN,它的模型结构如下图所示,主要由三个级联的简单网络组成。

首先将图像重新缩放为不同尺度的图像,然后第一个网络负责提出候选框,第二个网络对候选框进行过滤,留下更加精准的候选框,第三个网络进一步回归和过滤,输出预测的面部边界框和特征点位置。

在这里插入图片描述

下图是该网络的模型结构参数,可以发现该网络结构由简单的若干个卷积层组成,结构简单,运行十分快速,因此适用于在线的人脸识别。

在这里插入图片描述
这里代码也很简单,有现成的:

import cv2
from mtcnn_cv2 import MTCNN# 加载模型(MTCNN)
mtcnn = MTCNN()# 打开摄像头
cap = cv2.VideoCapture(0)while True:# 读取一帧图像ret, img = cap.read()# 如果读取成功if ret:# 将图像转为RGB格式img_rgb = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2RGB)# 人脸检测(检测图像中是否存在人脸)faces = mtcnn.detect_faces(img=img_rgb)

人脸识别

在人脸识别部分,我们首先将想要识别的人脸图片存入文件夹,然后计算视频中检测到的人脸与文件夹内人脸的差异,根据阈值判断检测到的人脸是已知的,还是陌生人。

import cv2
from mtcnn_cv2 import MTCNN
from img_mark import mark_face
from img_mark import rec_face# 加载模型(MTCNN)
mtcnn = MTCNN()# 打开摄像头
cap = cv2.VideoCapture(0)while True:# 读取一帧图像ret, img = cap.read()# 如果读取成功if ret:# 将图像转为RGB格式img_rgb = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2RGB)# 人脸检测(检测图像中是否存在人脸)faces = mtcnn.detect_faces(img=img_rgb)if faces:# 人脸标注(box, landmark)mark_face(img=img, faces=faces)# 人脸识别(识别身份)rec_face(img=img, faces=faces)# 显示图像cv2.imshow(winname="love", mat=img)cv2.waitKey(delay=1)else:# 读取失败,退出循环break# 释放资源
cap.release()
cv2.destroyAllWindows()

还有一个 img_mark.py 文件定义了人脸识别的功能部分。

from torchvision import transforms
from PIL import Image
import numpy as np
import os
import cv2
from res_facenet.models import model_921# 加载模型(FaceNet)
model921 = model_921()def reg_faces(root="../faces"):"""使用 FaceNet 录入人脸:param root: 存储的人脸仓库:return:"""# 定义空字典,存放录入的人脸faces = {}# 预处理preprocess = [transforms.Resize(224),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])]trans = transforms.Compose(preprocess)# 读取带录入的人脸for file in os.listdir(root):if file.endswith(".jpg"):# 拼接完整路径file_path = os.path.join(root, file)# 读取图像内容并预处理img = trans(Image.open(file_path)).unsqueeze(0)# 使用FaceNet模型,将人脸变成128维向量embed = model921(img)# 将录入的脸存储在字典中faces[file.split(".")[0]] = embed.detach().numpy()[0]return facesdef embed_faces(img=None):"""将人脸图像变成一个向量"""preprocess = [transforms.Resize(224),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])]trans = transforms.Compose(preprocess)img = trans(Image.fromarray(obj=img)).unsqueeze(0)embed = model921(img).detach().numpy()[0]return embeddef get_dist(face, faces):"""求解欧氏距离:param face: 预测的结果:param faces: 库中的结果:return:"""result = []for n, f in faces.items():result.append((n, np.sqrt(((f - face) ** 2).sum())))result.sort(key=lambda ele: ele[1])return result# 获取人脸库
face_db = reg_faces()def mark_face(img=None, faces=None):for face in faces:x, y, w, h = face["box"]confidence = face["confidence"]keypoints = face["keypoints"]if confidence > 0.9:cv2.rectangle(img=img, pt1=(x, y), pt2=((x+w), (y+h)), color=(0, 0, 200))# 左眼cv2.circle(img=img, center=keypoints["left_eye"], radius=2, color=(200, 0, 0))# 右眼cv2.circle(img=img, center=keypoints["right_eye"], radius=2, color=(200, 0, 0))# 鼻子cv2.circle(img=img, center=keypoints["nose"], radius=2, color=(200, 0, 0))# 左嘴角cv2.circle(img=img, center=keypoints["mouth_left"], radius=2, color=(200, 0, 0))# 右嘴角cv2.circle(img=img, center=keypoints["mouth_right"], radius=2, color=(200, 0, 0))def rec_face(img, faces):"""人脸识别:param img::param faces::return:"""# 将图像转为RGB格式img_rgb = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2RGB)for face in faces:x, y, w, h = face["box"]confidence = face["confidence"]# 通过置信度,过滤部分人脸if confidence > 0.9:# 截取人脸data = img_rgb[y:y+h, x:x+w, :]# 嵌入向量vec = embed_faces(img=data)# 计算距离result = get_dist(vec, face_db)# 求最短距离name, distance = result[0]print(distance)# 超过距离的阈值,则认为是陌生人if distance > 1.5:name = "Stranger"# 将名字打印到图像中cv2.putText(img=img, text=name, org=(x, y+h+30), color=(0, 200, 0),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=1)

放张简单的效果图。

在这里插入图片描述

完整的代码文件见百度网盘:链接:https://pan.baidu.com/s/15q69SjVFEhfJ9WpgWSyhbg
提取码:pymx

日常学习记录,一起交流讨论吧!侵权联系~

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

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

相关文章

基于DNN深度学习网络的OFDM+QPSK信号检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................................. Transmitt…

XGBoost实例——皮马印第安人糖尿病预测和特征筛选

利用皮马印第安人糖尿病数据集来预测皮马印第安人的糖尿病,以下是数据集的信息: Pregnancies:怀孕次数Glucose:葡萄糖BloodPressure:血压 (mm Hg)SkinThickness:皮层厚度 (mm)Insulin:胰岛素 2…

区块链学习笔记

区块链技术与应用 数组 列表 二叉树 哈希函数 BTC中的密码学原理 cryptographic hash function collsion resistance(碰撞抵抗) 碰撞指的是找到两个不同的输入值,使得它们的哈希值相同。也就是说,如果存在任意两个输入x和y,满足x ≠ y…

【N32L40X】学习笔记03-gpio输出库

gpio输出 该函数库的目的就是在统一的地方配置&#xff0c;将配置的不同项放置在一个结构体内部使用一个枚举来定义一个的别名 led.c #include <stdio.h> #include "led/bsp_led.h"static led_t leds[LED_NUM]{{GPIOB,GPIO_PIN_2,RCC_APB2_PERIPH_GPIOB},{GP…

Android获取屏幕的宽高、密度等

转载他人的链接 Android 获取屏幕尺寸与密度获取屏幕密度&#xff08;方法1&#xff09; int screenWidth getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽&#xff08;像素&#xff0c;如&#xff1a;480px&#xff09; int screenHeight getWin…

ElasticSearch的面试题

ElasticSearch的面试题 ElasticSearch是开源的高扩展的分布式全文搜索引擎。 ElasticSearch基本操作 ES里的Index可以看做一个库&#xff0c;而Types想当于表&#xff0c;Documents则相当于表的行&#xff0c;这里的Types的概念已经被逐渐弱化&#xff0c;ElasticSearch6.X中&…

【ES】---ES的聚合(aggregations)

目录 一、前言1、聚合分类2、聚合的实现方式二、RestAPI--bucket聚合案例11、按照类型分bucket2、按照(String)时间分bucket三、RestAPI-- metric聚合案例11、metric指标统计四、RestAPI-- pipeline聚合案例1一、前言 聚合是对文档数据的统计、分析、计算。 注意:参与聚合的字…

SpringBoot-Mybatis整合+Restful风格 + (CRUD简单案例)

SpringBoot-Mybatis整合 基本步骤数据库设计数据库表设计pom.xml文件坐标SpringBoot配置配置SpringBoot 启动器类配置数据源(数据库)日志 驼峰映射 访问路径和端口 等引入前端页面搭建后端包结构业务逻辑(Restful风格)前端请求的四种方式(GET POST PUT DELETE)GET DELETEPO…

Java语言创建包含以上数据类型的MySQL表,并提供批量新增数据、批量修改数据、删除数据以及字段的DDL语句的详细代码示例

以下是使用Java语言创建包含以上数据类型的MySQL表&#xff0c;并提供批量新增数据、批量修改数据、删除数据以及字段的DDL语句的详细代码示例&#xff1a; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.State…

YOLOX-PAI 论文学习

1. 解决了什么问题&#xff1f; 对 YOLOX 做加速&#xff0c;在单张 Tesla V100 上取得了 42.8 42.8 42.8mAP&#xff0c;推理速度为 1 毫秒。 2. 提出了什么方法&#xff1f; 2.1 主干网络 YOLOv6 和 PP-YOLOE 都将主干网络从 CSPNet 切换到了 RepVGG。RepVGG 在推理时&a…

MyBatis学习笔记之高级映射及延迟加载

文章目录 环境搭建&#xff0c;数据配置多对一的映射的思路逻辑级联属性映射association分布查询 一对多的映射的思路逻辑collection分布 环境搭建&#xff0c;数据配置 t_class表 t_stu表 多对一的映射的思路逻辑 多对一&#xff1a;多个学生对应一个班级 多的一方是st…

Anaconda常用命令

Anaconda常用命令 文章目录 Anaconda常用命令1. 前言2. 管理conda自身2.1 查看conda版本2.2 查看conda的环境配置2.3 设置镜像2.4 更新conda2.6 更新Anaconda整体2.7 查询某个命令的帮助 3. 管理环境3.1 创建虚拟环境3.2 创建虚拟环境的同时安装必要的包3.3 查看有哪些虚拟环境…

redis缓存穿透

缓存穿透是指在缓存中查询大量不存在的数据&#xff0c;导致无效请求直接落到后端数据库&#xff0c;从而造成数据库负载过高&#xff0c;甚至引起数据库超负荷的情况。缓存穿透通常发生在恶意攻击或非法请求的情况下&#xff0c;攻击者故意查询不存在的数据&#xff0c;导致大…

mac系统占用100多G怎么清除 mac内存系统占用了好多怎么清理

mac电脑运行速度足以傲视其他电脑系统&#xff0c;不易卡顿死机是苹果电脑的优势&#xff0c;但是其偏小的存储空间令人十分头痛。如果你的mac磁盘容量是仅有12GB&#xff0c;在使用一段时间之后&#xff0c;系统内存很有可能就要占用100多G&#xff0c;很快电脑会出现空间不够…

【Odoo16前端源码分析】接口web_search_read

接口名称: web_search_read 请求路径: /web/dataset/call_kw/project.project/web_search_read 内容主题: 请求参数kwargs中fields的来源分析 以list类型为例 1 先转成archInfo对象&#xff0c;其中有activeFileds属性 /* web/static/src/views/list/list_view.js */expor…

Android12之快速查找静态注册jni函数方法(一百六十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【C语言15】单链表,(对于二级指针与一级指针应用的详细讲述)

文章目录 单链表1.单链表的介绍2.单链表的实现2.1.1单链表结点的创建与销毁2.1.2单链表尾插2.1.3单链表打印2.1.4尾删2.1.5头插2.1.6头删2.1.7查找2.1.8在pos位置之后插入数据2.1.9删除pos位置 单链表 1.单链表的介绍 链表是一种物理存储结构上非连续、非顺序的存储结构&#…

通达OA-V12版本二次开发-2023年7月25日

通达OA-V12版本二次开发-2023年7月25日 1、解密V11版本的文件2、修改V11的文件3、修改mysql_为mysqli_。4、关闭文件&#xff0c;windows下的记事本方式打开&#xff0c;然后另存为utf-8文件。5、V12版本相对于V11版本&#xff0c;改动内容 1、解密V11版本的文件 免费解密工具…

Vue 本地应用 图片切换 v-show v-bind实践

点击切换图片的本质&#xff0c;其实修改的是img标签的src属性。 图片的地址有很多个&#xff0c;在js当中通过数组来保存多个数据&#xff0c;数组的取值结合索引&#xff0c;根据索引可以来判断是否是第一张还是最后一张。 图片的变化本质是src属性被修改了&#xff0c;属性…

国标GB28181视频监控平台EasyGBS视频无法播放,抓包返回ICMP是什么原因?

国标GB28181视频平台EasyGBS是基于国标GB/T28181协议的行业内安防视频流媒体能力平台&#xff0c;可实现的视频功能包括&#xff1a;实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。国标GB28181视频监控平台部署简单、可拓展性强&#xff0c;支持将…