在計算機視覺領域,人體姿態檢測與軌跡跟蹤是很多應用場景的核心技術,例如運動分析、行為識別、智能監控等。本文將介紹如何在 PiscCode 平臺上,利用 YOLO-Pose 模型進行姿態估計,并實現多人關鍵點軌跡跟蹤。
一、什么是 PiscCode
PiscCode 是一個面向開發者的計算機視覺編程平臺,它提供了靈活的 Python API 封裝、多模型管理和高性能視頻處理能力。在 PiscCode 平臺上,開發者可以方便地:
-
調用不同的目標檢測、實例分割、姿態估計模型;
-
對視頻幀進行實時處理、繪制和結果渲染;
-
快速構建可復用的視覺算法模塊。
在本文示例中,我們使用 PiscCode 的視頻處理能力,將 YOLO-Pose 模型封裝為一個 FrameObject
類,實現多人體關鍵點檢測與軌跡繪制。
二、YOLO-Pose 模型簡介
YOLO-Pose 是 YOLO 系列模型的擴展版本,它在傳統目標檢測的基礎上增加了 人體關鍵點預測 功能。特點如下:
-
高效、快速,可用于實時視頻分析;
-
支持多人姿態檢測;
-
與 YOLOv8/v11 系列兼容,可通過
track()
方法獲取穩定的跟蹤 ID。
通過 YOLO-Pose,我們可以得到每個人體的關鍵點位置,并結合跟蹤 ID,實現軌跡記錄和繪制。
三、FrameObject 封裝實現
下面是基于 YOLO-Pose 的 FrameObject
類,集成了關鍵點檢測、軌跡緩存和繪制功能:
import cv2
import random
from ultralytics import YOLOclass FrameObject:def __init__(self,model_path="E:/影跡-p/Support Files/data/model/yolo11x-pose.pt",device="cuda",line_thickness=2,point_size=6,max_frames=30,draw_bbox=False,):self.model = YOLO(model_path)self.model.to(device)self.device = deviceself.tf = line_thicknessself.point_size = point_sizeself.max_frames = max_framesself.draw_bbox = draw_bboxself.trajectories = {}@staticmethoddef _rand_color():return [random.randint(0, 255) for _ in range(3)]def _ensure_tracks_init(self, track_id: int, kpt_count: int):if track_id not in self.trajectories:self.trajectories[track_id] = [[] for _ in range(kpt_count)]self.trajectories[track_id].append(self._rand_color())else:cur_len = len(self.trajectories[track_id]) - 1if cur_len != kpt_count:color = self.trajectories[track_id][-1]self.trajectories[track_id] = [[] for _ in range(kpt_count)]self.trajectories[track_id].append(color)def do(self, frame):if frame is None:return Noneim = frame.copy()results = self.model.track(im, verbose=False, persist=True, device=self.device)if not results or len(results) == 0:return imres = results[0]ids = res.boxes.id.cpu().numpy() if res.boxes.id is not None else []boxes = res.boxes.xyxy.cpu().numpy() if (self.draw_bbox and res.boxes is not None) else []kpts = getattr(res, "keypoints", None)if kpts is None or kpts.data is None or len(kpts.data) == 0:return imkpts_data = kpts.datafor i, keypoints in enumerate(kpts_data):track_id = int(ids[i]) if i < len(ids) else ikpt_count = len(keypoints)self._ensure_tracks_init(track_id, kpt_count)color = self.trajectories[track_id][-1]for j, point_tensor in enumerate(keypoints):x, y = map(int, point_tensor[:2].detach().cpu().numpy())if x == 0 and y == 0:continueself.trajectories[track_id][j].append((x, y))if len(self.trajectories[track_id][j]) > self.max_frames:self.trajectories[track_id][j].pop(0)cv2.circle(im, (x, y), self.point_size, color, -1)for track_id, traj_list in self.trajectories.items():color = traj_list[-1]for traj in traj_list[:-1]:if len(traj) > 1:for i in range(1, len(traj)):cv2.line(im, traj[i - 1], traj[i], color, thickness=max(1, self.point_size // 3))if self.draw_bbox and len(boxes) > 0:for i, box in enumerate(boxes):x1, y1, x2, y2 = map(int, box[:4])track_id = int(ids[i]) if i < len(ids) else icolor = self.trajectories.get(track_id, [[None], self._rand_color()])[-1]cv2.rectangle(im, (x1, y1), (x2, y2), color, 2)return im
四、應用示例 Demo
五、總結
本文展示了如何在 PiscCode 平臺上:
-
使用 YOLO-Pose 模型進行多人關鍵點檢測;
-
結合 track() 方法,實現穩定 ID 的軌跡跟蹤;
-
將關鍵點軌跡可視化到原始視頻中。
通過封裝成 FrameObject
類,開發者可以輕松集成到視頻分析、運動識別、智能監控等應用中,并方便擴展更多功能,例如姿態動作識別或異常行為檢測。
對 PiscTrace or PiscCode感興趣?更多精彩內容請移步官網看看~🔗?PiscTrace