实时监控图像中的人脸识别:理解人脸识别技术指南

点击下方卡片,关注“小白玩转Python”公众号

在当今的数字时代,人脸识别技术已经成为一个关键技术,它正在从安全到个性化体验等多个领域进行革新。从门禁控制到考勤系统,再到走失儿童的检测,人脸识别的应用非常广泛,涵盖了安全、教育和公共安全领域。然而,在不同的条件下准确识别人脸面临着一系列独特的挑战。在本指南中,我们将深入探讨人脸识别的复杂性,探索使用Python和先进的机器学习工具来确保强大的识别和验证的技术。

理解人脸识别

人脸识别技术利用先进的算法分析和比较从图像或视频片段中提取的面部特征,从而实现个人的识别和验证。提供的Python代码展示了人脸识别的实现。让我们探索代码的主要组成部分,以深入了解该过程。

1. 导入库:

在本节中,导入了执行各种任务所需的库,如面部检测、图像处理、数据增强和人脸识别。

import face_recognition
import cv2
import numpy as np
from deepface import DeepFace
from utils import apply_blur, generate_unique_random_numbers, find_cosine_distance_helper
from utils import apply_resize
from utils import augment_data, face_distance
import os
from PIL import Image
from mtcnn.mtcnn import MTCNN
import random

2. 数据集准备:

数据集准备阶段涉及遍历包含已知个人图像的目录(known_people_dir)。对于每个人,代码在train_dataset目录中创建一个输出目录。然后加载每张图像,使用MTCNN(多任务级联卷积网络)模型检测面部,裁剪检测到的面部区域,并将其保存在相应的输出目录(known_people_train_dir)中。此外,还应用了模糊、调整大小和应用随机变换等数据增强技术,以增加数据集的多样性并增强人脸识别系统的鲁棒性。

for person_name in os.listdir(known_people_dir):person_dir = os.path.join(known_people_dir, person_name)if os.path.isdir(person_dir):output_person_dir = os.path.join("train_dataset", person_name)os.makedirs(output_person_dir, exist_ok=True)for filename in os.listdir(person_dir):image_path = os.path.join(person_dir, filename)image = cv2.imread(image_path)faces = mtcnn.detect_faces(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))if faces:for face in faces:x, y, w, h = face['box']left = max(x, 0)top = max(y, 0)right = min(x + w, image.shape[1])bottom = min(y + h, image.shape[0])if right > left and bottom > top:output_face_path = os.path.join(output_person_dir, f"{filename}.jpg")cv2.imwrite(output_face_path, image)# Apply data augmentationapply_blur(output_face_path, output_folder=output_person_dir)apply_resize(output_face_path, output_folder=output_person_dir)augment_data(output_face_path, output_folder=output_person_dir, face_coordinates=(left, top, right, bottom), prefix=filename)

4997342e571a44dd250bd5cd127028ef.png

训练数据集

3. 检测面部:

使用MTCNN(多任务级联卷积网络)模型进行面部检测,该模型能够检测图像中的面部。然后使用检测到的面部进行进一步处理。

# Detect faces in the image using MTCNN
faces = mtcnn.detect_faces(rgb_image)

4. 提取边界框坐标:

# Get the bounding box coordinates of the face
x, y, w, h = face['box']
# Ensure that the bounding box coordinates are valid
left = max(x, 0)
top = max(y, 0)
right = min(x + w, image.shape[1])
bottom = min(y + h, image.shape[0])

ce7d23a0692ff02f38b06d107de21c52.png

5. 图像增强:

对提取的面部图像应用模糊、调整大小和随机变换等数据增强技术,以增强数据集的多样性。

i. 随机变换

def augment_data(original_image_path, output_folder, face_coordinates, num_augmented_images=3, should_add_jitter=True, prefix=""):# Load the original imageoriginal_image = Image.open(original_image_path)# Convert face image to grayscaleface_image_gray = original_image.convert('L')# Define torchvision transforms for data augmentationdata_transforms = transforms.Compose([transforms.RandomHorizontalFlip(),transforms.RandomRotation(degrees=15),transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),transforms.ToTensor(),])# Apply data augmentation and save augmented imagesfor i in range(num_augmented_images):# Apply different transformations to each augmented imagetransformed_image = data_transforms(face_image_gray)augmented_image_path = os.path.join(output_folder, f"{prefix}augmented_{i + 1}.jpg")transforms.ToPILImage()(transformed_image).save(augmented_image_path)print(f"Augmented image {i + 1} saved to {augmented_image_path}")

345977d0d783967f04cca319564b670b.png

ii. 调整大小和模糊

def apply_blur(image_path, output_folder, kernel_size=(7, 7)):# Load the imageimage = cv2.imread(image_path)# Apply Gaussian blurblurred_image = cv2.GaussianBlur(image, kernel_size, 0)# Save the blurred imagefilename = os.path.basename(image_path)output_path = os.path.join(output_folder, f"blurred_{filename}")cv2.imwrite(output_path, blurred_image)print(f"Blurred image saved to {output_path}")def apply_resize(image_path, output_folder, target_size=(256, 256)):# Load the imageimage = cv2.imread(image_path)# Resize the imageresized_image = cv2.resize(image, target_size)# Save the resized imagefilename = os.path.basename(image_path)output_path = os.path.join(output_folder, f"resized_{filename}")cv2.imwrite(output_path, resized_image)print(f"Resized image saved to {output_path}")

3b817f71cb5d60c87e08b1a707f95042.png

6. 在训练目录中存储增强图像:

处理后的图像,包括裁剪的面部、模糊的面部和增强的图像,存储在训练目录(train_dataset)中。这种目录结构便于访问训练数据,以构建人脸识别模型。

# Save the face image
cv2.imwrite(output_face_path, image)
# Apply data augmentation on the face image
apply_blur(output_face_path, output_folder=output_person_dir)
apply_resize(output_face_path, output_folder=output_person_dir)
augment_data(output_face_path, output_folder=output_person_dir,face_coordinates=(left, top, right, bottom),prefix=filename)

7. 从训练数据集中编码已知面部:

代码遍历我们指定的训练数据集目录中的目录,称为known_people_train_dir。在每个代表特定个人的目录中,它处理每个图像文件。代码验证每个图像文件的有效性,加载它,并使用高级技术提取面部特征。这些特征被编码成数值向量,称为面部编码,使用DeepFace.represent函数。这些编码以及相应的人名然后被添加到列表中以进行进一步处理。

通过将增强数据与原始图像结合,我们的模型训练数据集变得更加丰富和多样化,从而在不同条件和环境中提高了人脸识别的准确性和鲁棒性。

for person_name in os.listdir(known_people_train_dir):person_dir = os.path.join(known_people_train_dir, person_name)# Check if it's a directoryif os.path.isdir(person_dir):# Iterate over each file in the person's directoryfor filename in os.listdir(person_dir):image_path = os.path.join(person_dir, filename)print(image_path)# Check if the file is a valid image filetry:with Image.open(image_path) as img:img.verify()  # Attempt to open and verify the image file# Load the image fileperson_image = face_recognition.load_image_file(image_path)# Encode the face in the image-face_encoding = DeepFace.represent(person_image,model_name="Dlib",detector_backend="mtcnn", enforce_detection=False)# Append the face encoding and name to the respective listsknown_face_encodings.append(np.array(face_encoding[0]['embedding']))known_face_names.append(person_name)except (IOError, SyntaxError,IndexError):# Ignore any files that are not valid image filescontinue

8. 人脸识别循环:

在人脸识别循环中,程序不断从网络摄像头捕获帧,确保实时人脸识别。为了优化处理速度,每个帧都被调整大小,减少了计算负载而不影响准确性。使用MTCNN面部检测模型,程序在帧内识别面部,对其特征进行编码以进行比较。

# Continuous capture of frames from the webcam
while True:ret, frame = video_capture.read()
# Resize each frame for optimized processing speedsmall_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)# Using MTCNN for face detectionrgb_small_frame = small_frame[:, :, ::-1]result1 = DeepFace.represent(rgb_small_frame, model_name="Dlib", detector_backend="mtcnn", enforce_detection=False)# Encoding features of detected faces for comparisonface_locations = [(res['facial_area']['y'], res['facial_area']['x'] + res['facial_area']['w'], res['facial_area']['y'] + res['facial_area']['h'], res['facial_area']['x']) for res in result1]face_encodings = [res['embedding'] for res in result1]

通过计算检测到的面部和训练数据集中已知面部之间的余弦距离,程序确定潜在的匹配项。

# Calculating cosine distances between detected faces and known faces
for f_encoding in face_encodings:face_distances = find_cosine_distance_helper(known_face_encodings, f_encoding)best_match_index = np.argmin(face_distances)if face_distances[best_match_index] <= 0.07:name = known_face_names[best_match_index]else:name = "Unknown"     face_names.append(name)

9. 显示结果:

检测到的面部显示在视频流中,包括相应的名称(如果识别出来,否则为“未知”)。在面部周围绘制矩形框,并在每个面部下方添加标签,以便于识别。

# Draw a bounding box around the face
cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
# Draw a label with a name below the face
cv2.putText(frame, text, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)
# Display the resulting image
cv2.imshow('Video', frame)

输出

人脸识别系统使用网络摄像头在实时面部检测和识别任务中取得了显著的性能。它能够准确识别已知个人,并以良好的精度进行标记,并将未知面部适当地标记为“未知”。系统以高置信度运行,提高了其可靠性和可用性。在Salman的图像上训练的模型准确地识别了他在监控录像中的面部。

1cad32b23f8b2e6f1b4e8d39f34fd7b7.png

当遇到不在数据集中的Amitabh的图像时,它被适当地标记为“未知”。

d7b22aacb519834c705cf4315a0530cd.png

·  END  ·

🌟 想要变身计算机视觉小能手?快来「小白玩转Python」公众号!

回复Python视觉实战项目,解锁31个超有趣的视觉项目大礼包!🎁

871e6eb231e64eabc193655a94979625.png

本文仅供学习交流使用,如有侵权请联系作者删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1549352.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL的安装(环境为CentOS云服务器)

卸载内置环境 我们初期使用root账号&#xff0c;后期再切换成普通账号 使用 ps axj | grep mysql 查看系统中是否有MySQL相关的进程 使用 systemctl stop mysqld 关停进程 使用 rpm -qa | grep mysql 查看MySQL相关的安装包 使用 rpm -qa | grep mysql | xargs yum -y remo…

基于php的酒店管理系

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

力扣 滑动窗口最大值

滑动窗口最大值 题目描述 题目分析 维护一个定长窗口的最大值&#xff0c;每当窗口滑动时都有一个新的元素进入和一个原有的元素离开。 比较简单的方法就是用一个优先队列维护窗口最大值 但是堆的计算成本时最坏时是 O ( n log ⁡ n ) O(n\log n) O(nlogn) 优化&#xff1a;…

MySQL 性能剖析全攻略

在使用 MySQL 数据库的过程中&#xff0c;性能问题往往是让开发者和管理员头疼的难题。为了有效地解决这些问题&#xff0c;我们需要对 MySQL 进行性能剖析。那么&#xff0c;如何在 MySQL 中进行性能剖析呢&#xff1f;本文将为你详细介绍。 一、为什么要进行性能剖析&#x…

实施自动化测试的五个条件

摘要&#xff1a; 谈到什么是组成一次自动化测试的“恰当实施”经常会关注你需要用的工具&#xff0c;但是那仅仅是等式的一部分。巴斯 迪杰斯特拉详细说明了你需要考虑的其他四件事&#xff0c;他们如何致力于你的自动化测试的成功&#xff0c;以及关联到不能适当关注它们中任…

MNIST手写数字数据集

数据集 官网链接失效&#xff0c;我找到数据集后&#xff0c;上传到码云&#xff0c;并在这里分享。 打开链接&#xff0c;进入如下目录&#xff0c;即可找到如下八个文件&#xff1a; 下面是一些可有可无的介绍。 Mnist数据集介绍 Mnist数据集包含70000张手写数字图片&#x…

5G NR 协议规范表(对应3GPP 协议编号)

文章目录 5G NR 协议规范表&#xff08;对应3GPP 协议编号&#xff09;5G 架构相关协议5G 新空口相关协议无线接入网相关协议终端相关协议 5G NR 协议规范表&#xff08;对应3GPP 协议编号&#xff09; 5G 架构相关协议 5G 新空口相关协议 无线接入网相关协议 终端相关协议

Woocommerce怎么分类显示产品?如何将Shopify的产品导入到Woocommerce?

WooCommerce作为WordPress的一个电子商务插件&#xff0c;功能强大、使用简洁&#xff0c;能够轻松集成到WordPress网站中&#xff0c;为用户提供了一个完整的在线商店解决方案&#xff0c;在国外还是挺受欢迎的。 Woocommerce怎么分类显示产品&#xff1f; 在Woocommerce中&a…

[ComfyUI]Flux:太美了!古风华服与现代DJ演绎。灼灼荷花瑞,亭亭出水中

大家好我是安琪&#xff01;&#xff01;&#xff01; F.1-汉服人像艺术-国风-氛围感 简介 今天介绍一款Flux LORA模型&#xff1a;F.1-汉服人像艺术-国风-氛围感-liangyi&#xff0c;这是一款以古代汉服女性写真为主题的Flux LORA模型。属于人物主体&#xff0c;增加中国传统…

国庆头像制作小程序相关代码

↓↓ 点击下方搜索开始制作您的专属头像 ↓↓ 发现-》搜一搜-》最美易飞证件照制作 国庆头像自定义头像制作、微信头像直接获取制作小程序源码 index.wxml文件代码 // pages/userPhoto/userPhoto.js//获取应用实例const app getApp()import { Router} from ../../utils/ro…

23款奔驰E300立标升级23P智能辅助驾驶案例分享

《23 款奔驰 E300 立标升级 23P 智能辅助驾驶案例》 在汽车科技不断进步的今天&#xff0c;越来越多的车主开始追求更加智能、安全的驾驶体验。今天&#xff0c;我们就为大家带来一款 23 款奔驰 E300 立标升级 23P 智能辅助驾驶的精彩案例。 这辆 23 款奔驰 E300 立标原本就散…

C# Blazor Server 调用海康H5Player播放摄像头画面

目标 调用海康综合安防平台api&#xff0c;通过摄像头的cameraIndexCode调用【获取监控点预览取流URLv2】api&#xff0c;得到websocket 的url&#xff0c;然后在blazor server中使用htplayer.js播放摄像头实时画面。 步骤 根据摄像头名字&#xff0c;调用【查询监控点列表v2…

Python编码系列—Python命令模式:将请求封装为对象

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

CentOS8.5.2111(3)实验之DHCP服务器架设

一、实验目标 1&#xff0e;掌握DHCP服务器的主配置文件各项申明参数及操作及其含义 2. 具备DHCP 服务器、中继服务器的配置能力 3. 具备测试客户端正常获取服务器分配地址的能力 4. 具备DHCP服务器故障排除能力 二、实训原理/流程 &#xff08;一&#xff09;项目背景 …

python爬虫案例——抓取链家租房信息(8)

文章目录 1、任务目标2、分析网页3、编写代码1、任务目标 目标站点:链家租房版块(https://bj.lianjia.com/zufang/) 要求:抓取该链接下前5页所有的租房信息,包括:标题、详情信息、详情链接、价格 如: 2、分析网页 用浏览器打开链接,按F12或右键检查,进入开发者模式;因…

首屏优化之:SSR(服务端渲染)

引言 今天我们来聊一下首屏优化之SSR-服务端渲染&#xff08;Server-Side Rendering&#xff09;。 可能很多朋友并不了解什么是 SSR&#xff0c;包括在工作中写的网站是什么类型的也不太清楚&#xff0c;是 CSR 还是 SSR&#xff1f;作者在阅读过大量的文章之后&#xff0c;…

一文上手SpringSecurity【二】

书接上回,我们直接引入了spring security的依赖,之后啥也没有干,在访问接口的时候, 就需要认证之后才能访问了 ,咱们没有主动干啥,那肯定有人帮助我们干啥了,这一切都利益出spring boot自动装配机制,下面咱们就看看spring security的自动装配,帮助我们干啥了. 一、Spring Secur…

如何查看上网记录及上网时间?5种按步操作的方法分享!【小白也能学会!】

“知己知彼&#xff0c;百战不殆”&#xff0c;在数字时代&#xff0c;了解自己的上网行为和时长&#xff0c;不仅能帮助我们更好地管理时间&#xff0c;还能提升工作效率和生活质量。 今天&#xff0c;我们就来分享五种简单易懂的方法&#xff0c;即便是网络小白也能轻松学会…

某系统超级管理员密码重置通用型

故事的起因是意外发现某站点系统存在接口泄露&#xff0c;并且此接口可直接实现超级管理员密码重置&#xff0c;查ico找到用这个系统的站点&#xff0c;发现均存在此漏洞 首先打开系统站点&#xff0c;F12或者鼠标右键检查&#xff0c;然后刷新页面&#xff0c;在网络这里找到…

ECCV`24 | 高保真目标修复新SOTA!复旦智象开源CAT-Diffusion,语义视觉双一致

文章链接&#xff1a;https://arxiv.org/pdf/2409.08260 Github链接&#xff1a;https://github.com/Nnn-s/CATdiffusion 总结速览 解决的问题: 单一U-Net在所有去噪步骤中对齐文本提示和视觉对象不足以生成期望的对象。 扩散模型的复杂采样空间中无法保证对对象生成的可控性…