Face_recognition实现人脸识别

这里写自定义目录标题

  • 欢迎使用Markdown编辑器
    • 一、安装人脸识别库face_recognition
      • 1.1 安装cmake
      • 1.2 安装dlib库
      • 1.3 安装face_recognition
    • 二、3个常用的人脸识别案例
      • 2.1 识别并绘制人脸框
      • 2.2 提取并绘制人脸关键点
      • 2.3 人脸匹配及标注

欢迎使用Markdown编辑器

本文基于face_recognition库实现图像人脸识别,下面将介绍如何安装face_recognition库,并细述3个常用的人脸识别案例。

一、安装人脸识别库face_recognition

Face_recognition的安装不同于其他package,它需要依赖dlib库(dlib库的安装又依赖于cmake库),所以装face_recognition之前需要先安装前二者,整个安装过程还是挺耗费时间精力的。我的python环境是python3.7+Anaconda。

1.1 安装cmake

pip install cmake -i https://pypi.tuna.tsinghua.edu.cn/simple/

借助清华源的资源安装,通常下载速度会比较快,且不会中断。

1.2 安装dlib库

dlib-19.17.99-cp37-cp37m-win_amd64.whl 密码 79rt
下载后直接安装该whl文件

pip install dlib-19.17.99-cp37-cp37m-win_amd64.whl

直接在线pip install dlib,不知为何会报错,所以从网站上下载好安装包进行离线安装。

1.3 安装face_recognition

pip install face_recognition  -i https://pypi.tuna.tsinghua.edu.cn/simple/

二、3个常用的人脸识别案例

本章主要介绍face_recognition下3个常用的人脸识别方法及案例,它们所依赖的库函数如下:

import os
import face_recognition as fr
from PIL import Image, ImageDraw, ImageFont
import matplotlib.pyplot as plt
import dlib
import numpy as np

2.1 识别并绘制人脸框

在这里插入图片描述其中,face_locations(img, number_of_times_to_upsample=1, model=“hog”) 方法为实现该demo的关键,该方法用于提取图像img中的人脸特征并返回所有人脸框坐标list。

def draw_face_rect(self):self.img = fr.load_image_file(pic)      # 读图#(1)识别人脸框所在坐标faces = fr.face_locations(self.img)     # 也可使用cnn识别# faces = fr.face_locations(self.img, number_of_times_to_upsample=0, model="cnn")#(2)创建展示结果的图像pil_img = Image.fromarray(self.img)draw = ImageDraw.Draw(pil_img)#(3)依次绘制人脸框for face in faces:top, right, bottom, left = facedraw.rectangle(((left, top), (right, bottom)), outline=(0,255,0))del drawplt.imshow(pil_img)plt.axis('off')plt.show()
  1. 入参img,必填,输入要求为图像阵列形式(numpy array);
  2. 入参number_of_times_to_upsample,default为1,设定上采样检测人脸的次数,数值越大越便于检测到更小的人脸;
  3. 入参model,default为’hog’,选择人脸检测模型。‘hog’即Histogram of Oriented Gradient(方向梯度直方图),它通过计算和统计图像局部区域的梯度方向直方图来构成特征,该方法精度略低但性能更快(仅使用CPU时);也可选用’cnn’ 即(卷积神经网络),cnn作为深度学习模型具有更高的识别精度,当然如果有GPU或CUDA环境加速的话更好;
  4. 返回值,人脸框坐标list,表示为[face_1, face_2, …face_n],其中每张人脸框包含的元组信息face_i = (top, right, bottom, left),即依次是人脸框的上、右、下、左坐标。

注意: 图2中还有好些没能识别到的人脸,个人感觉有两个原因:其一,人脸占比太小,脸部特征不明显导致无法提取到,比如右上角的双胞胎;另一,脸部肤色、亮度、细节等不符合正常人脸特征导致算法不认为是人脸,比如绿巨人和左下角的独眼。

2.2 提取并绘制人脸关键点

在这里插入图片描述
检测结果如上,其中红点代表face_recognition能提取到的人脸关键点(眼、眉、鼻、嘴、面部轮廓),实现代码如下

def draw_face_landmarks(self):face_marks = fr.face_landmarks(self.img)pil_img = Image.fromarray(self.img)draw = ImageDraw.Draw(pil_img)for face_mark in face_marks:for key in face_mark.keys():for pt in face_mark[key]:draw.ellipse(((pt[0]-4, pt[1]-4),(pt[0]+4, pt[1]+4)), outline=(255,0,0), width=6)del drawplt.imshow(pil_img)plt.axis('off')plt.show()
  1. 入参img,必填,输入要求为图像阵列形式(numpy array);
  2. 入参face_locations,default为None,表示可选择性的提供人脸坐标list用于check;
  3. 入参model,default为"large",用于选择"large"或"small"模型。其中"small"模型速度更快但是仅返回5个关键点;
  4. 返回值,所有人脸的关键点list。其中每张人脸landmarks为一个字典,具体键和值如下:
{"chin": points[0:17],
"left_eyebrow": points[17:22],
"right_eyebrow": points[22:27],
"nose_bridge": points[27:31],
"nose_tip": points[31:36],
"left_eye": points[36:42],
"right_eye": points[42:48],
"top_lip": points[48:55] + [points[64]] + [points[63]] + [points[62]] + [points[61]] + [points[60]],
"bottom_lip": points[54:60] + [points[48]] + [points[60]] + [points[67]] + [points[66]] + [points[65]] + [points[64]]}

其中face_landmarks(face_image, face_locations=None, model=“large”)方法为实现该demo的关键,该方法用于提取图像img中的人脸特征并返回所有人脸的关键点list.

2.3 人脸匹配及标注

在这里插入图片描述

检测结果如上,其中绿框代表算法识别到的人脸,框底部还标注了每个人物的名称(绿巨人一如既往地没识别出来),实现代码如下

def match_faces(self):faces = fr.face_locations(self.img)face_encodings = fr.face_encodings(self.img, faces)self.load_known_faces()pil_img = Image.fromarray(self.img)draw = ImageDraw.Draw(pil_img)for (top, right, bottom, left), cur_encoding in zip(faces, face_encodings):# matches = fr.compare_faces(self.encoding_list, cur_encoding)    name = 'unknown'# 计算已知人脸和未知人脸特征向量的距离,距离越小表示两张人脸为同一个人的可能性越大distances = fr.face_distance(self.encoding_list, cur_encoding)match_index = np.argmin(distances)if matches[match_index]:name = self.name_list[match_index]# 绘制匹配到的人脸信息draw.rectangle(((left, top), (right, bottom)), outline=(0, 255, 0))text_width, text_height = draw.textsize(name)font = ImageFont.truetype('arial.ttf', 20)draw.rectangle(((left, bottom - text_height - 10), (right, bottom)), fill=(0, 0, 255), outline=(0, 255, 0))draw.text((left + 5, bottom - text_height - 10), name, fill=(255, 255, 255, 255), font=font)del drawplt.imshow(pil_img)plt.axis('off')plt.show()

其中,face_encodings()、compare_faces()、face_distance()三个方法的释义如下:
(1) face_encodings()

完整形式为face_encodings(face_image, known_face_locations=None, num_jitters=1, model=“small”),用于提取图像face_image中的人脸特征,并返回每张人脸的128维人脸编码组成的list;

  1. 入参face_image,必填,输入要求为图像阵列形式(numpy array);

  2. 入参known_face_locations,default为None,表示可选择性的提供人脸坐标list用于check;

  3. 入参num_jitters,default为1,表示在计算人脸编码时需要重新采样计算的次数。数值越大采样次数越多、结果越精确,但是耗时越久;

  4. 返回值为所有人脸的128维人脸编码组成的list。

(2) compare_faces()

完整形式为compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6),用于比较待确认的face_encoding与已知的known_face_encodings列表中各元素的匹配程度,并返回对应长度的布尔列表;

  1. 入参known_face_encodings,已知的人脸编码列表,本文在self.load_known_faces()方法中读取得到;

  2. 入参face_encoding_to_check,待check的人脸编码;

  3. 入参tolerance,default为0.6,定义两张人脸之间距离数值为多少时可用于表示图像匹配,通常数值越小表明匹配越严格,0.6为经验最优值;

  4. 返回值为待确认的face_encoding与已知的人脸编码列表中各元素的match结果列表,形式如[False, False, True, False, False]。

(3)face_distance()

完整形式为face_distance(face_encodings, face_to_compare),同compare_faces(),用于比较待比较的face_encoding与已知的face_encodings列表中各元素的匹配程度,并返回对应长度的数值列表;

  1. 入参face_encodings,已知的人脸编码列表;

  2. 入参face_to_compare,待check的人脸编码;

  3. 返回值为待确认的face_encoding与已知的人脸编码列表中各元素的match结果列表,形式如[0.79155519 0.74486473 0.45825189 0.78371348 0.99910555],各元素值范围为[0,1]。

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

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

相关文章

双向链表+Map实现LRU

LRU: LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。 核心思想: 基于Map实现k-v存储,双向链表中使用一个虚拟头部和虚拟尾部,虚拟头部的…

BioXcell—InVivoMAb anti-West Nile/dengue virus E protein

研发背景: 西尼罗河病毒(WNV)是一种由蚊虫类介导传播的黄病毒,与引起人类感染性流行病的登革热病毒、黄热病病毒和日本脑炎病毒密切相关。 WNV和登革热病毒(DENV)同属黄病毒科(Flaviviridae)黄热病毒属,是具有小包膜单…

【多模态】41、VILA | 打破常规多模态模型训练策略,在预训练阶段就微调 LLM 被证明能取得更好的效果!

论文:VILA: On Pre-training for Visual Language Models 代码:https://github.com/NVlabs/VILA 出处:NVLabs 时间:2024.05 贡献: 证明在预训练阶段对 LLM 进行微调能够提升模型对上下文任务的效果在 SFT 阶段混合…

Centos7离线安装ElasticSearch7.4.2

一、官网下载相关的安装包 ElasticSearch7.4.2: elasticsearch-7.4.2-linux-x86_64.tar.gz 下载中文分词器: elasticsearch-analysis-ik-7.4.2.zip 二、上传解压文件到服务器 上传到目录:/home/data/elasticsearch 解压文件&#xff1…

免费无限白嫖阿里云服务器

今天,我来分享一个免费且无限使用阿里云服务器的方法,零成本!这适用于日常测试学习,比如测试 Shell 脚本、学习 Docker 安装、MySQL 等等。跟着我的步骤,你将轻松拥有一个稳定可靠的服务器,为你的学习和实践…

错误记录-SpringCloud-OpenFeign测试远程调用

文章目录 1,org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name memberController: Unsatisfied dependency expressed through field couponFeign2, Receiver class org.springframework.cloud.netflix…

几种不同的方式禁止IP访问网站(PHP、Nginx、Apache设置方法)

1、PHP禁止IP和IP段访问 <?//禁止某个IP$banned_ip array ("127.0.0.1",//"119.6.20.66","192.168.1.4");if ( in_array( getenv("REMOTE_ADDR"), $banned_ip ) ){die ("您的IP禁止访问&#xff01;");}//禁止某个IP段…

SAP S4 环境下,KSU1 Ob52 转为前台操作,不产生传输请求号

参考 OB52/KSV1/KSU1等与Client状态相关的前台操作-y_q_yang se16n 编辑表 T811FLAGS 新增行 CYCLES MAINTENANCE X 即可

WAIC 2024 AI盛宴大会亮点回顾

&#x1f389; 刚刚落幕的WAIC 2024大会&#xff0c;简直是科技迷们的狂欢节&#xff01;这场全球瞩目的人工智能盛会&#xff0c;不仅汇聚了全球顶尖的智慧&#xff0c;还带来了无数令人惊叹的创新成果。让我们一起回顾那些抓人眼球的亮点吧&#xff01; &#x1f525; 超燃开…

Java面试八股之MySQL的redo log和undo log

MySQL的redo log和undo log 在MySQL的InnoDB存储引擎中&#xff0c;redo log和undo log是两种重要的日志&#xff0c;它们各自服务于不同的目的&#xff0c;对数据库的事务处理和恢复机制至关重要。 Redo Log&#xff08;重做日志&#xff09; 功能 redo log的主要作用是确…

世界人工智能大会 | 江行智能大模型解决方案入选“AI赋能新型工业化创新应用优秀案例”

日前&#xff0c;2024世界人工智能大会暨人工智能全球治理高级别会议在上海启幕。本次大会主题为“以共商促共享&#xff0c;以善治促善智”&#xff0c;汇聚了上千位全球科技、产业界领军人物&#xff0c;共同探讨大模型、数据、新型工业化等人工智能深度发展时代下的热点话题…

[AI 大模型] Anthropic Claude

文章目录 [AI 大模型] Anthropic Claude简介模型架构发展新技术和优势示例 [AI 大模型] Anthropic Claude 简介 Anthropic Claude 是由 Anthropic 开发的一系列大型语言模型&#xff0c;旨在提供高性能、可靠和安全的 AI 解决方案。Claude 模型以其在语言处理、推理、分析和编…

响应式R2DBC数据库mybatis

介绍 响应式&#xff1a;Web、网络、IO&#xff08;存储&#xff09;、中间件&#xff08;Redis、MySQL&#xff09; 应用开发&#xff1a; ● 网络 ● 存储&#xff1a;MySQL、Redis ● Web&#xff1a;Webflux ● 前端&#xff1b; 后端&#xff1a;Controller – Service –…

【C++ STL】模拟实现 vector

标题&#xff1a;【C STL】模拟实现 vector 水墨不写bug &#xff08;图片来源于网络&#xff09; 正文开始&#xff1a; STL中的vector是一个动态数组&#xff0c;支持随机访问&#xff0c;可以根据需要来扩展数组空间。 本项目将实现vector的部分常用功能&#xff0c;以增强…

阿里云 Ubuntu 开启允许 ssh 密码方式登录

以前用的 centos&#xff0c;重置系统为 ubuntu 后在ssh 远程连接时遇到了点问题&#xff1a; 在阿里云控制台重置实例密码后无法使用密码进行 SSH 连接登录 原因&#xff1a;阿里云 Ubuntu 默认禁用密码登录方式 解决办法&#xff1a; 先使用其他用户登录到服务器 这里进来…

国产操作系统安装配置auditd审计工具 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统安装配置auditd审计工具 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产桌面操作系统上部署auditd审计工具的文章。auditd是Linux审计系统的核心守护进程&#xff0c;用于记录系统安全相关的事件和…

Python自动化测试系列[v1.0.0][自动化测试报告]

BeautifulReport测试报告 获取BeautifulReport模块 BeautifulReport 源码Clone地址为 BeautifulReport &#xff0c;其中BeautifulReport.py和其template是我们需要的 BeautifulReport 如下代码是BeautifulReport.py的源码&#xff0c;其中几个注释的地方需要注意&#xff…

排序算法(算法篇)

算法之排序算法 排序算法 概念&#xff1a; 我们在的排序工作能在主存中完成的&#xff0c;我们就叫这种算法叫做内部排序不能在主存中完成而必须在磁盘或磁带上完成的排序算法叫做外部排序 冒泡排序 概念&#xff1a; 冒泡排序是一个很简单的排序算法&#xff0c;冒泡排…

【python】PyQt5可视化开发,鼠标键盘实现联动界面交互逻辑与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

一个简单的 Vue 组件例子

https://andi.cn/page/621509.html