
是否可以在没有GPU的情况下实现实时性能对象检测模型?MediaPipe 人脸检测是一种概念验证,几乎可以在任何 CPU 上实时运行单类人脸检测。
可能有许多场景需要单类对象检测。例如,我们想要检测属于单个类的所有对象的位置。例如,我们可以为人脸识别系统检测人脸或在实时摄像头对话中跟踪人脸。
更重要的是,大多数时候,我们希望实时运行这些模型。为了实现这一点,我们必须非常快地捕获帧,并且我们的模型应该更快地对这些帧进行推理!这使我们能够在图像可用时立即处理它们。
几年前解决此任务(以及计算机视觉中的许多其他任务)最容易获得和使用的解决方案是在先前训练的模型上执行迁移学习(通常是在大量数据集上训练的标准模型,例如在Tensorflow Hub或TF Object中发现的那些)检测 API)。
通用对象检测模型(如上所述)在没有GPU的情况下无法实时运行。许多经过训练的目标检测架构(例如,YOLO、FasterRCNN、SSD)在 GPU 上运行的实时推理中实现了令人印象深刻的准确度。然而,仅仅为了好玩而拥有一个专用的 GPU 来实现实时推理是不可行的,也不值得。
我们提到的模型专门用于解决多类检测问题,仅检测图像中的人脸比检测汽车、人、交通标志和狗(都在同一个模型中)更简单,如果我们定义更详细的任务,我们可以假设网络需要学习更少的特征来执行这项工作。

介绍
本文将教我们如何使用MediaPipe库检测图像、视频或网络摄像头流中的人脸。许多类似的算法和模型都能完成同样的任务。在这里,我们将在Mediapipe库的帮助下浏览检测管道,并逐步进行代码解释。
在继续之前,不要混淆人脸检测和人脸标记检测。人脸检测是检测你的整个脸,并绘制一个矩形框。人脸标志检测面部特征,如鼻子、眼睛、嘴巴和耳朵。在本文中,我们将同时捕获两者,因为MediaPipe人脸检测算法在一个模型中同时提供两者。
一些人脸检测应用:
- 人脸检测只是人脸识别之前的一步,因为在我们能识别一张人脸之前,我们首先需要对它进行本地化;
- 人脸情感识别是人脸检测的另一个广泛应用的用例;
- 因此,当我们使用智能手机的锁屏时,该应用程序可以识别我们的面部。人脸检测是第一步;
- 保安公司使用面部识别来保护他们的场所;
- 入境检查站使用面部识别来实施更智能的边境控制;
- 车队公司可以使用面部识别来保护他们的车辆;
- 拼车公司可以使用面部识别技术来确保正确的司机搭载正确的乘客;
- 面部识别对于物联网是有用的,因为它可以改善安全措施和自动访问控制在家里;
- 作为人工智能监控系统的一部分,面部识别技术可以被执法部门使用;
- 零售商可以使用面部识别来定制线下产品,并从理论上将线上购买习惯与线上购买习惯映射起来;
人脸检测和识别技术已经成为许多行业使用的商品,不可能列出所有可用的应用。

使用MediaPipe库进行人脸检测
在本文中,我们将使用Mediapipe的人脸检测模型执行人脸检测功能。如果我们打开这个模型的深度概述,我们会发现它完全基于性能良好且轻量级的BlazeFace模型。该模型主要运行在低端CPU和移动GPU上,以产生实时推理。推理速度是每秒200-1000帧,这取决于设备的规格。
下面是使用MediaPipe人脸检测器的完整的人脸检测对象:
https://medium.com/media/5fc23292545b0c3e878afa538f8148d3/href
在使用Mediapipe人脸检测模型之前,我们必须首先对模型进行初始化。为此,我们将使用简单的语法mp.solution。在初始化模型之后,我们将使用一些参数调用面部检测函数。在初始化模型时,有两个基本参数:
- model_selection:该参数采用整数索引(0或1)。0建议用于近距离面部,它在距离相机2米内工作得最好。全范围型推荐使用1,适合5米以内的面部。如果不指定,默认值为0。
- min_detection_confidence:该参数接受0.0和1.0范围内的浮点值。这里的默认值是0.5,转换为50%的置信度。例如,当检测人脸时,结果应该至少有50%的可信度,人脸就在那里;否则,它将不会检测到任何东西。
所以,当我们定义MPfaceDetection对象时,我们在内存中创建了我们的模型。在下一步中,我们需要将我们的帧提供给这个对象。现在,当我们向对象提供图像时,我们将使用来自FaceDetection对象的process()函数。如果我们仔细观察我们的结果,我们会看到每个检测到的人脸有六个坐标。这些坐标代表右眼、左眼、鼻尖、嘴中心、右耳区和左耳区。
为了在我们的脸周围绘制矩形,MediaPipe有一个称为mp.drawing的内置函数,这是我们在对象初始化步骤中初始化的,要绘制矩形和主面部件,只需调用mp_drawing即可,Draw_detection函数用于每个人脸检测。
我还添加了一个参数“mp_drawing_utils = True”,通过这个参数,我们正在使用 mp.drawing utils。否则,我们可以使用 OpenCV cv2.rectangle 函数在我们的框架上绘制颜色和厚度的检测。此外,有时我们只对获取检测坐标感兴趣。我们可以在调用对象时通过设置 return_tlbr bool 选项来获取它们。因此,我们可以只返回不同情况下的检测结果,而不是在框架上绘制矩形,具体取决于用例。
下面是一个简单的代码示例,在网络摄像头流中只使用这个人脸检测对象运行我们的引擎:
https://medium.com/media/80bfdcafc3b5a5b3e980df39d3b42ea0/href

结论
在本文中,我们了解了使用MediaPipe库检测图像、保存的视频或实时网络摄像头流中的人脸是多么简单。介绍了如何创建在Engine对象中使用的自定义对象。类似地,我们可以为任何其他面部检测实现创建一个对象,并将其与相同的Engine一起使用。
使用所有这些代码,我们已经将检测到的面部结果可视化,其中包含一些标志性的东西,如嘴、耳朵、眼睛和鼻子。对于不同的角度,地标的结果可能不是那么准确,但对于正面的脸来说是很方便的。
原文链接:https://towardsai.net/p/l/cpu-real-time-face-detection-with-python