🍓 第十四章 AIoT 实验范例:Node-RED+TensorFlow.js
📄 一句话概括

Teachable Machine 让你在浏览器里零代码训练自己的分类模型,导出一个链接,贴回 Node-RED——全课第一次【真的训练】,而且训练数据一张都不出门。

📝 本节和前面几节的关系

12-4 判手势用的是【MediaPipe 找关键点+if 规则】,当时掰正过【那不是 AI】。本节是迟到的正面对照:同样的分类任务,这次真的训练一个神经网络——用的是 14-1 说的迁移学习,跑到 14-2 学过的消息格式上。它也是全课 AI 三章的收官:认物(11 章)、认人认势(12 章)、自训自用(本章)。

一、Teachable Machine 是什么

Google Creative Lab 维护的免费网页工具(teachablemachine.withgoogle.com),2026 年仍在正常运营。它把训练简化成三步:采集 → 训练 → 导出,全程不写代码、全程在浏览器里发生。

支持三种项目,本章用第一种:

项目类型 训练素材 典型产物
Image 摄像头拍照或上传图片 图像分类模型
Audio 麦克风短音频 声音分类模型
Pose 姿势照片 姿态分类模型

它的底层正是 14-1 学的 TF.js:训练发生在你浏览器的标签页里(迁移学习——在大模型基础上教它几个新类),训练数据不上传,除非你主动把项目存到 Google Drive。这是它和【把照片传给云服务训练】的根本区别,隐私上是质的不同。

二、浏览器里的训练流程(五步)

  1. 建类:网页上点【Image Project】,把默认两个类改名——本课用剪刀石头布:scissors / rock / paper(加一个背景类 nothing 更稳,共四类);
  2. 采集:每类用 Webcam 模式对着镜头录几十张(同一类多换角度、距离、背景——数据多样性直接决定模型命有多硬);nothing 类对着空背景录。每类建议 100 张上下,网页按住按钮自动连拍;
  3. 训练:点 Train Model,进度条跑完即可(浏览器里几分钟的事,什么都不用配);
  4. 试:训练完页面自带实时预览,手势摆上去立刻显示各类概率——这步不过关别急着导出,回炉补数据重训;
  5. 导出:Export Model → 选 TensorFlow.js → 点 Upload my model(免费托管)→ 得到一个模型 URL。

导出界面其实有三种去处:TensorFlow.js(托管 URL 或下载)、TensorFlow Lite(给手机端,对应 12-3 那条路)、下载 Keras 格式。走 Node-RED 就选第一种托管方式。

三、贴回 Node-RED:teachable machine 节点

社区节点 node-red-contrib-teachable-machine(2026 年仍在维护,1.4.1 版,v1.2.0 起明确支持树莓派)负责吃下这个 URL:

cd ~/.node-red
npm install node-red-contrib-teachable-machine
node-red-restart

节点配置两个模式,注意各有一个易错细节:

输入端吃 buffered image(jpeg 或 png 二进制)——正好是 14-2 Webcam 节点的输出,不用任何转换。节点状态灯三色:绿=模型就绪、黄=正在准备、红=出错;部署后先等灯变绿再测。

四、动手 Demo:手势裁判流

完整连一根:训练好的剪刀石头布模型接上摄像头:

[Webcam] → [teachable machine] → [Debug]
  1. Webcam 沿用 14-3 的节点(输出 jpeg buffer);
  2. teachable machine 节点配 Online Mode,贴上第二步的 URL;
  3. 部署,等状态灯变绿;
  4. 对镜头依次摆出剪刀、石头、布,每次点拍照。

看到什么算成功:Debug 输出形如:

[{"class":"scissors","score":0.87}, {"class":"rock","score":0.09}, ...]

读结果:和 COCO-SSD 一样的三件套格式(class/score),数组按概率从高到低排——第一行就是模型的答案。三个手势各拍几张,命中率在八成以上算训练成功;某类频繁认错,回去给那个类多补几张多样性的照片重训。

想让它像 12-4 一样出裁判结果?从 teachable machine 节点拉线到 Switch(按 payload[0].class 分三路)再到 dashboard 的三个 Text——12-4 当年手写的真值表,这次由模型自己的概率说了算。两代做法摆在一起看:【规则版】逻辑透明、永不误判位置,【模型版】能容忍手势千变万化、却会以概率的方式犯错——选哪条路,取决于你更需要可解释还是更抗变化。

30 秒实验

不碰 Node-RED,在 Teachable Machine 网页的预览区里做一个对照:同一只手,先正对镜头摆剪刀看概率条,再把侧过来摆——观察 scissors 概率是否明显下滑。下滑说明这个角度的训练数据不够;回采集区给 scissors 补几张侧位照重训,概率立刻回升。这 30 秒演示了机器学习最朴素的一条真理:模型的上限不在算法,在数据。

五、老教程里已失效/易踩的写法

  1. 【训练在树莓派上】是错觉——训练发生在你打开 TM 网站的浏览器里(可以是树莓派的 Chromium,也可以是 Windows 电脑的 Chrome),树莓派只是导出后的推理方;两台设备分工别搞反。
  2. 节点部署完就测——状态灯还黄着就拍照,消息直接石沉大海;等绿灯。
  3. URL 只复制一半——托管地址带一串随机后缀和结尾斜杠,少任何一段都是模型加载失败;从导出弹窗原样整段复制。
  4. 拿它当生产级模型——TM 定位是教育与原型(官方自己这么说);要上生产,导出模型后另走正经部署,它只负责【快速验证想法值不值】。

六、常见误区

  1. Teachable Machine 是玩具、不算真 AI —— 它训练的是货真价实的神经网络(迁移学习),导出的模型能在任何 JS 环境用;【零代码】不等于【假训练】。
  2. 每类只录十张就能很准 —— 样本太少又单一时,模型只会认你录的那个角度;每类几十上百张+姿态背景多样,才是够用的下限。
  3. 模型会过时,采集的数据要留着 —— 导出的托管模型随时可重新训练覆盖;但采集的原始数据在浏览器里,关页面前导出保存(或存项目到 Drive),否则重训要从头拍。
  4. 红状态灯就该重装 Node-RED —— 先查 URL 复制是否完整、网络能否访问托管地址;绝大多数红灯是配置问题不是环境问题。
自测三问(点开对答案) 1. Teachable Machine 的训练发生在哪里、数据上不上传? 训练在浏览器标签页里(TF.js 迁移学习),训练数据不上传——除非主动把项目存到 Google Drive。 2. 节点 Online Mode 配置最容易错的一个字符是什么? 结尾的斜杠 `/`——URL 必须从 https:// 完整复制到结尾斜杠,少一段都加载失败。 3. 某个手势老被认错,最有效的动作是什么? 给那个类补更多样化的照片(换角度/距离/背景)重训——改算法不如改数据。

相关笔记