数字图像处理(实践篇)二十一 人脸识别

目录

1 安装face_recognition

2 涉及的函数

3 人脸识别方案

4 实践


使用face_recognition进行人脸识别。

1 安装face_recognition

pip install face_recognition

或者

pip --default-timeout=100 install face_recognition -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

第二种方式安装得更快。

2 涉及的函数

  • face_recognition.api.load_image_file()函数
face_recognition.api.load_image_file(file, mode='RGB')

函数功能:下载图片文件(.jpg  .png等)转成numpy array。

输入:

①file:要加载的图像文件名或文件对象

②mode:将图像转换成的格式。支持“RGB”(8位,3通道)和“L”(黑白)

返回:

①Numpy array 的图像内容。

  • face_recognition.api.face_locations()函数
face_recognition.api.face_locations(img,number_of_times_to_upsample=1, model='hog')

函数功能:返回图片中所有人脸的Bbox(array)

输入:

img:输入的图片(numpy array)

number_of_times_to_upsample:上采样的次数,次数越多越能找到更小的人脸。

model:“hog”为默认;“hog”在上不精准,但是快。“cnn”是更精准的深度学习模型,需要GPU/CUDA加速。

返回:

人脸定位元组(top, right, bottom, left)的List。

  • face_recognition.api.face_encodings()函数
face_recognition.api.face_encodings(face_image, known_face_locations=None, num_jitters=1)

函数功能:图像中的每张人脸返回128维的人脸编码。

输入:

face_image:包含一张或者更多张人脸的图片

known_face_locations:-可选-每个人脸的Bbox(已知)

num_jitters:编码时重采样的次数。越高越准确,但是速度会慢些。

返回:

①128维的人来你编码List(图像中的每张脸都有)。

  • face_recognition.api.face_distance()函数
face_recognition.api.face_distance(face_encodings, face_to_compare)

输入:

①face_encodings:人脸编码List。

②face_to_compare:用来比较的一个人脸编码。

返回:

①与人脸编码List顺序相同的距离array。   

3 人脸识别方案

制作人脸库。

knownImg文件夹下有如下几张图片。依次读取文件夹中的图片,定位人脸,将人脸区域编码并存于face_encoding_list中。图片的名字依次存于label_list中。也就是说face_encoding_list中的人脸编码结果与label_list中的名字是一一对应的。

本文中,get_Known_faces_info()函数实现这一功能。

def get_Known_faces_info(dir_path):                                           
    face_encoding_list = []                                                   
    label_list = []                                                           
    for imgs_name in os.listdir(dir_path):                                    
        img = face_recognition.load_image_file(dir_path + imgs_name)          
        print(dir_path + imgs_name)                                           
        face_locations = face_recognition.face_locations(img)                 
        face_encodings = []                                                   
        face_encodings = face_recognition.face_encodings(img, face_locations) 
        if len(face_encodings) != 0:                                          
            face_encodings = face_encodings[0]                                
            face_encoding_list.append(face_encodings)                         
            label_list.append(imgs_name[:-4])                                 
    return face_encoding_list, label_list                                     

人脸识别

首先,读取输入的图像test.png,将图像中的所有人脸检测出来并将人脸区域编码。将每一个待识别的编码结果与人脸库的face_encoding_list对比并得出与人脸编码List顺序相同的距离结果。min_index为距离最小值对应的索引。选取数值最小的距离与阈值进行比较。如果小于阈值,则该人脸的标签为label_list[min_index]。如果大于阈值,则这一人脸编码对应的标签为Unknown,即人脸库中没有这一人脸数据,因此无法识别。

然后,将识别结果展示出来。

本文中,dealImageResult()函数实现这一功能。

def dealImageResult(unknown_face_path, face_encoding_list, label_list, face_threshold):                      
    im = cv2.imread(unknown_face_path)                                                                       
    unknown_image = face_recognition.load_image_file(unknown_face_path)                                      
    face_locations = face_recognition.face_locations(unknown_image)                                          
    face_encodings = face_recognition.face_encodings(unknown_image, face_locations)                          
    face_names = []                                                                                          
    for i, face_encoding in enumerate(face_encodings):                                                       
        name = "Unknown"                                                                                     
        face_distances = face_recognition.face_distance(face_encoding_list, face_encoding)                   
        min_index = np.argmin(face_distances)                                                                
        if face_distances[min_index] < face_threshold:                                                       
            name = label_list[min_index]                                                                     
        face_names.append(name)                                                                              
    # Display the results                                                                                    
    for (top, right, bottom, left), name in zip(face_locations, face_names):                                 
        # Draw a box around the face                                                                         
        cv2.rectangle(unknown_image, (left, top), (right, bottom), (0, 0, 255), 2)                           
        cv2.rectangle(unknown_image, (left, bottom), (right, bottom + 30), (0, 255, 255), cv2.FILLED)        
        font = cv2.FONT_HERSHEY_DUPLEX                                                                       
        cv2.putText(unknown_image, name, (left + 6, bottom + 25), font, 0.8, (0, 0, 0), 1)                   
    im = dealImg(im)                                                                                         
    fig = plt.figure(figsize=(10, 10))                                                                       
    titles = ["img", "result"]                                                                               
    images = [im, unknown_image]                                                                             
    for i in range(2):                                                                                       
        plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")                                              
        plt.title("{}".format(titles[i]), fontsize=20, ha='center')                                          
        plt.xticks([]), plt.yticks([])                                                                       
    # plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)                
    # plt.tight_layout()                                                                                     
    plt.show()                                                                                               
    fig.savefig('test_results.jpg', bbox_inches='tight')                                                     

4 实践

  • 代码
import numpy as np
import cv2
import matplotlib.pyplot as plt
import face_recognition
import os
def dealImg(img):
    b, g, r = cv2.split(img)
    img_rgb = cv2.merge([r, g, b])
    return img_rgb
def get_Known_faces_info(dir_path):
    face_encoding_list = []
    label_list = []
    for imgs_name in os.listdir(dir_path):
        img = face_recognition.load_image_file(dir_path + imgs_name)
        print(dir_path + imgs_name)
        face_locations = face_recognition.face_locations(img)
        face_encodings = []
        face_encodings = face_recognition.face_encodings(img, face_locations)
        if len(face_encodings) != 0:
            face_encodings = face_encodings[0]
            face_encoding_list.append(face_encodings)
            label_list.append(imgs_name[:-4])
    return face_encoding_list, label_list
def dealImageResult(unknown_face_path, face_encoding_list, label_list, face_threshold):
    im = cv2.imread(unknown_face_path)
    unknown_image = face_recognition.load_image_file(unknown_face_path)
    face_locations = face_recognition.face_locations(unknown_image)
    face_encodings = face_recognition.face_encodings(unknown_image, face_locations)
    face_names = []
    for i, face_encoding in enumerate(face_encodings):
        name = "Unknown"
        face_distances = face_recognition.face_distance(face_encoding_list, face_encoding)
        min_index = np.argmin(face_distances)
        if face_distances[min_index] < face_threshold:
            name = label_list[min_index]
        face_names.append(name)
    # Display the results
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        # Draw a box around the face
        cv2.rectangle(unknown_image, (left, top), (right, bottom), (0, 0, 255), 2)
        cv2.rectangle(unknown_image, (left, bottom), (right, bottom + 30), (0, 255, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(unknown_image, name, (left + 6, bottom + 25), font, 0.8, (0, 0, 0), 1)
    im = dealImg(im)
    fig = plt.figure(figsize=(10, 10))
    titles = ["img", "result"]
    images = [im, unknown_image]
    for i in range(2):
        plt.subplot(1, 2, i + 1), plt.imshow(images[i], "gray")
        plt.title("{}".format(titles[i]), fontsize=20, ha='center')
        plt.xticks([]), plt.yticks([])
    # plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.3, hspace=0)
    # plt.tight_layout()
    plt.show()
    fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
    face_encoding_list, label_list = get_Known_faces_info("knownImg/")
    dealImageResult("test.png", face_encoding_list, label_list, 0.4)
    pass
  • 效果图

注:本文中的图片来自于网络,如有侵权,请联系作者删除。

前文回顾

入门篇目录

 数字图像处理(入门篇)一 图像的数字化与表示

 数字图像处理(入门篇)二 颜色空间

 数字图像处理(入门篇)三 灰度化

 数字图像处理(入门篇)四 像素关系

 数字图像处理(入门篇)五 图像数据预处理之颜色空间转换

 数字图像处理(入门篇)六 图像数据预处理之坐标变化

 数字图像处理(入门篇)七 图像数据预处理之灰度变化

 数字图像处理(入门篇)八 图像数据预处理之直方图

 数字图像处理(入门篇)九 图像数据预处理之滤波

 数字图像处理(入门篇)十 边缘检测

 数字图像处理(入门篇)十一 形态学处理

 数字图像处理(入门篇)十二 自适应阈值分割

 数字图像处理(入门篇)十三 仿射变换

 数字图像处理(入门篇)十四 透视变换

实践篇目录

数字图像处理(实践篇)一 将图像中的指定目标用bBox框起来吧!

数字图像处理(实践篇)二 画出图像中目标的轮廓

数字图像处理(实践篇)三 将两张图像按照指定比例融合

数字图像处理(实践篇)四 图像拼接-基于SIFT特征点和RANSAC方法

数字图像处理(实践篇)五 使用Grabcut算法进行物体分割

数字图像处理(实践篇)六 利用hough变换进行直线检测

数字图像处理(实践篇)七 利用霍夫变换进行圆环检测

数字图像处理(实践篇)八 Harris角点检测

数字图像处理(实践篇)九 基于边缘的模板匹配

数字图像处理(实践篇)十 图像质量检测

数字图像处理(实践篇)十一 图像中的条形码解析

数字图像处理(实践篇)十二 基于小波变换的图像降噪

数字图像处理(实践篇)十三 数据增强之给图像添加噪声!

数字图像处理(实践篇)十四 图像金字塔

数字图像处理(实践篇)十五 基于傅里叶变换的高通滤波和低通滤波

数字图像处理(实践篇)十六 基于分水岭算法的图像分割

数字图像处理(实践篇)十七 Shi-Tomasi 角点检测

数字图像处理(实践篇)十八 人脸检测

数字图像处理(实践篇)十九 漫水填充
数字图像处理(实践篇)二十 人脸特征提取

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

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

相关文章

c#读取XML文件实现晶圆wafermapping显示demo计算电机坐标控制电机移动

c#读取XML文件实现晶圆wafermapping显示 功能&#xff1a; 1.读取XML文件&#xff0c;显示mapping图 2.在mapping视图图标移动&#xff0c;实时查看bincode,x,y索引与计算的电机坐标 3.通过设置wafer放在平台的位置x,y轴电机编码值&#xff0c;相机在wafer的中心位置&#…

类与接口常见面试题

抽象类和接口的对比 抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。 从设计层面来说&#xff0c;抽象类是对类的抽象&#xff0c;是一种模板设计&#xff0c;接口是行为的抽象&#xff0c;是一种行为的规范。 相同点 接口和抽象类都不能实例化都位于继承的顶端…

每日一题,头歌平台c语言题目

任务描述 题目描述:输入一个字符串&#xff0c;输出反序后的字符串。 相关知识&#xff08;略&#xff09; 编程要求 请仔细阅读右侧代码&#xff0c;结合相关知识&#xff0c;在Begin-End区域内进行代码补充。 输入 一行字符 输出 逆序后的字符串 测试说明 样例输入&…

老师们居然这样把考试成绩发给家长

教育是一个复杂而多元的过程&#xff0c;其中考试成绩的发布和沟通是教育过程中的一个重要环节。然而&#xff0c;有些老师在发布考试成绩时&#xff0c;采取了一些不恰当的方式&#xff0c;给家长和学生带来了不必要的困扰和压力。本文将探讨老师们不应该采取的发布考试成绩的…

六级高频词组1

目录 词组 参考链接 词组 1. abide by&#xff08;be faithful to &#xff1b;obey&#xff09;忠于&#xff1b;遵守。 2. be absent from… 缺席&#xff0c;不在 3. absence or mind&#xff08;being absent-minded&#xff09; 心不在焉 4. absorb&#xff08;take …

进程的同步和异步、进程互斥

一、进程同步和异步 同步&#xff08;Synchronous&#xff09;&#xff1a; 同步指的是程序按照顺序执行&#xff0c;一个操作完成后才能进行下一个操作。在多进程或多线程的环境中&#xff0c;同步意味着一个进程&#xff08;或线程&#xff09;在执行某个任务时&#xff0c;…

大致人类应该是短时记忆和利用短时记忆控制利用周围环境达到长期记忆的吧

这里写目录标题 图代码代码解析图 代码 import timedef route_llm(route_text):passdef write_to_dask(one_sum, one_text, one_path

每日一题 1631. 最小体力消耗路径(中等,最小最大值)

最小最大值问题&#xff0c;二分答案搜索heights的最大值为106&#xff0c;所以右边界为106&#xff0c;左边界为0&#xff0c;通过dfs来判断是否存在一条路径&#xff0c;其中所有的相邻格子的高度差绝对值小于左右边界的中点 class Solution:def minimumEffortPath(self, he…

AI自动生成代码工具

AI自动生成代码工具是一种利用人工智能技术来辅助或自动化软件开发过程中的编码任务的工具。这些工具使用机器学习和自然语言处理等技术&#xff0c;根据开发者的需求生成相应的源代码。以下是一些常见的AI自动生成代码工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有…

记录 | linux静态库和动态库的理解

hello.cpp&#xff1a; #include <cstdio>void hello() {printf("Hello, world!\n"); }main.cpp&#xff1a; #include <cstdio>void hello();int main() {hello();return 0; }静态库编译配置&#xff1a; cmake_minimum_required(VERSION 3.12) proj…

Xmanager

什么是 XManager Xmanager 是市场上领先的 PC X 服务器&#xff0c;可将X应用程序的强大功能带入 Windows 环境。 提供了强大的会话管理控制台&#xff0c;易于使用的 X 应用程序启动器&#xff0c;X 服务器配置文件管理工具&#xff0c;SSH 模块和高性能 PC X 服务器。 Xman…

果然,做年终报告还是得看大数据分析工具

一年一度的年终报告比拼有要开始了。听一句劝&#xff0c;今年的年终报告还是用大数据分析工具来做吧&#xff01;将年终报告做成BI大数据分析报表&#xff0c;能直截了当总结分析过去一年的数据情况不说&#xff0c;还能在会议上随时切换分析维度&#xff0c;随时从不同的维度…

java--LocalDate、LocalTime、LocalDateTime、ZoneId、Instant

1.为什么要学习JDK8新增的时间 LocalDate&#xff1a;代表本地日期(年、月、日、星期) LocalTime&#xff1a;代表本地时间(时、分、秒、纳秒) LocalDateTime&#xff1a;代表本地日期、时间(年、月、日、星期、时、分、秒、纳秒) 它们获取对象的方案 2.LocalDate的常用API(…

软件测试之缺陷管理

一、软件缺陷的基本概念 1、软件缺陷的基本概念主要分为&#xff1a;缺陷、故障、失效这三种。 &#xff08;1&#xff09;缺陷&#xff08;defect&#xff09;&#xff1a;存在于软件之中的偏差&#xff0c;可被激活&#xff0c;以静态的形式存在于软件内部&#xff0c;相当…

Vue快速入门教程

什么是Vue&#xff1f; 1&#xff0c;vue是一套前端框架&#xff0c;免除原生JavaScrip中dom操作&#xff0c;简化书写。 2&#xff0c;给予MVVM&#xff08;Model-View-ViewModel&#xff09;思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上 官网&a…

漏洞复现--速达进存销管理系统任意文件上传

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

python:六种算法(DBO、RFO、WOA、GWO、PSO、GA)求解23个测试函数(python代码)

一、六种算法简介 1、蜣螂优化算法DBO 2、红狐优化算法RFO 3、鲸鱼优化算法WOA 4、灰狼优化算法GWO 5、粒子群优化算法PSO 6、遗传算法GA 二、6种算法求解23个函数 &#xff08;1&#xff09;23个函数简介 参考文献&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolution…

关于粒子群算法的一些简单尝试

粒子群算法核心思想&#xff1a;&#xff08;鸟 粒子&#xff09; &#xff08;1&#xff09;许多的鸟站在不同的地方&#xff1b; &#xff08;2&#xff09;每一只鸟都有自己寻找食物的初始飞行方向、飞行速度&#xff1b; &#xff08;3&#xff09;这些鸟儿每隔一段时间…

0013Java安卓程序设计-ssm酒品移动电商平台app

文章目录 **摘要**目录系统实现5.1 APP端5.2管理员功能模块开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析…

PHP基础 - 循环与条件语句

循环语句 1)for循环: 重复执行一个代码块指定的次数。 for ($i = 0; $i < 5; $i++) { // 初始化 $i 为 0,每次循环后将 $i 值增加 1,当 $i 小于 5 时执行循环echo "The number is: $i \n"; // 输出当前 $i 的值并换行 }// 循环输出结果为: // The number …