MediaPipe 入门教程:Task API 全家桶
1. MediaPipe 的架构哲学
MediaPipe 核心理念:ML 推理是一个 Pipeline 图。
摄像头 → [人脸检测] → [关键点] → [表情分类] → UI 渲染
↘ [背景虚化] ↗
每个节点叫 Calculator,图结构叫 Graph。MediaPipe 自带了 200+ Calculators。
2. Task API 全家桶
| Task API |
功能 |
延迟(移动端) |
| Face Detector |
人脸检测 |
~2ms |
| Face Mesh |
468 个面部关键点 |
~3ms |
| Hand Landmarker |
21 个手掌关键点 |
~3ms |
| Pose Landmarker |
33 个人体关键点 |
~4ms |
| Object Detector |
目标检测 |
~5ms |
| Image Segmenter |
人像分割 |
~5ms |
| Gesture Recognizer |
手势分类 |
~2ms |
3. 人脸 468 点 Mesh
import mediapipe as mp
mp_face_mesh = mp.solutions.face_mesh
face_mesh = mp_face_mesh.FaceMesh(
max_num_faces=1,
refine_landmarks=True, # 眼部和嘴唇精细关键点
min_detection_confidence=0.5,
)
results = face_mesh.process(rgb)
if results.multi_face_landmarks:
for landmark in results.multi_face_landmarks[0].landmark:
# 468 个点 (x, y, z)
pass
应用场景:AR 滤镜、虚拟化妆、3D 头像驱动。
4. 姿态 33 点 Landmark
mp_pose = mp.solutions.pose
pose = mp_pose.Pose(
min_detection_confidence=0.5,
min_tracking_confidence=0.5,
model_complexity=2, # 0=轻量, 1=中等, 2=高精度
)
results = pose.process(rgb)
if results.pose_landmarks:
left_wrist = results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_WRIST]
right_wrist = results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_WRIST]
33 个关键点覆盖全身,可做俯卧撑计数、瑜伽姿势纠正等。
5. 实时人像分割(背景虚化)
mp_selfie_seg = mp.solutions.selfie_segmentation
segmenter = mp_selfie_seg.SelfieSegmentation(model_selection=1) # 0=通用, 1=风景
results = segmenter.process(rgb)
mask = results.segmentation_mask > 0.5 # 二值化
# 替换背景
blurred_bg = cv2.GaussianBlur(frame, (55, 55), 0)
output = np.where(mask[..., None], frame, blurred_bg)
只需 5ms,视频会议级别实时虚化。
6. Web 端使用(无需后端!)
import { HandLandmarker, FilesetResolver } from "@mediapipe/tasks-vision";
const vision = await FilesetResolver.forVisionTasks(
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.9/wasm"
);
const handLandmarker = await HandLandmarker.createFromOptions(vision, {
baseOptions: {
modelAssetPath: "https://storage.googleapis.com/mediapipe-models/hand_landmarker/hand_landmarker/float16/latest/hand_landmarker.task",
},
runningMode: "VIDEO",
});
const results = handLandmarker.detectForVideo(videoElement, timestamp);
浏览器里跑!无需 GPU 服务器,隐私数据不出设备。
7. MediaPipe vs OpenCV vs YOLO 端侧
| 维度 |
MediaPipe |
OpenCV DNN |
YOLOv8-ncnn |
| 安装难度 |
⭐⭐⭐ 极简 |
⭐⭐ |
⭐ |
| 预置模型 |
⭐⭐⭐ 33 个 |
⭐ 有限 |
⭐ |
| 自定义模型 |
⭐⭐ |
⭐⭐ |
⭐⭐⭐ |
| Web/移动端 |
⭐⭐⭐ |
⭐⭐ |
⭐⭐ |
| 实时性 |
⭐⭐⭐ |
⭐⭐ |
⭐⭐⭐ |
思考题
- MediaPipe 在手机上跑得快的秘诀是什么?与普通 TF Lite 推理有何不同?
- Hands 检测 21 个关键点和 Pose 检测 33 个关键点的模型架构有何区别?
- 为什么 MediaPipe 选择 Calculator 图架构而不是简单的顺序 Pipeline?