如何基于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,提问作者季子钧
相关产品推荐
相关产品推荐

