Android 机器学习组件-图像标签初探

前言

学习和了解使用 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 也有相应的版本)基于这些能力做一些相关的事情。

参考文档

相关推荐
晨曦_子画1 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
道可云2 分钟前
道可云人工智能&元宇宙每日资讯|2024国际虚拟现实创新大会将在青岛举办
大数据·人工智能·3d·机器人·ar·vr
人工智能培训咨询叶梓12 分钟前
探索开放资源上指令微调语言模型的现状
人工智能·语言模型·自然语言处理·性能优化·调优·大模型微调·指令微调
zzZ_CMing12 分钟前
大语言模型训练的全过程:预训练、微调、RLHF
人工智能·自然语言处理·aigc
newxtc13 分钟前
【旷视科技-注册/登录安全分析报告】
人工智能·科技·安全·ddddocr
成都古河云14 分钟前
智慧场馆:安全、节能与智能化管理的未来
大数据·运维·人工智能·安全·智慧城市
UCloud_TShare17 分钟前
浅谈语言模型推理框架 vLLM 0.6.0性能优化
人工智能
软工菜鸡21 分钟前
预训练语言模型BERT——PaddleNLP中的预训练模型
大数据·人工智能·深度学习·算法·语言模型·自然语言处理·bert
孤客网络科技工作室23 分钟前
AJAX 全面教程:从基础到高级
android·ajax·okhttp
vivid_blog27 分钟前
大语言模型(LLM)入门级选手初学教程 III
人工智能·语言模型·自然语言处理