图像处理篇---face_recognition库实现人脸检测

发布于:2025-06-05 ⋅ 阅读:(27) ⋅ 点赞:(0)

以下是使用face_recognition库实现人脸检测的详细步骤、实例代码及解释:

一、环境准备

1. 安装依赖库
pip install face_recognition opencv-python  # 核心库
pip install matplotlib  # 用于显示图像(可选)
2. 依赖说明
  • face_recognition:封装 dlib 的人脸检测和识别功能。
  • opencv-python:用于图像处理和结果可视化
  • matplotlib:用于在 Jupyter 或脚本中显示图像。

二、人脸检测基本流程

步骤 1:加载图像

使用face_recognition.load_image_file()加载图像,返回 NumPy 数组(BGR 格式)。

步骤 2:检测人脸位置

调用face_recognition.face_locations()返回人脸边界框坐标(top, right, bottom, left)。

步骤 3:可视化结果

使用 OpenCV 绘制边界框并显示图像。

三、实例代码:单张图像人脸检测

import face_recognition
import cv2
import matplotlib.pyplot as plt

# 1. 加载图像
image = face_recognition.load_image_file("test.jpg")  # 替换为你的图像路径

# 2. 检测人脸位置(返回(top, right, bottom, left)格式的元组列表)
face_locations = face_recognition.face_locations(image)

# 3. 复制原图用于绘制边界框
image_with_boxes = image.copy()

# 4. 遍历检测到的人脸并绘制边界框
for (top, right, bottom, left) in face_locations:
    cv2.rectangle(image_with_boxes, (left, top), (right, bottom), (0, 255, 0), 2)

# 5. 转换颜色通道顺序(face_recognition使用RGB,OpenCV使用BGR)
image_with_boxes = cv2.cvtColor(image_with_boxes, cv2.COLOR_RGB2BGR)

# 6. 显示结果(在脚本中使用cv2,在Jupyter中使用matplotlib)
cv2.imshow("Face Detection", image_with_boxes)
cv2.waitKey(0)  # 按任意键关闭窗口
cv2.destroyAllWindows()

# 或在Jupyter中显示:
# plt.figure(figsize=(10, 10))
# plt.imshow(image_with_boxes)
# plt.axis('off')
# plt.show()

四、参数调整与进阶用法

1. 检测模型选择

face_locations()支持两种检测模型:

# HOG模型(CPU友好,速度快但精度稍低)
face_locations = face_recognition.face_locations(image, model="hog")

# CNN模型(精度高,需GPU加速)
face_locations = face_recognition.face_locations(image, model="cnn")
2. 批量处理多图像
import os

image_paths = ["img1.jpg", "img2.jpg", "img3.jpg"]
for path in image_paths:
    image = face_recognition.load_image_file(path)
    face_locations = face_recognition.face_locations(image)
    print(f"在 {path} 中检测到 {len(face_locations)} 张人脸")
3. 视频流实时检测
import cv2

video_capture = cv2.VideoCapture(0)  # 0表示默认摄像头

while True:
    ret, frame = video_capture.read()
    rgb_frame = frame[:, :, ::-1]  # BGR转RGB
    
    face_locations = face_recognition.face_locations(rgb_frame)
    
    for (top, right, bottom, left) in face_locations:
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
    
    cv2.imshow('Video', frame)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):  # 按'q'键退出
        break

video_capture.release()
cv2.destroyAllWindows()

五、关键点检测(可选)

除了边界框,还可检测人脸关键点(眼睛、鼻子、嘴巴等):

# 检测人脸关键点
face_landmarks = face_recognition.face_landmarks(image)

# 绘制关键点
for landmarks in face_landmarks:
    for feature in landmarks.keys():
        for (x, y) in landmarks[feature]:
            cv2.circle(image_with_boxes, (x, y), 2, (0, 0, 255), -1)

六、代码解释

  1. 加载图像load_image_file()将图像读取为 NumPy 数组,格式为 RGB(与 OpenCV 的 BGR 不同)。
  2. 人脸检测face_locations()返回每个人脸的边界框坐标,顺序为(top, right, bottom, left)
  3. 边界框绘制:使用 OpenCV 的rectangle()函数在原图上绘制绿色矩形。
  4. 颜色通道转换cv2.cvtColor()将 RGB 转换为 BGR,确保显示正常。
  5. 显示结果cv2.imshow()显示图像,waitKey(0)等待按键关闭窗口。

七、常见问题与解决方案

  1. 安装失败

    • 确保已安装 CMake 和 dlib 依赖(如brew install cmake dlib on macOS)。
    • 使用 conda 环境:conda install -c conda-forge dlib
  2. 检测不到人脸

    • 尝试切换模型(model="cnn")。
    • 调整图像亮度 / 对比度,或使用face_recognition.load_image_file()前预处理图像。
  3. 性能问题

    • 视频流处理时降低分辨率:video_capture.set(3, 640); video_capture.set(4, 480)
    • 仅每隔几帧检测一次人脸。

八、应用场景扩展

  1. 人脸数量统计:统计照片或视频中的人脸数量。
  2. 人脸裁剪:提取检测到的人脸区域用于后续分析。
  3. 人流量监控:结合 OpenCV 的背景减除算法,统计通过特定区域的人脸数量。

通过以上步骤,你可以快速实现基于face_recognition的人脸检测系统,适用于原型验证和轻量级应用。若需更高精度或定制化能力,建议转向深度学习框架(如 PyTorch)训练自定义模型。


网站公告

今日签到

点亮在社区的每一天
去签到