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(文字)这样的笼统标签。
扫码添加客服咨询