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

【ZYNQ】AXI4总线协议实战:从握手时序到PS-PL高效通信

1. AXI4总线协议基础&#xff1a;从握手信号到通道架构 第一次接触ZYNQ的PS-PL通信时&#xff0c;我被AXI4协议里那些VALID/READY信号搞得头晕眼花。直到在示波器上抓到真实的握手波形&#xff0c;才突然理解这个看似复杂的协议其实像极了我们日常的对话机制——只有当说话方准…...

Swagger2Word终极指南:3种方法实现API文档自动化转换

Swagger2Word终极指南&#xff1a;3种方法实现API文档自动化转换 【免费下载链接】swagger2word 项目地址: https://gitcode.com/gh_mirrors/swa/swagger2word 还在为手动编写API文档而烦恼吗&#xff1f;Swagger2Word为你提供了一站式自动化解决方案&#xff0c;将Swa…...

Source Han Serif CN:企业级开源字体终极实战指南

Source Han Serif CN&#xff1a;企业级开源字体终极实战指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在当今数字化时代&#xff0c;企业面临字体选择的两难困境&#xff1a;商…...

Arm Neoverse CMN-700互连架构与协议寄存器配置指南

1. Arm Neoverse CMN-700一致性互连架构解析在现代多核处理器设计中&#xff0c;一致性互连网络如同城市交通系统般重要。Arm Neoverse CMN-700作为第二代Coherent Mesh Network解决方案&#xff0c;其架构设计充分考虑了数据中心和边缘计算的严苛需求。与传统的总线或环形拓扑…...

Java 大厂面试 200 题完整版含答案解析

前言本文整理了近两年从阿里、腾讯、字节、美团、京东、拼多多等大厂面试中高频出现的 200 道 Java 面试题&#xff0c;覆盖 Java 基础、集合、并发、JVM、Spring、MySQL、Redis、消息队列、分布式、场景设计 等核心模块&#xff0c;每题都附有简明扼要的答案解析&#xff0c;助…...

小红书无水印下载工具XHS-Downloader:3种使用模式全解析

小红书无水印下载工具XHS-Downloader&#xff1a;3种使用模式全解析 【免费下载链接】XHS-Downloader 小红书&#xff08;XiaoHongShu、RedNote&#xff09;链接提取/作品采集工具&#xff1a;提取账号发布、收藏、点赞、专辑作品链接&#xff1b;提取搜索结果作品、用户链接&a…...

Go语言实现跨平台系统更新检查器:自动化运维与安全监控实践

1. 项目概述&#xff1a;一个被低估的系统运维“哨兵”在服务器和桌面系统的日常运维中&#xff0c;有一个场景大家一定不陌生&#xff1a;某天&#xff0c;你管理的服务器突然因为一个已知漏洞被攻击&#xff0c;事后排查发现&#xff0c;相关的安全补丁其实在几周前就已经发布…...

dotai:将AI大模型无缝集成到Shell终端的智能助手工具

1. 项目概述&#xff1a;当AI遇上你的终端如果你是一个重度命令行用户&#xff0c;每天在终端里敲击着ls、cd、git commit这些命令&#xff0c;有没有那么一瞬间&#xff0c;希望有个助手能帮你自动补全、解释命令&#xff0c;甚至直接帮你写出复杂的管道操作&#xff1f;dotai…...

基于 Next.js 的无头电商架构实战:从 Vercel Commerce 看现代全栈开发

1. 项目概述&#xff1a;一个面向未来的全栈电商起点如果你最近在琢磨着用 Next.js 搞一个电商网站&#xff0c;或者想找一个现代、开箱即用的全栈电商模板来启动项目&#xff0c;那你大概率已经听说过vercel/commerce这个仓库了。它不是某个具体的电商平台&#xff0c;而是一个…...

DLP/SLA光固化3D打印技术解析与Ember打印机实战指南

1. DLP/SLA 3D打印技术深度解析&#xff1a;从光与树脂的对话说起如果你是从FDM&#xff08;熔丝制造&#xff09;打印转向树脂打印的&#xff0c;那感觉就像从开手动挡卡车换到了开精密数控机床。DLP&#xff08;数字光处理&#xff09;和SLA&#xff08;立体光刻&#xff09;…...