当前位置: 首页 > news >正文

2024-11-5 学习人工智能的Day22 openCV(4)

face_recognition 介绍

face_recognition 是一个非常流行的 Python 库,专门用于人脸识别任务。它基于 dlib 库和 HOG(Histogram of Oriented Gradients)特征以及深度学习模型,提供了简单易用的接口来进行人脸检测、面部特征点定位和人脸识别。face_recognition 库由 Adam Geitgey 开发,旨在简化人脸识别任务,使其更加容易上手。

主要功能

  1. 人脸检测
    • 检测图像中的人脸位置。
    • 支持使用 HOG 特征或 CNN(卷积神经网络)进行人脸检测。
  2. 面部特征点定位
    • 检测人脸上的关键特征点(如眼睛、鼻子、嘴巴等)。
  3. 人脸识别
    • 提取人脸的特征向量(128维),并用于比较不同人脸之间的相似度。
    • 支持从图像或视频中识别特定的人脸。

它和opencv关系

face_recognition 和 OpenCV 是两个独立的计算机视觉库,但它们在功能上有一些重叠,并且经常一起使用来完成复杂的视觉任务。下面简要介绍两者的联系:

联系

尽管 face_recognition 和 OpenCV 各有侧重,但在实际应用中,它们经常被组合起来使用,以发挥各自的优势:

  • 图像预处理:通常情况下,我们会先使用 OpenCV 对图像进行预处理,比如调整大小、灰度化、去噪等。这些预处理步骤有助于提高后续人脸识别的准确率。
  • 人脸检测与识别:预处理后的图像可以传递给 face_recognition 库来执行人脸检测和识别。face_recognition 可以高效地完成这些任务,并返回人脸位置、面部特征点等信息。
  • 结果可视化:最后,我们可以再次利用 OpenCV 来对识别结果进行可视化处理,例如在图像上画出人脸框、标注识别到的名字等。

检测人脸

face_recognition.face_locations(img, number_of_times_to_upsample=1, model='hog')
  • 功能:检测图像中的人脸位置。
  • 参数
    • img:图像的 NumPy 数组。
    • number_of_times_to_upsample:图像上采样的次数,用于提高检测精度。
    • model:使用的模型,可以是 'hog'(默认)或 'cnn'
  • 返回:一个列表,每个元素是一个 (top, right, bottom, left) 的元组,表示人脸的位置
import face_recognition
import cv2
#加载图片
image = cv2.imread("../face_train_images/ldh.jpg")
#读取人脸位置
face_locations = face_recognition.face_locations(image)
print(face_locations)for (top, right, bottom, left) in face_locations:# 画出人脸区域cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2)
# 显示结果
cv2.imshow("Detected Faces", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

切割人脸

import face_recognition
import cv2
#加载图片
image = cv2.imread("../face_train_images/ldh.jpg")
#读取人脸位置
face_locations = face_recognition.face_locations(image)
print(face_locations)for (top, right, bottom, left) in face_locations:# 画出人脸区域cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2)qg_image = image[top:bottom,left:right]
# 显示结果
cv2.imshow("Detected Faces", qg_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

提取人脸特征

`face_recognition.face_encodings(img, known_face_locations=None, num_jitters=1, model='small')`
  • 功能:提取图像中人脸的特征向量。
  • 参数
    • img:图像的 NumPy 数组。
    • known_face_locations:人脸位置的列表,如果为 None,则自动检测人脸位置。
    • num_jitters:对每个人脸进行多次编码以提高精度。
    • model:使用的模型,可以是 'small''large'(默认)。
  • 返回:一个列表,每个元素是一个 128 维的特征向量。
import face_recognition
import cv2
#加载图片
image = cv2.imread("../face_train_images/ldh.jpg")
#读取人脸位置
face_locations = face_recognition.face_locations(image)
#提取人脸特征码
face_encodings = face_recognition.face_encodings(image)[0]
print(face_encodings)

计算人脸的欧几里得距离

import face_recognition
import cv2
import numpy as np
#加载图片
image1 = cv2.imread("../face_train_images/ldh.jpg")
#读取人脸位置
face_locations1 = face_recognition.face_locations(image1)
#提取人脸特征码
face_encodings1 = face_recognition.face_encodings(image1)[0]#加载图片
image2 = cv2.imread("../face_train_images/4.jpg")
#读取人脸位置
face_locations2 = face_recognition.face_locations(image2)
#提取人脸特征码
face_encodings2 = face_recognition.face_encodings(image2)[0]# 计算两个人脸编码之间的欧几里得距离。
distance = np.linalg.norm(face_encodings1 - face_encodings2)
print(distance)

欧几里得距离

​ 欧几里得距离(Euclidean distance)是一种测量两个点之间直线距离的方式,常用于数学、物理学和计算机科学中的各种应用,包括机器学习中的数据点距离计算。它是基于欧几里得几何的概念,通常用于计算空间中两点之间的距离。

应用

  • 数据分析: 欧几里得距离常用于计算数据点之间的距离,例如在聚类算法(如K均值聚类)中。
  • 计算机视觉: 在人脸识别等任务中,欧几里得距离用于计算特征向量之间的相似度。
  • 优化: 在路径规划和优化问题中,计算两点之间的欧几里得距离可以帮助寻找最短路径。

欧几里得距离的意义

  1. 距离越小,相似度越高
    • 特征向量相似:当欧几里得距离越小说明两个特征向量之间的差异越小,即这两个人脸在特征空间中很接近。因此,这两个图像可能是同一个人或者相似度很高。
    • 相同身份的概率大:在许多人脸识别系统中,如果计算出的距离小于某个设定的阈值,则系统会认为这两个面孔属于同一个人。
  2. 距离阈值
    • 匹配判断:通常,系统会设置一个阈值来判断两个特征向量是否属于同一身份。如果计算出的距离小于这个阈值,则认为两张图片中的人脸是相同的;如果距离大于阈值,则认为是不同的身份。
    • 误识别率:设置的阈值会影响系统的误识别率(假阳性和假阴性率)。距离阈值的选择需要根据具体应用场景进行调整。

计算人脸匹配程度

face_recognition.compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6)

  • 功能:比较已知人脸特征向量和待检测人脸特征向量,判断是否匹配。

  • 参数

    • known_face_encodings:已知人脸特征向量的列表。
    • face_encoding_to_check:待检测的人脸特征向量。
    • tolerance:匹配的阈值,范围是 0.0 到 1.0,值越小表示匹配要求越高。
  • 返回:一个布尔值列表,表示待检测人脸特征向量是否与已知人脸特征向量匹配

import face_recognition
import cv2
#提取已知人脸图片
known_image = image1 = cv2.imread("../face_train_images/ldh.jpg")
#提取提取已知人脸图片的人脸特征码
face_encodings1 = face_recognition.face_encodings(known_image)[0]
#提取未知人脸图片
unknown_image  = image1 = cv2.imread("../face_train_images/1.jpg")
#提取未知人脸图片的人脸特征码
face_encodings2 = face_recognition.face_encodings(unknown_image)
#计算是否匹配
results = face_recognition.compare_faces([face_encodings1], face_encodings2[0],tolerance=0.5)
print(results)

注意:

提取提取已知人脸图片的人脸特征码要获取下标未 0 的数值

提取未知人脸图片的人脸特征码 不获取小标

在计算匹配的时候传入到函数的参数,已知人脸图片的人脸特征码 获取放入到列表中,未知获取下标未0

图片预处理

如果对图片进行,

import face_recognition
import cv2
import numpy as np
#加载图片
image1 = cv2.imread("../face_train_images/ldh.jpg")
# 使用 OpenCV 进行图像预处理
gray_image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
#使用高斯滤波去除噪声
gs_img1 =cv2.GaussianBlur(gray_image1,(3,3),0)image1 = cv2.cvtColor(gs_img1,cv2.COLOR_GRAY2BGR)
#读取人脸位置
face_locations1 = face_recognition.face_locations(image1)
#提取人脸特征码
face_encodings1 = face_recognition.face_encodings(image1)[0]#加载图片
image2 = cv2.imread("../face_train_images/1.jpg")
# 使用 OpenCV 进行图像预处理
gray_image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
#使用高斯滤波去除噪声
gs_img2 =cv2.GaussianBlur(gray_image2,(3,3),0)image2 = cv2.cvtColor(gs_img2,cv2.COLOR_GRAY2BGR)
#读取人脸位置
face_locations2 = face_recognition.face_locations(image2)
#提取人脸特征码
face_encodings2 = face_recognition.face_encodings(image2)[0]# 计算两个人脸编码之间的欧几里得距离。
distance = np.linalg.norm(face_encodings1 - face_encodings2)
print(distance)
#

相关文章:

2024-11-5 学习人工智能的Day22 openCV(4)

face_recognition 介绍 face_recognition 是一个非常流行的 Python 库,专门用于人脸识别任务。它基于 dlib 库和 HOG(Histogram of Oriented Gradients)特征以及深度学习模型,提供了简单易用的接口来进行人脸检测、面部特征点定位…...

JavaScript 网页设计详解教程

JavaScript 网页设计详解教程 引言 JavaScript 是一种广泛使用的编程语言,主要用于网页开发。它使得网页具有动态交互性,能够响应用户的操作。随着前端开发的不断发展,JavaScript 已成为现代网页设计中不可或缺的一部分。本文将详细介绍 Ja…...

技术复杂性导致估算不准确?5大对策

技术复杂性引发的估算不准确可能导致成本超出预算,不当的资源分配则可能造成人力浪费或关键任务缺乏必要支持,进而影响客户满意度和市场竞争力,增加项目失败的风险。而有效避免因技术复杂性导致的估算不准确问题,可以显著提升项目…...

【JavaEE初阶 — 多线程】死锁的产生原因和解决方法

目录 死锁 1.构成死锁的场景 (1) 一个线程一把锁 问题描述 解决方案(可重入锁) (2) 两个线程两把锁 问题描述 (3)N个线程 M把锁 哲学家就餐问题 2.死锁的四个必要条件 3.如何解决死锁问题 (1)避免出现请求和保持 (2)打破多个线程的循环等待关系 死锁…...

mapper.xml 使用大于号、小于号示例

<mapper namespace"com.example.EmployeeMapper"><!-- 更新employee_absent_resign_statistics表中的pre_work_date --><update id"updatePreWorkDate"><![CDATA[UPDATE employee e1JOIN employee e2ON e2.statistics_date < e1.s…...

深入了解决策树:机器学习中的经典算法

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

Flutter鸿蒙next 的 Sliver 实现自定义滚动效果

Flutter 提供了一些非常强大的滚动组件&#xff0c;如 ListView、GridView 等&#xff0c;它们可以在滑动时自动处理内容的显示和滚动。但当我们需要更复杂的滚动效果时&#xff0c;Sliver 组件便是一个强大的工具。通过自定义 Sliver&#xff0c;我们可以实现高度定制化的滚动…...

杨中科 .Net Core 笔记 DI 依赖注入

提到依赖不得不提到&#xff0c;控制反转&#xff08;Inversion of Control,IOC&#xff09;这个概念&#xff0c;简单的来讲就是将控制对象的权限交给框架&#xff0c;不再手动完成。IOC实现方式有2种&#xff1a; 1、服务定位器&#xff08;ServiceLocator&#xff09;,主动…...

【RocketMQ】无法访问此网站 http://XXX:10080/ ERR_UNSAFE_PORT

安装完rocketmq-dashboard。打开浏览器访问地址。 问题提示&#xff1a; 无法访问此网站 网址为 http://192.168.22.197:10080/ 的网页可能暂时无法连接&#xff0c;或者它已永久性地移动到了新网址。 ERR_UNSAFE_PORT ‌无法访问10080端口的网站通常是由于Chrome浏览器的安…...

pipreqs:快速准确生成当前项目的requirements.txt,还有和freeze的对比

大家好&#xff0c;这里是程序员晚枫。 今天给大家推荐一个快速生成requirements.txt的小工具&#xff1a;pipreqs。 什么是requirements.txt&#xff1f; 我们在开发Python项目的时候&#xff0c;需要用到requirements.txt来管理项目中使用的第三方库。 当我们把项目部署到…...

Spark 中的 RDD 分区的设定规则与高阶函数、Lambda 表达式详解

Spark 的介绍与搭建&#xff1a;从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式…...

redis十大数据类型

文章目录 一、redis字符串&#xff08;String&#xff09;set key value同时获取或设置多个键值获取指定区间范围内的值数字增减获取字符串长度和内容追加分布式锁getset&#xff08;先get再set&#xff09; 二、redis列表&#xff08;List&#xff09;通过索引获取列表中的元素…...

国内AI工具复现GPTs效果详解

国内AI工具复现GPTs效果详解 引言 近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;大型语言模型&#xff08;LLM&#xff09;逐渐成为研究和应用的热点。GPTs&#xff08;Generative Pre-trained Transformer&#xff09;系列模型&#xff0c;特别是GPT-4的推出&a…...

【学习笔记】SAP ABAP——OPEN SQL(一)【INTO语句】

【INTO语句】 结构体插入(插入一条语句时) SELECT...INTO [CORRESPONDING FIELDS OF] <wa> FROM <db> WHERE <condition>.内表插入(插入多条语句时) SELECT...INTO|APPENDING [CORRESPONDING FIELDS OF] TABLE <itab>FROM <db> WHERE <con…...

vscode使用之vscode-server离线安装

最近因为想要使用AI工具开始使用vscode&#xff0c;但是在内网使用vscode通过SSH连接虚拟机的centos远程目录却出现了问题&#xff0c;始终连不上&#xff0c;查看原因是centos没有安装vscode-server&#xff0c;网上找各个教程离线安装vscode-code除了浪费时间没有任何收获&am…...

字符编码和字符集

1. 字符编码和字符集 1.1. 字符编码 编码&#xff1a;字符 –>字节解码&#xff1a;字节 –>字符字符编码Character Encoding : 就是一套自然语言的字符与二进制数之间的对应规则。 1.2. 字符集 字符集 Charset&#xff1a;是一个系统支持的所有字符的集合&#xff0…...

【WRF理论第七期】WPS预处理

【WRF理论第七期】WPS预处理 运行WPS&#xff08;Running the WPS&#xff09;步骤1&#xff1a;Define model domains with geogrid步骤2&#xff1a;Extracting meteorological fields from GRIB files with ungrib步骤3&#xff1a;Horizontally interpolating meteorologic…...

Flutter鸿蒙next中的按钮封装:自定义样式与交互

在Flutter应用开发中&#xff0c;按钮是用户界面中不可或缺的组件之一。它不仅用于触发事件&#xff0c;还可以作为视觉元素增强用户体验。Flutter提供了多种按钮组件&#xff0c;如ElevatedButton、TextButton、OutlinedButton等&#xff0c;但有时这些预制的按钮样式无法满足…...

代码随想录算法训练营Day57 | 卡玛网 101.孤岛的总面积、卡玛网 102.沉没孤岛、卡玛网 103. 水流问题、卡玛网 104.建造最大岛屿

目录 卡玛网 101.孤岛的总面积 卡玛网 102.沉没孤岛 卡玛网 103. 水流问题 卡玛网 104.建造最大岛屿 卡玛网 101.孤岛的总面积 题目 101. 孤岛的总面积 思路 代码随想录&#xff1a;101.孤岛的总面积 重点&#xff1a; 首先遍历图的四条边&#xff0c;把其中的陆地及…...

美团代付微信小程序系统 read.php 任意文件读取漏洞复现

0x01 产品简介 美团代付微信小程序系统是美团点评旗下的一款基于微信小程序技术开发的应用程序功能之一,它允许用户方便快捷地请求他人为自己支付订单费用。随着移动支付的普及和微信小程序的广泛应用,美团作为中国领先的本地生活服务平台,推出了代付功能,以满足用户多样化…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...