【Pytorch项目实战】之人脸检测与识别:基于face_recognition开源人脸识别库

news2024/11/19 7:44:27

文章目录

  • 人脸检测与识别
    • (一)实战:人脸检测(图片)
    • (二)实战:人脸检测与识别(视频)

人脸检测与识别

face_recognition 是开源人脸识别库。Face Recognition官网。其依赖于python的两个库:dlib和CMake。安装分为三个步骤:(1)dlib安装(2)CMake安装(3)face_recognition安装。

人脸检测是🚌目标检测的一种。人脸检测和人脸识别原理

  • 目标检测 即找出图像中所有感兴趣的目标,确定他们的类别和位置。
    (1)早期框架有Viola Jones、HOG;
    (2)加入深度学习后的框架OverFeat、R-CNN、Fast R-CNN、Faster R-CNN等。
    主要影响因素:分辨率、光照、模糊度、遮挡、角度等。
  • 人脸检测与识别 属于生物特征识别技术,通过对生物体本身的生物特征来区分生物体个体。生物特征包括:脸、指纹、手掌纹、虹膜、视网膜、声音、体型、签字等。
    其主要的挑战:
    (1)单一限定场景发展到广场、车站、地铁口等;
    (2)人脸尺度多变、姿态多样性包括俯拍、搞帽子口罩、表情夸张、化妆伪装、光照条件恶劣、分辨率低到人眼难辩等。

如何实现人脸识别?

通过定位和对齐得到人脸的区域图像,然后卷积网络提取人脸特征进行分类识别。

  • 定位(Detection):在图像中找到所有人脸的位置,并画出矩形框。
  • 对齐(Alignment):找到人脸的若干个关键点(如眼角、鼻尖、嘴角等),然后通过相似变换(如旋转、缩放和平移)得到标准人脸(模板)。
  • 特征提取(Feature Extraction):通过深度卷积网络提取特征(权重参数)。

基于CNN的人脸定位与对齐方法:MTCNN(Multi-task Cascaded Convolutional Networks)

主要由三个神经网络组成:PNet、RNet、ONet
主要流程:
(1)resieze(预处理):对给定图像进行裁剪,生成不同大小的图像。构建图像金字塔,以便适应不同尺寸的人脸。
(2)PNet(一次过滤):使用PNet网络生成候选窗口,并利用边框回归方法矫正候选窗口,然后使用非极大值抑制NMS提取相关度最大的窗口。
(3)RNet(二次过滤):使用NRNet网络改善候选窗口。拒绝掉大部分假窗口,并继续使用边框回归矫正窗口和NMS提取窗口。
(4)ONet(检测人脸);使用ONet网络输出最终的人脸框和五个特征点的位置。

如何衡量人脸的相似性与不同?

设计有效的Loss Function,使得类内的变化程度最小,同时保持类间的可区分性。损失函数包括:(1)交叉熵损失(2)三元组损失(3)中心损失(4)ArcFace。

实战:人脸识别库face_recognition使用教程(人脸检测、人脸马赛克、人脸关键点识别、人脸涂色、人眼睁闭状态识别、人脸识别)

(一)实战:人脸检测(图片)

在这里插入图片描述

import face_recognition
import cv2      # opencv读取图像的格式BGR(图像的格式RGB)

img = face_recognition.load_image_file("女团.jpg")           # 加载图片
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)                  # BGR转换为RGB
face_locations = face_recognition.face_locations(img)       # 提取人脸位置
print("I found {} face(s) in this photograph." .format(len(face_locations)))     # 打印图像中的人脸数
#######################################################
# 提取图像中所有人脸
for face_location in face_locations:
    top, right, bottom, left = face_location
    start = (left, top)
    end = (right, bottom)
    cv2.rectangle(img, start, end, color=(255, 255, 255), thickness=3)
#######################################################
# 显示识别结果
cv2.namedWindow("face_recognition")
cv2.imshow("face_recognition", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

(二)实战:人脸检测与识别(视频)

在这里插入图片描述

import face_recognition
import cv2
import numpy as np
#########################################################
# (1)自定义已知面孔及标签
video_capture = cv2.VideoCapture(0)         # cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备

obama_image = face_recognition.load_image_file("小胖墩.jpg")               # 自定义已知面孔1
obama_face_encoding = face_recognition.face_encodings(obama_image)[0]

biden_image = face_recognition.load_image_file("obama.jpg")               # 自定义已知面孔2
biden_face_encoding = face_recognition.face_encodings(biden_image)[0]

known_face_encodings = [obama_face_encoding, biden_face_encoding]         # 创建已知人脸编码(数组)
known_face_names = ["Fat Boy", "obama"]                                   # 创建已知人脸的名称(数组)
#########################################################
# 参数初始化
face_locations = []
face_encodings = []
face_names = []
process_this_frame = True
while True:
    #########################################################
    # 人脸检测与识别(匹配两张面孔的距离)
    ret, frame = video_capture.read()               # 循环读取视频的每一帧(图像)
    if process_this_frame:                          # 为了节省时间,每隔一帧视频就处理一次
        small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)   # 调整视频帧的大小为1/4大小,以更快的人脸识别处理
        rgb_small_frame = small_frame[:, :, ::-1]                   # 将图像从BGR颜色(OpenCV使用)转换为RGB颜色(face_recognition使用)
        face_locations = face_recognition.face_locations(rgb_small_frame)                       # 查找当前视频帧中的所有人脸位置
        face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations)       # 查找当前视频帧中的所有人脸编码

        face_names = []
        for face_encoding in face_encodings:
            name = "Unknown"        # 若新面孔与已知面孔不同,则显示“ 未知”
            matches = face_recognition.compare_faces(known_face_encodings, face_encoding)           # 看这张脸是否与已知的脸匹配
            face_distances = face_recognition.face_distance(known_face_encodings, face_encoding)    # 计算与新面孔与已知面孔的距离
            best_match_index = np.argmin(face_distances)                                            # 计算与新面孔与已知面孔的最小距离
            if matches[best_match_index]:
                name = known_face_names[best_match_index]
            face_names.append(name)
    process_this_frame = not process_this_frame     # 为了节省时间,每隔一帧视频就处理一次
    #########################################################
    # 框出人脸并显示标签
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        # 由于我们检测到的帧被缩放到1/4大小,所以将面位置缩小
        top *= 4; right *= 4; bottom *= 4; left *= 4
        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, 1.0, (255, 255, 255), 1)
    cv2.imshow('Video', frame)
    if cv2.waitKey(1) & 0xFF == 27:    # 27 表示退出键(Esc)
        break
video_capture.release()
cv2.destroyAllWindows()

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

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

相关文章

启科 QuTrunk+Runtime+QuSaaS+亚马逊云科技量子计算编程实战

QuTrunk 是启科量子自主研发的一款免费、开源、跨平台的量子计算编程框架,包括量子编程 API、量子命令转译、量子计算后端接口等。它提供多种量子计算体验,提供本地量子计算 Python 计算后端,提供 OMP 多线程、MPI 多节点并行、GPU 加速等计算…

操作系统权限提升(一)之操作系统权限介绍

前言 操作系统权限提升简称提权,顾名思义就是提升自己在目标系统中的权限。现在的操作系统都是多用户操作系统,用户之间都有权限控制,比如通过Web漏洞拿到的是web进程的权限,往往Web服务都是以一个权限很低的账号启动的,因此通过 Webshell进行一些操作会受到限制,这就需要将其…

Leetcode力扣秋招刷题路-0094

从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结 94. 二叉树的中序遍历(Easy) 给定一个二叉树的根节点 root ,返回它的 **中序 **遍历。 示例 1: 输入:root [1,null,2,3] 输出…

无线网络概论_4

成帧细节 数据帧:好比802.11中的驮马,负责在工作站直接板运输数据。控制帧:通常能够与数据帧搭配使用,负责区域的清空,信道的取得以及载波监听的维护并于收到数据时给予肯定确认,借此来增加数据传输的可靠…

垃圾收集器必问系列—CMS

本文已收录至Github,推荐阅读 👉 Java随想录 应该相信,自己是生活的战胜者。——雨果 文章目录CMS简介运作过程CMS的缺陷处理器资源敏感无法处理“浮动垃圾”内存碎片纵观全书《深入理解JVM虚拟机》第三版,在垃圾回收器这一篇章&a…

CMakelists.txt简单介绍

先祝大家开工大吉,这篇策划一下CMakelists.txt,它依托在Cmake里,在大型工程、平台兼容方面非常好用的C项目编译工具,再此先对它做一个简短的介绍。 目录 一、CMakelists.txt简介 二、使用示例 三、总结 一、CMakelists.txt简介…

Eclipse swt环境搭建

通过Eclipse Marketplace安装打开eclipse,点击help,在弹出的框中,选择Eclipse Marketplace。如下所示。。。搜索windows 安装插件一、创建一个SWT项目点击左上角的File - > New -> Other...进入后搜索SWT ,选中在WindowBuilder下的SWT …

CnOpenData中国彩票销售数据

一、数据简介 彩票是一种编有号码的证券,按票面价格出售。开奖后,持有中奖号码奖券的,可按规定领奖。它是一种建立在机会均等基础上的、具有公平竞争特征的娱乐游戏。国家发行彩票的目的是筹集社会公众资金,资助福利、体育等社会公…

springboot中整合mybatis及简单使用

springboot中整合mybatis及简单使用1.引入依赖2.在applicaiton.yaml中配置数据源以及mybatis3.创建sql测试表4.编写mapper接口和mapper.xml文件4.1 mapper接口4.2 mapper.xml4.3 mybatisX快速开发插件5.创建service层和controller层5.1 创建service层5.2 创建controller层6.项目…

[网鼎杯 2018]Fakebook

目录 信息收集 代码审计 思路 解法一(非预期解) 解法二(预期解) 信息收集 目录扫描代码泄露扫描 robots.txt;flag.php;login.php;user.php;view.php;join.php; 直接打开flag.php后没有回显,应该需要通过ssrf来访…

Qt音视频开发12-easyplayer内核

一、前言 在视频监控行业经常看到两个厂家广告打得比较厉害,一个是青犀视频对应easyplayer,一个是大牛直播,两个最初都是sdk免费,并提供调用示例源码,后面大牛直播的sdk以及示例都无法运行,目前就剩下免费…

Word处理控件Aspose.Words功能演示:如何在 C# .NET 中将 PNG、JPG 转换为 Word

Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外, Aspose API支持流行文件格式处…

git push clone 参数具体解析

1 问题背景 git远程仓库有很多命令,但是教程里面讲解的都是特别模糊的。 2 命令实例解析 2.1 git branch -vv -a命令具体解析 在开始下面的命令解析之前,我们一定要学会git branch -vv -a这个命令,这个是查询本地仓库远程仓库跟踪关系最全…

《从0开始学大数据》之ZooKeeper是如何保证数据一致性的

背景 在分布式集群系统中,比如两个应用程序都需要对一个文件路径进行写操作,但是如果两个应用程序对于哪台服务器是主服务器的判断不同,就会分别连接到两个不同的 NameNode 上,并都得到了对同一个文件路径的写操作权限&#xff0…

振弦采集模块配置工具VMTool 扩展功能指令生成器与实时曲线

振弦采集模块配置工具VMTool 扩展功能指令生成器与实时曲线 指令生成器 ( 1) 指令生成 指令生成器可根据需要生成符合 MODBUS 和 AABB 通讯协议的读取和控制指令。 通过点击串口调试工具内的【 指令生成器】 按钮,可打开指令生成器窗口&#…

【SpringBoot高级篇】SpringBoot集成XXL-JOB分布式任务调度平台

【SpringBoot高级篇】SpringBoot集成XXL-JOB分布式任务调度平台简介下载源码部署任务调度平台执行SQL脚本部署任务平台简单使用初始化测试项目pom依赖SampleXxlJob修改配置调度平台配置执行器任务管理添加任务简介 XXL-JOB是一个分布式任务调度平台,其核心设计目标…

连续函数的运算与初等函数的连续性——“高等数学”

各位CSDN的uu们你们好呀,今天,小雅兰的内容是连续函数的运算与初等函数的连续性,上篇博客我们学到了函数的连续性和间断点,这篇博客相当于是上篇博客的一个补充,好吧,现在就让我们进入高等数学的世界吧 一、…

【刷题】不用加减乘除做加法

这是一道简单的数学题。但是比较繁琐,需要有耐心。 目录 前言 一、找规律 二、怎么实现加法? 总结 前言 这道题不让用四则运算符做加法,于是我第一反应是用位运算。 难道转成二进制再使用位运算吗,显然不需要,列草稿可…

Java 开发环境配置 “JDK”(超详细整理,适合新手入门)

前言 📜 “ 作者 久绊A ” 专注记录自己所整理的Java、web、sql等,IT技术干货、学习经验、面试资料、刷题记录,以及遇到的问题和解决方案,记录自己成长的点滴 目录 前言 一、什么是JDK? 1、大概介绍 2、详细介绍 …

MySQL进阶——触发器

1.触发器定义 同存储过程和函数类似,MySQL中的触发器也是存储在系统内部的一段程序代码,可以把它看作是一个特殊的存储过程。所不同的是,触发器无需人工调用,当程序满足定义条件时就会被MySQL自动调用。这些条件可以称为触发事件…