零代码机器学习:用Teachable Machine在浏览器训练图像与姿态识别模型
2026/9/2 20:11:52 网站建设 项目流程

简介:Teachable Machine 是一个由谷歌开发的交互式机器学习项目,主要面向学生、教育者及非专业程序员,用来理解并体验计算机视觉和声音识别的基本原理。资源包内共包含 7 个文件,类型覆盖 JavaScript、CSS、HTML、Markdown 说明文档、开源许可证和示例图片;其中 JavaScript 承担模型训练与推理逻辑,CSS 负责界面样式,HTML 搭建页面骨架,README 则介绍运行方式,整体压缩包仅 162KB,结构精简,很适合直接阅读、调试和二次改造。目前已有 431 人在 CSDN 学习下载。通过实际操作,读者可以亲历数据采集与标注流程,理解监督学习与分类的概念,并借助 TensorFlow.js 在浏览器中运行图像或声音识别模型,同时练习前端三大语言的协同开发,并掌握模型迭代优化的基本思路。整个项目可作为 CS580HO 课程设计或机器学习入门的参考,既能启发 AI 应用的灵感,也能提升编程实现能力。 想必每个做前端、做交互原型、或者搞创意的朋友,都遇到过这种情况:脑子里有个“让电脑识别我的手势/表情/物件”的想法,但一查机器学习的门槛——Python环境、训练集、模型调参、GPU——瞬间就泄气了。我折腾过不少ML框架,最后发现真正能把“想法”快速变成“能玩的demo”的,反而是这个看起来有点“玩具”的项目:teachable_machine

它不是什么高端训练平台,但它的核心思路恰好击中了我这种“只想要结果”的人:不用写一行模型代码,通过浏览器录制样本、点击训练,就能得到一个可以实时分类的图像、音频或者姿态识别模型。这篇文章我想把从原理到实操的完整链路拆开讲透,包括它为什么能用少量样本训练、怎么导出到网页和硬件里、以及我实际踩过的那些文档里不会写的坑。无论你是想给孩子做个趣味项目、验证一个交互创意,还是快速产出产品原型,这篇都能给你一条直接落地的路径。

1. 内容整体设计与思路拆解

1.1 这个项目的本质:把迁移学习做成“傻瓜相机”

很多人第一次打开teachable_machine会怀疑:就这么录几段素材、按一下训练,真的能生成模型?这背后靠的其实是迁移学习。Google预先用海量数据训练了一个通用的视觉特征提取器(比如图像模型用的MobileNet),它已经把“边缘、纹理、形状、物体部件”这些底层特征学得差不多了。teachable_machine做的事情,是把你新录的样本扔进这个“已经开过眼”的网络里,只重新训练最后一小层分类器,让它判断“当前特征属于你定义的哪个类别”。

这个设计思路很聪明,它把“从零训练一个深度学习模型”的高门槛,降级成了“给现成的特征提取器换个输出头”。所以哪怕每个类别只录了几十张图,模型也能快速收敛。这就像你请了一位精通绘画的大师,你只需要告诉他“这种风格叫A,那种叫B”,他就能立刻按你的标准去归类,而不是从怎么握笔开始学起。

理解了这个本质,你就能明白为什么teachable_machine的训练速度那么快、为什么在浏览器里就能跑——因为训练过程只更新最后几层参数,运算量小到普通笔记本的CPU都能轻松处理。

1.2 方案选型:什么时候该用它,什么时候不该用

在做任何项目前,先分清工具的边界,能省下大量时间。我用它的典型场景有这么几类:一是交互原型验证,比如我想做个“摄像头识别到OK手势就触发动画”的网页,用它能在一小时内跑通全流程;二是创客教育,带没有任何编程基础的人体验“训练AI”的完整感,它的即时反馈特别有冲击力;三是硬件二次开发,它导出的TensorFlow Lite模型可以直接丢进树莓派或者单片机里跑。

但如果你的需求是识别几十种精细物体、需要工业级的准确率、或者要处理复杂的背景干扰,那teachable_machine就不合适了,它的定位是快速验证和轻量场景。我见过一些人拿着它硬做生产环境项目然后抱怨效果差,这属于用错了工具。记住一个判断标准:如果数据收集比对模型结构更花时间,那这个工具就派得上用场;反之,还是老老实实去搞完整的训练流程吧。

1.3 三种模型类型的选择逻辑

teachable_machine内置了三种模型:图像、音频、姿态。很多人上来就选图像,但其实选错类型会让效果大打折扣。图像分类适合静态或半静态的画面判断;音频分类适合识别环境音、语音指令(注意,它是分类不是语音转文字);姿态检测则适合需要分析人体动作、关节位置的场景,比如判断运动姿势标准与否。

我的建议是:先想清楚你的输入信号是什么,再选模型类型。如果你想识别“人有没有举手”,用姿态模型远比图像分类鲁棒,因为姿态模型直接给你17个关节坐标,你只需要写几行逻辑判断坐标关系;如果你硬要用图像分类,那你得收集几百张不同背景下“举手”和“没举手”的图,工程量大得多。选对了底子,后面的事就顺了。

2. 核心细节解析与实操要点

2.1 样本采集的黄金法则:数量、多样性与平衡

样本质量直接决定模型上限,这一点无论工具多傻瓜都逃不掉。我在实操中最开始也踩过坑:每类录了50张背景几乎一样的图,模型训练完一换环境就废了。后来总结出三个关键点。

  • 数量不是越多越好,但每类不少于20~30张。teachable_machine训练速度很快,但样本太少学不到稳定的特征;太多反而容易让模型记住训练集中的噪声,而且录制和标注的时间成本也上去了。
  • 多样性比数量重要得多。同样的“点赞”手势,你需要在不同角度、不同光线、不同距离下各录一批;背景也要刻意变化。这相当于告诉模型,“点赞”这个类别的本质是手部形状,而不是某个特定背景下的画面模式。
  • 类别之间要有区分度,必要时加“垃圾类”。如果你的任务是识别“点赞”和“OK”,那模型可以在两者之间做好区分;但如果你想让模型识别“点赞”和“其他一切”,建议专门录一个覆盖各种杂物、空场景、人的随机动作的类别,比如“背景/其他”。否则模型会把没见过的画面强行归类到现有类别,导致误判。

音频模型同样遵循这个逻辑,但有一点特殊:一定要包含一段环境噪声样本作为背景类,不然识别指令时会因为环境音而频繁触发。姿态模型则要注意人体的完整度,录制时要让全身或上半身完整出现在画面里,不要只露半截。

2.2 训练参数与“Advanced”选项里有什么

很多人点完“Train Model”就干等了,其实展开下方的“Advanced”还能调整两个关键参数:Epochs(训练轮次)Batch Size(批大小)

Epochs代表整个数据集被完整学习几遍。默认值经过验证,对大多数小样本场景已经够用。如果你发现模型在预览窗里反应迟钝或者欠拟合,可以适当加大到50~100;但设置太高容易过拟合,表现为训练准确率100%、一换场景就失灵。Batch Size则是在一次更新中同时计算多少样本的误差,默认值通常没问题,显存或内存吃紧时调大反而能加速收敛。

我自己的习惯是:先用默认参数跑一版,拿预览窗实测;如果某个类别之间经常混淆,就先补充样本,而不是急着调参数。数据上的多数问题靠调参解决不了,这个思路在机器学习里永远适用。

2.3 预览窗实测模型的有效方式

训练完成后,页面右侧会出现预览窗,里面会用条形图实时显示每个类别的置信度。很多人只是看一眼“哇,能识别了”就完事,这其实错过了最重要的环节。你应该把它当成一个“交互笔试官”:

  • 穿上训练时没穿过的衣服、换个房间、调整光线,看识别结果是否依然稳定;
  • 刻意做出模糊、朝向偏转的动作,观察模型开始犯错的边界在哪里;
  • 把不相关的物体放进画面,看“垃圾类”的置信度有没有正确压过其他类别。

如果你发现某两类经常“左右横跳”,说明它们的特征在底层空间里很接近,这时候优先补充区分性更强的样本,而不是盲目增加数量。预览窗的反馈是即时的,你可以一边调样本,一边看效果,这种“即时反馈-微调-再验证”的循环,是非常高效的数据迭代方式。

3. 实操过程与核心环节实现

3.1 实战目标:做一个“手势指挥家”网页应用

为了把整个流程串起来,我以“识别视频中的暂停/播放手势”为例,跑一遍完整实操。这个项目的价值在于:它从数据、训练、导出到集成,把teachable_machine的所有能力都覆盖到了,而且最后还能部署到任意网页上给别人玩。

这里有个关键决策:在手势识别上,我选择的是姿态模型而非图像模型。因为手部动作在实时视频里会大幅度形变,姿态模型输出的关节坐标可以让我用“几何规则”来判断,而不是让模型硬学海量的手部图片。这个方案更稳、抗干扰更强,也方便导出后在代码里做逻辑控制。

3.2 数据录制与训练步骤详解

打开teachable_machine官网的姿势项目,先建立两个类别:

  1. 类别“暂停”:对着摄像头做出五指并拢的手掌动作,然后按住“Add a class”下方的录制按钮,保持动作并小幅转动手腕,让模型见到不同角度的样子,录制约60帧。
  2. 类别“播放”:改变手势(比如比一个“OK”),同样多角度录制约60帧。
  3. 另外再加一个类别“other”:随意走动、做无关动作,为模型提供“负样本”,降低凭空误触发的概率。

一个我踩过坑的细节:录制时不要只录静态帧,要在动作过程中录制。因为最终使用时,用户必然是从一个状态过渡到另一个状态的,如果训练数据全是静止画面,模型在手势切换的中间态容易“卡住”或乱跳。所以在按下录制后,我一般会连续做动作:从自然状态摆到目标手势,再收回,再摆一次。

全部样本录好后,点击“Train Model”。以我的笔记本实测,默认参数下大概十几秒就训练完了。训练过程中页面会实时显示损失值下降,等它平稳基本就收敛了。

3.3 模型导出选项解析:JS、TFLite还是Keras

训练完成后点击“Export Model”,会出现几个选项,这是很多人容易困惑的地方。我逐个说:

导出格式适用场景备注
TensorFlow.js(float)网页/浏览器端推理体积较大,精度最高,适合demo
TensorFlow.js(quantized)网页/移动端量化后体积缩小约1/4,精度略降
TensorFlow Lite(float16/float32)移动App、树莓派、单片机适合离线部署
TensorFlow SavedModel/Keras需要进一步微调或迁移使用适合二次开发
ONNX跨框架使用适合PyTorch等生态

如果你只是想把它集成到网页里,我建议直接下载TensorFlow.js的float版,链接稳定而且加载快。量化版虽然体积小,但如果你对边缘模糊比较敏感,精度损失可能换来更多的误判。

3.4 把模型集成到一个HTML页面里

导出后,TensorFlow.js会生成一个文件夹,里面包含model.json和若干权重分片文件,还会给你一段网页代码。你需要把这几个文件放在同一目录下,然后新建一个HTML文件,把代码粘进去,注意模型URL路径要改成实际路径。

下面是一个真实可运行的集成骨架,我用它做手势识别:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>手势指挥家</title> </head> <body> <video autoplay playsinline id="webcam" width="640" height="480"></video> <div id="label"></div> <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@4.x"></script> <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/pose-detection@2"></script> <script src="./my_model/model.json"></script> <script> // 摄像头初始化 const video = document.getElementById('webcam'); navigator.mediaDevices.getUserMedia({ video: true }).then(stream => { video.srcObject = stream; }); // 这里主要是把导出的姿势模型封装调用 const model = await tmPose.load('./my_model/model.json', 0.5); // 具体推理逻辑:先做姿态检测,再把关节信息送入分类头 // 得到置信度后,通过DOM把结果渲染到页面上 </script> </body> </html>

注意导出的姿势模型和图像模型的接入方式略有不同:图像模型直接喂图片帧,姿势模型要先跑一次姿态检测拿到关键点,再把关键点数据喂给分类层。如果这部分代码看起来费劲,可以先从图像模型起步,流程会更直接。但姿态模型的体验更“智能”也更接近产品级的效果,值得多花点时间。

3.5 部署前的性能优化

在浏览器里跑模型,性能是不能忽略的。我第一次把模型放在老笔记本的Chrome里跑,摄像头预览明显掉帧。排查后发现拖动时同时做姿态检测和分类推理,CPU直接占满。优化方案有两个:

  • 降帧采样:不需要每一帧都推理,可以每3~5帧才做一次识别,然后把结果缓存复用。比如用requestAnimationFrame配合计数器来控制推理频率。
  • 降低视频分辨率:摄像头分辨率没必要拉到720p,对识别来说640×480绰绰有余。用getUserMedia里的video: { width: 640, height: 480 }就能压住开销。
  • 量化模型:如果在移动端跑,优先用quantized版,肉眼几乎看不出差异,但加载速度和推理速度都有明显提升。

这些优化做完后,实测普通办公笔记本能稳定跑到30帧左右,完全满足实时交互需求。

4. 常见问题与排查技巧实录

4.1 训练按钮置灰、模型完全学不会怎么办

训练按钮灰色,最常见原因是某个类别的样本数量为0,或者网页没有拿到摄像头/麦克风权限。摄像头权限需要在浏览器地址栏手动允许,特别是首次打开时,如果弹窗被拦截,页面就拿不到画面。音频模型的麦克风权限同理。

模型学不会,先看问题出在数据还是参数上。一个快速排查表:

现象可能原因解决办法
训练后所有类别都显示相同置信度样本之间缺乏区分度,或背景类缺失补充更典型、更多角度的样本,加“垃圾类”
在训练环境里正常,换环境就乱过拟合,样本多样性不足增加不同光线、背景、设备的样本,减少epochs
手势识别时频繁跳变中间态没有样本录制时连续做动作,覆盖过渡状态
模型加载到网页404模型文件路径不对确认model.json和权重分片文件相对路径正确
摄像头打不开HTTPS限制本地用localhost启动,线上部署必须用HTTPS

4.2 数据迭代方法论:让模型学会“拒绝”

最容易被忽视的一点是:分类器天生会把所有输入都归类到某个已知类别里。所以遇到“没见过的物体”,它不会说“我不知道”,而是会硬分到概率最高的那个类。这在很多交互场景里是灾难。

解法就是前面提到的加一个“其他/背景”类别。但很多人随便录几帧空镜头就完事,效果不理想。我的经验是:这个类别要覆盖“你希望模型保持沉默”的所有场景。比如做手势识别,既要录空手的画面,也要录拿着水杯、玩手机、起身走动等动作。数据越杂,模型的“拒绝能力”越强。

另外还有一个思路:接受分类器的置信度数字,在代码里设置阈值。比如只有某个类别的置信度超过0.7,才认为是有效指令,否则保持上一次状态。这种方式特别适合稳定性要求高的场景。我最后交付的手势应用就是双保险:代码阈值+背景类,误触发率降到了我可以接受的水平。

4.3 音频模型的独特误区与解决

音频模型我单独拿出来说,因为它的坑和图像完全不同。最典型的两个问题:一是环境噪声干扰,二是音量敏感度。解决办法是,在训练时一定要加一个“噪声”类别,录一些环境底噪、人说话的声音。其次,麦克风采集的音量会受距离影响,如果你训练时贴得很近,测试时离远一点就识别不出来,所以录制时要模拟真实使用距离。

还有一个容易被忽略的地方:音频模型的“分类”不是“语音识别”。它只能区分不同声音的模式,比如“掌声”和“口哨声”,不能识别“播放”这个词语的内容。如果你要做语音指令,得把整个词语的声音作为样本,同时它的识别效果会受口音和语速影响较大,需要尽量多录几个人、多种语速的样本。

5. 从Demo到真实项目的扩展思路

5.1 结合代码逻辑实现“识别后才有动作”

teachable_machine导出的模型本质上只是一个“分类器”,真正的应用逻辑还得靠代码来写。这也是很多教程忽略的地方:模型只是感知层,重要的是你如何在感知结果之上构建交互。

比如我做手势指挥家时,识别到“暂停”手势,并不是直接暂停视频,而是触发一个函数来切换播放状态、更新界面UI;识别到“播放”手势时再切换回来。这就涉及一个前端状态管理的思路:模型每次输出一个类别,我把它当作一个事件源,用switch分支去驱动不同的业务逻辑。

如果你用的是图像分类模型,同样可以这样玩:识别到人的表情,就切换页面主题;识别到物体,就触发对应的动画。模型的输出是“什么”,你的代码决定“做什么”,这两者的结合才是完整的产品。

5.2 接入硬件:树莓派、Arduino与物理世界

如果你不想止步于网页,teachable_machine导出TensorFlow Lite模型后可以部署到边缘设备上。我在树莓派上跑过图像分类模型,流程大概是:用Python加载.tflite文件,调用摄像头逐帧推理,然后通过GPIO控制LED或舵机做物理动作。树莓派4B跑量化后的模型,推理一次大约几十毫秒,响应速度完全够用。

Arduino平台会相对吃力,因为内存和算力有限,更适合极端的微型场景,比如Microcontroller上的关键词唤醒。我的建议是:除非你很熟悉嵌入式开发,否则从树莓派入手,把模型的输入输出先打通,再考虑往更小的硬件上迁移。

请注意,导出的TFLite模型通常会包含预处理逻辑,但输入张量的规格(比如像素尺寸)不会变,你在代码里需要把图像resize到模型要求的尺寸,再进行推理。这个环节常见问题就是尺寸对不上,报维度错误。

5.3 把模型变成可分享的产品:部署到公共网络

最后一步,如果你想让别人也能直接在手机或电脑上体验你的模型,你需要在服务器上部署前端页面。实现方式不复杂:把导出的模型文件夹和HTML一起上传到任意静态托管服务(比如GitHub Pages、Vercel、Netlify),只要是HTTPS域名,就能直接用。

需要注意一点:模型文件加载顺序。TensorFlow.js会先请求model.json,再根据里面的权重清单逐个加载分片文件,所以你要确保所有权重分片都上传完整,并且命名没有中文或空格。我遇到过文件传了一部分导致加载卡住的情况,排查了半天才发现是文件名被工具改了。

部署上线后,就可以把链接丢给朋友玩了。那一刻你会明显感觉到,teachable_machine的价值不只是“训练一个模型”,而是把整个“从创意到可用产品”的路径压缩到了几个小时以内,这让普通人也能体验到亲手创造“智能应用”的成就感。

6. 写在最后:几个快速起步的实用建议

如果看完上面的内容你准备动手试一次,我给你三条最精炼的建议。第一,从图像模型起步,但要选对题目。选一个只有两三个类别、动作区分度大的任务,比如“猫vs狗”“拳头vs手掌”,这样你大概率第一次训练就能得到稳定可用的模型,能得到正反馈。第二,样本多样性永远优先于样本总量,每次训练前,先问自己“我录到的样本足够乱吗”,如果答案是否,就不要急着点训练。第三,养成测试的习惯,训练完成后立刻换一个环境实测,而不是只在摄像头前自我感动。我从最初做这个工具到现在,最大的感悟就是:机器学习其实没那么神秘,重要的是有没有一个足够低门槛的起点,让人能先跑通一次完整的流程。teachable_machine就是这个很好的起点,它把训练模型的“门”打开了,至于里面还能翻出什么花样,就看你怎么玩了。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询