姿态估计是一项涉及识别图像中特定点(通常称为关键点)位置的任务。关键点可以代表物体的各个部分,如关节、地标或其他显著特征。关键点的位置通常用一组二维 [x, y] 或 三维 [x, y, visible] 坐标。
姿态估计模型的输出是一组边界框和代表图像中物体关键点的点,通常还包括每个点的置信度。姿态估计通常用于识别场景中物体的特定部分及其相互之间的位置关系。
YOLO-POSE 预测返回的是Python list类型的 Results
对象,包含的数据项很多,结构比较复杂,本文进行详细介绍。
YOLO11-POSE默认模型
YOLO11-POSE默认模型使用coco-pose数据集训练。
path: ../datasets/coco8-pose # dataset root dir
train: images/train # train images (relative to 'path')
val: images/val # val images (relative to 'path')
test: # test images (optional)
# Keypoints
kpt_shape: [17, 3] # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible)
flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15]
# Classes
names:
0: person
在YOLO11 的默认姿势模型中,有 17 个关键点,每个关键点代表人体的不同部位。以下是每个索引到相应身体面部和关节的映射:
1. 鼻子
2. 左眼
3. 右眼
4. 左耳
5. 右耳
6. 左肩
7. 右肩
8. 左肘
9. 右肘
10. 左腕
11. 右手腕
12. 左髋关节
13. 右髋关节
14. 左膝
15. 右膝盖
16. 左脚踝
17. 右脚踝
下面结合实例进行具体分析。
Results实例
我们直接使用预训练模型yolo11n-pose.pt对bus.jpg图像进行检测。
检测完成后,输出的图像:
只输入一张图片,results列表只有一个值results[0]。
从图中可以看出,检出4个’person’及其关键点,其中最左侧的只检出边界框,最右侧的只有部分关键点。
print(results[0]):
boxes: ultralytics.engine.results.Boxes object
keypoints: ultralytics.engine.results.Keypoints object
masks: None
names: {0: 'person'}
obb: None
orig_img: array([[[119, 146, 172],
[121, 148, 174],
[122, 152, 177],
...,
[161, 171, 188],
[160, 170, 187],
[160, 170, 187]],
...,
[[123, 122, 126],
[145, 144, 148],
[176, 175, 179],
...,
[ 95, 85, 91],
[ 96, 86, 92],
[ 98, 88, 94]]], shape=(1080, 810, 3), dtype=uint8)
orig_shape: (1080, 810)
path: 'D:\\work3\\ultralytics-main\\bus.jpg'
probs: None
save_dir: 'runs\\pose\\predict'
speed: {'preprocess': 16.387100011343136, 'inference': 463.7020000081975, 'postprocess': 23.11430001282133}
print(result[0].boxes)
cls: tensor([0., 0., 0., 0.])
conf: tensor([0.8870, 0.8810, 0.8779, 0.4577])
data: tensor([[4.7990e+01, 3.9991e+02, 2.4354e+02, 9.0587e+02, 8.8704e-01, 0.0000e+00],
[6.6901e+02, 3.8776e+02, 8.1000e+02, 8.7814e+02, 8.8096e-01, 0.0000e+00],
[2.2295e+02, 4.0504e+02, 3.4394e+02, 8.5905e+02, 8.7790e-01, 0