2024-11-5 学习人工智能的Day22 openCV(4)
face_recognition 介绍
face_recognition
是一个非常流行的 Python 库,专门用于人脸识别任务。它基于 dlib 库和 HOG(Histogram of Oriented Gradients)特征以及深度学习模型,提供了简单易用的接口来进行人脸检测、面部特征点定位和人脸识别。face_recognition
库由 Adam Geitgey 开发,旨在简化人脸识别任务,使其更加容易上手。
主要功能
- 人脸检测:
- 检测图像中的人脸位置。
- 支持使用 HOG 特征或 CNN(卷积神经网络)进行人脸检测。
- 面部特征点定位:
- 检测人脸上的关键特征点(如眼睛、鼻子、嘴巴等)。
- 人脸识别:
- 提取人脸的特征向量(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均值聚类)中。
- 计算机视觉: 在人脸识别等任务中,欧几里得距离用于计算特征向量之间的相似度。
- 优化: 在路径规划和优化问题中,计算两点之间的欧几里得距离可以帮助寻找最短路径。
欧几里得距离的意义
- 距离越小,相似度越高:
- 特征向量相似:当欧几里得距离越小说明两个特征向量之间的差异越小,即这两个人脸在特征空间中很接近。因此,这两个图像可能是同一个人或者相似度很高。
- 相同身份的概率大:在许多人脸识别系统中,如果计算出的距离小于某个设定的阈值,则系统会认为这两个面孔属于同一个人。
- 距离阈值:
- 匹配判断:通常,系统会设置一个阈值来判断两个特征向量是否属于同一身份。如果计算出的距离小于这个阈值,则认为两张图片中的人脸是相同的;如果距离大于阈值,则认为是不同的身份。
- 误识别率:设置的阈值会影响系统的误识别率(假阳性和假阴性率)。距离阈值的选择需要根据具体应用场景进行调整。
计算人脸匹配程度
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"><
深入了解决策树:机器学习中的经典算法
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
Flutter鸿蒙next 的 Sliver 实现自定义滚动效果
Flutter 提供了一些非常强大的滚动组件,如 ListView、GridView 等,它们可以在滑动时自动处理内容的显示和滚动。但当我们需要更复杂的滚动效果时,Sliver 组件便是一个强大的工具。通过自定义 Sliver,我们可以实现高度定制化的滚动…...
杨中科 .Net Core 笔记 DI 依赖注入
提到依赖不得不提到,控制反转(Inversion of Control,IOC)这个概念,简单的来讲就是将控制对象的权限交给框架,不再手动完成。IOC实现方式有2种: 1、服务定位器(ServiceLocator),主动…...

【RocketMQ】无法访问此网站 http://XXX:10080/ ERR_UNSAFE_PORT
安装完rocketmq-dashboard。打开浏览器访问地址。 问题提示: 无法访问此网站 网址为 http://192.168.22.197:10080/ 的网页可能暂时无法连接,或者它已永久性地移动到了新网址。 ERR_UNSAFE_PORT 无法访问10080端口的网站通常是由于Chrome浏览器的安…...
pipreqs:快速准确生成当前项目的requirements.txt,还有和freeze的对比
大家好,这里是程序员晚枫。 今天给大家推荐一个快速生成requirements.txt的小工具:pipreqs。 什么是requirements.txt? 我们在开发Python项目的时候,需要用到requirements.txt来管理项目中使用的第三方库。 当我们把项目部署到…...
Spark 中的 RDD 分区的设定规则与高阶函数、Lambda 表达式详解
Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…...

redis十大数据类型
文章目录 一、redis字符串(String)set key value同时获取或设置多个键值获取指定区间范围内的值数字增减获取字符串长度和内容追加分布式锁getset(先get再set) 二、redis列表(List)通过索引获取列表中的元素…...
国内AI工具复现GPTs效果详解
国内AI工具复现GPTs效果详解 引言 近年来,随着人工智能技术的飞速发展,大型语言模型(LLM)逐渐成为研究和应用的热点。GPTs(Generative Pre-trained Transformer)系列模型,特别是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,但是在内网使用vscode通过SSH连接虚拟机的centos远程目录却出现了问题,始终连不上,查看原因是centos没有安装vscode-server,网上找各个教程离线安装vscode-code除了浪费时间没有任何收获&am…...

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

【WRF理论第七期】WPS预处理
【WRF理论第七期】WPS预处理 运行WPS(Running the WPS)步骤1:Define model domains with geogrid步骤2:Extracting meteorological fields from GRIB files with ungrib步骤3:Horizontally interpolating meteorologic…...
Flutter鸿蒙next中的按钮封装:自定义样式与交互
在Flutter应用开发中,按钮是用户界面中不可或缺的组件之一。它不仅用于触发事件,还可以作为视觉元素增强用户体验。Flutter提供了多种按钮组件,如ElevatedButton、TextButton、OutlinedButton等,但有时这些预制的按钮样式无法满足…...

代码随想录算法训练营Day57 | 卡玛网 101.孤岛的总面积、卡玛网 102.沉没孤岛、卡玛网 103. 水流问题、卡玛网 104.建造最大岛屿
目录 卡玛网 101.孤岛的总面积 卡玛网 102.沉没孤岛 卡玛网 103. 水流问题 卡玛网 104.建造最大岛屿 卡玛网 101.孤岛的总面积 题目 101. 孤岛的总面积 思路 代码随想录:101.孤岛的总面积 重点: 首先遍历图的四条边,把其中的陆地及…...

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

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...