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

目录

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 resultsfor (top, right, bottom, left), name in zip(face_locations, face_names):# Draw a box around the facecv2.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_DUPLEXcv2.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 角点检测

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

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

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

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

相关文章

川崎ZX-6R确定引进,636它真的来了,3C认证已过。

最新消息&#xff0c;兄弟们&#xff0c;你们期待已久的川崎ZX6R&#xff08;636&#xff09;基本已经确定引进了&#xff0c;官方的3C认证已经通过&#xff0c;那么从3C里面我们可以看到哪几个信息&#xff1f;产品代号ZX636J就是心心念念的ZX-6R了。 有些小伙伴不太清楚3C认…

t-SNE完整笔记 (附Python代码)

t-SNE(t-distributed stochastic neighbor embedding)是用于降维的一种机器学习算法&#xff0c;是由 Laurens van der Maaten 和 Geoffrey Hinton在08年提出来。此外&#xff0c;t-SNE 是一种非线性降维算法&#xff0c;非常适用于高维数据降维到2维或者3维&#xff0c;进行可…

分配栈空间的三种方式(基于适配qemu的FreeRTOS分析)

1、定义全局的数组 定义的全局数组属于bss段&#xff0c;相当于把bss段的一部分作为栈空间&#xff0c;栈空间的大小就是数组的大小如果把栈空间放在bss段&#xff0c;则在bss段清零时会多清零一段地址空间 2、在链接脚本中指定 用链接脚本在所有段的后面增加stack段&#xff…

15:00面试,15:06就出来了,问的问题真变态。。。

刚从小厂出来&#xff0c;没想到在另一家公司我又寄了。 在这家公司上班&#xff0c;每天都要加班&#xff0c;但看在钱给的比较多的份上&#xff0c;也就不太计较了。但万万没想到5月一纸通知&#xff0c;所有人不准加班了&#xff0c;不仅加班费没有了&#xff0c;薪资还要降…

基于springboot的大学生兼职信息管理系统(源码+数据库+文档)

摘要 基于Spring Boot的大学生兼职信息管理系统是一个为大学生和兼职公司提供服务的平台。通过该系统&#xff0c;大学生可以方便地寻找兼职工作机会&#xff0c;而兼职公司可以发布、管理和筛选合适的兼职信息。首先&#xff0c;系统采用了Spring Boot作为开发框架&#xff0…

Ubuntu22.04使能root用户

一、背景 安装Ubuntu22.04系统的时候&#xff0c;会要求创建一个用户&#xff0c;并设置密码。为方便后续行文&#xff0c;将此用户称为user_normal&#xff0c;此密码称为normal_pd 安装Ubuntu22.04系统的时候&#xff0c;没有出现任何和root有关的设置 Ubuntu22.04安装完成…

[陇剑杯 2021]日志分析

[陇剑杯 2021]日志分析 题目做法及思路解析&#xff08;个人分享&#xff09; 问一&#xff1a;单位某应用程序被攻击&#xff0c;请分析日志&#xff0c;进行作答&#xff1a; 网络存在源码泄漏&#xff0c;源码文件名是_____________。(请提交带有文件后缀的文件名&…

前端mp3文件转wav文件的实现

一、音频文件格式转换 1&#xff09;安装fluent-ffmpeg和ffmpeg插件 npm install fluent-ffmpeg; npm install ffmpeg;2&#xff09;mp3转wav test.js文件&#xff1a; const ffmpeg require(fluent-ffmpeg);ffmpeg(./test.mp3) .format(wav) .audioBitrate(16k) .audioFre…

(纯原创) 基于SSM 的商城购物系统(完整源代码以及开发文档)

摘要 本网上商城系统以SSM架构、使用Mybatis&#xff0c;数据库使用MySQL&#xff0c;这些技术目前相对比较成熟&#xff0c;方便系统的维护与扩展。网上商城系统前台包括了用户注册、用户登录、商品查询、商品添加到购物车、删除商品等几大功能&#xff1b;后台管理功能则包…

Android VpnService 使用(一)

Android VpnService 使用(一) 本篇算是VpnService 使用的第一篇文章,主要讲述service创建,intent调用. 1: 申请权限 <service android:name".MyVpnService" android:permission"android.permission.BIND_VPN_SERVICE"><intent-filter><ac…

LeetCode力扣每日一题(Java):27、移除元素

一、题目 二、解题思路 1、我的思路 因为题目中说“元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。”也就是说&#xff1a; 输入&#xff1a;nums [3,2,2,3], val 3 输出&#xff1a;2, nums [2,2] 解释&#xff1a;函数应该返回新的长度 2并且 nums 中的…

JVM性能调优

遇到以下情况&#xff0c;就需要考虑进行JVM调优了&#xff1a; Heap内存&#xff08;老年代&#xff09;持续上涨达到设置的最大内存值&#xff1b; Full GC 次数频繁&#xff1b; GC 停顿时间过长&#xff08;超过1秒&#xff09;&#xff1b; 应用出现OutOfMemory 等内存异常…

xtts和ogg不选择?

不选择ogg的理由&#xff1a; 1.需要在源端创建用户赋权&#xff0c;启用数据库最小日志&#xff0c;附加日志等操作--对生产影响较大 2.外键约束过多&#xff0c;割接启用可能很慢https://www.modb.pro/db/201126--割接停机时间影响 3.初始化配置expdp导出可能快照过旧&#x…

深入理解JVM虚拟机第二十八篇:详解JVM当中方法重写的本质和虚方法表

&#x1f609;&#x1f609; 欢迎加入我们的学习交流群呀&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&a…

2022年拉丁美洲中东和非洲医疗机器人市场及全球概况报告

今天分享的是机器人系列深度研究报告&#xff1a;《2022年拉丁美洲中东和非洲医疗机器人市场及全球概况报告》。 &#xff08;报告出品方&#xff1a;Apollo Reports&#xff09; 报告共计&#xff1a;195页 研究方法论 2.1通过桌面研究和内部存储库的假设 a)最初&#xff…

【LeetCode刷题】-- 118.杨辉三角

118.杨辉三角 class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> res new ArrayList<List<Integer>>();for(int i 0; i < numRows;i){List<Integer> ret new ArrayList<>();for(…

18.Java程序设计-基于Springboot的电影院售票系统的设计与实现

摘要 电影产业在当今社会中占据着重要地位&#xff0c;电影院作为观影的主要场所&#xff0c;其售票系统的高效性和用户体验至关重要。本文基于Spring Boot框架设计并实现了一款电影院售票系统&#xff0c;旨在提高售票效率、优化用户体验&#xff0c;并解决传统售票方式存在的…

PHP 之道(PHP The Right Way 中文版)

PHP 之道&#xff08;PHP The Right Way 中文版&#xff09;

我的NPI项目之Android 显示 -- 背光的电路小知识

由于使用的高通平台一直在演化&#xff0c;从SDM660,QCM4290,QCM4490再到QCM6490。产品的背光设计也是一直在迭代。 简单罗列了一下所经历的一些设计&#xff0c;简单的背光也涉及到了很多学问。 先说有哪些类型&#xff1a; 1. SDM660上由PMIC提供了wled给背光, 透过驱动直…

软件设计师——软件工程(一)

&#x1f4d1;前言 本文主要是【软件工程】——软件设计师——软件工程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…