机器学习套件(ML Kit)组件在在线版和教育版中提供,离线版(含机房版)不包含。
它能做什么
即教即识让 App 学会认你自己的东西:给每个类别对着摄像头拍几张到几十张样本,马上就能实时分辨。不用电脑、不用联网,也不用等待训练。可以认杯子和笔、石头剪刀布手势、表情、零食包装、垃圾种类…… 教好的结果能保存成文件,下次直接加载。它是 PersonalImageClassifier(PIC)、TeachableMachine 拓展和 MIT PICaboo 课程的本土化简化版(全程离线运行):那两个拓展要先到国外网站训练,国内用不了,这里在手机上就能完成同样的事。也可以用电脑打开即教即识训练台,拍样本或拖入一批图片,测好正确率后导出模型文件,上传为素材直接用。
即教即识为教学做了简化:没有选网络、调学习率、训练轮数这些参数,加样本立刻生效。想讲神经网络训练过程、自己调参数,可以用 PersonalImageClassifier 拓展;类别很多、要求高精度或要用现成的专业模型,在电脑上训练 TFLite 模型后用自定义图像分类。几种方案的关系和区别,看图像分类方案对比:Teachable Machine、PIC 和即教即识怎么选。
准备工作
- 教得好的窍门:每类 10~30 张;采集时慢慢转动物体、变换远近和角度;类别之间差别越明显越准。再教一个「背景」类(镜头前什么都不放),没东西时就不会乱认。
- 最低置信度:默认 0.6,最像的类别置信度低于它时结果为空(拿不准)。认错多就调高,总说拿不准就多教几张。
- 系统要求:Android 7.0 以上。
- 联机调试:安卓上用 AI 伴侣调试需要安装 MLKit 版 AI 伴侣(应用宝,包名 cn.fun123.appinventor);普通版伴侣不含识别引擎,调用时会触发「屏幕.出现错误时」(错误码 4722)。直接打包 APK 安装测试不受影响。
- 安装包体积:只有用到本组件的 App 才会打包它的识别引擎与模型,体积以编译结果为准。
- 鸿蒙:暂不支持:鸿蒙系统没有开放通用图像特征提取接口,添加样本、分类、实时摄像头都会触发「分类出错」并说明原因。
案例一:教会 App 认东西
先「打开实时摄像头」,再用「从摄像头采集样本(类别, 张数)」连续采集,每采到一张触发「样本已添加」。教完的类别立刻参与分类,「实时分类」按「实时事件间隔」给出结果:
when 按钮_打开.Click() {
即教即识1.PreviewContainer = 垂直布局_预览
即教即识1.StartLiveCamera()
}
when 按钮_教1.Click() { 即教即识1.AddSamplesFromCamera(文本输入框_类别1.Text, 20) }
when 按钮_教2.Click() { 即教即识1.AddSamplesFromCamera(文本输入框_类别2.Text, 20) }
when 即教即识1.SampleAdded(类别, 数量) {
标签_状态.Text = join("正在教「", 类别, "」:", 数量, " 张")
}
when 即教即识1.LiveClassification(类别, 置信度, 结果JSON) {
if 类别 == "" {
标签_结果.Text = "拿不准"
} else {
标签_结果.Text = join(类别, " ", round(置信度 * 100), "%")
}
}
案例二:保存、加载模型,给相册图片分类
「保存模型」只写文件名时存在 App 自己的目录,不需要存储权限;「加载模型」用同一个文件名读回来。把保存的 .json 文件作为素材上传,App 一打开就能「加载模型」直接认。
警告:模型文件名必须用字母和数字(如
model.json)。中文名在手机上能存取,但作为素材上传时,App Inventor 的素材名不支持中文,上传会被自动改成英文名,「加载模型」里写的中文名就找不到文件了。
不开摄像头时也能用「图片分类」给照片分类:
when 按钮_保存.Click() { 即教即识1.SaveModel("model.json") }
when 即教即识1.ModelSaved(路径) { 标签_详情.Text = join("模型已保存:", 路径) }
when 按钮_加载.Click() { 即教即识1.LoadModel("model.json") }
when 即教即识1.ModelLoaded(类别数, 样本数) {
标签_详情.Text = join("已载入 ", 类别数, " 个类别、", 样本数, " 张样本")
}
when 图像选择器_相册.AfterPicking() {
即教即识1.ClassifyImage(图像选择器_相册.Selection)
}
when 即教即识1.GotClassification(类别, 置信度, 结果JSON) {
标签_详情.Text = join("相册图片:", choose(类别 == "", "拿不准", 类别), " ", round(置信度 * 100), "%")
}
案例三:认出后朗读出来
「实时分类」每次都触发,要在类别变化时才说话:用全局变量记住上一次的类别,不一样时才调「文本朗读器」。采集样本期间(「正在采集」为真)先不念:
global 上次类别 = ""
when 即教即识1.LiveClassification(类别, 置信度, 结果JSON) {
if 类别 != "" and 类别 != 上次类别 and not(即教即识1.Collecting) {
文本朗读器1.Speak(join("这是", 类别))
}
上次类别 = 类别
}
结果数据说明
「类别」是最可能的类别,置信度低于「最低置信度」时为空;「置信度」0~1。「结果JSON」里 scores 给出每个类别的置信度,加起来等于 1,例如 {"category":"杯子","confidence":0.94,"scores":{"杯子":0.94,"笔":0.04,"背景":0.02}}。模型文件只存每张样本的特征数字,不存照片。不想处理事件时,直接读「当前类别」「置信度」「各类别置信度」(字典,按类别名取值)三个属性,它们保存最近一次分类结果——实时分类时点按钮读一次,就等于「识别当前画面」。
常见问题
| 现象 | 原因与处理 |
|---|---|
| 总是「拿不准」 | 样本太少或类别太像;每类多教几张、换几个角度,或调低「最低置信度」 |
| 没东西时也认成某一类 | 再教一个「背景」类(镜头前什么都不放) |
| 换个地方就认不准 | 样本都在同一背景下拍的;在不同背景、光线下各补几张 |
| 加载模型失败 | 文件名要和保存时一致;作为素材上传的模型文件直接写素材名 |
| 普通版伴侣里调用报错 4722 | 请安装 MLKit 版 AI 伴侣,或直接打包 APK 测试 |
| 实时预览黑屏、看不到画面 | 「预览容器」要选布局组件并给明确宽高(如宽度充满、高度 300 像素);第一次打开要允许摄像头权限 |
| 实时检测时界面卡 | 调大「实时事件间隔」,事件里少做事;画面上的标注不受间隔影响 |
完整 .aia 源码与操作指导
导入 TeachableClassifierDemo.aia 后可以直接打包 APK 运行;用 AI 伴侣联机调试请安装 MLKit 版 AI 伴侣。源码文件已通过正式编辑器载入、后台导入和 APK 编译校验;真机识别效果请以实际设备为准。
| 功能 | 操作 | 预期结果 |
|---|---|---|
| 打开摄像头 | 点「打开摄像头」,允许摄像头权限 | 预览区显示摄像头画面 |
| 教第一类 | 把杯子放在镜头前,点第一行的「教」,慢慢转动杯子 | 状态栏显示采集进度,「0 张」变成「20 张」 |
| 教第二、三类 | 换成笔点第二行「教」;移开东西点第三行「教」(背景) | 三类都有样本 |
| 实时认 | 轮流把杯子、笔放到镜头前 | 大字显示类别和置信度,换了类别念出「这是……」 |
| 保存与载入 | 点「保存模型」,再点「清空」,然后点「加载模型」 | 显示保存路径;清空后显示「还没教」,载入后恢复三个类别 |
| 相册分类 | 点「给相册图片分类」选一张照片 | 下方显示照片的分类结果和每类置信度 |
案例界面与积木源码在仓库 docs/markdown/reference/components/guide/examples/TeachableClassifierDemo/,SHA-256:b9bf35b7a526a695e41f209c70ad7b8b32c22cc73e5c5dca9977cce41cadf8d7。
扫码添加客服咨询