基于面部特征提取的实时人脸身份识别与非授权入侵检测系统
笔者为某不知名985非计算机专业学生,假期闲来对CV有点感兴趣,遂做一点小项目,属于自娱自乐,若能帮助到您则感到百般荣幸,若技术上有需要改进的点或者不妥之处,还望各位积极留言!
后续我也会不定期在CSDN上分享我学习CV以及机器学习、深度学习的相关博客,偏实际应用,欢迎大家积极关注!!!感谢!
一、环境准备
为了运行基于面部特征提取的实时人脸身份识别与非授权入侵检测系统,需要准备以下环境:
1.1 系统要求
- 操作系统:Windows、macOS 或 Linux
- Python版本:3.6及以上
1.2 安装依赖库
请确保安装以下Python库:
- OpenCV:用于计算机视觉和人脸检测。
pip install deepface
- DeepFace:用于面部特征提取和人脸识别。
pip install opencv-python-headless
- 其他依赖库:
- NumPy:用于数值计算。
- Tkinter:用于创建警告窗口和用户交互。
二、项目概述
本项目的核心功能是开发一个基于面部特征提取的实时人脸身份识别与非授权入侵检测系统。
该系统旨在通过摄像头实时捕捉并识别用户的面部特征,识别过程中利用DeepFace库进行面部特征提取和比对,从而确保识别的准确性。
2.1 主要用途
- 身份验证:该系统可以用于个人计算机或其他设备的身份验证,确保只有经过授权的用户(如Richard)才能访问设备。
- 安全监控:系统实时监控周围环境,如检测到非授权用户的面部,系统将立即发出警报,从而防止潜在的安全威胁。
- 隐私保护:通过有效的身份识别和入侵检测,该系统可以防止未经授权的人员访问私人信息或设备,提供隐私保护。
2.2 目标
- 高准确度:通过多次采集面部特征并取平均值,提高识别的准确性,避免误识别或漏识别的情况发生。
- 实时处理:系统能够实时处理摄像头捕捉到的画面,迅速做出判断并执行相应的动作,如发出警报或记录检测到的非授权用户面部。
- 用户友好:操作简单,用户只需正对摄像头,系统即可自动完成身份验证和入侵检测过程。
- 扩展性:系统具备良好的扩展性,未来可以结合更多功能模块,如多用户识别、面部表情分析等,以满足更广泛的应用需求。
三、程序设计与实现
在本节中,我们将详细介绍该系统的设计与实现。主要包括人脸检测模块、人脸识别模块以及入侵检测与报警模块。每个模块都会提供相应的代码及其解释,以帮助理解程序的工作原理。
3.1 主要功能概述
本系统由三个主要功能模块组成:
- 人脸检测模块:利用OpenCV进行人脸检测,识别出摄像头画面中的人脸区域。
- 人脸识别模块:使用DeepFace库提取面部特征,并与已注册的用户(如Richard)的特征进行比对,判断是否为授权用户。
- 入侵检测与报警模块:如果检测到非授权用户的面部特征,系统将触发报警并保存相关图像。
3.2 人脸检测模块
在该模块中,我们使用OpenCV的Haar级联分类器来检测摄像头画面中的人脸。以下是代码实现及其解释:
import cv2
# 加载OpenCV的Haar级联人脸检测器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 初始化摄像头
cap = cv2.VideoCapture(0)
# 从摄像头捕获帧并进行人脸检测
ret, frame = cap.read()
faces = face_cascade.detectMultiScale(frame, scaleFactor=1.3, minNeighbors=5, minSize=(30, 30))
# 标识检测到的人脸
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
# 显示结果
cv2.imshow('Face Detection', frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
- CascadeClassifier:加载预训练的Haar级联分类器,用于人脸检测。
- detectMultiScale:检测输入帧中的人脸,scaleFactor调整图像大小,minNeighbors决定每个候选矩形应保留多少个邻近矩形。
- rectangle:在检测到的人脸区域绘制矩形框。
3.3 人脸识别模块
在人脸检测到之后,接下来是提取面部特征并进行比对。本模块使用DeepFace库来实现面部特征的提取和比对。以下是代码实现及其解释:
from deepface import DeepFace
import numpy as np
# 读取并存储Richard的脸部图像
richard_face = frame[y:y + h, x:x + w]
# 使用DeepFace库提取面部特征
richard_embedding = DeepFace.represent(img_path=None, img=richard_face, model_name='VGG-Face', enforce_detection=False)[0]['embedding']
# 多次采集样本进行平均特征值计算(假设已经进行了多次采集)
richard_embeddings = [richard_embedding1, richard_embedding2, richard_embedding3] # 示例
avg_richard_embedding = np.mean(np.array(richard_embeddings), axis=0)
# 检测到的其他人脸
detected_face = frame[y:y + h, x:x + w]
detected_embedding = DeepFace.represent(img_path=None, img=detected_face, model_name='VGG-Face', enforce_detection=False)[0]['embedding']
# 计算两个面部特征向量之间的距离
distance = np.linalg.norm(np.array(avg_richard_embedding) - np.array(detected_embedding))
- DeepFace.represent:使用VGG-Face模型提取面部特征向量。
- np.mean:对多次采集的特征向量求平均,以提高识别的准确性。
- np.linalg.norm:计算两个人脸特征向量之间的欧氏距离,距离越小,表示越相似。
3.4 入侵检测与报警模块
当检测到的面部特征与Richard的面部特征不匹配时,系统会触发报警,并保存非授权用户的面部图像。以下是代码实现及其解释:
import time
import tkinter as tk
from tkinter import messagebox
import os
# 设置警报触发的条件参数
alert_duration = 5 # 触发警报的时间阈值(秒)
max_alerts = 3 # 最大警报次数限制
non_richard_count = 0 # 非Richard脸部出现的计数
start_time = None # 记录非Richard脸部首次出现的时间
warning_count = 0 # 检测到的非Richard脸部计数
# 检测面部特征与Richard特征之间的距离
if distance > 0.8: # 如果距离超过阈值,认为是非授权用户
if start_time is None:
start_time = time.time()
non_richard_count += 1
elapsed_time = time.time() - start_time
# 保存非授权用户的脸部图像
warning_image_path = f"face/warning_face_{warning_count}.jpg"
cv2.imwrite(warning_image_path, detected_face)
warning_count += 1
# 触发报警
if elapsed_time > alert_duration or non_richard_count >= max_alerts:
root = tk.Tk()
root.withdraw()
messagebox.showwarning("警报", "检测到非Richard的脸!")
root.destroy()
non_richard_count = 0
start_time = None
else:
non_richard_count = 0
start_time = None
- distance > 0.8:如果检测到的脸部特征与Richard的特征向量距离超过阈值,触发非授权检测。
- cv2.imwrite:保存非授权用户的脸部图像,方便日后核查。
- messagebox.showwarning:使用Tkinter库弹出警告窗口,提醒用户可能存在的入侵。
3.5 代码优化与性能提升
在实际应用中,为了提高系统的响应速度和准确性,可能需要对代码进行优化,例如:
- 批量处理:避免对每一帧都进行特征提取和比对,而是对一系列帧进行平均处理。
- 利用GPU加速:通过安装CUDA和编译支持CUDA的OpenCV,使用GPU加速图像处理和特征提取过程。
# 安装支持CUDA的OpenCV版本(如果尚未安装)
# pip install opencv-python-headless[opencv-contrib]
# 检查CUDA是否可用
print(cv2.cuda.getCudaEnabledDeviceCount()) # 返回大于0表示支持CUDA
通过CUDA加速,可以大幅提高程序在处理大量图像数据时的速度。
本节详细介绍了系统的各个模块,并通过代码和解释帮助理解各个模块的实现原理。通过这些模块的协同工作,系统能够实现实时人脸识别与非授权入侵检测功能。
四、完整代码展示
import cv2
import numpy as np
from deepface import DeepFace
import time
import tkinter as tk
from tkinter import messagebox
import os
# 加载人脸检测的级联分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 初始化摄像头
cap = cv2.VideoCapture(0)
print("请保持正脸面对摄像头,进行身份识别...")
time.sleep(2)
richard_embeddings = []
num_samples = 5
# 持续检测直到成功采集多张人脸图像并记录特征
for i in range(num_samples):
while True:
ret, frame = cap.read()
faces = face_cascade.detectMultiScale(frame, scaleFactor=1.3, minNeighbors=5, minSize=(30, 30))
if len(faces) > 0:
(x, y, w, h) = faces[0]
richard_face = frame[y:y + h, x:x + w]
temp_image_path = f"richard_temp_{i}.jpg"
cv2.imwrite(temp_image_path, richard_face)
embedding = DeepFace.represent(img_path=temp_image_path, model_name='VGG-Face', enforce_detection=False)[0]['embedding']
richard_embeddings.append(embedding)
os.remove(temp_image_path)
print(f"第{i+1}次采集完成")
break
else:
print("未检测到脸部,请继续保持正脸面对摄像头...")
richard_embedding = np.mean(np.array(richard_embeddings), axis=0)
print("Richard的脸部特征已记录。")
alert_duration = 5
max_alerts = 3
non_richard_count = 0
start_time = None
warning_count = 0
def alert():
root = tk.Tk()
root.withdraw()
messagebox.showwarning("警报", "检测到非Richard的脸!")
root.destroy()
while True:
ret, frame = cap.read()
faces = face_cascade.detectMultiScale(frame, scaleFactor=1.3, minNeighbors=5, minSize=(30, 30))
for (x, y, w, h) in faces:
detected_face = frame[y:y + h, x:x + w]
temp_image_path = "temp_detected_face.jpg"
cv2.imwrite(temp_image_path, detected_face)
detected_embedding = DeepFace.represent(img_path=temp_image_path, model_name='VGG-Face', enforce_detection=False)[0]['embedding']
os.remove(temp_image_path)
distance = np.linalg.norm(np.array(richard_embedding) - np.array(detected_embedding))
if distance > 0.8:
if start_time is None:
start_time = time.time()
non_richard_count += 1
elapsed_time = time.time() - start_time
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.putText(frame, "Warning", (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
warning_image_path = f"face\\warning_face_{warning_count}.jpg"
cv2.imwrite(warning_image_path, detected_face)
warning_count += 1
if elapsed_time > alert_duration or non_richard_count >= max_alerts:
alert()
non_richard_count = 0
start_time = None
else:
non_richard_count = 0
start_time = None
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(frame, "Richard", (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
cv2.imshow('frame', frame)
if cv2.waitKey(5) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
五、实操演示
5.1采集人脸特征
程序运行后:首先采集“主人”并记录人脸特征
程序正在进行多次采集Richard的脸部特征。在该过程中,系统会多次尝试检测人脸,并在检测到人脸后采集其特征。以下是该过程的简要描述:
- 提示信息:程序提示用户“请保持正脸面对摄像头,进行身份识别”,以确保用户正对摄像头,方便系统进行人脸识别。
- 多次采集:程序进行五次人脸采集,每次成功检测到人脸后,都会记录特征,并显示“第X次采集完成”的信息。截图中显示了共五次采集过程。
- 检测过程:在采集过程中,如果未检测到人脸,程序会提示“未检测到脸部,请继续保持正脸面对摄像头…”,并等待用户调整姿势直到成功检测到人脸。
- 特征记录完成:在完成五次采集后,程序显示“Richard的脸部特征已记录”,表示已经成功将采集到的面部特征进行平均处理并存储下来。
5.2 实时人脸身份识别
在该实时人脸身份识别系统中,程序通过摄像头不断捕捉用户的面部图像,并实时进行识别。以下是程序运行过程的简要描述:
-
实时识别:
- 程序进入实时监控阶段,通过摄像头持续捕捉画面中的人脸。
- 当检测到人脸时,程序会将其与之前记录的Richard的特征进行比对。
- 如果识别为Richard,系统会在画面上以绿色方框标识人脸,并显示标签“Richard”。
- 如果检测到非授权人脸,系统会触发报警,并以红色方框标识,同时保存相关图像。
-
显示结果:
- 截图显示了程序在检测到Richard的面部后,在画面上用绿色矩形框标识出人脸区域,并标注“Richard”。
- 此外,程序会记录非授权人脸的图像,并在日志中显示相关信息。
该系统能够有效地在实时环境中进行身份识别,确保设备或环境的安全性。通过多次采集和特征平均化处理,系统可以显著提高识别的准确性和可靠性。
5.3 非授权入侵检测
在该系统中,当检测到非授权用户(即非Richard)的面部特征时,系统会自动触发报警,并保存相关图像。
-
实时监控:
- 系统在实时监控过程中,通过摄像头持续捕捉画面,并检测画面中的人脸。
- 当检测到人脸时,系统会将其面部特征与已记录的Richard的面部特征进行比对。
-
非授权检测:
- 当检测到的面部特征与Richard的特征不匹配时,系统将判定为非授权用户。
- 系统会在检测到的非授权用户人脸上用红色矩形框标识,并在图像上标注“Warning”提示。
-
报警触发:
- 系统会立即弹出一个警告窗口,提示用户“检测到非Richard的脸!”。
- 这是为了提醒用户可能存在的入侵行为,确保及时响应和处理。
-
保存图像:
- 在检测到非授权用户时,系统会自动保存这些人脸图像,并以“warning_face_X.jpg”的格式命名文件。
- 这些保存的图像可以用于后续的分析或审查,确保能够追踪和确认每一个检测到的非授权人脸。
-
多次检测:
- 如果多次检测到同一非授权用户,系统会每次都保存图像并触发报警,确保没有遗漏任何潜在的安全威胁。
通过该非授权入侵检测过程,系统能够有效识别和处理未经授权的人脸,为用户提供实时的安全监控和入侵报警功能。
六、应用中的注意事项
在实际应用本程序时,为了确保其准确性、性能和稳定性,用户需要注意以下几个方面:
6.1 环境配置与依赖管理
- Python版本:确保使用Python 3.6或更高版本,避免因版本差异导致的不兼容问题。
- 虚拟环境:建议在虚拟环境中运行程序,以避免依赖冲突。可以使用
venv
或conda
创建虚拟环境,并在其中安装所需的库。 - 库的版本:确保使用正确版本的库,特别是OpenCV和DeepFace库,版本差异可能导致程序行为不一致。
6.2 摄像头与图像质量
- 摄像头分辨率:使用高质量的摄像头可以显著提高人脸检测和识别的准确性。尽量使用1080p或更高分辨率的摄像头。
- 光照条件:确保摄像头采集图像时的光线充足且均匀。低光环境下的图像质量可能会显著降低识别的准确性。
- 摄像头角度:摄像头应尽量正对着用户,以确保捕捉到的面部图像是正面照,避免侧脸或遮挡影响识别。
6.3 参数调整
- 人脸检测参数:程序中的
scaleFactor
和minNeighbors
参数对检测精度影响较大。scaleFactor
通常设置为1.1至1.4之间,而minNeighbors
建议设置为3至6之间,具体值需要根据应用环境进行调试。 - 识别阈值:在实际应用中,
distance
阈值的选择非常重要。过高的阈值可能导致误检,过低的阈值可能导致误识。建议在实际环境中进行多次测试后选择适当的阈值。
6.4 性能优化
- GPU加速:在处理大规模数据或需要实时响应的场景中,建议使用支持CUDA的GPU来加速程序。确保正确安装CUDA Toolkit和cuDNN,并使用支持CUDA的OpenCV版本。
- 批量处理:避免对每一帧都进行面部特征提取和比对,可以选择在一段时间内对帧进行平均处理,以提高性能。
6.5 安全与隐私
- 数据安全:确保在保存和传输面部数据时,使用加密方式保护用户的隐私信息。避免在公共网络中传输未加密的面部图像或特征向量。
- 用户授权:在应用此系统时,确保用户已经明确授权,并知晓面部数据的采集、存储和使用方式。尊重用户的隐私权利。
6.6 错误处理与日志记录
- 异常处理:在实际应用中,可能会遇到摄像头未连接、库加载失败等异常情况。建议在程序中加入必要的异常处理机制,并为每个关键步骤添加错误提示。
- 日志记录:建议在程序中加入日志记录功能,记录检测到的非授权人脸、警报触发时间等关键事件,以便日后分析和审计。
6.7 测试与验证
- 环境测试:在部署前,应在不同的环境和设备上进行充分的测试,以确保程序在各种条件下都能稳定运行。
- 识别准确性验证:在实际使用前,应使用多组不同的面部图像进行测试,验证程序的识别准确性,并调整参数以达到最佳效果。
6.8 更新与维护
- 定期更新库:定期检查和更新所依赖的库,以获得最新的功能和安全补丁,但在更新前请务必在测试环境中进行验证。
- 维护与监控:长期运行过程中,建议定期维护程序,清理日志和旧的面部图像文件,并监控系统性能,确保程序始终以最佳状态运行。
通过遵循以上注意事项,用户可以最大限度地提高本程序的稳定性和可靠性,确保其在各种应用场景中的准确性和有效性。