计算机系统应用教程网站

网站首页 > 技术文章 正文

python简易人脸识别增强版hog模型

btikc 2025-01-09 10:47:40 技术文章 21 ℃ 0 评论

之前发布了文章【python摄像头识别检测已有照片人脸】,虽然可以识别已经存在的头像,但是识别错误的概率还是挺高的,后来几经探索使用hog模型,正脸的识别率会提高不少。

hog(Histogram of Oriented Gradients)模型是一个经典的计算机视觉算法,用于人脸检测,速度较快,适用于大多数普通场景。它适用于实时检测,但在复杂场景下精度可能略逊于 CNN 模型。

图片中的识别代码:

import cv2
import face_recognition
import numpy as np
import os

# 1. 加载目标人脸照片和提取特征
known_face_encodings = []
known_face_names = []

# 设置存放人脸照片的目录
faces_directory = "faces"  # 替换为你的目录路径

# 遍历目录中的所有图片文件
for filename in os.listdir(faces_directory):
    if filename.endswith(".jpg") or filename.endswith(".png"):
        # 加载图片并提取特征
        image_path = os.path.join(faces_directory, filename)
        image = face_recognition.load_image_file(image_path)
        encoding = face_recognition.face_encodings(image)[0]

        # 将特征和名字添加到列表
        known_face_encodings.append(encoding)
        name = os.path.splitext(filename)[0]  # 使用文件名作为名字
        known_face_names.append(name)

print(f"已加载以下人脸: {known_face_names}")

# 2. 加载要检测的图片
image_path = "dp2.jpg"  # 替换为你要检测的图片路径
image = cv2.imread(image_path)

# 3. 在图片中检测人脸
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 转为 RGB
face_locations = face_recognition.face_locations(rgb_image, model="hog")  # 使用 hog 模型
face_encodings = face_recognition.face_encodings(rgb_image, face_locations)

# 4. 标记每个人脸的位置,并识别出对应的名字
for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
    # 将当前人脸与目标人脸进行比较
    matches = face_recognition.compare_faces(known_face_encodings, face_encoding, tolerance=0.4)
    name = "Unknown"

    # 使用 face_distance 进一步判断匹配的最优结果
    distances = face_recognition.face_distance(known_face_encodings, face_encoding)
    best_match_index = np.argmin(distances)

    if distances[best_match_index] < 0.4:  # 距离小于阈值
        name = known_face_names[best_match_index]

    # 5. 在图片上标记人脸
    cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2)
    cv2.putText(image, name, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

# 6. 显示图片
cv2.imshow("Detected Faces", image)

# 等待用户按键,按 'Esc' 键关闭窗口
cv2.waitKey(0)  # 等待用户按下任意键
cv2.destroyAllWindows()

摄像头或视频中的识别代码:

import cv2
import face_recognition
import numpy as np
import os

# 1. 加载目标人脸照片和提取特征
known_face_encodings = []
known_face_names = []

# 设置存放人脸照片的目录
faces_directory = "faces"  # 替换为你的目录路径

# 遍历目录中的所有图片文件
for filename in os.listdir(faces_directory):
    if filename.endswith(".jpg") or filename.endswith(".png"):
        # 加载图片并提取特征
        image_path = os.path.join(faces_directory, filename)
        image = face_recognition.load_image_file(image_path)
        encoding = face_recognition.face_encodings(image)[0]

        # 将特征和名字添加到列表
        known_face_encodings.append(encoding)
        name = os.path.splitext(filename)[0]  # 使用文件名作为名字
        known_face_names.append(name)

print(f"已加载以下人脸: {known_face_names}")

# 2. 打开视频
video_capture = cv2.VideoCapture("video.mp4")  # 使用视频文件
# video_capture = cv2.VideoCapture(0)  # 使用摄像头

frame_count = 0  # 用于控制帧率

while video_capture.isOpened():
    ret, frame = video_capture.read()
    if not ret:
        break

    # 每 3 帧处理一次
    frame_count += 1
    if frame_count % 3 != 0:
        continue

    # 降低视频分辨率
    frame = cv2.resize(frame, (640, 480))

    # 3. 在视频帧中检测人脸
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)  # 转为 RGB
    face_locations = face_recognition.face_locations(rgb_frame, model="hog")  # 使用 hog 模型
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
        # 4. 将当前人脸与目标人脸进行比较
        matches = face_recognition.compare_faces(known_face_encodings, face_encoding, tolerance=0.4)
        name = "Unknown"

        # 使用 face_distance 进一步判断匹配的最优结果
        distances = face_recognition.face_distance(known_face_encodings, face_encoding)
        best_match_index = np.argmin(distances)

        if distances[best_match_index] < 0.4:  # 距离小于阈值
            name = known_face_names[best_match_index]

        # 5. 在视频帧中标记人脸
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)
        cv2.putText(frame, name, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

    # 显示视频帧
    cv2.imshow("Video", frame)

    # 按 'Esc' 键退出
    if cv2.waitKey(1) & 0xFF == 27:  # 27 是 Esc 键的键值
        break

# 释放资源
video_capture.release()
cv2.destroyAllWindows()

要说一下的是,这个人脸识别适合正脸,斜着的脸或侧面的可能不准确,如果要识别各个角度的人脸可考虑训练人脸模型再进行识别。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表