Python+MediaPipe实现检测人脸功能详解
作者:woshicver 发布时间:2021-05-05 15:34:17
MediaPipe概述
谷歌开源MediaPipe于2019年6月首次推出。它的目标是通过提供一些集成的计算机视觉和机器学习功能,使我们的生活变得轻松。
MediaPipe是用于构建多模态(例如视频、音频或任何时间序列数据)、跨平台(即eAndroid、IOS、web、边缘设备)应用ML管道的框架。
Mediapipe还促进了机器学习技术在各种不同硬件平台上的演示和应用程序中的部署。
应用
人脸检测
多手跟踪
头发分割
目标检测与跟踪
目标:三维目标检测与跟踪
AutoFlip:视频裁剪管道
其他
为什么需要MediaPipe
有效管理资源(CPU和GPU)以实现低延迟性能,处理时间序列数据(如音频和视频帧)的同步。
MediaPipe将每个感知模型抽象为一个模块,并将它们与维护图连接起来。
除上述功能外,MediaPipe还支持TensorFlow和TF Lite推理引擎。任何TensorFlow和TF Lite模型均可用于MediaPipe。同时,在移动和嵌入式平台上,MediaPipe还支持设备本身的GPU加速。
现在是时候向MediaPipe的应用迈进了,人脸检测。
人脸检测
考虑一个场景,“零售商要求你计算访客数量,并跟踪访客的移动。”
看起来很难!!我们怎样才能解决这个问题?嗯…
哦,是的!我们将使用人脸检测来解决这个问题。
人脸检测是计算机视觉中的一个问题,即在照片中定位和定位一个或多个人脸。
问题的一般陈述可以定义如下:给定一幅静止或视频图像,检测并定位未知数量(如果有)的人脸。
使用MediaPipe执行人脸检测:
要执行人脸检测,可以使用三种模型:
近景模型(最适合距离相机2米以内的人脸)
全范围模型(密集型,最适合距离相机5米以内的人脸)
全范围模型(稀疏,最适合距离相机5米以内的人脸)
全范围密集模型和稀疏模型在F分数方面具有相同的质量,但在基础度量方面有所不同。
密集型模型的召回率略高于稀疏模型,而稀疏模型的精确度高于稠密模型。
现在是时候使用MediaPipe的人脸检测模型了。
安装必要的库
要执行人脸检测,首先必须在机器中安装MediaPipe。如果你是windows用户,则可以在计算机的命令提示符下运行以下代码。
pip install mediapipe
有关详细说明,你可以访问以下链接:
https://google.github.io/mediapipe/getting_started/python.html
你还需要为网络摄像头或图像输入安装OpenCV。如果你是windows用户,可以在命令提示符下运行以下代码。
pip install opencv-python
有关详细说明,你可以访问以下链接:
https://pypi.org/project/opencv-python/
编写代码以了解API的使用:
我们使用Google Colab来运行代码。你可以选择使用它。
我们需要cv2,能够读取和显示图像,以及MediaPipe模块,它公开了我们执行人脸检测所需的功能
import cv2
import mediapipe as mp
然后我们将访问两个子模块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的cv2_imshow模块。
在本地机器中工作时显示cv2.imshow(frame name, iamge)。我们可以使用下面的代码在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)
短长度(2米以内)图像的人脸检测模型
现在对于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)
全范围(5米以内)图像的人脸检测模型
我们还可以使用全范围人脸检测模型的代码对集体照片执行此过程。
下面关于algoscale的文章将向你展示使用OpenCV和MediaPipe姿势估计。
使用OpenCV和MediaPipe进行训练姿势估计:
https://algoscale.com/tech-corner/workout-pose-estimation-using-opencv-and-mediapipe/
来源:https://blog.csdn.net/woshicver/article/details/123059410


猜你喜欢
- 目录1、条件语句1.1 if语句2、嵌套的分支语句3、案例练习4、循环语句4.1 for-in循环4.2 range()函数4.3 实例1:
- 本文实例讲述了Python操作Sql Server 2008数据库的方法。分享给大家供大家参考,具体如下:最近由于公司的一个项目需要,需要使
- 前言:pandas中排序的几种常用方法,主要包括sort_index和sort_values。基础数据:import pandas as p
- 当我们进行数据分析时,有时候需要对数值型数据进行离散化,将其划分为不同的标签或类别。这样做可以方便我们进行统计和分析,并帮助我们更好地理解数
- 本文介绍了用ASP的AdoDb.Stream读取/写入UTF-8编码格式的文件的方法:函数名称:ReadTextFile 作用:利用AdoD
- 本文实例为大家分享了python实现图书管理系统的具体代码,供大家参考,具体内容如下添加新书查询借阅二次添加新书(读取已有的.xls并修改)
- 全文检索里的组件简介1. 什么是haystack?1. haystack是django的开源搜索框架,该框架支持Solr,Elasticse
- 初学框架vue搭配vux使用发现这个UI库使用有些力不从心。下面说说自己在表单验证过程遇到的两个需求问题及解决的方法。1.使用x-input
- 前言最近在回答问答python区的问题的时候,发现很多人对于这个break和continue分不清。所以,今天我就写篇文章来讲一下(绝对不是
- Django实现内容缓存:1、内存缓存settings.py文件配置CACHES = { 'default':
- Python 模块EasyGui详细介绍前言:在Windows想用Python开发一些简单的界面,所以找到了很容易上手的EasyGui库。下
- 导言到目前为止,我们探讨的教程是由表现层,业务逻辑层和数据访问层构成的层次体系结构。数据访问层和业务逻辑层分别在教程第一和第二章提到。在Di
- XML.DOM需求有一个表,里面数据量比较大,每天一更新,其字段可以通过xml配置文件进行配置,即,可能每次建表的字段不一样。上游跑时会根据
- 1. 导入库import numpy as np #矩阵运算import matplotlib.pyplot as plt #可视化impo
- 如何用Sleep函数编译一个定时组件?见下: Private Declare Sub Sleep L
- 与部门同事做了个小小的交流,话题杂而浅,在此做一个小纪录。1、什么是设计工业设计、环境设计、建筑设计、平面设计、网页设计、服装设计、信息设计
- 不过最近发现这个可视化操作有点点问题,就是当数据条数超过一定数目EMS SQL Manager就挂了,也不知道是否是软件问题……当然该开始我
- 前言:今天教大家通过Python进行Socket网络编程(做一个聊天程序),可以实现在不同的主机(电脑)之间进行通话。具体效果如何,接着往下
- Mysql常用显示命令1、显示当前数据库服务器中的数据库列表:mysql> SHOW DATABASES;注意:mysql库里面有MY
- github指路作业要求友情提示ldw老师给の友情提示(虽然感觉也还好/dbq其实还挺有用的)课上讲的例子是图片展示器(能够实现打开图片+镜