基于深度学习的OpenCV与dlib融合技术实现人脸识别

解决痛点

基于深度学习的OpenCV与dlib融合技术实现人脸识别

痛点分析:

  1. 准确性不足:传统的基于特征提取的人脸识别方法,如Haar级联分类器或LBP(局部二值模式),在复杂光照、角度变化和表情差异等情况下,识别精度较低。

  2. 实时性能差:一些早期的人脸识别系统无法高效处理视频流或大量图片数据,导致延迟高,用户体验差。

  3. 适应性弱:许多现有的人脸识别解决方案对不同的环境条件(如低光、遮挡)不够鲁棒,或者需要针对特定场景进行大量的参数调整。

  4. 隐私问题:随着人们对个人隐私的关注度不断提高,如何在保证安全性的前提下保护用户数据成为一个重要课题。

  5. 部署困难:一些先进的深度学习模型虽然提供了卓越的识别效果,但往往需要强大的硬件支持,增加了部署成本和技术门槛。

解决方案概述:

本项目通过融合OpenCV和dlib库的优势,利用深度学习算法实现了高准确性和实时性的人脸识别系统。该系统能够自动适应各种环境变化,并且在保护用户隐私的同时提供简便的部署方式。

  • 准确性提升:采用预训练的深度卷积神经网络(CNN)来提取人脸特征,显著提高了不同条件下的人脸检测和识别率。

  • 优化实时性能:结合OpenCV高效的图像处理能力和dlib中的人脸识别API,确保了系统的快速响应能力,适用于实时应用场景。

  • 增强适应性:内置多种预处理步骤,包括自动白平衡、对比度调整等,使得系统能够在更广泛的环境中稳定工作。

  • 隐私保护机制:所有数据都在本地处理,不上传至云端;同时提供加密存储选项,确保用户信息安全。

  • 简化部署流程:优化后的轻量化模型减少了对硬件资源的需求,降低了部署难度,便于集成到现有的安防监控系统或其他应用中。

适用场景

  1. 智能安防:在企业园区、住宅区入口设置人脸识别门禁系统,提高安全性并减少人工干预。

  2. 零售行业:商场、超市等人流量大的地方可以通过人脸识别统计顾客流量,分析购物行为,为营销决策提供数据支持。

  3. 金融服务:银行、证券交易所等金融机构可利用人脸识别验证客户身份,防范金融欺诈。

  4. 教育领域:学校可以使用人脸识别考勤系统,自动记录学生出勤情况,减轻教师负担。

  5. 智能家居:家庭自动化设备如智能锁、摄像头等可以集成人脸识别功能,实现个性化服务,比如根据识别结果自动调节室内温度、播放音乐等。

  6. 移动支付:在线上线下支付过程中加入人脸识别作为额外的安全验证手段,增加交易的安全性。

  7. 社交娱乐:社交媒体平台或游戏应用可以使用人脸识别进行用户认证、表情捕捉等功能,丰富用户体验。

本项目旨在解决传统人脸识别技术中存在的痛点,提供一个高效、准确、安全且易于部署的人脸识别解决方案,满足多个行业的多样化需求。

安装vs生成工具

https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/?spm=5176.28103460.0.0.22f05d27GZoNXR

安装cmker

https://cmake.org/download/

cmker需要下载install包版本,并手动设置环境变量。否则可能一直找不到cmker导致dlib安装失败

 

更新pip

pip install --upgrade pip

 

安装库:

pip install opencv-python-headless dlib numpy

import cv2
import dlib
import numpy as np
from scipy.spatial import distance
import os

# 加载预训练的面部检测器、特征点预测器和面部识别模型
detector = dlib.get_frontal_face_detector()
predictor_path = 'shape_predictor_68_face_landmarks.dat'
face_rec_model_path = 'dlib_face_recognition_resnet_model_v1.dat'
predictor = dlib.shape_predictor(predictor_path)
facerec = dlib.face_recognition_model_v1(face_rec_model_path)

def get_face_encoding(image_path):
    """给定图像路径,返回第一个检测到的面部的编码"""
    img = cv2.imread(image_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = detector(gray, 1)

    if len(faces) == 0:
        raise ValueError("未在图片中找到人脸")

    # 获取第一张检测到的脸部的形状
    shape = predictor(gray, faces[0])
    face_encoding = facerec.compute_face_descriptor(img, shape)
    return np.array(face_encoding)

def compare_faces(known_encoding, unknown_encodings, tolerance=0.6):
    """比较已知面部编码和未知面部编码列表,判断是否有匹配"""
    for unknown_encoding in unknown_encodings:
        dist = distance.euclidean(known_encoding, unknown_encoding)
        if dist < tolerance:
            return True
    return False

# 加载并获取大头贴的面部编码
try:
    script_dir = os.path.dirname(os.path.abspath(__file__))
    known_image_path = os.path.join(script_dir, '1.jpg')

    # known_image_path = "/face/1.jpg"
    known_encoding = get_face_encoding(known_image_path)
except Exception as e:
    print(f"处理大头贴时出错: {e}")
    exit()

# 加载多人照片并尝试找到所有面部及其编码
unknown_image_path = "2.jpg"
unknown_image = cv2.imread(unknown_image_path)
gray_unknown = cv2.cvtColor(unknown_image, cv2.COLOR_BGR2GRAY)
unknown_faces = detector(gray_unknown, 1)

unknown_encodings = []
for rect in unknown_faces:
    shape = predictor(gray_unknown, rect)
    face_encoding = facerec.compute_face_descriptor(unknown_image, shape)
    unknown_encodings.append(np.array(face_encoding))

# 比较两个编码是否属于同一人
if compare_faces(known_encoding, unknown_encodings):
    print("多人照片中包含了大头贴的那个人。")
else:
    print("多人照片中不包含大头贴的那个人。")

视频代码

import cv2
import dlib
import numpy as np
from scipy.spatial import distance

# 初始化检测器、特征点预测器和面部识别模型
detector = dlib.get_frontal_face_detector()
predictor_path = 'models/shape_predictor_68_face_landmarks.dat'
face_rec_model_path = 'models/dlib_face_recognition_resnet_model_v1.dat'
predictor = dlib.shape_predictor(predictor_path)
facerec = dlib.face_recognition_model_v1(face_rec_model_path)

def get_face_encoding(image):
    """给定图像,返回第一个检测到的面部的编码"""
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = detector(gray, 1)
    
    if len(faces) == 0:
        return None
    
    shape = predictor(gray, faces[0])
    face_encoding = facerec.compute_face_descriptor(image, shape)
    return np.array(face_encoding)

# 加载大头贴并获取其编码
known_image_path = "万凯.jpg"
known_image = cv2.imread(known_image_path)
known_encoding = get_face_encoding(known_image)

if known_encoding is None:
    print("未能从大头贴中提取面部编码")
    exit()

# 打开视频文件或摄像头
video_capture = cv2.VideoCapture('path_to_video.mp4')  # 或者使用 0 表示默认摄像头

while True:
    # 获取视频的一帧
    ret, frame = video_capture.read()
    if not ret:
        break  # 视频结束或无法读取帧时退出循环

    # 将帧转换为灰度图(可选)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 检测当前帧中所有人脸的位置
    face_locations = detector(gray, 1)

    for rect in face_locations:
        # 获取每个检测到的人脸的形状
        shape = predictor(gray, rect)
        
        # 计算面部描述符
        face_encoding = facerec.compute_face_descriptor(frame, shape)
        face_encoding = np.array(face_encoding)

        # 比较已知编码和当前帧中的编码
        dist = distance.euclidean(known_encoding, face_encoding)
        if dist < 0.6:  # 调整这个阈值以适应你的需求
            top, right, bottom, left = rect.top(), rect.right(), rect.bottom(), rect.left()
            # 在帧上绘制矩形框标注匹配的人脸
            cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)
            cv2.putText(frame, "Match Found", (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    # 显示结果帧
    cv2.imshow('Video', frame)

    # 按 'q' 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 当所有操作完成后,释放资源
video_capture.release()
cv2.destroyAllWindows()

评论区
请先登录后查看和发表评论
立即登录
选择支持方式
超值优惠
年费会员
原价: ¥365
限时: ¥199
全站资源无限下载
全年免费咨询
专属会员社群
轻量体验
月度会员
原价: ¥49
特惠: ¥29
更新资源下载
专属会员社群
不含咨询
交个朋友
体验会员
原价: ¥29
特惠: ¥9.9
单次下载或咨询
专属会员社群
微信扫码支持
支付宝扫码支持
客服微信
微信:mingzhang567