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

目录

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;进行可…

laravel定时任务配置手册

任务调度在 app/Console/Kernel.php 的 schedule 方法中进行定义&#xff1b; 分配多种调度计划&#xff1a;结合其他一些特定条件&#xff0c;我们可以生成在一周中特定时间运行的任务。举个例子&#xff0c;在每周一执行命令&#xff1a; 方法 描述 ->cron(* * * * *); …

分配栈空间的三种方式(基于适配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…

Android 7.1 默认自拍镜像

Android 7.1 默认自拍镜像 近来收到客户需求反馈需要将相机前摄成像默认为镜像显示&#xff0c;大致思路我们可以在保存数据前将前摄拍的照片转为镜像&#xff0c;保存数据是通过PhotoMode.java文件中的saveData方法实现&#xff0c;具体修改参照如下&#xff1a; 首先添加将图…

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…

H3C网络设备交换机风扇亮黄灯故障处理

H3C出现如下报错信息: [H3C]fan prefer-direction slot 1 power%Jan 1 04:30:13:401 2013 H3C DEV/1/FAN_DIRECTION_NOT_PREFERRED: Fan 1 airflow direction is not preferred on slot 1, please check it. %Jan 1 04:30:13:404 2013 H3C DEV/1/FAN_DIRECTION_NOT_PREFERRED…

代码随想录算法训练营第四十八天 _ 动态规划_198.打家劫舍、213.打家劫舍II、337.打家劫舍 III。

学习目标&#xff1a; 动态规划五部曲&#xff1a; ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录&#xff01; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 198.打家劫舍 动态规划五步曲&a…

深入理解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…

基于java的Redis工具类可缓存Object,list,set,map!!!

目录 简介&#xff1a;springboot redis启动器redis配置&#xff1a;工具类 简介&#xff1a; 添加redis启动器&#xff0c;配置redis相关配置&#xff0c;使用工具类缓存数据 封装的方法有&#xff1a;缓存Object,list,set,map类型数据的方法、获取指定key的value、判断指定k…