AI-深度学习

嵌入式视觉模型进阶 21:人体关键点与姿态估计

展开合集目录
  1. 嵌入式视觉模型进阶 01:怎样读懂一个实际模型
  2. 嵌入式视觉模型进阶 02:卷积进阶:分组、深度、逐点与空洞卷积
  3. 嵌入式视觉模型进阶 03:MobileNet:深度可分离卷积与倒残差
  4. 嵌入式视觉模型进阶 04:通道注意力与 MobileNetV3
  5. 嵌入式视觉模型进阶 05:ShuffleNet:通道拆分与重排
  6. 嵌入式视觉模型进阶 06:结构重参数化:训练分支怎样合为一个卷积
  7. 嵌入式视觉模型进阶 07:Backbone、Neck、Head 与多尺度特征
  8. 嵌入式视觉模型进阶 08:FPN 与 PAN:怎样融合不同尺度的信息
  9. 嵌入式视觉模型进阶 09:检测头:分类、位置与置信度
  10. 嵌入式视觉模型进阶 10:检测训练:标签分配与损失计算
  11. 嵌入式视觉模型进阶 11:完整 YOLOv8 推理:从图片到原图目标框
  12. 嵌入式视觉模型进阶 12:训练自己的检测器与错误分析
  13. 嵌入式视觉模型进阶 13:检测器导出对照与其他结构路线
  14. 嵌入式视觉模型进阶 14:跟踪基础:运动预测、匹配与轨迹生命周期
  15. 嵌入式视觉模型进阶 15:ByteTrack 思路:用低分框恢复已有轨迹
  16. 嵌入式视觉模型进阶 16:外观特征与 ReID:怎样比较两个目标
  17. 嵌入式视觉模型进阶 17:目标跟随:从轨迹到云台控制接口
  18. 嵌入式视觉模型进阶 18:视频系统:队列、时间戳与异步流水线
  19. 嵌入式视觉模型进阶 19:人脸处理流程:检测、关键点与对齐
  20. 嵌入式视觉模型进阶 20:特征识别:人脸向量、相似度与阈值
  21. 嵌入式视觉模型进阶 21:人体关键点与姿态估计
  22. 嵌入式视觉模型进阶 22:OCR 检测:从文字区域到矫正图片
  23. 嵌入式视觉模型进阶 23:OCR 识别:序列模型与 CTC
  24. 嵌入式视觉模型进阶 24:完整 OCR 流程与识别错误分析
  25. 嵌入式视觉模型进阶 25:轻量语义分割与实例分割
  26. 嵌入式视觉模型进阶 26:工业异常检测:缺陷样本少时怎么办
  27. 嵌入式视觉模型进阶 27:深度估计与图像恢复:两个专题入口
  28. 嵌入式视觉模型进阶 28:面向 NPU 的计算图与算子兼容
  29. 嵌入式视觉模型进阶 29:量化、蒸馏与剪枝的实际取舍
  30. 嵌入式视觉模型进阶 30:综合项目:检测、跟踪与云台跟随验收
嵌入式视觉模型进阶 21:人体关键点与姿态估计的封面

第 21 / 30 课。 前置:上一课。本篇的运行范围以实验说明和验证记录为准,构造样例不代表真实任务精度或板端性能。

坐标回归与热力图是不同接口

关键点模型可能直接输出坐标,也可能输出 [N,K,H,W] 热力图。前者要确认坐标是否归一化、是否相对裁剪;后者要确定峰值解码和像素中心约定。不能把分类 argmax 的轴照搬到关键点热力图。

本课每个关键点独立寻找空间峰值,同时保留峰值分数。峰值低时返回不可用标记,而不是将默认 argmax 的左上角当成真实关节。分数阈值要在目标数据验证,本例只用构造阈值演示。

从热力图回到原图

假设原图裁剪区域为 [x0,y0,x1,y1],热力图采用格子中心解释,则 x=x0+(col+0.5)×crop_width/W,y 同理。某些网络使用端点对齐或额外偏移校正,必须按模型训练与导出约定调整。

若前处理包含旋转或仿射对齐,应使用逆变换矩阵,而不是只乘缩放系数。框越界裁剪与 padding 也要进入逆映射记录。

输出坐标不等于动作结论

两点连线只是骨架可视化。跌倒、挥手等行为往往依赖时间序列、视角和任务定义;不能仅凭某帧一个关节点高度就宣布动作识别完成。被遮挡的关节需要明确低质量或缺失状态。

练习

将裁剪区域平移 10 像素,检查所有有效点也平移 10;把某个热力图变成全零,确认它不会产生有效坐标。参考结论:几何映射随裁剪变化,但低分点应被屏蔽。

交付关键点编号表、骨架连接、可见性定义和坐标还原测试。左右关节编号错误往往不会触发运行错误,应通过可控姿态图检查。

配套实验与运行记录

实验:人体关键点与姿态估计

查看完整代码:main.py
"""解码热力图并还原裁剪坐标,区分峰值分数、可见性与动作判断。"""

import numpy as np


def decode(heatmaps, crop, threshold=0.5):
    k, h, w = heatmaps.shape
    x0, y0, x1, y1 = crop
    result = []
    for heat in heatmaps:
        row, col = np.unravel_index(heat.argmax(), heat.shape)
        score = float(heat[row, col])
        point = (
            [x0 + (col + 0.5) * (x1 - x0) / w, y0 + (row + 0.5) * (y1 - y0) / h]
            if score >= threshold
            else None
        )
        result.append({"point": point, "score": score})
    return result


def main():
    maps = np.zeros((3, 4, 4))
    maps[0, 1, 2] = 0.9
    maps[1, 2, 1] = 0.8
    first = decode(maps, [100, 50, 180, 130])
    shifted = decode(maps, [110, 60, 190, 140])
    np.testing.assert_allclose(first[0]["point"], [150, 80])
    assert first[2]["point"] is None
    for a, b in zip(first[:2], shifted[:2]):
        np.testing.assert_allclose(np.array(b["point"]) - a["point"], [10, 10])
    print(first)


if __name__ == "__main__":
    main()
下载代码

在项目根目录执行;下载包解压后,在解压目录执行 python3 main.py。

cd 'content/posts/AI-深度学习/嵌入式视觉模型进阶/21-人体关键点与姿态估计/code' && python3 main.py

在本篇代码目录执行 python3 main.py。依赖安装、可选入口见包内 README.md;实际运行结果见 verification.md。下载包包含本课使用的辅助模块与样例。

参考与进一步阅读

原始论文或官方文档用于核对结构、接口和适用范围。本篇代码是围绕教学目标编写的最小实验;除明确注明的完整入口外,不视为对应论文模型的完整复现。


完整进阶目录 · 入门系列 · 上一篇 · 下一篇