使用 Teachable Machine 训练图像分类模型并在 p5.js 中集成:ml5.js 完整实战指南
教程文档示例工程【免费下载链接】website-archiveArchive of the Coding Train website (first version)项目地址https://gitcode.com/gh_mirrors/we/website-archive点击查看免费下载本教程围绕 The Coding Train 的「Teachable Machine: Images」视频展开完整演示如何用 Google Teachable Machine 训练一个能识别自定义类别的图像分类模型并把训练好的模型通过 ml5.js 导入 p5.js 草图实现基于实时摄像头画面的分类与可视化反馈。读完本文你将掌握 Teachable Machine 的训练与导出流程、ml5.imageClassifier的加载与调用方式以及一套可直接复制运行的实时图像分类 p5.js 示例。教程背景从训练平台到浏览器推理Teachable Machine 是 Google Creative Lab 推出的可视化机器学习平台它允许非技术人员通过浏览器采集样本、训练模型并将模型用于自己的应用。本教程发布于 2019-11-07视频编号 1仓库目录为 TeachableMachine/1-teachable-machine聚焦其中最常见的场景图像分类。整个技术链路可以概括为三个环节训练在 Teachable Machine 网站上为每个类别采集若干张图片样本点击训练得到自定义分类模型导出平台生成一个模型托管地址本示例中形如https://storage.googleapis.com/tm-models/YadBJmj5/托管于 Google Cloud Storage其中包含model.json及其权重文件集成在 p5.js 草图中通过 ml5.js 的ml5.imageClassifier(modelURL model.json)加载模型对摄像头实时画面逐帧分类。这套思路的本质是迁移学习Transfer LearningTeachable Machine 底层基于 MobileNet——一篇面向移动端视觉应用的高效卷积神经网络MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications该网络最初在 ImageNet 大规模图像数据库上预训练具备了通用的图像特征提取能力用户只需在预训练特征之上训练自己的少量类别就能快速得到一个准确率可观的自定义分类器。仓库内 ml5 系列课程文档 和 特征提取器分类文档 正是对这一原理的展开讲解可以作为延伸阅读。训练一个图像分类模型类别设计与样本采集从仓库源码可以反推出本教程训练的三个类别及其展示逻辑。在 TeachableMachine/1-teachable-machine/P5/sketch.js 中分类结果标签与 emoji 的映射关系如下类别标签对应 emoji含义waiting...默认模型尚未返回结果Rainbow彩虹Unicorn独角兽Ukulele尤克里里在 Teachable Machine 训练页面上实操流程是为每个类别Class分别采集若干张图片样本——可以是直接打开摄像头实时拍摄也可以上传图片为类别命名类别名必须与代码中判断的字符串完全一致例如Rainbow、Unicorn、Ukulele否则label Rainbow这类比较永远不成立点击 Train 训练模型训练完成后平台会给出模型预览可上传图片测试分类效果在导出面板选择「Download my model」或复制模型托管链接得到形如https://storage.googleapis.com/tm-models/YadBJmj5/的模型根地址。类别数量不限于三个可以按需增减但需注意类别越多、每个类别的样本越多样不同角度、光照、背景分类器的鲁棒性越好。引入依赖index.html 的配置仓库中的 index.html 展示了页面的最小依赖配置它依次引入p5.js 1.4.1负责画布、摄像头捕获与绘图p5.sound 插件本示例虽未使用声音 API但保留该依赖便于后续扩展ml5.js 0.4.2提供ml5.imageClassifier等高层机器学习 API。meta charsetutf-8 /用于保证中文等字符正常显示。脚本加载顺序很关键必须先加载 p5.js 与 ml5.js再加载业务逻辑sketch.js否则ml5、p5全局对象尚未就绪。四步集成流程sketch.js 源码解析sketch.js 将「加载模型 → 捕获视频 → 循环分类 → 绘制结果」拆解为清晰的四步注释中的 STEP 14 直接对应视频讲解的流程。STEP 1在 preload() 中预加载模型let classifier; let modelURL https://storage.googleapis.com/tm-models/YadBJmj5/; function preload() { classifier ml5.imageClassifier(modelURL model.json); }preload()是 p5.js 提供的异步预加载钩子p5 会等待preload()中的异步操作全部完成后才执行setup()因此可以确保分类器在草图启动前已就绪。ml5.imageClassifier(url)接收模型根地址 model.json的拼接路径model.json描述网络结构与类别元信息ml5 会据此拉取同目录下的权重文件完成实例化。若模型加载失败如网络不通、路径错误setup()中后续的分类调用会报错。STEP 2初始化摄像头并启动分类let video; let label waiting...; function setup() { createCanvas(640, 520); video createCapture(VIDEO); video.hide(); classifyVideo(); }createCapture(VIDEO)请求浏览器摄像头权限并返回 p5.MediaElement 对象video.hide()隐藏原始视频 DOM 元素因为画面将通过image()绘制进 canvas640×520。classifyVideo()随后启动第一次分类function classifyVideo() { classifier.classify(video, gotResults); }classifier.classify(输入, 回调)是 ml5 的异步分类接口输入可以是图像、视频或 DOM 元素分类完成后调用回调函数。这里将video直接作为输入传入意味着每一帧摄像头画面都会参与分类。STEP 3在回调中获取结果并形成分类循环function gotResults(error, results) { if (error) { console.error(error); return; } label results[0].label; classifyVideo(); }gotResults遵循 Node 风格回调约定第一个参数是错误对象第二个是分类结果数组。ml5 返回的结果按置信度从高到低排序因此results[0].label就是当前画面最可能的类别。取出标签后立即再次调用classifyVideo()构成持续的实时分类循环——这也是实时摄像头分类应用的标准写法。注意错误处理不可省略若模型尚未加载完成或摄像头被中断error会被触发直接返回可避免程序崩溃。STEP 4在 draw() 中绘制视频与反馈function draw() { background(0); image(video, 0, 0); textSize(32); textAlign(CENTER, CENTER); fill(255); text(label, width / 2, height - 16); // emoji 映射与绘制 let emoji ; if (label Rainbow) emoji ; else if (label Unicorn) emoji ; else if (label Ukulele) emoji ; textSize(256); text(emoji, width / 2, height / 2); }draw()每帧执行先用image(video, 0, 0)把摄像头画面铺满画布再用白色文字在底部显示最新标签label由gotResults异步更新最后根据标签把 256 号字号的 emoji 绘制在画面中央。emoji 映射采用 if-else 链默认值 train恰好呼应 Teachable Machine 的命名——这个细节也体现了「未分类到已知类别时展示中性占位符」的设计思路。完整可运行的示例代码将以下index.html与sketch.js放入同一目录通过本地静态服务器或 p5.js Web Editor 导入打开即可运行!DOCTYPE html html head script srcp51.4.1 p5.min.js 的 CDN 引用/script script srcp51.4.1 addons/p5.sound.min.js 的 CDN 引用/script script srcml50.4.2 dist/ml5.min.js 的 CDN 引用/script meta charsetutf-8 / /head body script srcsketch.js/script /body /html// Teachable Machine 图像分类示例 // 源码见 TeachableMachine/1-teachable-machine/P5/sketch.js let video; let label waiting...; let classifier; let modelURL https://storage.googleapis.com/tm-models/YadBJmj5/; // STEP 1: 预加载模型 function preload() { classifier ml5.imageClassifier(modelURL model.json); } function setup() { createCanvas(640, 520); video createCapture(VIDEO); video.hide(); classifyVideo(); } // STEP 2: 启动分类 function classifyVideo() { classifier.classify(video, gotResults); } function draw() { background(0); image(video, 0, 0); textSize(32); textAlign(CENTER, CENTER); fill(255); text(label, width / 2, height - 16); let emoji ; if (label Rainbow) { emoji ; } else if (label Unicorn) { emoji ; } else if (label Ukulele) { emoji ; } textSize(256); text(emoji, width / 2, height / 2); } // STEP 3: 获取分类结果并继续分类 function gotResults(error, results) { if (error) { console.error(error); return; } label results[0].label; classifyVideo(); }运行与调试要点摄像头权限浏览器会在createCapture(VIDEO)时弹出权限请求必须允许权限被拒后画布将无画面分类也不会产出有效结果。本地运行环境浏览器安全模型要求摄像头 API 只能在localhost或 HTTPS 域名下使用直接双击打开file://页面通常无法获取摄像头。可以用本地静态服务器如npx serve或 p5.js Web Editor运行。模型地址modelURL必须指向你自己在 Teachable Machine 导出的模型根地址替换YadBJmj5为自己的模型标识若类别标签与代码中的字符串不一致emoji 映射会一直停留在默认值 。分类延迟gotResults中的再次调用会让模型持续推理推理耗时会带来轻微延迟属于正常现象帧率需求高的场景可降低classifyVideo()的调用频率。镜像问题本示例未做水平镜像处理若训练时样本与摄像头画面存在左右镜像差异分类准确率会受影响。该问题在系列第二课中通过ml5.flipImage(video)解决详见下文。延伸从图像分类到交互应用「Teachable Machine: Images」只是该系列的第一课仓库中还包含两个同主题的进阶示例展示了同一套「训练 → 导入 → 分类」模式的复用价值Teachable Machine: Snake仓库目录 TeachableMachine/2-teachable-game把分类结果用于控制贪吃蛇游戏的方向。关键差异在于训练了left/right/down/up四个方向类别并在分类前用ml5.flipImage(video)做水平镜像以匹配训练时的画面分类回调中把label转译为snake.setDir(...)指令。其源码见 TeachableMachine/2-teachable-game/P5/sketch.js。Teachable Machine: Audio仓库目录 TeachableMachine/3-teachable-audio训练声音分类器类别为 Train、Bell、Ukulele通过ml5.soundClassifier(modelURL model.json)加载并默认监听麦克风输入在draw()中按标签切换 emoji。源码见 TeachableMachine/3-teachable-audio/P5/sketch.js。三课的代码结构高度一致preload 加载 → setup 初始化 → classify 循环 → 回调取results[0].label掌握第一课即可快速迁移到音频、姿态等其他输入模态。本系列首页见 _TeachableMachine/index.md。相关学习路径若想深入理解本示例背后的 ml5.js 机制仓库中的 ml5 初学者系列课程文档 提供了系统的进阶路线迁移学习用 MobileNet 训练自定义分类器 —— 解释为什么少量样本也能训练出可用模型特征提取器分类 —— 在浏览器内用 ml5 特征提取器训练自己的图片分类器与 Teachable Machine 原理相通保存与加载模型 —— 讲解本地保存 / 加载模型文件的方法是脱离 Teachable Machine 托管、自托管模型的基础Webcam 图像分类 与 MobileNet 图像分类 —— 使用预训练 MobileNet 直接分类常见物体可作为本示例的对照实验。小结本文以「Teachable Machine: Images」教程为骨架完整覆盖了从训练平台采集样本、训练并导出模型到在 p5.js 中通过 ml5.js 加载模型、驱动摄像头实时分类并绘制反馈的端到端流程。仓库中的 sketch.js 是一个结构清晰、可直接复用的实时分类模板preload()预加载模型、setup()初始化摄像头、classifyVideo()gotResults()构成分类循环、draw()完成可视化。掌握这四步之后你可以在任何自定义类别、任何交互场景游戏控制、表情识别、物体分拣等中复用同一套模式Teachable Machine 与 ml5.js 的组合让「训练自己的机器学习模型并跑在浏览器里」成为一件触手可及的事。赞分享教程文档示例工程【免费下载链接】website-archiveArchive of the Coding Train website (first version)项目地址https://gitcode.com/gh_mirrors/we/website-archive点击查看免费下载相关推荐ml5.js 图像分类实战用 MobileNet 预训练模型在 p5.js 中识别图片内容ml5.js 图像分类实战用 MobileNet 预训练模型在 p5.js 中识别图片内容 本文围绕 Coding Train 的 ml5.js 初学者指南系教程文档示例工程为什么 cuDF 会内存不足RMM 与 Spilling 溢写技术深度解析十亿行数据终极方案为什么 cuDF 会内存不足RMM 与 Spilling 溢写技术深度解析十亿行数据终极方案 cuDF 是运行在 GPU 上的 DataFrame 库但教程文档示例工程ml5.js 入门指南基于 MobileNet 与 p5.js 在浏览器中完成图像分类ml5.js 入门指南基于 MobileNet 与 p5.js 在浏览器中完成图像分类 ml5.jsFriendly Machine Learning fo人工智能机器学习深度学习计算机视觉NLP上一篇3 步搞定 Windows Terminal 字体从安装到 settings.json 全配置下一篇如何本地跑起 PDFMathTranslateAI PDF 翻译保留公式版式的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

黑黄配色商务PPT模板设计实操:母版、版式与兼容性维护

黑黄配色商务PPT模板设计实操:母版、版式与兼容性维护

简介:这款黑黄配色商务报告PPT模板专为职场商务汇报场景设计,适合需要快速制作工作概况、阶段成就、经验教训或阶段计划等内容的用户选用。模板以黑色为底、黄色高亮,兼顾稳重感与信息突出度,内置目录页、数据图表、图片展示页等常…

2026/10/13 7:09:57 阅读更多 →
Spring Boot自动配置机制:Spring.factories文件解析与实践

Spring Boot自动配置机制:Spring.factories文件解析与实践

1. Spring.factories 文件解析与应用场景Spring.factories 是 Spring Boot 自动配置机制中的关键配置文件,它采用 Java 的 SPI(Service Provider Interface)机制实现模块化扩展。这个文件通常位于 META-INF 目录下,格式为键值对形…

2026/10/13 7:09:57 阅读更多 →
QOwnNotes 的 AppImage 安装与便携模式完全指南:下载、运行、数据目录与密钥环配置

QOwnNotes 的 AppImage 安装与便携模式完全指南:下载、运行、数据目录与密钥环配置

桌面应用 【免费下载链接】QOwnNotes QOwnNotes is a plain-text file notepad and todo-list manager with Markdown support and Nextcloud / ownCloud integration. 项目地址: https://gitcode.com/gh_mirrors/qo/QOwnNotes 点击查看 免费下载 本篇技术指南聚焦…

2026/10/13 7:08:57 阅读更多 →

最新新闻

SQL UNIQUE约束详解:原理、数据库差异与防重复设计实践

SQL UNIQUE约束详解:原理、数据库差异与防重复设计实践

1. UNIQUE约束到底是什么,为什么你需要它做数据库设计这些年,我见过太多因为“忘记加唯一约束”而崩溃的业务系统。最典型的场景:用户注册接口被脚本刷了一遍,username重复了;订单表里同一笔订单被回调程序insert了两次…

2026/10/13 7:55:19 阅读更多 →
Agent-Skills:智能体原子化能力的设计与工程实践

Agent-Skills:智能体原子化能力的设计与工程实践

1. “agent-skills”不是新词,而是智能体能力体系的命名共识 最近在多个技术社区、开源项目文档和内部架构评审会上,“agent-skills”这个组合词出现频率陡增——它既不指代某个具体开源库,也不是某家公司的私有协议,而是一类设计…

2026/10/13 7:55:19 阅读更多 →
Flink DataStream与Table API转换实战:Schema推导、时间属性与常见避坑指南

Flink DataStream与Table API转换实战:Schema推导、时间属性与常见避坑指南

做实时数据处理这几年,Flink的DataStream和Table API来回切换是我用得最频繁的操作之一。刚接触那会儿,总觉得这两套API是两套独立的体系,流上处理业务逻辑用DataStream,做统计查询用Table,中间隔着一道说不清的墙。后…

2026/10/13 7:55:19 阅读更多 →
LiteLLM:大模型API统一网关与智能路由实战指南

LiteLLM:大模型API统一网关与智能路由实战指南

1. LiteLLM不是另一个大模型,而是一把“万能适配器”最近在几个技术群和开源社区里,频繁看到有人发问:“LiteLLM到底是个啥?是又一个新模型吗?”“它和Ollama、LM Studio有什么区别?”——这种误解非常典型…

2026/10/13 7:55:19 阅读更多 →
LiteLLM:大模型API统一接入与智能路由实战指南

LiteLLM:大模型API统一接入与智能路由实战指南

1. 为什么“litellm”突然在开发者圈里被高频提及——它不是新模型,而是新范式最近两周,在多个技术社区、内部分享会和开源项目讨论区里,“litellm”这个词出现的频率明显升高。它不像Llama、Qwen或Claude那样代表一个具体的大语言模型&#…

2026/10/13 7:55:19 阅读更多 →
开源代码审查实战:流程设计、工具配置与团队落地方法

开源代码审查实战:流程设计、工具配置与团队落地方法

代码审查这事儿,我过去几年一直想好好聊一聊。初看上去,open-code-review 这个项目标题没什么特别,好像就是把自己团队做代码评审的过程、工具和规范整理出来,开源给社区用。但如果真这么理解,那就有点浪费了。代码审查…

2026/10/13 7:54:17 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →