Python – 使用 MediaPipe Holistic 进行面部和手部识别
什么是媒体管道:
对象检测是计算机视觉领域领先和最受欢迎的用例之一。几种对象检测模型在全球范围内用于其特定的用例应用程序。其中许多模型已被用作具有自己固定应用程序的单个计算机视觉任务的独立解决方案。将这些任务中的几个实时组合到一个端到端的解决方案中,正是 MediaPipe 所做的。
MediaPipe 是一个开源、跨平台的机器学习框架,用于构建复杂和多模式的应用机器学习管道。它可用于制作尖端的机器学习模型,如人脸检测、多手跟踪、对象检测和跟踪等。 MediaPipe 基本上充当处理在任何平台上运行的系统的模型实现的中介,这有助于开发人员更多地专注于模型试验,而不是系统。
MediaPipe 的可能性:
- 人体姿态检测和跟踪 高保真人体姿态跟踪,从 RGB 视频帧中推断出至少 25 个 2D 上身地标
- Face Mesh 468 3D 人脸地标,支持多面
- 手部追踪 21 个 3D 地标,支持多手,基于高性能手掌检测和手部地标模型
- 整体跟踪 33 个姿势、21 个单手和 468 个面部标志的同步和语义一致跟踪
- 头发分割超逼真的实时头发重新着色
- 对象检测和跟踪 在单个管道中检测和跟踪视频中的对象
- 人脸检测超轻量级人脸检测器,具有 6 个地标和多人脸支持
- 虹膜跟踪和深度估计 准确的人体虹膜跟踪和度量深度估计,无需专门的硬件。跟踪虹膜、瞳孔和眼睛轮廓标志。
- 鞋子和椅子等日常物体的 3D 目标检测和 3D 姿态估计
MediaPipe 整体:
Mediapipe Holistic 是包含优化的面部、手部和姿势组件的管道之一,允许进行整体跟踪,从而使模型能够同时检测手部和身体姿势以及面部标志。 MediaPipe 整体的主要用途之一是检测面部和手部并提取关键点以传递给计算机视觉模型。
使用 Holistic 检测面部和手部并提取关键点
下面的代码片段是一个使用 OpenCV 框架访问来自系统网络摄像头的图像输入、检测手部和面部地标并提取关键点的函数。
Python3
'''
Install dependencies
pip install opencv-python
pip install mediapipe
'''
# Import packages
import cv2
import mediapipe as mp
#Build Keypoints using MP Holistic
mp_holistic = mp.solutions.holistic # Holistic model
mp_drawing = mp.solutions.drawing_utils # Drawing utilities
def mediapipe_detection(image, model):
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # COLOR CONVERSION BGR 2 RGB
image.flags.writable = False # Image is no longer writable
results = model.process(image) # Make prediction
image.flags.writable = True # Image is now writable
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # COLOR CONVERSION RGB 2 BGR
return image, results
def draw_landmarks(image, results):
mp_drawing.draw_landmarks(
image, results.face_landmarks, mp_holistic.FACE_CONNECTIONS) # Draw face connections
mp_drawing.draw_landmarks(
image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS) # Draw pose connections
mp_drawing.draw_landmarks(
image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS) # Draw left hand connections
mp_drawing.draw_landmarks(
image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS) # Draw right hand connections
def draw_styled_landmarks(image, results):
# Draw face connections
mp_drawing.draw_landmarks(
image, results.face_landmarks, mp_holistic.FACE_CONNECTIONS,
mp_drawing.DrawingSpec(color=(80,110,10), thickness=1, circle_radius=1),
mp_drawing.DrawingSpec(color=(80,256,121), thickness=1, circle_radius=1))
# Draw pose connections
mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS,
mp_drawing.DrawingSpec(color=(80,22,10), thickness=2, circle_radius=4),
mp_drawing.DrawingSpec(color=(80,44,121), thickness=2, circle_radius=2)
)
# Draw left hand connections
mp_drawing.draw_landmarks(image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS,
mp_drawing.DrawingSpec(color=(121,22,76), thickness=2, circle_radius=4),
mp_drawing.DrawingSpec(color=(121,44,250), thickness=2, circle_radius=2)
)
# Draw right hand connections
mp_drawing.draw_landmarks(image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS,
mp_drawing.DrawingSpec(color=(245,117,66), thickness=2, circle_radius=4),
mp_drawing.DrawingSpec(color=(245,66,230), thickness=2, circle_radius=2)
)
#Main function
cap = cv2.VideoCapture(0)
# Set mediapipe model
with mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5) as holistic:
while cap.isOpened():
# Read feed
ret, frame = cap.read()
# Make detections
image, results = mediapipe_detection(frame, holistic)
print(results)
# Draw landmarks
draw_styled_landmarks(image, results)
# Show to screen
cv2.imshow('OpenCV Feed', image)
# Break gracefully
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()