前言
学习和了解使用 Android 官方提供的机器学习相关组件,给图片打标签,进行图片内容的识别。
以机器学习或者说深度学习为理念,通过神经网络训练的模型,可以变得像人一样具有智慧。可以用于处理各种学习任务,如语音识别、图像识别、自然语言处理等。Android 官方提供了很多机器学习的组件可以使用,比如文字识别、人脸检测、姿势检测、图像标签、对象检测和跟踪等功能的组件。下面通过图片标签这个组件了解一下使用官方提供的机器学习组件可以做什么。
图像标签
图像标签说白了就是检测和提取图片中各种类别的实体的相关信息。默认的图片标签模型可以识别一般对象、地点、活动、动物物种、商品等。
读取图像标签
使用基础模型
Android 官方提供的 com.google.mlkit:image-labeling
组件可以读取图像标签。
- 官方提供的机器学习组件,可以和模型绑定使用,需要把模型打包到 apk 中,也可以和 Google Play 服务绑定使用,模型首次使用时会自动下载;相对来说比较灵活和方便。
- image-labeling 组件可以通过相机、图片文件 URL、图片内存信息的方式读取图片信息。
com.google.mlkit:image-labeling
的组件集成比较简单,可以直接参考 图片标签 文档。
下面通过核心代码了解一下 image-labeling 组件的实际效果。
kotlin
fun getLabel(context: Context, uri: Uri) {
val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
val image: InputImage
try {
image = InputImage.fromFilePath(context, uri)
labeler?.process(image)?.addOnSuccessListener { labels ->
for (label in labels) {
val text = label.text
val confidence = label.confidence
val index = label.index
Log.i(TAG, "text=$text,confidence=$confidence,index=$index ,uri=$uri")
}
}?.addOnFailureListener { e ->
Log.e(TAG, e.stackTraceToString())
}
} catch (e: Exception) {
e.printStackTrace()
}
}
我们通过图片 URI 创建 InputImage 对象,通过调用 ImageLabeling 的 process 方法异步获取图片标签信息。比如以下面这张元宵节灯笼的图片为例
可以看一下输出
shell
11:31:12.839 ImageLabelHelper I text=Crowd ,confidence=0.968574 ,index=218 ,uri=content://media/external/images/media/101508
11:31:12.839 ImageLabelHelper I text=Product ,confidence=0.943360 ,index=78 ,uri=content://media/external/images/media/101508
11:31:12.840 ImageLabelHelper I text=Stadium ,confidence=0.893257 ,index=43 ,uri=content://media/external/images/media/101508
11:31:12.840 ImageLabelHelper I text=Event ,confidence=0.803580 ,index=319 ,uri=content://media/external/images/media/101508
11:31:12.840 ImageLabelHelper I text=Fun ,confidence=0.631223 ,index=386 ,uri=content://media/external/images/media/101508
11:31:12.841 ImageLabelHelper I text=Leisure ,confidence=0.612061 ,index=239 ,uri=content://media/external/images/media/101508
11:31:12.841 ImageLabelHelper I text=Race ,confidence=0.511048 ,index=285 ,uri=content://media/external/images/media/101508
可以看到针对这张图片,image-labeling 组件推理出了 Crowd,Product,Stadium,Event,Fun,Leisure,Race
这几个标签。
我们再看一张图片
shell
11:32:42.062 ImageLabelHelper I text=Event ,confidence=0.742820 ,index=319 ,uri=content://media/external/images/media/101507
11:32:42.063 ImageLabelHelper I text=Team ,confidence=0.716490 ,index=0 ,uri=content://media/external/images/media/101507
11:32:42.063 ImageLabelHelper I text=Leisure ,confidence=0.674395 ,index=239 ,uri=content://media/external/images/media/101507
11:32:42.064 ImageLabelHelper I text=Fun ,confidence=0.612567 ,index=386 ,uri=content://media/external/images/media/101507
11:32:42.064 ImageLabelHelper I text=Sports ,confidence=0.538094 ,index=292 ,uri=content://media/external/images/media/101507
image-labeling 组件从这张图片推理出了 Event,Team,Leisure,Fun,Sports
这几个标签。
最后再看一张日常拍摄的照片
shell
11:36:01.222 ImageLabelHelper I text=Infrastructure,confidence=0.919282 ,index=31 ,uri=content://media/external/images/media/3719
11:36:01.222 ImageLabelHelper I text=Vehicle ,confidence=0.904313 ,index=316 ,uri=content://media/external/images/media/3719
11:36:01.223 ImageLabelHelper I text=Road ,confidence=0.841021 ,index=287 ,uri=content://media/external/images/media/3719
11:36:01.223 ImageLabelHelper I text=Asphalt ,confidence=0.781312 ,index=411 ,uri=content://media/external/images/media/3719
11:36:01.224 ImageLabelHelper I text=Car ,confidence=0.762895 ,index=423 ,uri=content://media/external/images/media/3719
11:36:01.224 ImageLabelHelper I text=Plant ,confidence=0.711713 ,index=266 ,uri=content://media/external/images/media/3719
11:36:01.224 ImageLabelHelper I text=Building ,confidence=0.646049 ,index=366 ,uri=content://media/external/images/media/3719
11:36:01.225 ImageLabelHelper I text=Wheel ,confidence=0.598548 ,index=322 ,uri=content://media/external/images/media/3719
11:36:01.225 ImageLabelHelper I text=Van ,confidence=0.551206 ,index=404 ,uri=content://media/external/images/media/3719
这张图片输出的标签还挺多。
日志中输出的信息还是很好理解的,
- text 就是图片中包含标签的文本描述,从这里的英文表述可以看到识别还是很准确的。
- confidence 从 image-labeling 组件的角度出发就是对这个描述的信心,对使用者来说就是可信度,概率值,可以看到标签是按可信度的降序排列。如果你自己曾经做过模型训练的话,应该对 confidence 这个词不陌生。
- index 这个 index 可以理解为标签索引,现实生活中同一个具体的物品在不同环境会有不同的表达,模型不可能基于不同的语言输出不同的文本描述,而是选择了输出标签索引,基于这个索引,我们可以去映射具体的含义。
标签映射
图片标签 API 提供的默认模型支持 400 多个不同的标签,比如对于上面出现的标签索引
标签索引 | 标签内容 |
---|---|
0 | 团队 |
43 | 体育馆 |
239 | 休闲 |
287 | 道路 |
404 | 厢式车 |
通过这个标签索引,我们就可以获取图片中的标签信息了。
完整的标签索引列表可以参考官方提供的 标签索引
上述相关完整代码可以参考 Matisse
小结
Android 官方提供的机器学习组件,主要是视觉和自然语言两大类。视觉相关的组件除了图片标签还有文字识别、人脸检测、姿势检测。自然语言相关的组件包括语言识别、翻译、智能回复等组件。通过这些组件可以在移动设备(除了 Android、iOS 也有相应的版本)基于这些能力做一些相关的事情。