Python+MediaPipe实现人脸检测功能详解

凌晨两点半
凌晨两点半
发布时间:2026-10-15 | 2人浏览过
原创

本文详细介绍如何利用Google开源的MediaPipe框架结合Python和OpenCV实现人脸检测功能。内容涵盖MediaPipe概述、近景与全范围模型的选择、环境安装配置以及具体的代码实现步骤,帮助开发者快速掌握在Web、移动端及边缘设备上部署低延迟人脸检测应用的方法。

MediaPipe概述

谷歌于2019年6月开源发布了MediaPipe。其核心目标是通过提供集成的计算机视觉与机器学习功能,简化开发流程,让日常生活更加便捷。

MediaPipe是一个用于构建多模态(涵盖视频、音频或各类时间序列数据)且跨平台(包括Android、iOS、Web及边缘设备)应用的机器学习管道框架。

此外,MediaPipe还推动了机器学习技术在不同硬件平台上的演示验证及其在应用程序中的实际部署。

应用场景

  • 人脸检测
  • 多手跟踪
  • 头发分割
  • 目标检测与跟踪
  • 三维目标检测与跟踪
  • AutoFlip:视频智能裁剪管道
  • 其他应用

为什么需要MediaPipe

MediaPipe能够有效管理CPU和GPU资源,以实现低延迟性能,并同步处理音频和视频帧等时间序列数据。

该框架将每个感知模型抽象为独立模块,并通过维护图结构将它们连接起来,便于管理和扩展。

除了上述功能,MediaPipe还支持TensorFlow和TF Lite推理引擎。任何TensorFlow或TF Lite模型均可集成到MediaPipe中。同时,在移动和嵌入式平台上,MediaPipe还支持利用设备本身的GPU进行加速处理。

接下来,我们将进入MediaPipe的具体应用环节,重点介绍人脸检测功能。

人脸检测

设想一个场景:零售商要求你统计访客数量,并实时跟踪访客的移动轨迹。

这看起来似乎很有挑战性!我们该如何解决这个问题呢?

答案是:利用人脸检测技术来解决这一难题。

人脸检测是计算机视觉领域的一个经典问题,旨在从照片中定位并识别出一个人或多个人脸。

该问题的一般性定义如下:给定一张静态图像或视频帧,检测并定位其中未知数量(如果存在)的人脸。

使用MediaPipe执行人脸检测的具体步骤如下:

要执行人脸检测,MediaPipe提供了三种不同的模型供选择:

  • 近景模型(Short-range model):最适合距离相机2米以内的人脸检测。
  • 全范围密集模型(Full-range dense model):计算密集型,最适合距离相机5米以内的人脸检测。
  • 全范围稀疏模型(Full-range sparse model):计算轻量型,最适合距离相机5米以内的人脸检测。

全范围密集模型和稀疏模型在F分数(F-score)方面具有相同的质量,但在基础度量指标上存在差异。

具体而言,密集模型的召回率略高于稀疏模型,而稀疏模型的精确度则高于密集模型。

现在,让我们开始使用MediaPipe的人脸检测模型进行实际操作。

安装必要的库

要执行人脸检测,首先必须在计算机中安装MediaPipe。如果你是Windows用户,可以在命令提示符下运行以下代码进行安装。

pip install mediapipe

有关更详细的安装说明,你可以访问以下官方链接:

https://google.github.io/mediapipe/getting_started/python.html

此外,你还需要安装OpenCV以支持网络摄像头或图像输入处理。如果你是Windows用户,可以在命令提示符下运行以下代码。

pip install opencv-python

有关OpenCV安装的详细说明,你可以访问以下链接:

https://pypi.org/project/opencv-python/

编写代码以了解API的使用

我们使用Google Colab来运行示例代码,你也可以选择使用它进行实验。

我们需要导入cv2库,用于读取和显示图像;同时需要导入MediaPipe模块,它公开了执行人脸检测所需的功能。

import cv2
import mediapipe as mp

接着,我们将访问两个子模块:face_detection和drawing_utils。其中,face_detection用于加载执行人脸检测所需的所有功能,而drawing_utils用于在图像上绘制检测到的人脸关键点。

mp_face_detection = mp.solutions.face_detection
mp_drawing = mp.solutions.drawing_utils

现在让我们深入代码细节。首先,我们将图像作为输入。这里我们使用两种类型的测试图像:

(i)包含距离相机2米以内的人脸的图像。

(ii)包含距离相机5米以内的人脸的图像。

我们在Colab环境中通过文件上传功能直接从本地目录加载图像。如果你是在本地计算机上工作,也可以使用cv2.imread函数来加载图像。

(a)第一张照片

from google.colab import files
 
uploaded_short_range = files.upload()

(b)第二张照片

from google.colab import files
 
uploaded_full_range = files.upload()

在本地PC上工作时,你可以使用以下代码加载图像。

cv2.imread() # 获取输入

点击此处了解有关cv2.imread的更多详细信息。

接下来,我们将调整图像大小并显示图像。为了在Colab中显示图像,我们必须使用cv2_imshow模块。

在本地机器中工作时,显示图像可以使用cv2.imshow(frame name, image)。我们可以使用下面的代码在Google Colab中调整图像大小并显示图像。

用于调整图像大小和显示图像的代码如下:

import cv2
from google.colab.patches import cv2_imshow
import math
import numpy as np
 
DESIRED_HEIGHT = 480
DESIRED_WIDTH = 480
def resize_and_show(image):
  h, w = image.shape[:2]
  if h < w:
    img = cv2.resize(image, (DESIRED_WIDTH, math.floor(h/(w/DESIRED_WIDTH))))
  else:
    img = cv2.resize(image, (math.floor(w/(h/DESIRED_HEIGHT)), DESIRED_HEIGHT))
  cv2_imshow(img)
 

# 预览图片.
 
short_range_images = {name: cv2.imread(name) 
for name in uploaded_short_range.keys()}
for name, image in short_range_images.items():
  print(name)   
  resize_and_show(image)
 
 
full_range_images = {name: cv2.imread(name) 
for name in uploaded_full_range.keys()}
for name, image in full_range_images.items():
  print(name)   
 
  resize_and_show(image)

现在,我们将在脸上绘制关键点。

你可以根据需要更改thickness(线条粗细)和circle_radius(圆圈半径)的值。

drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)

以下代码展示了mp.solutions.face_detection模块的详细信息。

help(mp_face_detection.FaceDetection)

在此之后,我们将创建一个FaceDetection类的对象。该对象将允许我们处理图像并执行人脸关键点检测。此类的构造函数支持以下参数:

(i)模型选择:整数索引0或1。使用0选择最适合距离相机2米以内的近景模型,使用1选择最适合距离相机5米以内的全范围模型。对于全范围选项,默认使用稀疏模型以提高推理速度。

(ii)最小检测置信度:人脸检测模型中的最小置信值(范围[0.0, 1.0]),低于此值则检测失败。默认值为0.5。

with mp_face_detection.FaceDetection(min_detection_confidence=0.5, model_selection=0) as face_detection:

上面的代码中model_selection=0,这意味着我们选择近景模型进行人脸检测。使用下面的代码,我们使用近景模型执行最终的人脸检测,并绘制关键点。

# 运行MediaPipe人脸检测与近距离模型
 
with mp_face_detection.FaceDetection(
    
    min_detection_confidence=0.5, model_selection=0) as face_detection:
        
  for name, image in short_range_images.items():
    # 将BGR图像转换为RGB,并使用MediaPipe人脸检测进行处理。
 
    results = face_detection.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
 
    # 绘制每个人脸的检测。
    print(f'Face detections of {name}:')
    
    if not results.detections:
        
      continue
    annotated_image = image.copy()

    for detection in results.detections:
 
      mp_drawing.draw_detection(annotated_image, detection)
 
    resize_and_show(annotated_image)

现在对于model_selection=1的情况,这意味着我们选择人脸检测全范围模型。使用下面的代码,我们使用全范围模型执行最终的人脸检测,并绘制关键点。

with mp_face_detection.FaceDetection(
 
    min_detection_confidence=0.5, model_selection=1) as face_detection:
 
  for name, image in full_range_images.items():
    # 将BGR图像转换为RGB,并使用MediaPipe人脸检测进行处理。
    results = face_detection.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    # 绘制每个人脸的检测。
    print(f'Face detections of {name}:')
 
    if not results.detections:
 
      continue
 
    annotated_image = image.copy()
 
    for detection in results.detections:
 
      mp_drawing.draw_detection(annotated_image, detection)
 
    resize_and_show(annotated_image)

我们还可以使用全范围人脸检测模型的代码对集体照片执行此过程。

下面关于algoscale的文章将向你展示使用OpenCV和MediaPipe进行姿势估计的方法。

使用OpenCV和MediaPipe进行训练姿势估计:

https://algoscale.com/tech-corner/workout-pose-estimation-using-opencv-and-mediapipe/

到此这篇关于Python+MediaPipe实现检测人脸功能详解的文章就介绍到这了,更多相关Python MediaPipe检测人脸内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表