我是靠谱客的博主 壮观鲜花,最近开发中收集的这篇文章主要介绍使用 Mediapipe 库检测图像中的人脸,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

介绍

在本文中,我们将学习使用 Mediapipe 库检测图像中的人脸,我们可能会看到可以执行相同任务的不同算法和模型。在这里,我们将在 Mediapipe 库的帮助下检测图像中的人脸,并逐代码解释。在继续前进之前,请不要混淆面部检测和面部标志检测,因为在面部检测中,它会检测整个面部并绘制边界框,但在面部标志检测中,它会检测面部的特征,即眼睛、鼻子和嘴巴等,虽然我们也会尝试在这里检测一些地标,但这并不是最好的方法,因为Mediapipes人脸检测算法也提供了同样的功能。

5170b9c27cf57c8ded778e79c35f02b2.png

人脸检测的应用

  1. 人脸识别:人脸检测只是人脸识别之前的一步,因为在识别人脸之前,我们必须先检测它。

  2. 人脸情绪检测:人脸情绪识别也是人脸检测应用广泛的用例之一。

  3. 锁屏:每当我们使用安卓/苹果手机的锁屏功能时,该应用程序首先在该区域检测或识别我们的面部。

所以这次让我们借助 mediapipe 库来构建我们的人脸检测系统。

导入库

第一步是导入所有必要的库。

import cv2
import numpy as np
import mediapipe as mp
import matplotlib.pyplot as plt

使用 Mediapipe 库进行人脸检测

所以这次我们将使用Mediapipe 的人脸检测模型来执行人脸检测功能,当我们尝试深入这个模型时,我们会发现它完全是基于BlazeFace开发的,这是人脸检测算法之一,之所以使用它,是因为它在人脸检测方面具有非常准确的预测,而且是轻量级的,该算法源自MobileNetV1/V2最先进的模型。该模型的每秒帧数为200-1000,具体取决于设备的规格。

我们的下一步是初始化 Mediapipe 库的人脸检测模型。

d05e7257ff3d429b83d19488f086ddae.png

在使用Mediapipe 的人脸检测模型之前,我们必须首先初始化模型,我们将使用简单的语法,如mp.solution.face_detection,在初始化模型后,我们将使用一些参数调用人脸检测函数。现在我们将讨论这些:

  • model_selection:此参数仅取0-1范围内的实际整数值,即此模型将整数值取为1或0。让我们来讨论这两种类型的模型。

  1. 0 型模型:当我们选择 0 型模型时,我们的人脸检测模型将能够检测到距离相机 2 米范围内的人脸。

  2. 1 型模型:当我们选择 1 型模型时,我们的人脸检测模型将能够检测到5 米范围内的人脸。虽然默认值为 0。

  • min_detection_confidence:此参数也采用整数值,但在[0.0,1.0]的范围内,默认值为0.5,即 50% 的置信度,当我们的模型将检测人脸时,它应该至少有 50% 的把握检测成功,否则它不会检测到任何东西。

虽然我们已经初始化了我们的模型并且它已经准备好检测人脸,但是我们已经说过我们也需要可视化结果,因为我们将使用该drawing_utils函数在图像/帧中查看结果。

mp_face_detection = mp.solutions.face_detection

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

mp_drawing = mp.solutions.drawing_utils

代码分解

  1. 第一步是初始化 Mediapipe 的人脸检测模型。

  2. 初始化模型后,我们将使用相关参数及其值调用人脸检测函数。

  3. 最后还需要查看结果,我们将使用drawing_utils函数在图像/帧上绘制结果。

读取我们将在其上执行人脸检测的图像

因此,在初始化部分之后,我们将读取一个特定的图像,我们将在该图像上应用我们的人脸检测模型,我们将使用cv2.imread函数来帮助我们读取图像,但在此步骤中,它将从RGB转换图像格式到BGR

sample_img = cv2.imread('media/sample.jpg')

plt.figure(figsize = [10, 10])

plt.title("Sample Image");plt.axis('off');plt.imshow(sample_img[:,:,::-1]);plt.show()

输出:

d241d6b94a53a2ed43413c6eec33e62f.png

代码分解

  1. 正如这里所讨论的,我们在函数中提供了它的路径后读取了图像。

  2. 现在,我们将使用 matplotlib 函数来绘制图像,因为我正在使用Jupyter Notebook, cv2 的 show 函数在这个环境中不起作用,因此我们将使用 Matplotlib 的show函数,在绘制图像之前,我们还将在 matplotlib 的帮助下使用 figure size。

使用处理功能进行人脸检测

我们已经阅读了图像,现在进入主要任务,我们将使用我们的人脸检测模型并在我们的示例图像上实现它的功能,因为我们将使用FaceDetection类中的process()函数。此函数将为我们返回它将在图像/帧中检测到的每个人脸的主要六坐标。这六个坐标如下:

  1. 右眼

  2. 左眼

  3. 鼻尖

  4. 口腔中心

  5. 右耳

  6. 左耳

因此,在获得这6 个点之后,我们将能够在图像/帧上绘制边界框,但我们只会绘制两个主要关键点,以便获得清晰的输出,并且图像上不应有其他点.

face_detection_results = face_detection.process(sample_img[:,:,::-1])

if face_detection_results.detections:

    for face_no, face in enumerate(face_detection_results.detections):

        print(f'FACE NUMBER: {face_no+1}')
        print('==============================')

        print(f'FACE CONFIDENCE: {round(face.score[0], 2)}')

        face_data = face.location_data

        print(f'nFACE BOUNDING BOX:n{face_data.relative_bounding_box}')

        for i in range(2):

            print(f'{mp_face_detection.FaceKeyPoint(i).name}:')
            print(f'{face_data.relative_keypoints[mp_face_detection.FaceKeyPoint(i).value]}')

输出:

006b8e634be70ea0d964873c7a1b2654.png

代码分解

  1. 首先,我们将图像的格式从 BGR 格式更改为其 RGB 版本。

  2. 然后,使用 if 条件,我们将首先检测是否在图像中找到了人脸,因为我们将使用 face_detection 的detection属性。

  3. 然后在enumerate函数和 for 循环的帮助下,我们将遍历图像中找到的人脸。

  4. 现在我们将打印出图像中找到的人脸总数。

  5. 我们还将打印出置信度值,即我们的模型对检测到面部的置信度有多少。

  6. 然后我们将得到我们将在图像上显示的边界框和主要点。

  7. 现在注意内部 for 循环中的一件事,我们只是迭代了 2 个点,因为我们只想从这 6 个主要点看到图像上的两个点,然后最后我们将显示这些点——坐标的归一化版本。

可视化结果

img_copy = sample_img[:,:,::-1].copy()

if face_detection_results.detections:

    for face_no, face in enumerate(face_detection_results.detections):

        mp_drawing.draw_detection(image=img_copy, detection=face, 
                                 keypoint_drawing_spec=mp_drawing.DrawingSpec(color=(255, 0, 0),
                                                                              thickness=2,
                                                                              circle_radius=2))
fig = plt.figure(figsize = [10, 10])

plt.title("Resultant Image");plt.axis('off');plt.imshow(img_copy);plt.show()

输出:

585c3a9f31cd31c74ea61a9d905f02ff.png

代码分解

  1. 首先,我们将使用copy方法创建图像的副本,这样我们就不会丢失图像的原始预处理部分。

  2. 然后,我们将首先检查是否找到了这些面部,然后继续。

  3. 如果找到了面部,那么我们将通过 for 循环遍历每个面部并枚举函数。

  4. 现在,我们将使用具有相关参数的draw_detection函数在示例图像上绘制点,而不是打印点,如我们所讨论的。

  5. 现在我们将使用 Matplotlib 的 figure 函数设置图形(此处为图像)的大小。

  6. 最后,我们将显示带有边界框和点的图像。

尾注

  1. 本文的第一个要点是我们学习了一种不同的算法来检测人脸,即 Mediapipe 库来检测人脸。

  2. 我们了解了作为媒体管道人脸检测算法骨干的过程函数,我们也对此进行了深入的讨论。

  3. 最后,我们也可视化了结果,不仅是面部,还有一些地标,如眼睛、耳朵、嘴巴和鼻子,地标的结果对于不同的角度可能不是那么准确,但对于正面来说,它非常方便。

这是本文的 github 链接:https://github.com/Aman-Preet-Singh-Gulati/face-detection-mediapipe

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

0f82c64d009a37e0287bc92cd85dafc0.png

最后

以上就是壮观鲜花为你收集整理的使用 Mediapipe 库检测图像中的人脸的全部内容,希望文章能够帮你解决使用 Mediapipe 库检测图像中的人脸所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部