You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ml5.js中使用Teachable Machine训练的姿态识别模型?

解决方案

你之前调用的ml5.imageClassifier仅支持Teachable Machine图像分类项目导出的模型,姿态项目训练的模型输入是人体关键点特征而非原始图像,所以不能直接调用该接口加载。

实现逻辑

  • 先通过PoseNet提取摄像头画面中的人体姿态17个关键点坐标
  • 将坐标做归一化处理后,作为输入传给你训练的Teachable Machine姿态分类模型
  • 得到分类结果后输出即可

完整实现代码

HTML部分(引入依赖+页面元素)

<!-- 依赖可下载到本地后替换为本地路径,无需外部跳转 -->
<script src="tf.min.js"></script>
<script src="ml5.min.js"></script>
<video id="webcam" autoplay playsinline width="640" height="480"></video>
<div id="result"></div>

JS逻辑部分

// 替换为你自己的姿态模型导出后model.json的访问路径
const poseModelURL = '你的姿态模型路径/model.json';
let poseNet, poseClassifier, video;

async function start() {
  // 初始化摄像头
  const stream = await navigator.mediaDevices.getUserMedia({
    audio: false,
    video: { width: 640, height: 480 }
  });
  video = document.getElementById('webcam');
  video.srcObject = stream;
  await video.play();

  // 加载PoseNet用于提取人体关键点
  poseNet = ml5.poseNet(video, { detectionType: 'single' }, () => {
    console.log('PoseNet加载完成');
  });

  // 加载你训练的姿态分类模型
  poseClassifier = await tf.loadLayersModel(poseModelURL);
  console.log('姿态分类模型加载完成');

  // 启动识别循环
  detectLoop();
}

async function detectLoop() {
  // 检测单个人体关键点
  const poses = await poseNet.estimatePoses(video);
  if (poses.length > 0) {
    const keypoints = poses[0].keypoints;
    // 处理关键点为模型要求的输入格式:提取x,y坐标并按摄像头分辨率归一化
    const input = keypoints.flatMap(kp => [kp.x / 640, kp.y / 480]);
    // 转换为张量输入模型
    const tensorInput = tf.tensor2d([input]);
    const predictions = await poseClassifier.predict(tensorInput).data();
    // 取置信度最高的结果
    const maxIndex = predictions.indexOf(Math.max(...predictions));
    // 替换为你训练时设置的分类标签列表,顺序需要和训练时完全一致
    const labels = ["姿态A", "姿态B", "姿态C"];
    document.getElementById("result").textContent = `${labels[maxIndex]},置信度:${(predictions[maxIndex]*100).toFixed(2)}%`;
    // 清理张量避免内存泄漏
    tensorInput.dispose();
  }
  requestAnimationFrame(detectLoop);
}

// 页面加载完成后启动
window.addEventListener('DOMContentLoaded', start);

注意事项

  • 导出模型时请选择Teachable Machine姿态项目下的「TensorFlow.js」格式导出包,解压后将路径替换到代码中对应位置
  • 归一化时的宽高数值要和你摄像头设置的分辨率匹配
  • 如果环境不允许加载外部CDN,可将tfjs和ml5的js文件下载到本地后自行引入

内容的提问来源于stack exchange,提问作者shuyin2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:24:04