Pose estimation là gì ?
Định nghĩa
Human pose estimation (HPE) là tác vụ thị giác máy tính nhằm biểu diễn tư thế của một người ở định dạng đồ họa (graphical format).
Một mô hình pose estimation có nhiệm vụ xác định và phân biệt các khớp (joints) của cơ thể người (các keypoints), liên kết giữa các keypoint được gọi là pairs. Khi kết nối keypoints và pairs ta thu được một sơ đồ giống khung xương cơ thể người (skeleton) và bài toán xác định nhiều skeleton trong 1 khung ảnh còn được gọi là Multi-person pose estimation.
Phân loại
Ta có thể phân loại các phương pháp pose estimation theo các tiêu chí sau
- Theo hướng tiếp cận: Skeleton-based, Contour-based, Volume-based.
- Theo tác vụ: Body, Face, Hand, Whole body, … pose estimation
- Theo số chiều: 2D và 3D pose estimation.
Ứng dụng
Pose estimation có nhiều ứng dụng trong thực tế và có thể kể đến một số ứng dụng như sau
- Action recognition: Nhận diện hành động liên quan đến việc nhận biết, xác định vị trí và dự đoán các hành vi của con người trong video. Skeleton đặc trưng cho tư thế con người và có thể sử dụng làm đầu vào cho các mô hình giải quyết bài toán này. Trong bài viết Action Recognition có đề cập đến các ứng dụng và các phương pháp nhận diện hành động trong đó có skeleton-based.
- Gesture recognition: Đây là một bài toán cụ thể trong lớp bài toán Action Recognition, với mục đích là nhận dạng và phân loại cử chỉ tay của đối tượng trong video và hand keypoints có thể được dùng làm thông tin quan trọng để nhận diện các cử chỉ khác nhau.
- Gaming: Ngoài ra pose estimation còn có nhiều ứng dụng trong gaming khi mô phỏng nhân vật theo hành động của con người.
Skeleton-based pose estimation
Trong phần này, ta sẽ cùng phân tích một số phương pháp pose estimation phổ biến hiện tại. Có thể chia các phương pháp nhận diện 2D-skeleton thành 2 nhóm là Top-down và Bottom-up.
Top-down pose estimation
Mô hình sử dụng phương pháp top-down sẽ phân vùng người có trong khung ảnh trước sau đó áp dụng bộ Single Person Pose Estimation (SPPE) để xác định các keypoints có trong mỗi phân vùng. Sơ đồ hoạt động của Alpha-Pose – mô hình top-down pose estimation có dạng như hình bên dưới.
Với mỗi phân vùng mô hình sẽ dự đoán nhiều skeleton và sau đó sử dụng thuật toán non maximum suppression (Pose NMS) để chọn ra skeleton có độ chính xác cao nhất. Các mô hình top-down có độ chính xác và thời gian xử lý phụ thuộc vào mô hình nhận dạng người và sẽ tăng lên khi số lượng người trong khung ảnh tăng.
Bottom-up pose estimation
Mô hình sử dụng phương pháp bottom-up sẽ phát hiện tất cả các keypoints của mọi người trong ảnh, sau đó mới phân chia mỗi keypoint về từng người cụ thể. Luồng hoạt động của Open-Pose – một mô hình bottom-up pose estimation có dạng như hình bên dưới.
Ảnh đầu vào OpenPose được đưa qua mạng VGG19 (10 layers đầu tiên) để trích xuất đặc trưng tạo thành tập feature maps F. Các đặc trưng này sau đó được đưa vào hai nhánh song song các lớp tích chập (two-branch multi stage CNN).
Two-branch nghĩa là mạng CNN trả về 2 output khác nhau gồm Confidence maps (St) và Part affinity fields (Lt) :
- Nhánh đầu tiên dự đoán keypoints của human skeletons (confidence maps of difference body parts location) – Parts
- Nhánh thứ hai dự đoán một tập hợp 38 Part Affinity Fields (PAFs) thể hiện mức độ liên kết giữa các bộ phận đó – Pairs
Multi-stage nghĩa là mạng CNN gồm nhiều stage liên kết, xếp chồng lên nhau. Stage đầu tiên nhận input là feature maps trích xuất từ backbone.Những stage tiếp theo có input là kết quả của stage trước ghép với feature map F.
Open-Pose có ưu điểm về thời gian xử lý so với các phương pháp top-down khi thời gian xử lý không thay đổi khi số lượng người trong khung ảnh tăng. Tuy nhiên trong khung ảnh có ít người, mô hình top-down có thể cho kết quả dự đoán keypoints tốt hơn.
Nhìn chung thì các mô hình pose estimation bên cạnh nhiệm vụ xác định chính xác các keypoints phải giải quyết các thách thức như thời gian chạy, hiệu quả của mô hình trong khung ảnh nhiều người, hỉnh ảnh mờ, hình ảnh chỉ chứa một phần cơ thể người, …
Sử dụng Open-pose
Trong phần này ta sẽ sử dụng Open-pose để dự đoán keypoint trong một khung ảnh cũng như trong một video.
Repo của tác giả Open-Pose (Zhe Cao) sử dụng tensorflow v1 có thể truy cập tại đây. Tuy nhiên ở phần này chúng ta sẽ sử dụng repo của tác giả Gunjan Sethi đã chuyển đổi lại để Open-Pose có thể hoạt động với tensorflow v2.
Các phần code dưới đây được viết để thuận tiện chạy trên google colab và có thể truy cập tại đây.
- Tải repo Open-Pose về colab
# %%capture - don't show log info %%capture # clone repo !git clone https://github.com/gsethi2409/tf-pose-estimation.git %cd tf-pose-estimation/ # install requirement !pip install -r requirements.txt !pip install swig # build open-pose %cd tf_pose/pafprocess/ !swig -python -c++ pafprocess.i && python3 setup.py build_ext --inplace !pip install git+https://github.com/adrianc-a/tf-slim.git@remove_contrib %cd ../../
Tại đường dẫn tf-pose-estimation ta có các thư mục và các file như sau:
- Thêm các thư viện cần thiết
import sys import time import os from tf_pose import common import cv2 import numpy as np import tensorflow as tf from tf_pose.estimator import TfPoseEstimator from tf_pose.networks import get_graph_path, model_wh import matplotlib.pyplot as plt
- Tải pose model
Trong repo đã có sẵn các model Open-Pose với các backbone khác nhau như : CMU / Mobilenet_thin / Mobilenet_v2_large / Mobilenet_v2_small. Tuy nhiên model cmu có backbone VGG19 không có sẵn trong repo nên ta có thể tải về như sau:
%cd models/graph/cmu !bash download.sh %cd ../../..
- Load pose model
%%capture # Load model 'cmu / mobilenet_thin / mobilenet_v2_large / mobilenet_v2_small' model = 'cmu'; w, h = model_wh('432x368'); e = TfPoseEstimator(get_graph_path(model), target_size=(w, h));
- Tải hình ảnh và xác định keypoints
# load image image_path = 'images/p3.jpg' t_start = time.time() frame = cv2.imread(image_path) # estimate skeletons humans = e.inference(frame, upsample_size=4.0) # plot skeletons frame = TfPoseEstimator.draw_humans(frame, humans, imgcopy=False) plt.figure(figsize=(8,8)) plt.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) print(f'Inference time: {time.time()-t_start :.2f}s')
- Kết quả
- Phần code chạy OpenPose với video chi tiết có trong file Google Colab và có thể tham khảo tại đây.
Vậy là chúng ta đã tìm hiểu tổng quan về pose estimation cũng như sử dụng một mô hình pose estimation. Cảm ơn mọi người đã dành thời gian đọc đến đây và hẹn gặp lại mọi người tại những bài viết tiếp theo.