Pose Detection là công nghệ thị giác máy tính xác định vị trí cơ thể con người thông qua các điểm chính (landmarks): đầu, vai, khuỷu tay, cổ tay, hông, đầu gối, mắt cá chân. Mỗi điểm có tọa độ (x, y) trong không gian 2D và các mô hình nâng cao (MediaPipe BlazePose 3D) thêm tọa độ z cho chiều sâu. Trong các ứng dụng di động, Pose Detection được sử dụng trong máy theo dõi thể dục, ứng dụng yoga, bộ lọc AR, chương trình phục hồi chức năng và hệ thống phân tích thể thao. Theo Google ML Kit, 2025, Pose Detection trên thiết bị xử lý tới 30 khung hình mỗi giây với độ chính xác 94% PCK.
Những điểm chính
Pose Detection (còn gọi là Ước tính tư thế) đề cập đến nhiệm vụ xác định các điểm chính ngữ nghĩa của cơ thể con người từ hình ảnh hoặc video. Phương pháp Top-down đầu tiên phát hiện người (Phát hiện đối tượng), sau đó xác định tư thế của họ. Phương pháp Bottom-up tìm tất cả các landmarks trong hình ảnh, sau đó nhóm chúng theo người (OpenPose). Đối với thiết bị di động, sử dụng bottom-up — nhanh hơn khi có nhiều người trong khung hình. ML Kit và BlazePose sử dụng phương pháp một giai đoạn — phát hiện + tư thế trong một lần.
COCO Keypoints — bộ tiêu chuẩn gồm 17 điểm: mũi, mắt (2), tai (2), vai (2), khuỷu tay (2), cổ tay (2), hông (2), đầu gối (2), mắt cá chân (2). MediaPipe BlazePose sử dụng 33 điểm, thêm: ngón chân, gót chân, trung tâm thân, điểm mặt. Càng nhiều điểm, phân tích tư thế càng chính xác, nhưng tải tính toán càng cao. Đối với ứng dụng thể dục, 17–20 điểm là đủ. Đối với phân tích đầy đủ (yoga, khiêu vũ) — 33 điểm. Đối với bộ lọc AR — 33 điểm + 468 điểm mặt (MediaPipe Face Mesh).
PCK (Percentage of Correct Keypoints) — chỉ số độ chính xác của Pose Detection. Tính tỷ lệ điểm được dự đoán trong khoảng cách so với ground truth (thường là 0.05–0.15 kích thước hộp giới hạn của người). ML Kit Pose Detection: 94% PCK@0.1. BlazePose Full: 96% PCK@0.1. MoveNet Lightning: 91% PCK@0.1. OKS (Object Keypoint Similarity) — chỉ số được sử dụng trong COCO, tính đến tỷ lệ người và độ khó của điểm. mAP@OKS — chỉ số tiêu chuẩn cho benchmark.
| Mô hình | Landmarks | PCK@0.1 | Độ trễ (GPU) | Kích thước |
|---|---|---|---|---|
| ML Kit Pose Acc | 33 | 94% | 15–30 ms | 14 MB |
| BlazePose Full | 33 + 3D | 96% | 10–20 ms | 12 MB |
| BlazePose Lite | 33 | 91% | 5–10 ms | 5 MB |
| MoveNet Lightning | 17 | 91% | 8–15 ms | 8 MB |
| MoveNet Thunder | 17 | 95% | 25–40 ms | 13 MB |
Khả năng hiển thị Keypoint: mỗi landmark có điểm số (0..1) cho biết mô hình tự tin đến mức nào về điểm đó và liệu nó có hiển thị hay không. Các điểm có điểm < 0.5 được coi là vô hình (bị che khuất, ngoài khung hình). Để phân tích tư thế, chỉ sử dụng các điểm hiển thị. Để đánh giá sự căn chỉnh — tính khoảng cách có trọng số tin cậy, trong đó các điểm có điểm thấp có trọng số thấp hơn trong chỉ số.
ML Kit Pose Detection — thư viện từ Google để phát hiện tư thế trên thiết bị. Hỗ trợ 33 landmarks, bao gồm điểm mặt, ngón chân và gót chân. Chế độ: Accurate Mode (mô hình 14 MB, 15–30 ms, độ chính xác cao) và Streaming Mode (5 MB, 5–10 ms, cho thời gian thực). Streaming Mode sử dụng mô hình nhẹ với theo dõi — sau khung hình đầu tiên, nó theo dõi chuyển động mà không phát hiện lại vị trí chính xác, đạt tới 60 FPS.
API ML Kit Pose Detection: PoseDetector (tùy chọn: setDetectorMode, setPerformanceMode) → InputImage → Pose (List<PoseLandmark>). Mỗi PoseLandmark có: landmarkType (38 loại), position (PointF3D), inFrameLikelihood (0..1). Pose cũng cung cấp: boundingBox của người, danh sách landmarks, phương thức getLandmark(type). Để phân loại tư thế, sử dụng góc giữa các xương: shoulderAngle, elbowAngle, hipAngle — được tính qua Vector3D giữa các landmarks liền kề.
val options = PoseDetectorOptions.Builder()
.setDetectorMode(PoseDetectorOptions.STREAM_MODE)
.setPerformanceMode(PoseDetectorOptions.PERFORMANCE_MODE_FAST)
.build()
val detector = PoseDetection.getClient(options)
detector.process(inputImage)
.addOnSuccessListener { pose ->
val leftElbow = pose.getLandmark(PoseLandmark.LEFT_ELBOW)
val leftShoulder = pose.getLandmark(PoseLandmark.LEFT_SHOULDER)
val leftWrist = pose.getLandmark(PoseLandmark.LEFT_WRIST)
val elbowAngle = calculateAngle(
leftShoulder.position, leftElbow.position, leftWrist.position
)
}
ML Kit trên iOS: Pose Detection có sẵn qua ML Kit CocoaPods. API tương tự Android: PoseDetector → UIImage → Pose → PoseLandmark. Trên iOS, ML Kit sử dụng Core ML và ANE (A12+), đạt độ trễ 10–20 ms ở chế độ Accurate Mode trên iPhone 15 Pro. Chế độ Streaming — 3–8 ms, lên tới 120 FPS. Trên iOS, ML Kit Pose Detection nhanh hơn MediaPipe BlazePose (tăng tốc Core ML), nhưng thua kém BlazePose về FPS trên các thiết bị cũ (iPhone X–11).
MediaPipe BlazePose — mô hình hiệu suất cao cho Pose Detection từ Google Research. Sử dụng kiến trúc lai: pipeline detector-decoder dựa trên MobileNetV2 + Feature Pyramid Network. BlazePose Full: 33 landmarks + tọa độ 3D (độ sâu z). BlazePose Lite: 33 landmarks (2D) không có độ sâu. Cả hai mô hình đều có sẵn trong MediaPipe Tasks Vision trên Android, iOS, Python và Web. BlazePose Full xử lý 30–60 FPS trên GPU, Lite — 60+ FPS.
Ước tính tư thế 3D với BlazePose: mô hình dự đoán tọa độ z cho mỗi landmark, cho phép ước tính độ sâu (tiếp cận/rút lui của chi) mà không cần camera lập thể. Tọa độ z được tính trong không gian mét (mét) so với camera. Độ chính xác BlazePose 3D: 37 mm MPJPE (Mean Per Joint Position Error) trên các benchmark công khai — đủ cho thể dục và AR, không đủ cho chẩn đoán y tế. Đối với ARKit/ARFoundation, BlazePose 3D cung cấp độ sâu tự nhiên.
// Tác vụ Thị giác MediaPipe Pose Detection
val options = PoseLandmarkerOptions.Builder()
.setBaseOptions(BaseOptions.builder()
.setModelAssetPath("pose_landmarker_full.task")
.build())
.setDelegate(Delegate.GPU)
.build()
val landmaker = PoseLandmarker.createFromOptions(context, options)
val result = landmaker.detect(MPImage.fromBitmap(bitmap))
result.landmarks.forEach { pose ->
pose.forEach { landmark ->
drawLandmark(landmark.x, landmark.y, landmark.z)
}
}
BlazePose vs ML Kit Pose Detection: BlazePose nhanh hơn (60+ FPS vs 30 FPS), hỗ trợ tọa độ 3D, hoạt động đa nền tảng qua MediaPipe. ML Kit dễ tích hợp hơn (không yêu cầu MediaPipe SDK), bao gồm các mô hình được đào tạo sẵn với độ chính xác cao. Đối với dự án iOS gốc — ML Kit Pose Detection (tối ưu hóa ANE tốt nhất). Đối với dự án đa nền tảng (Flutter, React Native) — MediaPipe BlazePose (mô hình thống nhất cho tất cả nền tảng). Về độ chính xác trong các cảnh khó — cả hai mô hình đều tương đương.
MoveNet — họ mô hình Pose Detection từ TensorFlow, tối ưu hóa cho TFLite. Lightning (8 MB, INT8 — 4 MB): 17 keypoints COCO, 91% PCK, độ trễ 8–15 ms, 30+ FPS. Thunder (13 MB, INT8 — 6 MB): 17 keypoints, 95% PCK, độ trễ 25–40 ms, 20+ FPS. MoveNet sử dụng kiến trúc CenterNet + nội suy song tuyến cho bản đồ nhiệt độ phân giải cao. MoveNet hỗ trợ phát hiện đa tư thế (tới 6 người). Các mô hình có sẵn trên TensorFlow Hub.
MoveNet Lightning vs Thunder: Lightning — cho ứng dụng thời gian thực với FPS cao (thể dục, bộ lọc AR). Thunder — cho phân tích tư thế chính xác (phục hồi chức năng, phân tích thể thao) trên thiết bị có GPU. Cả hai mô hình đều chuyển đổi sang Core ML qua tf-coreml cho iOS. MoveNet cũng có sẵn qua API TFLite Task Vision PoseLandmarker. Khuyến nghị: bắt đầu với Lightning, nếu độ chính xác không đủ — chuyển sang Thunder (chỉ thêm +15 ms độ trễ).
// Suy luận MoveNet với TFLite
Interpreter interpreter = new Interpreter(loadModel(context));
TensorImage image = TensorImage.fromBitmap(bitmap);
image.load(Bitmap.createScaledBitmap(bitmap, 192, 192, true));
float[][] output = new float[1][51];
interpreter.run(image.getTensorBuffer(), output);
float[] keypoints = output[0];
for (int i = 0; i < 17; i++) {
float y = keypoints[i * 3];
float x = keypoints[i * 3 + 1];
float score = keypoints[i * 3 + 2];
drawKeypoint(x, y, score);
}
MoveNet đa tư thế: phát hiện tới 6 người trong khung hình. Thay vì phương pháp bản đồ nhiệt tiêu chuẩn, MoveNet sử dụng phát hiện người + tinh chỉnh tư thế: đầu tiên phát hiện người (dựa trên trọng tâm), sau đó ước tính mỗi tư thế. Chế độ đa tư thế chậm hơn 2–3 lần so với đơn tư thế: Lightning — 25–50 ms (6 người). Đối với ứng dụng thể dục một người dùng, sử dụng đơn tư thế. Đối với hoạt động nhóm (yoga, crossfit) — đa tư thế với giới hạn khung hình để tiết kiệm pin.
Pose Classification — giai đoạn sau phát hiện: chuyển đổi landmarks thành các hành động ngữ nghĩa (đứng, ngồi, giơ tay, ngồi xổm). Các phương pháp: Dựa trên quy tắc (quy tắc thủ công — góc giữa xương), Dựa trên ML (hồi quy logistic hoặc Random Forest trên vector landmark), Dựa trên DL (bộ phân loại LSTM chuỗi tư thế qua các khung hình). Dựa trên quy tắc — độ chính xác 50–80%, đơn giản và nhanh. Dựa trên ML — độ chính xác 85–95% với 200+ mẫu được gắn nhãn. LSTM — độ chính xác 90–98% trên chuỗi thời gian (video).
Góc giữa xương: cho mỗi điểm, góc với các điểm lân cận được tính toán. Ví dụ: góc khuỷu tay phải (vai → khuỷu tay → cổ tay), góc đầu gối phải (hông → đầu gối → mắt cá chân), góc thân (điểm giữa vai → điểm giữa hông). Góc không phụ thuộc vào tỷ lệ người và vị trí trên màn hình. Chuẩn hóa góc về phạm vi [0, 1] cho phép phân loại tư thế bằng quy tắc ngưỡng đơn giản: nếu elbowAngle < 30° — cánh tay gập, nếu > 150° — duỗi thẳng.
// Bộ phân loại squat dựa trên quy tắc
fun classifySquat(pose: Pose): SquatPhase {
val kneeAngle = angle(
pose.getLandmark(PoseLandmark.LEFT_HIP),
pose.getLandmark(PoseLandmark.LEFT_KNEE),
pose.getLandmark(PoseLandmark.LEFT_ANKLE)
)
return when {
kneeAngle > 140f -> SquatPhase.STANDING
kneeAngle < 90f -> SquatPhase.SQUAT
else -> SquatPhase.TRANSITION
}
}
MediaPipe Pose Classification — các bộ phân loại được đào tạo sẵn trong MediaPipe Tasks: squat, chống đẩy, plank, nâng chân. Bộ phân loại nhận danh sách landmarks và trả về hành động + độ tin cậy. Bao gồm làm mịn theo thời gian (bộ lọc thời gian): HED (Holt Exponential Double Smoothing) để chuyển tiếp mượt giữa các tư thế. Đối với hành động tùy chỉnh — đào tạo bộ phân loại trên 100–500 mẫu qua MediaPipe Model Maker (TensorFlow Lite + siêu dữ liệu).
Máy theo dõi thể dục với chỉnh sửa kỹ thuật — ứng dụng phân tích tư thế người dùng trong khi tập luyện và đưa ra hướng dẫn bằng giọng nói: “hạy hông xuống”, “không nghiêng thân về phía trước”. ML Kit Pose Detection + bộ phân loại dựa trên quy tắc đếm số lần lặp và đánh giá chất lượng. Squat: góc đầu gối < 90° — squat đúng, góc lưng < 45° — nghiêng thân nguy hiểm. Chống đẩy: góc khuỷu tay < 90° ở điểm dưới cùng — chống đẩy đầy đủ. Kéo xà: cằm trên mức thanh.
Phục hồi chức năng và vật lý trị liệu — Pose Detection được sử dụng để theo dõi từ xa các bài tập vật lý trị liệu. Bác sĩ đặt tư thế tham chiếu (ví dụ: dang vai ở góc 45°), ứng dụng đo góc hiện tại và độ lệch. BlazePose 3D cung cấp độ chính xác góc ±3° — đủ cho đánh giá lâm sàng. Tần suất: 1 khung hình mỗi 3–5 giây (tiết kiệm pin). Trên thiết bị — quyền riêng tư dữ liệu y tế của bệnh nhân. Phục hồi sau đột quỵ: theo dõi tay-đến-vai, duỗi khuỷu tay, gập hông.
Bộ lọc AR và hiệu ứng — Pose Detection là nền tảng của bộ lọc AR trong mạng xã hội (TikTok, Instagram, Snapchat). Các landmark của đầu, vai và tay được sử dụng để phủ mặt nạ, hoạt ảnh, yếu tố trang trí. MediaPipe BlazePose Full + Face Mesh (468 điểm) đạt 120+ FPS trên thiết bị flagship. ARKit/ARCore Face Tracking + Pose Detection — sự kết hợp cho AR toàn thân. Yêu cầu: FPS > 30, độ trễ motion-to-photon < 20 ms.
// Bộ lọc AR với landmarks tư thế
let request = VNDetectHumanBodyPoseRequest { req, _ in
guard let observation = req.results?.first as? VNHumanBodyPoseObservation else { return }
let keypoints = try observation.recognizedPoints(.all)
let rightShoulder = keypoints[VNHumanBodyPoseObservation.JointName.rightShoulder]
DispatchQueue.main.async {
arView.placeFilter(at: rightShoulder?.location ?? .zero)
}
}
Phân tích thể thao — đánh giá kỹ thuật chuyên nghiệp: phân tích cơ sinh học khi chạy (nhịp, độ dài sải chân, đối xứng vung tay), bơi lội (xoay thân, góc khuỷu tay khi kéo), quần vợt (xoay vai, búng cổ tay). MoveNet Thunder với hậu xử lý cung cấp độ chính xác đủ cho phân tích không chuyên. Thể thao chuyên nghiệp yêu cầu chụp chuyển động 3D (Vicon, OptiTrack), nhưng Pose Detection trên điện thoại là giải pháp thay thế giá rẻ cho thị trường đại chúng. Đồng bộ góc giữa các khung hình là thành phần chính.
Câu hỏi thường gặp
Sử dụng làm mịn theo thời gian: One Euro Filter (bộ lọc 1€) — tần số cắt có thể cấu hình riêng cho mỗi landmark, triệt tiêu nhiễu tần số cao (rung) trong khi giữ nguyên chuyển động thực (độ trễ thấp). MediaPipe BlazePose bao gồm HED tích hợp (Holt Exponential Double Smoothing) — làm mịn thích ứng với dự đoán chuyển động. Đối với ML Kit, tự triển khai bộ lọc 1€: bộ lọc có hai tham số — beta (tốc độ) và minCutoff (ngưỡng tần số). Khuyến nghị: beta = 0.04, minCutoff = 0.5 (Android).
ML Kit Pose Detection — một người (đơn tư thế). MoveNet Lightning — lên tới 6 người (đa tư thế). MediaPipe BlazePose — lên tới 2–3 người qua MediaPipe Tasks (đa tư thế). Đối với ứng dụng hoạt động nhóm, sử dụng MoveNet Lightning hoặc BlazePose. Đối với ứng dụng thể dục một người dùng — ML Kit (tích hợp đơn giản hơn, độ chính xác đơn tư thế cao hơn). Đối với cuộc gọi video có bộ lọc AR — BlazePose Lite với đa tư thế (FPS cao) là đủ.
Góc giữa hai xương: lấy ba landmarks — khớp A, khớp B (đỉnh góc), khớp C. Tính vector BA = (A - B) và BC = (C - B). Góc = atan2(cross(BA, BC), dot(BA, BC)). Math.toDegrees(acos(dot(BA, BC) / (len(BA) * len(BC)))). Góc trong phạm vi 0–180°. Đối với tọa độ ba chiều (BlazePose 3D) sử dụng Vector3D. Chuẩn hóa góc về phạm vi [0,1] cho bộ phân loại ML.
Có, tất cả các mô hình chính (ML Kit, BlazePose, MoveNet) đều phát hiện landmarks của cả hai tay cùng lúc: LEFT_SHOULDER, LEFT_ELBOW, LEFT_WRIST, RIGHT_SHOULDER, RIGHT_ELBOW, RIGHT_WRIST. Để phát hiện thêm bàn tay, kết hợp Pose Detection + Hand Landmarker (21 điểm mỗi tay). MediaPipe Hands + BlazePose là sự kết hợp tiêu chuẩn cho toàn thân + tay. Trên iOS — VNDetectHumanHandPoseRequest + VNDetectHumanBodyPoseRequest.
ML Kit Pose Detection: hộp giới hạn tối thiểu của người — 100x100 pixel (tỷ lệ khung hình ~1:1). MoveNet Lightning: 120x120 pixel. BlazePose: 80x160 pixel (hộp giới hạn dọc). Đối với người đứng thẳng ở khoảng cách 3 mét từ máy ảnh (1920x1080) — khoảng 250x600 px, đủ. Ở khoảng cách > 5 mét, độ chính xác giảm — sử dụng Đa tư thế + đầu vào độ phân giải cao. Đối với vật thể ở xa, Phát hiện đối tượng + Ước tính tư thế (hai giai đoạn) tốt hơn.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm