YOLO26N 姿态估计模型架构与 17 关键点解析
1. 姿态估计概述
姿态估计任务:
├── 输入:RGB 图像
├── 输出:人体边界框 + 17 个关键点坐标
├── 关键点:鼻子、眼睛、耳朵、肩膀、肘、腕、髋、膝、踝
└── 应用:跌倒检测、健身指导、动作识别、人机交互
2. COCO 17 关键点定义
关键点索引与连接关系:
┌─────┬──────────┬─────────────────────────┐
│ 索引 │ 名称 │ 连接关系 │
├─────┼──────────┼─────────────────────────┤
│ 0 │ 鼻子 │ → 左眼(1), 右眼(2) │
│ 1 │ 左眼 │ → 鼻子(0), 左耳(3) │
│ 2 │ 右眼 │ → 鼻子(0), 右耳(4) │
│ 3 │ 左耳 │ → 左眼(1) │
│ 4 │ 右耳 │ → 右眼(2) │
│ 5 │ 左肩 │ → 右肩(6), 左肘(7) │
│ 6 │ 右肩 │ → 左肩(5), 右肘(8) │
│ 7 │ 左肘 │ → 左肩(5), 左腕(9) │
│ 8 │ 右肘 │ → 右肩(6), 右腕(10) │
│ 9 │ 左腕 │ → 左肘(7) │
│ 10 │ 右腕 │ → 右肘(8) │
│ 11 │ 左髋 │ → 右髋(12), 左膝(13) │
│ 12 │ 右髋 │ → 左髋(11), 右膝(14) │
│ 13 │ 左膝 │ → 左髋(11), 左踝(15) │
│ 14 │ 右膝 │ → 右髋(12), 右踝(16) │
│ 15 │ 左踝 │ → 左膝(13) │
│ 16 │ 右踝 │ → 右膝(14) │
└─────┴──────────┴─────────────────────────┘
骨架连接(骨骼):
上半身:0-1, 0-2, 1-3, 2-4, 5-6, 5-7, 6-8, 7-9, 8-10
下半身:11-12, 11-13, 12-14, 13-15, 14-16
躯干:5-11, 6-12
3. YOLO26N 姿态估计架构
YOLO26N-Pose 模型结构:
├── Backbone(主干)
│ ├── Stem:3 层 Conv(下采样 8x)
│ ├── Stage 1-4:C3k2 模块
│ └── SPPF:空间金字塔池化
├── Neck(特征融合)
│ ├── FPN:自顶向下
│ └── PAN:自底向上
└── Head(检测头)
├── 分类分支:1 类(person)
├── 回归分支:4 值(bbox)
└── 关键点分支:17x3(x, y, visibility)
4. 模型输出格式
# YOLO26N-Pose 输出格式
# 输出 tensor shape: [1, 56, 8400]
# 56 = 4(bbox) + 1(conf) + 1(cls) + 17*3(kpts)
# 分解:
# bbox: [4, 8400] → cx, cy, w, h
# conf: [1, 8400] → 目标置信度
# cls: [1, 8400] → 类别(person=0)
# kpts: [51, 8400] → 17 个关键点 × (x, y, visibility)
# 关键点 visibility:
# 0 = 不可见(被遮挡)
# 1 = 部分可见
# 2 = 完全可见
5. 模型规格
YOLO26N-Pose 模型参数:
┌──────────────────┬──────────┐
│ 参数 │ 数值 │
├──────────────────┼──────────┤
│ 参数量 │ 3.2M │
│ FLOPs │ 6.8G │
│ 模型大小(FP16) │ 6.4MB │
│ 模型大小(INT8) │ 3.2MB │
│ 输入尺寸 │ 640x640 │
│ 输出维度 │ 56x8400 │
│ 关键点数 │ 17 │
│ COCO mAP50-95 │ 68.5 │
│ 推理延迟(Orin NX)│ 5.2ms │
└──────────────────┴──────────┘
6. 快速体验
#!/usr/bin/env python3
"""quick_pose.py - 快速姿态估计"""
from ultralytics import YOLO
# 加载预训练模型
model = YOLO("yolo26n-pose.pt")
# 推理
results = model.predict("person.jpg", conf=0.3, save=True)
for r in results:
if r.keypoints is not None:
for kp in r.keypoints:
kpts = kp.data[0] # [17, 3]
for i, (x, y, vis) in enumerate(kpts):
if vis > 0.5:
print(f"关键点 {i:2d}: ({x:6.1f}, {y:6.1f}) 可见性: {vis:.2f}")
7. 关键点可视化
#!/usr/bin/env python3
"""draw_pose.py - 姿态可视化"""
import cv2
import numpy as np
# 骨架连接定义
SKELETON = [
(0, 1), (0, 2), (1, 3), (2, 4), # 头部
(5, 6), (5, 7), (6, 8), (7, 9), (8, 10), # 上半身
(11, 12), (11, 13), (12, 14), (13, 15), (14, 16), # 下半身
(5, 11), (6, 12), # 躯干
]
# 关键点颜色
COLORS = [
(255, 0, 0), (255, 85, 0), (255, 170, 0), (255, 255, 0),
(170, 255, 0), (85, 255, 0), (0, 255, 0), (0, 255, 85),
(0, 255, 170), (0, 255, 255), (0, 170, 255), (0, 85, 255),
(0, 0, 255), (85, 0, 255), (170, 0, 255), (255, 0, 255),
(255, 0, 170),
]
def draw_pose(image, keypoints, conf_thresh=0.3):
"""绘制姿态骨架"""
canvas = image.copy()
# 绘制骨架连线
for (i, j) in SKELETON:
if keypoints[i][2] > conf_thresh and keypoints[j][2] > conf_thresh:
pt1 = (int(keypoints[i][0]), int(keypoints[i][1]))
pt2 = (int(keypoints[j][0]), int(keypoints[j][1]))
cv2.line(canvas, pt1, pt2, (0, 255, 0), 2)
# 绘制关键点
for i, (x, y, vis) in enumerate(keypoints):
if vis > conf_thresh:
cv2.circle(canvas, (int(x), int(y)), 4, COLORS[i], -1)
cv2.circle(canvas, (int(x), int(y)), 6, (255, 255, 255), 1)
return canvas
总结
| 维度 | YOLO26N-Pose |
|---|---|
| 参数量 | 3.2M |
| 模型大小 | 6.4MB (FP16) / 3.2MB (INT8) |
| 关键点 | 17 个(COCO 标准) |
| 精度 | mAP 68.5 |
| 延迟 | 5.2ms (Orin NX FP16) |
核心要点:
- 输出格式:[1, 56, 8400] = bbox(4) + conf(1) + cls(1) + kpts(51)
- 关键点:17 个 COCO 标准关键点,每个含 (x, y, visibility)
- 骨架连接:16 条骨骼线,用于可视化
- 轻量化:仅 3.2M 参数,适合边缘部署


1万+

被折叠的 条评论
为什么被折叠?



