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

参考文档

相关推荐
大耳朵爱学习10 分钟前
掌握Transformer之注意力为什么有效
人工智能·深度学习·自然语言处理·大模型·llm·transformer·大语言模型
TAICHIFEI11 分钟前
目标检测-数据集
人工智能·目标检测·目标跟踪
qq_153214526417 分钟前
【2023工业异常检测文献】SimpleNet
图像处理·人工智能·深度学习·神经网络·机器学习·计算机视觉·视觉检测
Reese_Cool20 分钟前
【C语言二级考试】循环结构设计
android·java·c语言·开发语言
洛阳泰山21 分钟前
如何使用Chainlit让所有网站快速嵌入一个AI聊天助手Copilot
人工智能·ai·llm·copilot·网站·chainlit·copliot
儿创社ErChaungClub30 分钟前
解锁编程新境界:GitHub Copilot 让效率翻倍
人工智能·算法
乙真仙人35 分钟前
AIGC时代!AI的“iPhone时刻”与投资机遇
人工智能·aigc·iphone
平凡シンプル38 分钟前
安卓 uniapp跨端开发
android·uni-app
elina801341 分钟前
安卓实现导入Excel文件
android·excel
严文文-Chris1 小时前
【设计模式-享元】
android·java·设计模式