MLKitImageLabeler 拓展:离线图像标注(拍照识物)

« 返回首页

logo MLKitImageLabeler 拓展

识别一张图片里有什么,返回 400 多个通用类别及置信度(花、食物、天空、建筑、猫、狗……)。

为什么选它:

  • 完全离线。模型随 .aix 打包,设备不需要 Google Play 服务,断网也能用。
  • 标签自带中文名。ML Kit 原始返回是英文(Flower、Food),本拓展内置约 230 条常见类别的 中文对照,事件里同时给英文和中文,不用自己维护映射表。
  • 不用先”初始化”,识别器按需创建、复用。
  • 「什么都没认出来」走专门的事件,不当错误处理。

常用场景:拍照识物教学项目、相册自动打标签、按内容分类图片。

与 MLKitObjectDetector 的区别:本拓展只告诉你「图里有花」, 目标检测还会告诉你「花在这个矩形框里」并能一次框出多个物体。要画框请用那个。

  • .aix 拓展下载:

cn.fun123.MLKit.ImageLabeler.aix


快速上手

一、拍照识物(最小可用)

设计器里放一个 MLKitImageLabeler、一个「图像选择器」、一个标签、一个列表显示。

when 图像选择器1.AfterPicking() {
  标签1.Text = "识别中…"
  ImageLabeler1.LabelFromFile(图像选择器1.Selection)
}
when ImageLabeler1.GotLabels(topLabel, topName, labels, names, resultJson) {
  标签1.Text = join("这是:", topName)
  列表显示框1.Elements = names
}
when ImageLabeler1.NoLabelFound(operation) {
  标签1.Text = "没认出来,试试换张图或调低置信度阈值"
}
when ImageLabeler1.LabelFailed(operation, errorMessage) {
  标签1.Text = errorMessage
}

topName 直接就是中文(如「花」),names 是全部标签的中文列表。

二、想要更多标签就调低阈值

when Screen1.Initialize() {
  ImageLabeler1.ConfidenceThreshold = 0.3
}

三、带置信度一起显示

when ImageLabeler1.GotLabels(topLabel, topName, labels, names, resultJson) {
  标签1.Text = topName
  标签_原始结果.Text = resultJson
}

resultJson 的形状(用「JSON 文本解码」块解析):

[{"label":"Flower","name":"花","confidence":0.92,"index":0},
 {"label":"Plant","name":"植物","confidence":0.81,"index":1}]

四、识别 Base64 图片(例如从摄像头或网络拿到的)

when 按钮_Base64.Click() {
  ImageLabeler1.LabelFromBase64(文本输入框_Base64.Text)
}

五、给别处拿到的英文标签配中文名

when 按钮_名称.Click() {
  标签1.Text = ImageLabeler1.LabelName("Sunset")
}

属性

ConfidenceThreshold
置信度阈值,0~1,默认 0.5。低于这个值的标签不返回。 调低会返回更多但更不确定的标签。改这个属性会重建识别器,立即生效。
Busy
只读。是否正在识别。识别期间再次调用会触发 LabelFailed。

事件

GotLabels(topLabel,topName,labels,names,resultJson)
识别出标签。
  • topLabel / topName — 置信度最高的那个标签的英文名 / 中文名。只想显示一个结果就用 topName。
  • labels / names — 全部标签的英文列表 / 中文列表,按置信度从高到低。
  • resultJson — 含置信度和索引的完整结果(见示例三)。
NoLabelFound(operation)
没识别出任何标签(图片内容不在 400 类里,或都低于阈值)。这不是错误 —— 可以试着调低 置信度阈值。
LabelFailed(operation,errorMessage)
识别失败。operation 是出错的方法名。

方法

LabelFromFile(path)
识别图片文件。path 可以是素材文件名、设备路径、file:// 或 content:// 地址 (「图像选择器」的 选中项 可以直接传进来)。
LabelFromBase64(base64)
识别 Base64 图片。支持纯 Base64,也支持带 data:image/...;base64, 前缀的写法。
LabelName(englishLabel)
把英文标签转成中文名。对照表里没有的原样返回英文。

运行环境:AI 伴侣联机需要 Android 11 及以上

本拓展的识别模型放在依赖库自带的 assets 里,AI 伴侣联机调试要把它挂进 AssetManager,用的是 Android 11(API 30)才有的 ResourcesLoader —— 这是系统提供的 唯一公开办法,更低版本没有等价 API。所以:

运行方式 Android 6 ~ 10 Android 11 及以上
打包 APK ✅ 正常 ✅ 正常
AI 伴侣联机 ❌ 模型加载不了 ✅ 正常

打包 APK 之所以不受限制,是因为模型在编译时就被并进了 APK 的 assets,装到手机上 就是 App 自己的资源,与系统版本无关。伴侣的 APK 是提前编好装在手机上的,运行时没法 往自己已安装的包里加文件,只能靠系统的运行时挂载 API。

低版本设备上想验证功能,直接打包 APK 测即可;要用伴侣边改边调,请换 Android 11+ 的设备。

常见问题

认出来的类别很笼统(只说”食物”不说”披萨”)。 这是 ML Kit 基础模型的能力边界 —— 它是 400 个通用大类,不是细粒度识别。 要认具体品类(花的品种、菜名、商品)需要自定义 TFLite 模型,用本仓库的自定义模型版拓展。

中文名是空的 / 显示的是英文。 说明这个标签不在内置的约 230 条对照表里,此时会原样返回英文(宁可显示英文也不显示空白)。 需要补充可以在自己的项目里做一层映射,或反馈标签名给我们加进对照表。

为什么 .aix 有 23 MB? 除了 2.4 MB 的标注模型,还有 18.7 MB 的推理引擎(vision-internal-vkp,4 个 CPU 架构的原生库), 这是「完全离线、不依赖 Google Play 服务」的代价。

能识别文字吗? 不能,那是 OCR。请用 MLKit.TextRecognizer(本仓库的离线文字识别拓展,支持中/英/日/韩/天城文 5 种脚本)。 本拓展只会给你一个 Text(文字)这样的笼统标签。

文档反馈