Pose Estimation
Ước tính tư thế xác định vị trí các keypoint như khớp để mô tả tư thế của cơ thể hoặc đối tượng. Tìm hiểu các phương pháp top-down, bottom-up, một giai đoạn và OKS.
Ước lượng pose là tác vụ thị giác máy tính xác định vị trí một tập hợp keypoint được định nghĩa trước trên cơ thể hoặc vật thể, chẳng hạn vai, khuỷu tay và đầu gối của một người, rồi nối chúng thành skeleton mô tả tư thế. Model xuất tọa độ ảnh của từng keypoint hoặc vị trí 3D của keypoint, cùng với điểm tin cậy, để ứng dụng có thể đo góc khớp, đếm số lần lặp hoặc nhận diện hành động. Ước lượng pose mô tả cách mỗi người đứng hoặc di chuyển, điều mà bounding box từ phát hiện đối tượng hay mask từ phân đoạn instance không thể thể hiện.
Cách ước lượng pose hoạt động#
Các bộ ước lượng pose 2D nhiều người sử dụng một trong ba chiến lược; chiến lược thứ ba tương tự detector đối tượng một giai đoạn:
- Từ trên xuống: Detector người tìm tất cả mọi người trong ảnh, sau đó model đơn người dự đoán keypoint bên trong từng crop, như trong HRNet (2019) và ViTPose (2022). Độ chính xác cao với người có kích thước lớn và nhìn rõ, còn chi phí tăng theo số người.
- Từ dưới lên: Mạng tìm tất cả keypoint trong ảnh cùng lúc, rồi nhóm chúng thành từng người. OpenPose (2017) nối các khớp bằng trường liên kết bộ phận, tức các vector 2D chỉ dọc theo từng chi, nhờ vậy chi phí gần như không đổi trong đám đông.
- Một giai đoạn: Mạng dự đoán box của một người và toàn bộ keypoint của người đó từ cùng một vị trí lưới trong một lượt, không cần crop hay bước gom nhóm. YOLO-Pose (2022) đưa thiết kế này vào YOLO.
Vị trí keypoint được xác định bằng heatmap—mỗi keypoint có một bản đồ xác suất riêng với đỉnh đánh dấu vị trí—hoặc bằng cách hồi quy trực tiếp tọa độ. Heatmap dẫn đầu các benchmark trong nhiều năm nhưng tốn bộ nhớ và bị giới hạn bởi độ phân giải của bản đồ. Ước lượng log-khả năng dư (RLE) thu hẹp khoảng cách về hiệu quả của phương pháp hồi quy vào năm 2021 bằng cách học phân phối sai số dự đoán với normalizing flow. Model pose YOLO26 là các bộ hồi quy một giai đoạn được huấn luyện bằng RLE: trong quá trình huấn luyện, một nhánh bổ sung dự đoán độ bất định của từng keypoint và flow RealNVP chấm điểm sai số; cả hai đều bị loại bỏ khi hợp nhất model để suy luận, nên không làm phát sinh chi phí suy luận.
from ultralytics import YOLO
# Nạp model pose YOLO26 nano được huấn luyện trên 17 keypoint cơ thể COCO
model = YOLO("yolo26n-pose.pt")
# Tìm mọi người và keypoint của họ trong một lượt
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# Shape là (people, keypoints, xy); lưu ảnh có vẽ skeleton
print(result.keypoints.xy.shape)
result.save(filename="pose_result.jpg")Shape được in ra biểu thị số người được tìm thấy, với 17 keypoint và 2 tọa độ pixel cho mỗi người; ảnh đã lưu vẽ từng skeleton lên người tương ứng.
Ước lượng pose 2D và 3D#
Bộ ước lượng 2D trả về tọa độ pixel. Ước lượng pose người 3D khôi phục vị trí khớp trong không gian bằng cách nâng chuỗi keypoint 2D lên 3D bằng mạng thứ hai, như trong VideoPose3D; bằng cách tam giác hóa keypoint quan sát từ một số camera đã hiệu chuẩn; hoặc bằng cách khớp mesh cơ thể tham số như SMPL với ảnh. Ước lượng pose vật thể là một tác vụ riêng: tác vụ này khôi phục phép quay và phép tịnh tiến 3D của vật thể cứng, thường dựa trên keypoint trên bề mặt, phục vụ gắp vật bằng robot và thực tế tăng cường.
Đánh giá ước lượng pose#
Benchmark COCO Keypoints, với khoảng 250.000 người được gán nhãn 17 keypoint, chấm điểm dự đoán bằng độ tương đồng keypoint của đối tượng (OKS), đại lượng tương ứng với keypoint của intersection over union (IoU). Với mỗi keypoint được gán nhãn, khoảng cách d giữa dự đoán và nhãn được chuyển thành độ tương đồng exp(-d²/(2s²k²)), trong đó s² là diện tích phân đoạn của người và k là hằng số riêng cho từng keypoint, được đo dựa trên mức độ nhất quán khi người gán nhãn đặt keypoint đó. OKS tính trung bình các giá trị này trên những keypoint được gán nhãn, còn mean average precision (mAP) được tính trung bình trên các ngưỡng OKS từ 0.50 đến 0.95.
import numpy as np
# COCO falloff constants: annotators place eyes far more consistently than hips
sigmas = {"eye": 0.025, "hip": 0.107}
area = 20_000 # person's segmented area in pixels (s squared)
error = 5.0 # predicted keypoint lies 5 pixels from its label
# Per-keypoint OKS term: exp(-d^2 / (2 s^2 k^2)) with k = 2 * sigma
for name, sigma in sigmas.items():
similarity = np.exp(-(error**2) / (2 * area * (2 * sigma) ** 2))
print(f"{name}: {similarity:.2f}")Cùng một sai lệch 5 pixel có điểm 0.78 ở mắt và 0.99 ở hông. Các benchmark khác dùng những thước đo khác: MPII báo cáo PCKh, tỷ lệ keypoint nằm trong phạm vi nửa kích thước đầu so với nhãn; các benchmark 3D như Human3.6M báo cáo sai số vị trí trung bình trên mỗi khớp tính bằng milimét.
Ứng dụng thực tế#
- Phân tích thể thao: Huấn luyện viên đo góc khớp, độ dài sải chân và cơ chế vung tay từ video thông thường mà không cần các marker phản quang dùng trong hệ thống motion capture phòng thí nghiệm.
- Phục hồi chức năng: Ứng dụng vật lý trị liệu theo dõi phạm vi chuyển động và tư thế tập luyện tại nhà; hệ thống phát hiện té ngã theo dõi khi keypoint cơ thể hạ xuống ngang sàn.
- Nhận diện hành động: Chuỗi skeleton là đầu vào gọn nhẹ để phân loại các hành động như vẫy tay, ngã hoặc nâng vật; chuỗi này không bị ảnh hưởng bởi quần áo và phông nền.
- Nghiên cứu động vật: Các tập keypoint tùy chỉnh theo dõi tư thế động vật, chẳng hạn 24 keypoint cho mỗi con chó trong dataset Dog-Pose, nhằm nghiên cứu dáng đi và hành vi.










