前语

学习和了解运用 Android 官方供给的机器学习相关组件,给图片打标签,进行图片内容的辨认。

以机器学习或者说深度学习为理念,经过神经网络练习的模型,能够变得像人一样具有智慧。能够用于处理各种学习使命,如语音辨认、图画辨认、自然语言处理等。Android 官方供给了很多机器学习的组件能够运用,比方文字辨认、人脸检测、姿态检测、图画标签、目标检测和跟踪等功能的组件。下面经过图片标签这个组件了解一下运用官方供给的机器学习组件能够做什么。

图画标签

图画标签说白了便是检测和提取图片中各种类别的实体的相关信息。默认的图片标签模型能够辨认一般目标、地点、活动、动物物种、商品等。

读取图画标签

运用基础模型

Android 官方供给的 com.google.mlkit:image-labeling 组件能够读取图画标签。

  • 官方供给的机器学习组件,能够和模型绑定运用,需要把模型打包到 apk 中,也能够和 Google Play 服务绑定运用,模型首次运用时会主动下载;相对来说比较灵敏和便利。
  • image-labeling 组件能够经过相机、图片文件 URL、图片内存信息的办法读取图片信息。

com.google.mlkit:image-labeling 的组件集成比较简单,能够直接参阅 图片标签 文档。

下面经过核心代码了解一下 image-labeling 组件的实际效果。

    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 办法异步获取图片标签信息。比方以下面这张元宵节灯笼的图片为例

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

能够看一下输出

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 这几个标签。

咱们再看一张图片

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

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 这几个标签。

最后再看一张日常拍照的相片

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

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

参阅文档