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 = face
    draw.rectangle(((left, top), (right, bottom)), outline=(0,255,0))
    del draw
    plt.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 draw
    plt.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 draw
    plt.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.mfbz.cn/a/784713.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 安装Numpy 出现异常信息

文章目录 前言一、包源二、安装完成异常 前言 安装Python Numpy包出现异常问题 Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. 一、包源 使用默认的包源出现超时异常,改用清华包源 pip …

娱乐圈幕后揭秘孙俪天选打工人

【娱乐圈幕后揭秘:孙俪“天选打工人”背后的热议风暴】在聚光灯下光鲜亮丽的娱乐圈,每一位明星的日常备受瞩目。近日,实力派演员孙俪在社交媒体上分享了一段片场棚拍的趣事,本是无心之举,意外引爆了网络热议的导火索。…

这几类人,千万不要买纯电车

文 | AUTO芯球 作者 | 响铃 纯电车的冤大头真是太多了, 我之前劝过,有些人不适合买纯电车, 你们看,果然吧,麦卡锡最近的一份报告就披露了 去年啊,22%的人在买了电车后后悔了, 这些人说了&a…

面试常考题---128陷阱(详细)

1.问题引入 分别引入了int和Integer变量,并进行比较 int b 128; int b1 128;Integer d 127; Integer d1 127;Integer e 128; Integer e1 128;System.out.println(bb1); System.out.println(dd1); System.out.println(ee1); System.out.println(e.equals(e1)…

kafka系列之offset超强总结及消费后不提交offset情况的分析总结

概述 每当我们调用Kafka的poll()方法或者使用Spring的KafkaListener(其实底层也是poll()方法)注解消费Kafka消息时,它都会返回之前被写入Kafka的记录,即我们组中的消费者还没有读过的记录。 这意味着我们有一种方法可以跟踪该组消费者读取过的记录。 如前…

【力扣高频题】014.最长公共前缀

经常刷算法题的小伙伴对于 “最长”,“公共” 两个词一定不陌生。与此相关的算法题目实在是太多了 !!! 之前的 「动态规划」 专题系列文章中就曾讲解过两道相关的题目:最长公共子序列 和 最长回文子序列 。 关注公众…

跨境电商代购系统与电商平台API结合的化学反应

随着全球化的不断推进和互联网技术的飞速发展,跨境电商已成为国际贸易的重要组成部分。跨境电商代购系统作为连接国内外消费者与商品的桥梁,不仅为消费者提供了更多元化的购物选择,也为商家开辟了更广阔的市场空间。在这一过程中,…

如何将heic转jpg格式?四种图片格式转换方法【附教程】

如何把heic转jpg格式?heic是用于存储静态图像和图形的压缩格式,旨在以更小的文件大小保持高质量的图像。HEIC格式自iOS 11和macOS High Sierra(10.13)内测开始,被苹果设置为图片存储的默认格式,广泛应用于i…

【VUE基础】VUE3第四节—核心语法之computed、watch、watcheffect

computed 接受一个 getter 函数&#xff0c;返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set 函数的对象来创建一个可写的 ref 对象。 创建一个只读的计算属性 ref&#xff1a; <template><div cl…

【一次成功】清华大学和智谱AI公司的ChatGLM-4-9B-Chat-1M大模型本地化部署教程

【一次成功】清华大学和智谱AI公司的ChatGLM-4-9B-Chat-1M大模型本地化部署教程 一、环境准备二、ChatGLM-4-9B-Chat-1M简介三、模型下载2.1 安装Git LFS2.2 初始化仓库2.3 同步Git文件2.4 拉取文件2.5 下载完毕 四、python和源码安装与下载4.1 安装python4.2 下载源码4.3 安装…

Monaco 中添加 CodeLens

CodeLens 会在指定代码行上添加一行可点击的文字&#xff0c;点击时可以触发定义的命令&#xff0c;效果如下&#xff1a; 通过调用 API 注册 LensProvider&#xff0c;点击时触发 Command&#xff0c;首先要注册命令&#xff0c;通过 editor.addCommand () 方法进行注册。三个…

韦东山嵌入式linux系列-LED驱动程序

之前学习STM32F103C8T6的时候&#xff0c;学习过对应GPIO的输出&#xff1a; 操作STM32的GPIO需要3个步骤&#xff1a; 使用RCC开启GPIO的时钟、使用GPIO_Init函数初始化GPIO、使用输入/输出函数控制GPIO口。 【STM32】GPIO输出-CSDN博客 这里再看看STM32MP157的GPIO引脚使用…

高通开发系列 - 使用QFIL工具单刷某个镜像文件

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 背景过程记录背景 有时候设备中刷的是user版本,无法使用fastboot刷单个镜像,这个时候该怎么办呢? 要解决在user…

Websocket在Java中的实践——整合Rabbitmq和STOMP

大纲 Rabbitmq开启STOMP支持 服务端依赖参数参数映射类配置类逻辑处理类 测试测试页面Controller测试案例 在《Websocket在Java中的实践——STOMP通信的最小Demo》一文中&#xff0c;我们使用enableSimpleBroker启用一个内置的内存级消息代理。本文我们将使用Rabbitmq作为消息代…

计算机类期刊横纵向对比

备注&#xff1a;综合影响因子更具针对性&#xff0c;将科技类期刊和人文社科期刊的影响力考虑&#xff0c;更加聚焦于某一特定科学领域&#xff1b;复合影响因子是基于期刊、学位论文、以及会议论文等多个类型的文献作为计算基础。 两者都是通过前两年发表的可被引文献在统计年…

pandas数据分析(8)

描述性统计量和数据聚合 描述性统计量 描述性统计量通过量化数据来概括数据集。DataFrame和Series可以通过sum、mean、count等方法来获取各种描述性统计量。在默认情况下会按照axis0返回一个Series&#xff0c;也就是说会得到一个有关列的统计量&#xff1a; 如果要计算行的统…

鼠标宏怎么设置?6款鼠标自动点击器强推,游戏玩家专用!(2024全)

随着电子游戏和日常应用的不断发展&#xff0c;我们经常会遇到一些重复性的任务或操作。而在这种情况下&#xff0c;鼠标宏以其自动化的特点成为了许多玩家和使用者的利器之一。如果你正在寻找如何设置鼠标宏来简化操作并提高效率&#xff0c;那么你来对地方了。在本文中&#…

理解算法复杂度:空间复杂度详解

引言 在计算机科学中&#xff0c;算法复杂度是衡量算法效率的重要指标。时间复杂度和空间复杂度是算法复杂度的两个主要方面。在这篇博客中&#xff0c;我们将深入探讨空间复杂度&#xff0c;了解其定义、常见类型以及如何进行分析。空间复杂度是衡量算法在执行过程中所需内存…

利用canvas压缩图片

前情提要 页面打印导出pdf文件的时候&#xff0c;图片大小会影响pdf文件大小。 为了减小pdf文件大小&#xff0c;需要将图片压缩一下。在只有图片地址的情况下&#xff0c;将图片压缩后显示&#xff0c;一开始用的browser-image-compression插件&#xff0c;这是js压缩&#x…

硬件产品设计过程:结构及硬件设计

目录 简介 设计管理问题 简介 之前也多次谈到硬件产品的设计分为多个过程,每个过程所涉及的内容也是完全不同的。 比如说: 后台、应用app层的开发;电子硬件设计;结构、ID设计;营销侧;生产管理侧;供应链管理侧等等。接下来就谈谈最近公司开发上的一些问题。 以往由于公…