即教即识(TeachableClassifier)使用指导:在手机上现拍现教

« 返回

机器学习套件(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 源码与操作指导

下载 .aia 源码

导入 TeachableClassifierDemo.aia 后可以直接打包 APK 运行;用 AI 伴侣联机调试请安装 MLKit 版 AI 伴侣。源码文件已通过正式编辑器载入、后台导入和 APK 编译校验;真机识别效果请以实际设备为准。

功能 操作 预期结果
打开摄像头 点「打开摄像头」,允许摄像头权限 预览区显示摄像头画面
教第一类 把杯子放在镜头前,点第一行的「教」,慢慢转动杯子 状态栏显示采集进度,「0 张」变成「20 张」
教第二、三类 换成笔点第二行「教」;移开东西点第三行「教」(背景) 三类都有样本
实时认 轮流把杯子、笔放到镜头前 大字显示类别和置信度,换了类别念出「这是……」
保存与载入 点「保存模型」,再点「清空」,然后点「加载模型」 显示保存路径;清空后显示「还没教」,载入后恢复三个类别
相册分类 点「给相册图片分类」选一张照片 下方显示照片的分类结果和每类置信度

案例界面与积木源码在仓库 docs/markdown/reference/components/guide/examples/TeachableClassifierDemo/,SHA-256:b9bf35b7a526a695e41f209c70ad7b8b32c22cc73e5c5dca9977cce41cadf8d7。

文档反馈