App Inventor 2 Posenet人体姿态检测教程

« 返回首页

概述

PoseNet是Google开发的实时人体姿态估计模型,可以检测人体的17个关键点。在App Inventor中通过PoseNet扩展使用。

关键点列表

编号 部位 编号 部位
0 鼻子 9 右手腕
1 左眼 10 左臀
2 右眼 11 右臀
3 左耳 12 左膝
4 右耳 13 右膝
5 左肩 14 左脚踝
6 右肩 15 右脚踝
7 左手肘 16
8 右手肘

扩展来源

PoseNet扩展来自MIT App Inventor社区或DeepHost:

  • MIT社区搜索 “PoseNet extension”
  • DeepHost: https://app.deephost.in/

基本用法

界面设计

Screen1
├── Camera1(或选择图片按钮)
├── Canvas1(绘制关键点)
├── Image1(显示检测结果)
├── PoseNet1(扩展)
├── 按钮_开始检测
└── 标签_结果

检测姿态

当 按钮_开始检测.被点击
  调用 Camera1.拍照()

当 Camera1.拍照完成(图片路径)
  设 Image1.图片 = 图片路径
  调用 PoseNet1.检测姿态(图片路径)

当 PoseNet1.检测完成(关键点列表, 置信度)
  ' 关键点列表包含17个点,每个有x, y, score
  标签_结果.文本 = "检测到 " & 列表长度(关键点列表) & " 个关键点"
  标签_置信度.文本 = "置信度:" & 数学.保留小数(置信度 * 100, 1) & "%"
  
  ' 在Canvas上绘制关键点
  调用 Canvas1.清除()
  设 i = 1
  当 i ≤ 列表长度(关键点列表)
    设 点 = 列表第i项(关键点列表)
    设 x = 从字典 点 获取 "x"
    设 y = 从字典 点 获取 "y"
    设 score = 从字典 点 获取 "score"
    
    如果 score > 0.5  ' 置信度阈值
      调用 Canvas1.画圆(x, y, 8, 红色)
    设 i = i + 1
  
  ' 绘制骨骼连线
  调用 绘制骨骼(关键点列表)

绘制骨骼连线

定义 绘制骨骼(关键点列表)
  ' 定义骨骼连接关系 [起点, 终点]
  设 骨骼连接 = [
    [6, 5],   ' 左肩-右肩
    [6, 8],   ' 右肩-右肘
    [8, 10],  ' 右肘-右臀(注:实际是手腕)
    [5, 7],   ' 左肩-左肘
    [7, 9],   ' 左肘-左手腕
    [6, 12],  ' 右肩-右臀
    [5, 11],  ' 左肩-左臀
    [12, 14], ' 右臀-右膝
    [14, 16], ' 右膝-右脚踝
    [11, 13], ' 左臀-左膝
    [13, 15]  ' 左膝-左脚踝
  ]
  
  设 i = 1
  当 i ≤ 列表长度(骨骼连接)
    设 连接 = 列表第i项(骨骼连接)
    设 起点 = 列表第1项(连接)
    设 终点 = 列表第2项(连接)
    设 点1 = 列表第(起点+1)项(关键点列表)
    设 点2 = 列表第(终点+1)项(关键点列表)
    设 s1 = 从字典 点1 获取 "score"
    设 s2 = 从字典 点2 获取 "score"
    
    如果 s1 > 0.5 且 s2 > 0.5
      调用 Canvas1.画线(
        从字典 点1 获取 "x", 从字典 点1 获取 "y",
        从字典 点2 获取 "x", 从字典 点2 获取 "y"
      )
    设 i = i + 1

实战案例:姿势识别

判断举手

定义 是否举手(关键点列表) 返回 结果
  设 右手腕 = 列表第10项(关键点列表)
  设 右肩 = 列表第6项(关键点列表)
  设 手腕Y = 从字典 右手腕 获取 "y"
  设 肩膀Y = 从字典 右肩 获取 "y"
  
  ' 如果手腕在肩膀上方(Y值更小)
  如果 手腕Y < 肩膀Y
    返回 "右手举起"
  返回 ""

判断站立/坐着

定义 判断姿势(关键点列表) 返回 姿势
  设 左臀 = 列表第12项(关键点列表)
  设 右臀 = 列表第13项(关键点列表)
  设 左膝 = 列表第14项(关键点列表)
  
  设 臀部平均Y = ((从字典 左臀 获取 "y") + (从字典 右臀 获取 "y")) / 2
  设 膝盖Y = 从字典 左膝 获取 "y"
  设 膝臀差 = 膝盖Y - 臀部平均Y
  
  如果 膝臀差 > 50
    返回 "站立"
  否则
    返回 "坐着"

性能说明

模式 帧率 适用
单张图片检测 1-3秒/张 照片分析
实时视频流 2-5fps 简单交互
降低分辨率 5-10fps 对实时性要求不高

注意:PoseNet在手机端的帧率较低,不适合需要高实时性的应用。

常见问题

Q1: PoseNet检测不到人?

  • 确保图片中人物清晰可见
  • 全身照比半身照检测效果好
  • 光线充足时检测更准确
  • 人物距离适中(不要太远或太近)

Q2: 关键点位置偏移?

PoseNet的坐标基于输入图片尺寸,需要缩放到Canvas的实际尺寸:

设 缩放比X = Canvas1.宽度 / 图片宽度
设 缩放比Y = Canvas1.高度 / 图片高度
设 实际X = 原始X * 缩放比X
设 实际Y = 原始Y * 缩放比Y

总结

能力 支持
单张图片检测
实时视频检测 ⚠️ 帧率低
17个关键点
骨骼绘制
姿势识别 ✅ 需自己写逻辑
多人检测 部分扩展支持

版权声明:MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权,本文档由 ai2claw 🐝 整理。

文档反馈