首页 > 其他分享 >opencv保姆级讲解-人脸识别(5)

opencv保姆级讲解-人脸识别(5)

时间:2024-11-05 18:15:47浏览次数:6  
标签:人脸识别 image cv2 locations face opencv 人脸 讲解 recognition

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)
#



标签:人脸识别,image,cv2,locations,face,opencv,人脸,讲解,recognition
From: https://blog.csdn.net/m0_74994555/article/details/143508533

相关文章

  • opencv保姆级讲解——图像预处理(3)
    图像滤波所为图像滤波通过滤波器得到另一个图像什么是滤波器在深度学习中,滤波器又称为卷积核,滤波的过程成为卷积卷积核概念卷积核大小,一般为奇数,如3*35*57*7为什么卷积核大小是奇数?原因是:保证锚点在中间,防止位置发生偏移的原因卷积核大小的影响在深度学习中,卷积......
  • 【计算机毕设选题推荐】基于springboo大学生就业系统的设计与实现 【附源码+部署+讲解
    ✍✍计算机毕设编程指导师**⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java、Python、小程序、大数据实战项目集⚡⚡文末获取......
  • windows安装cmake、opencv、qt
    配置工具1、准备好我们的安装包:2、创建一个不含中文路径文件夹:3、双击cmake安装包:(安装过程略过)勾选选择的时候注意可以选择自动添加到环境变量。安装完成后可以通过win+R键输入cmake-gui.exe去检验环境变量是否配置成功,如果可以打开则配置成功。4、双击opencv-3.4......
  • 冒泡排序与选择排序超详细讲解
    冒泡排序与选择排序冒泡排序condition:输入5个数字,冒泡排序,逆序输出#include<stdio.h>intmain(){ intuserInput,tmp,i,j,arr[6],flag; flag=0; for(inti=0;i<5;i++){ scanf("%d",&userInput); arr[i]=userInput; }//依次输入五个数字 for(inti=0;i<4;i++){//......
  • C++ OpenCv二值化找圆心坐标
    思路:图像转为灰度图,然后二值化得到只有0或255的点坐标,此处圆是黑点,所以添加所有像素值为0的坐标。在这些坐标中找到圆上最左边、最顶端、最右边、最底端的四个点,这时可求出圆心坐标。 .cpp文件#include<opencv2/opencv.hpp>#include<iostream>#include<cstdlib>#include......
  • 基于大数据 Python短视频推荐系统(源码+LW+部署讲解+数据库+ppt)
    !!!!!!!!!选题不知道怎么选不清楚自己适合做哪块内容都可以免费来问我避免后期給自己答辩找麻烦增加难度(部分学校只有一次答辩机会没弄好就延迟毕业了)会持续一直更新下去有问必答一键收藏关注不迷路源码获取:https://pan.baidu.com/s/1aRpOv3f2sdtVYOogQjb8jg?pwd=jf1d提取码:......
  • 艾卡货车救援系统(源码+文档+部署+讲解)
    本文将深入解析“货车救援系统”的项目,探究其架构、功能以及技术栈,并分享获取完整源码的途径。系统概述货车救援系统是一款专为货车司机和救援服务提供商设计的管理平台,旨在通过集成救援服务管理、合作项目管理、用户管理等功能模块,提高救援服务的效率和响应速度。系统包括管理端和......
  • 细嗦Transformer(三):准备训练,讲解及代码实现优化器、学习率调整策略、正则化和KL散度损
    文章目录关注我:细嗦大模型批处理对象/BatchesandMasking训练循环主函数/TrainingLoop优化器/Optimizer学习率调整策略/Learningrateadjustmentstrategy样例测试正则化/RegularizationLabelsmoothing标签平滑KL散度损失样例测试Github完整代码----求......
  • opencv 图像预处理(一) python笔记
    图像预处理​在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV提供了许多图像预处理的函数和方法,以下是一些常见的图像预处理操作:图像空间转换图像大小调整图像仿射变换图像翻转图像裁剪图像二值......
  • 基于matlab的人脸识别系统设计与仿真
    第一章绪论本章提出了本文的研究背景及应用前景。首先阐述了人脸图像识别意义;然后介绍了人脸图像识别研究中存在的问题;接着介绍了自动人脸识别系统的一般框架构成;最后简要地介绍了本文的主要工作和章节结构。1.1研究背景自70年代以来.随着人工智能技术的兴起.以及人类视觉......