python图像处理-基于LBP的人脸检测和人脸识别

2024-01-29 09:59

本文主要是介绍python图像处理-基于LBP的人脸检测和人脸识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

python图像处理-基于LBP的人脸检测和人脸识别

主要工作是:
1.了解LBP纹理特征的原理
2.调用OPEN-CV人脸识别库,框出图像中所有的人脸
3.将人脸区域做LBPH,将其计算结果与人脸标签做训练集(H表示直方图)
4.用爬虫爬出两个人的很多图片,构成较为多图片的训练集
5.用训练出来的分类器进行人脸识别


目录

  • python图像处理-基于LBP的人脸检测和人脸识别
  • 1. LBP纹理特征的原理
  • 2.调用OPEN-CV人脸识别库,框出图像中所有的人脸
  • 3. 爬出两个人的很多图片
  • 4.将爬出的图片与标签对应
  • 5.进行分类
  • 6.实例
    • 6.1 图像与标签构成训练集
    • 6.2 进行分类
    • 6.3 利用LBPH读取训练集
    • 6.4 选取测试图片,并进行人脸检测
    • 6.5 人脸识别

头文件:

import numpy as np
import os
import cv2
import matplotlib.pyplot as plt

1. LBP纹理特征的原理

LBP: Local Binary Pattern, 局部二进制模式,是一种用来描述图像局部纹理的算子,它具有旋转不变性和灰度不变性等显著优点。它所提取的特征是局部特征,反映的是每个像素与周围像素的信息。

原始LBP算子:在33的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,33邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共2^8 = 256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。

在这里插入图片描述
圆形LBP算子:基本的 LBP 算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,Ojala 等对 LBP 算子进行了改进,将 3×3 邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点,从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子。
在这里插入图片描述
旋转不变LBP算子:从LBP的定义可以看出,LBP算子是灰度不变的,但却不是旋转不变的。图像的旋转会得到不同的LBP值。Maenpaa等人又将 LBP 算子进行了扩展,提出了具有旋转不变性的 LBP 算子,即不断旋转圆形邻域得到一系列初始定义的 LBP 值,取其最小值作为该邻域的 LBP 值。

在这里插入图片描述
LBP等价模式:一个LBP算子可以产生不同的二进制模式,对于半径为R的圆形区域内含有P个采样点的LBP算子将会产生2^p种模式。随着邻域集内采样点数的增加,二进制模式的种类是急剧增加的。如此多的二值模式无论对于纹理的提取还是对于纹理的识别、分类及信息的存取都是不利的。同时,过多的模式种类对于纹理的表达是不利的。例如,将LBP算子用于纹理分类或人脸识别时,常采用LBP模式的统计直方图来表达图像的信息,而较多的模式种类将使得数据量过大,且直方图过于稀疏。因此,需要对原始的LBP模式进行降维,使得数据量减少的情况下能最好的代表图像的信息。

为了解决二进制模式过多的问题,提高统计性,Ojala提出了采用一种“等价模式”(Uniform Pattern)来对LBP算子的模式种类进行降维。Ojala等认为,在实际图像中,绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变。因此,Ojala将“等价模式”定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。如00000000(0次跳变),00000111(只含一次从0到1的跳变),10001111(先由1跳到0,再由0跳到1,共两次跳变)都是等价模式类。除等价模式类以外的模式都归为另一类,称为混合模式类,例如10010111(共四次跳变)

以上都是些原理,下面是应用和思考:

在skimage库中有local_binary_pattern函数可以直接调用,函数的参数method分别取值为default, ror, uniform分别对应圆形LBP模式,LBP旋转不变模式和LBP等价模式。
下面比较旋转图片在default和ror模式下的提取效果。
原图:
在这里插入图片描述
default模式下的纹理特征提取:
在这里插入图片描述
roc模式下的纹理特征提取:
在这里插入图片描述

默认模式虽然很清楚,但是缺少旋转不变性,因为每旋转一定角度,生成的二进制就会移动,导致二进制数发生很大的变换。所以采用旋转不变性时,不论怎么旋转,都采用最小的值。这样一来,二进制不论怎么平移,都对应着唯一的值。但是这也导致,图像上的每一个点的灰度值都很接近,使图像偏暗。

2.调用OPEN-CV人脸识别库,框出图像中所有的人脸

## 这个函数是做人脸提取的,faces_rect是个四维向量,前两位输出人脸所在位置的左上方坐标,后两位是人类所在宽度
def detect_face(test_img):gray_img = cv2.cvtColor(test_img, cv2.COLOR_BGR2GRAY) # converts color img to grayscale img# the below line loads haar classifierface_haar_cascade = cv2.CascadeClassifier("D:/classofmathpicture/trainingImages/haarcascade_frontalface_default.xml")faces = face_haar_cascade.detectMultiScale(gray_img, scaleFactor = 1.32, minNeighbors = 5) # detectMultiScale returns rectanglesreturn faces, gray_img# 在图片中,在人脸位置上框出人类,并且给它标上text内容
def b_boxes(test_img, face):(x, y, w, h) = facecv2.rectangle(test_img, (x, y), (x + w, y + h), (255, 0, 0), thickness = 1)# 在框边写名字
def put_name(test_img, text, x, y):cv2.putText(test_img, text, (x, y), cv2.FONT_HERSHEY_DUPLEX, 1, (255, 0, 0), 1)

3. 爬出两个人的很多图片

需要放入两个文件夹,方便下面的图片与标签对应
在这里插入图片描述
链接

4.将爬出的图片与标签对应

## 训练函数,输出id(通过文件名)和 每一张图片的人脸部分。都是以链表的形式储存
def labels_train_data(directory):faces = []labels = []for path, subdirnames, filenames in os.walk(directory):for filename in filenames:if filename.startswith("."):print("Skipping system file")continueid = os.path.basename(path) # fetching subdirectory namesimg_path = os.path.join(path, filename) # fetching img pathprint("img_path:", img_path)print("id:", id)test_img = cv2.imread(img_path) # loading each imgif test_img is None:print("Image not loaded properly")continuefaces_rect, gray_img = detect_face(test_img) # calling this fn returns faces detected in particular imgif len(faces_rect) != 1:continue # since we are assuming only single person images are being fed to the classifier(x, y, w, h) = faces_rect[0]roi_gray = gray_img[y : y + w, x : x + h] # cropping region of interest (face area from grayscale image)faces.append(roi_gray)labels.append(int(id))return faces, labels

5.进行分类

# 分类函数  输入某人的人脸图片以及其标签,生产训练集
def train_classifier(faces, labels):face_recognizer = cv2.face.LBPHFaceRecognizer_create()face_recognizer.train(faces, np.array(labels))return face_recognizer

利用下面的LBPH提取人脸纹理直方图特征,进行分类,并记录在新的XML文件中。还可以用其他的特征提取算法:
在这里插入图片描述

6.实例

6.1 图像与标签构成训练集

faces, labels = labels_train_data("D:/classofmathpicture/wu")

文件夹应该是下图,0放入一个人的图片;1放入另一个人的图片。可以通过爬虫找图片
在这里插入图片描述

6.2 进行分类

#进行分类
face_recognizer = train_classifier(faces, labels)
#生成yml文件
face_recognizer.write("D:/classofmathpicture/trainingData.yml")

6.3 利用LBPH读取训练集

# 读取训练集,输出face_recognizer参数
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
face_recognizer.read("D:/classofmathpicture/trainingData.yml")

6.4 选取测试图片,并进行人脸检测

# 选取测试图片
test_img = cv2.imread("D:/classofmathpicture/wulei_test4.png",1) # test img path
test_img = cv2.cvtColor(test_img, cv2.COLOR_BGR2RGB)
faces_detected, gray_img = detect_face(test_img)
plt.imshow(test_img)

faces_detected是人脸位置,链表数表示已检测人脸数目:
在这里插入图片描述
在这里插入图片描述

6.5 人脸识别

利用图像识别函数求出参数,根据参数识别不同的人脸

##选取最小的confidence值下的人脸作为匹配最接近的,其余判定other
name = {0:"wulei",1:"reba"} # creating dict containing names
for face in faces_detected:(x, y, w, h) = faceroi_gray = gray_img[y:y+h, x:x+w]label, confidence = face_recognizer.predict(roi_gray) # predicting the label of given imageprint("Confidence:", confidence)print("Label:", label)b_boxes(test_img, face)predicted_name = name[label]
#     if confidence>100: # if this is true then it doesn't print predicted face text on screen
#         continueput_name(test_img, predicted_name, x, y)
plt.figure(figsize=(20, 10)); 
plt.imshow(test_img)

在这里插入图片描述

这篇关于python图像处理-基于LBP的人脸检测和人脸识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/656550

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.