You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于YOLOv8 Pose实现指定关键点越线计数?

问题

YOLOv8可实现关键点检测,现需统计越过指定线的关键点数量。已知ultralytics提供的object_counter.py可实现计数功能,其extract_and_process_tracks方法中,track_line.append存储的是检测框的中心坐标(代码如下)。现需将该中心坐标替换为关键点坐标(例如动物头部关键点)以实现对应关键点的越线计数,请问如何在YOLOv8 Pose中获取关键点坐标?

原方法代码:

def extract_and_process_tracks(self, tracks):
    boxes = tracks[0].boxes.xyxy.cpu()
    clss = tracks[0].boxes.cls.cpu().tolist()
    track_ids = tracks[0].boxes.id.int().cpu().tolist()

    self.annotator = Annotator(self.im0, self.tf, self.names)
    self.annotator.draw_region(reg_pts=self.reg_pts, color=(0, 255, 0))

    for box, track_id, cls in zip(boxes, track_ids, clss):
        self.annotator.box_label(box, label=self.names[cls], color=colors(int(cls), True))  

        # Draw Tracks
        track_line = self.track_history[track_id]
        track_line.append((float((box[0] + box[2]) / 2), float((box[1] + box[3]) / 2)))
        track_line.pop(0) if len(track_line) > 30 else None

        if self.draw_tracks:
            self.annotator.draw_centroid_and_tracks(track_line,
                                                    color=(0, 255, 0),
                                                    track_thickness=self.track_thickness)

解决方案

1. 提取YOLOv8 Pose的关键点数据

在YOLOv8 Pose的跟踪结果tracks中,关键点数据存储在tracks[0].keypoints下,核心属性包括:

  • xy: 存储所有目标的关键点(x,y)坐标,张量形状为[N, K, 2],其中N是检测目标数,K是关键点总数
  • conf: 每个关键点的置信度值,张量形状为[N, K],用于过滤低精度的关键点

2. 修改extract_and_process_tracks方法

替换原代码中检测框中心坐标的逻辑,改为使用指定关键点坐标(以头部关键点为例,假设其为第0个关键点),同时加入置信度过滤保证数据可靠性:

def extract_and_process_tracks(self, tracks):
    boxes = tracks[0].boxes.xyxy.cpu()
    clss = tracks[0].boxes.cls.cpu().tolist()
    track_ids = tracks[0].boxes.id.int().cpu().tolist()
    # 新增:提取关键点坐标与置信度并转为numpy数组
    keypoints = tracks[0].keypoints.xy.cpu().numpy()
    keypoint_confs = tracks[0].keypoints.conf.cpu().numpy()

    self.annotator = Annotator(self.im0, self.tf, self.names)
    self.annotator.draw_region(reg_pts=self.reg_pts, color=(0, 255, 0))

    for box, track_id, cls, kp, kp_conf in zip(boxes, track_ids, clss, keypoints, keypoint_confs):
        self.annotator.box_label(box, label=self.names[cls], color=colors(int(cls), True))  

        track_line = self.track_history[track_id]
        # 替换为头部关键点坐标,加入置信度过滤
        target_kp_idx = 0  # 自定义关键点索引,对应你需要的部位
        if kp_conf[target_kp_idx] > 0.5:  # 可调整置信度阈值
            target_x, target_y = kp[target_kp_idx][0], kp[target_kp_idx][1]
            track_line.append((float(target_x), float(target_y)))
        else:
            # 关键点置信度不足时, fallback 到检测框中心保证轨迹连续
            center_x = float((box[0] + box[2]) / 2)
            center_y = float((box[1] + box[3]) / 2)
            track_line.append((center_x, center_y))
        
        track_line.pop(0) if len(track_line) > 30 else None

        if self.draw_tracks:
            self.annotator.draw_centroid_and_tracks(track_line,
                                                    color=(0, 255, 0),
                                                    track_thickness=self.track_thickness)

3. 关键注意事项

  • 关键点索引:不同Pose模型的关键点顺序不同,比如COCO人体关键点中第0位是鼻子,自定义训练的动物模型需对应自己标注的关键点索引
  • 置信度阈值:可根据实际场景调整,平衡准确性与轨迹连续性
  • 备选方案:当关键点不可靠时,保留检测框中心作为备选,避免轨迹中断

内容的提问来源于stack exchange,提问作者季子钧

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:31:04