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

Haar cascade训练人脸小模型做人脸辨别

代码讲解

1. 导入必要的库
import cv2
import os
from pathlib import Path
import shutil
import numpy as np
import logging
  • cv2: OpenCV 库,用于图像处理和计算机视觉。
  • os: 提供了一种便携的方式使用操作系统依赖的功能。
  • pathlib.Path: 提供了对象导向的路径处理方法。
  • shutil: 提供了高级文件操作,如复制、移动文件等。
  • numpy: 用于处理数组和矩阵的计算。
  • logging: 提供了记录日志的功能。
2. 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

设置日志的基本配置,使得程序可以记录信息级别的日志。

3. 加载 Haar cascade 模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

加载 OpenCV 预训练的 Haar cascade 分类器,用于检测图像中的人脸。

4. 定义文件夹
REFERENCE_DIR = "reference"
NO_MATCH_DIR = "no_match"
os.makedirs(REFERENCE_DIR, exist_ok=True)
os.makedirs(NO_MATCH_DIR, exist_ok=True)

定义参考图像文件夹和不匹配图像的存放文件夹,并确保这些文件夹存在。

5. 加载训练数据集
training_data = []
labels = []def load_training_data(training_dir):label = 0  # 假设只有一个参考人物for root, _, files in os.walk(training_dir):for file in files:if file.endswith(".jpg") or file.endswith(".png"):path = os.path.join(root, file)image = cv2.imread(path, cv2.IMREAD_GRAYSCALE)  # 直接读取为灰度图if image is not None:training_data.append(image)labels.append(label)

遍历指定的训练数据文件夹,加载所有 .jpg.png 图片,并将它们转换为灰度图存储在 training_data 列表中,标签统一为 0(假设只有一个参考人物)。

6. 训练人脸识别器
def train_recognizer(training_data, labels):recognizer = cv2.face.LBPHFaceRecognizer_create()recognizer.train(training_data, np.array(labels))return recognizer

使用 Local Binary Patterns Histograms (LBPH) 方法训练人脸识别器。

7. 检测图像中的人脸
def detect_faces(image):gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)face_rects = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))return face_rects

检测传入图像中的人脸位置,并返回人脸矩形框。

8. 识别图像中的人脸
def recognize_face(recognizer, image):gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 确保图像为灰度图face_rects = detect_faces(image)if len(face_rects) > 0:for (x, y, w, h) in face_rects:roi_gray = gray[y:y+h, x:x+w]  # 使用灰度图label, confidence = recognizer.predict(roi_gray)return label, confidencereturn None, None

使用训练好的人脸识别器来识别图像中的人脸,并返回标签和置信度。

9. 处理单张图片
def process_image(png_file, recognizer, threshold=100):try:image = cv2.imread(str(png_file))if image is None:raise FileNotFoundError(f"Could not load image from {png_file}")label, confidence = recognize_face(recognizer, image)if label is not None and confidence < threshold:logging.info(f"{png_file.name} belongs to the target person.")else:logging.info(f"{png_file.name} does not belong to the target person.")destination = Path(NO_MATCH_DIR) / png_file.nameshutil.move(str(png_file), str(destination))  # 移动不匹配的图片except Exception as e:logging.error(f"Error processing {png_file.name}: {str(e)}")

处理单张图片,识别其中的人脸,如果识别结果的置信度低于阈值,则移动该图片到 NO_MATCH_DIR 文件夹。

10. 处理文件夹中的所有 .png 图片
def process_images(directory, recognizer):directory_path = Path(directory)png_files = list(directory_path.glob('*.png'))for png_file in png_files:process_image(png_file, recognizer)

遍历指定目录下的所有 .png 文件,并逐一处理。

11. 主程序入口
if __name__ == "__main__":# 加载训练数据集load_training_data(REFERENCE_DIR)# 训练人脸识别器recognizer = train_recognizer(training_data, labels)# 处理目标文件夹中的图片input_directory = 'images'  # 请确保这个路径是正确的process_images(input_directory, recognizer)

主程序入口,加载训练数据集,训练人脸识别器,并处理指定目录下的所有图片。

总结

这段代码实现了从一个包含参考人物的图像文件夹中加载数据,训练一个简单的人脸识别器,然后用这个识别器去识别另一个文件夹中的图片,并将不匹配的图片移动到另一个文件夹中。通过这种方式,可以有效地对大量图片进行分类处理。

相关文章:

Haar cascade训练人脸小模型做人脸辨别

代码讲解 1. 导入必要的库 import cv2 import os from pathlib import Path import shutil import numpy as np import loggingcv2: OpenCV 库&#xff0c;用于图像处理和计算机视觉。os: 提供了一种便携的方式使用操作系统依赖的功能。pathlib.Path: 提供了对象导向的路径处…...

DBA | 如何将 .mdf 与 .ldf 的数据库文件导入到SQL Server 数据库中?

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 原文链接&#xff1a;DBA | 如何将 .mdf 与 .ldf 的数据库文件导入到SQL Server 数据库中? 如何将 (.mdf) 和 (.ldf) 的SQL Server 数据库文件导入到当前数据库中? Step 1.登录到 Sql Server 服…...

【差分数组】个人练习-Leetcode-3229. Minimum Operations to Make Array Equal to Target

题目链接&#xff1a;https://leetcode.cn/problems/minimum-operations-to-make-array-equal-to-target/description/ 题目大意&#xff1a;给出两个数组nums[]和target[]&#xff0c;可以对nums[]数组进行这样两种操作 给某个区间内的子列全加1给某个区间内的子列全减1 求…...

HTML5--裸体回顾

免责声明&#xff1a;本文仅做分享~ 详情请参考以下&#xff1a; HTML 系列教程 (w3school.com.cn) 菜鸟教程 - 学的不仅是技术&#xff0c;更是梦想&#xff01; --本文是光秃秃的空壳. 标题标签 段落标签 换行和水平线 文本格式化标签 &#xff08;一般用左边的&#xff…...

【网络安全】CVE-2024-46990: Directus环回IP过滤器绕过实现SSRF

未经许可,不得转载。 文章目录 背景漏洞详情受影响版本解决方案背景 Directus 是一款开源 CMS,提供强大的内容管理 API,使开发人员能够轻松创建自定义应用程序,凭借其灵活的数据模型和用户友好的界面备受欢迎。然而,Directus 存在一个漏洞,允许攻击者绕过默认的环回 IP …...

问:JVM的垃圾收集算法你知道哪些,有什么区别?

GC&#xff08;垃圾回收器&#xff09;的概念 GC&#xff0c;即垃圾回收&#xff08;Garbage Collection&#xff09;&#xff0c;是计算机程序中一种自动管理内存的机制。其目的是自动回收不再被使用的对象所占用的内存空间&#xff0c;从而避免内存泄漏和内存溢出&#xff0…...

Python selenium库学习使用实操四

系列文章目录 Python selenium库学习使用实操 Python selenium库学习使用实操二 Python selenium库学习使用实操三 文章目录 系列文章目录[TOC](文章目录) 前言一、元素获取二、选项解析总结 前言 在Python selenium库学习使用实操二中提到了下拉框的操作&#xff0c;一种是标…...

用Go开发跨平台GUI

本篇内容是根据2023年3月份#271 Cross-platform graphical user interfaces音频录制内容的整理与翻译 这一期与 Wails 和 Fyne 的创建者一起深入研究为不同架构和操作系统编写 Go 代码。 译者注: Wails的作者是在澳大利亚悉尼的威尔士人,github头像是威尔士的旗帜,Wails也是Wa…...

云原生开发 - 工具镜像(简约版)

在微服务和云原生环境中&#xff0c;容器化的目标之一是尽可能保持镜像小型化以提高启动速度和减少安全风险。然而&#xff0c;在实际操作中&#xff0c;有时候需要临时引入一些工具来进行调试、监控或问题排查。Kubernetes提供了临时容器&#xff08;ephemeral containers&…...

Mac 电脑pink 后端ip地址进行本地联调

文章目录 0: 使用ping 192.39.192.180查看是否能ping通1:点击访达2:在访达里面 shift commit g 打开前往路径的窗口3:在窗口中输入地址/private/etc/hosts4:打开hosts文件 添加后端地址&#xff08;如&#xff1a;192.39.192.180 localhost:80805:保存 后端ip为192.39.192.180…...

iPhone使用指南:如何在没有备份的情况下从 iPhone 恢复已删除的照片

本指南将向您展示如何在没有备份的情况下从 iPhone 恢复已删除的照片。我们所有人在生活中的某个时刻都一定做过一些愚蠢的事情&#xff0c;例如从手机或电脑中删除一些重要的东西。这是很自然的&#xff0c;没有什么可羞耻的。您可能在辛苦工作一天后回来。当突然想看一些照片…...

黑马程序员 javaWeb基础学习,精细点复习【持续更新】

文章目录 WEB开发一、HTML1.html介绍 二、CSS1.CSS介绍2.CSS导入方式3.CSS选择器4.CSS属性 三、JavaScript1.介绍2.浏览器3.js的三种输出方式4.js定义变量5.js数据类型6.js运算符7.全局函数8.函数定义9.js数组对象10.js正则对象11.字符串对象12.自定义对象13.BOM浏览器对象模型…...

【C++设计模式】行为型模式:中介者模式

行为型模式&#xff1a;中介者模式 中介者模式通过引入一个中介者对象来集中控制对象之间的交互。这样可以解耦多个对象之间的复杂交互关系&#xff0c;使系统更易于维护和扩展。 假设我们有一个简单的聊天室应用&#xff0c;其中有每个用户可以发送群聊消息给其他用户&#…...

关于C语⾔内存函数 memcpy memmove memset memcmp

memcpy使⽤和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 这个函数在遇到 \0 的时候并不会停下来。 如果source和destination有任何的重叠&am…...

华为---Super VLAN简介及示例配置

目录 1. Super VLAN技术产生背景 2. Super VLAN概念 3. Super VLAN应用场景 4. Super VLAN工作原理 5. Super-VLAN主要配置命令 6. Super-VLAN主要配置步骤 7. 示例配置 7.1 示例场景 7.2 网络拓扑 7.3 配置代码 7.4 代码解析 7.5 测试验证 1. Super VLAN技术产生背…...

PHP 中浮点数 array_sum 求和精度丢失问题

首先给定一个数组&#xff1a; // 该数组中&#xff0c;amount 为 float/double 或 string 不影响结果 $arr [[amount > 1493.66],[amount > 1493.66],[amount > 1493.66] ];求和&#xff1a; $amount array_sum(array_column($arr, amount));我们已知晓的结果如下…...

llava1.5论文阅读

Improved Baselines with Visual Instruction Tuning 通过视觉指令微调增强的基线方法 论文摘要&#xff1a; 我们发现&#xff0c;LLaVA中的全连接视觉语言连接器非常强大且数据效率高。 3.3 数据和模型的scaling 受到将线性投影转变为多层感知机&#xff08;MLP&#xff0…...

【学术会议投稿链接】React前端框架:构建现代Web应用的强大工具

【即将截稿】第五届经济管理与大数据应用国际学术会议&#xff08;ICEMBDA 2024&#xff09;_艾思科蓝_学术一站式服务平台 更多学术会议请看&#xff1a;https://ais.cn/u/nuyAF3 目录 引言 一、React简介 二、React的核心概念 1. 组件化 2. 虚拟DOM&#xff08;Virtua…...

Linux: network: tcp: sk_tx_skb_cache;4.18.0-283.el8;多分配内存

最近看一个问题,发现下面这个添加cache的commit,在4.18.0-283.el8版本被拿进来到RHEL8。 commit 472c2e07eef045145bc1493cc94a01c87140780a Author: Eric Dumazet <edumazet@google.com> Date: Fri Mar 22 08:56:39 2019 -0700tcp...

电脑报错msvcp100.dll丢失怎么办?这些方法快速修复

在Windows操作系统中&#xff0c;msvcp100.dll是一个重要的动态链接库文件&#xff0c;属于Microsoft Visual C 2010 Redistributable Package的一部分。这个文件提供了C标准库功能&#xff0c;许多应用程序依赖它来运行。如果msvcp100.dll文件丢失或损坏&#xff0c;可能会导致…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...