Android-机器学习组件-自定义模型

前言

通过 Android 机器学习组件-图像标签初探 - 掘金 (juejin.cn) 我们了解了如何使用基础模型实现图像标签功能。但是,基础模型所能识别的标签是有限的,是基于特定的数据集进行训练的。而实际业务场景中,需要我们结合自身的数据,需要量身定制的模型,以便模型推理的结果更符合我们实际的需求,下面就来了解一下如何使用自定义模型。

自定义模型

相比于标准模型,使用自定义模型有更多的灵活性,可以通过参数定制更多的内容。

使用自定义模型获取图像标签

  • 首先,使用自定义模型时需要依赖支持自定义模型的组件 com.google.mlkit:image-labeling-custom
  • 将模型文件放在项目代码 assets 目录下,模型文件(通常以 .tflite 或 .lite 结尾)
  • 完成 ImageLabeler 的初始化
kotlin 复制代码
    private fun initCustomLabeler() {
        val localModel = LocalModel.Builder().setAssetFilePath("model.tflite").build()
        val customImageLabelerOptions =
            CustomImageLabelerOptions.Builder(localModel).setConfidenceThreshold(0.5f)
                .setMaxResultCount(15).build()
        labeler = ImageLabeling.getClient(customImageLabelerOptions)
    }
  • 这里 setConfidenceThreshold 顾名思义,就是配置可信度最小值,小于这个可信度的结果是不会返回的
  • setMaxResultCount 返回标签个数集合的最大值

创建好 ImageLabeler 了之后,具体使用方式已经在Android 机器学习组件-图像标签初探 - 掘金 (juejin.cn)中说过了,我们用相同的图片再试一下。这里使用的自定义模型是有 Google 训练的 mobilenet_v3, 是一个专门用于图像分类相关任务的模型。

shell 复制代码
17:07:37.195 ImageLabelHelper         I  text=stage     ,confidence=8.178474  ,index=820 ,uri=content://media/external/images/media/101508
17:07:37.195 ImageLabelHelper         I  text=volcano   ,confidence=7.372629  ,index=981 ,uri=content://media/external/images/media/101508
17:07:37.195 ImageLabelHelper         I  text=spotlight ,confidence=5.266957  ,index=819 ,uri=content://media/external/images/media/101508
17:07:37.196 ImageLabelHelper         I  text=alp       ,confidence=4.521148  ,index=971 ,uri=content://media/external/images/media/101508
17:07:37.196 ImageLabelHelper         I  text=electric guitar,confidence=4.404194  ,index=547 ,uri=content://media/external/images/media/101508
17:07:37.197 ImageLabelHelper         I  text=geyser    ,confidence=4.381730  ,index=975 ,uri=content://media/external/images/media/101508
17:07:37.197 ImageLabelHelper         I  text=maypole   ,confidence=4.266276  ,index=646 ,uri=content://media/external/images/media/101508
17:07:37.197 ImageLabelHelper         I  text=planetarium,confidence=4.118463  ,index=728 ,uri=content://media/external/images/media/101508
17:07:37.197 ImageLabelHelper         I  text=ballplayer,confidence=4.013018  ,index=982 ,uri=content://media/external/images/media/101508
17:07:37.198 ImageLabelHelper         I  text=torch     ,confidence=3.877848  ,index=863 ,uri=content://media/external/images/media/101508
17:07:37.198 ImageLabelHelper         I  text=steam locomotive,confidence=3.836026  ,index=821 ,uri=content://media/external/images/media/101508
17:07:37.198 ImageLabelHelper         I  text=fountain  ,confidence=3.698731  ,index=563 ,uri=content://media/external/images/media/101508
17:07:37.199 ImageLabelHelper         I  text=unicycle  ,confidence=3.564799  ,index=881 ,uri=content://media/external/images/media/101508
17:07:37.199 ImageLabelHelper         I  text=jigsaw puzzle,confidence=3.548051  ,index=612 ,uri=content://media/external/images/media/101508
17:07:37.199 ImageLabelHelper         I  text=crash helmet,confidence=3.526286  ,index=519 ,uri=content://media/external/images/media/101508
shell 复制代码
17:09:00.118 ImageLabelHelper         I  text=basketball,confidence=10.063719 ,index=431 ,uri=content://media/external/images/media/101507
17:09:00.119 ImageLabelHelper         I  text=unicycle  ,confidence=5.737387  ,index=881 ,uri=content://media/external/images/media/101507
17:09:00.119 ImageLabelHelper         I  text=volleyball,confidence=5.126340  ,index=891 ,uri=content://media/external/images/media/101507
17:09:00.119 ImageLabelHelper         I  text=mountain bike,confidence=5.038583  ,index=672 ,uri=content://media/external/images/media/101507
17:09:00.120 ImageLabelHelper         I  text=bow       ,confidence=4.851575  ,index=457 ,uri=content://media/external/images/media/101507
17:09:00.120 ImageLabelHelper         I  text=comic book,confidence=4.779339  ,index=918 ,uri=content://media/external/images/media/101507
17:09:00.120 ImageLabelHelper         I  text=toilet seat,confidence=4.755874  ,index=862 ,uri=content://media/external/images/media/101507
17:09:00.120 ImageLabelHelper         I  text=racket    ,confidence=4.598331  ,index=753 ,uri=content://media/external/images/media/101507
17:09:00.121 ImageLabelHelper         I  text=chain saw ,confidence=4.398981  ,index=492 ,uri=content://media/external/images/media/101507
17:09:00.121 ImageLabelHelper         I  text=drum      ,confidence=4.151714  ,index=542 ,uri=content://media/external/images/media/101507
17:09:00.121 ImageLabelHelper         I  text=shield    ,confidence=3.973551  ,index=788 ,uri=content://media/external/images/media/101507
17:09:00.122 ImageLabelHelper         I  text=toyshop   ,confidence=3.807693  ,index=866 ,uri=content://media/external/images/media/101507
17:09:00.122 ImageLabelHelper         I  text=bobsled   ,confidence=3.746702  ,index=451 ,uri=content://media/external/images/media/101507
17:09:00.122 ImageLabelHelper         I  text=tricycle  ,confidence=3.694458  ,index=871 ,uri=content://media/external/images/media/101507
17:09:00.122 ImageLabelHelper         I  text=balance beam,confidence=3.685299  ,index=417 ,uri=content://media/external/images/media/101507
shell 复制代码
17:10:03.945 ImageLabelHelper         I  text=seashore  ,confidence=7.280358  ,index=979 ,uri=content://media/external/images/media/3719
17:10:03.946 ImageLabelHelper         I  text=aircraft carrier,confidence=5.773122  ,index=404 ,uri=content://media/external/images/media/3719
17:10:03.946 ImageLabelHelper         I  text=alp       ,confidence=5.731852  ,index=971 ,uri=content://media/external/images/media/3719
17:10:03.946 ImageLabelHelper         I  text=obelisk   ,confidence=5.652296  ,index=683 ,uri=content://media/external/images/media/3719
17:10:03.947 ImageLabelHelper         I  text=breakwater,confidence=5.417479  ,index=461 ,uri=content://media/external/images/media/3719
17:10:03.947 ImageLabelHelper         I  text=traffic light,confidence=5.388855  ,index=921 ,uri=content://media/external/images/media/3719
17:10:03.947 ImageLabelHelper         I  text=maze      ,confidence=5.183353  ,index=647 ,uri=content://media/external/images/media/3719
17:10:03.948 ImageLabelHelper         I  text=go-kart   ,confidence=5.009349  ,index=574 ,uri=content://media/external/images/media/3719
17:10:03.948 ImageLabelHelper         I  text=lakeside  ,confidence=4.928476  ,index=976 ,uri=content://media/external/images/media/3719
17:10:03.948 ImageLabelHelper         I  text=unicycle  ,confidence=4.758537  ,index=881 ,uri=content://media/external/images/media/3719
17:10:03.948 ImageLabelHelper         I  text=racer     ,confidence=4.605724  ,index=752 ,uri=content://media/external/images/media/3719
17:10:03.949 ImageLabelHelper         I  text=triumphal arch,confidence=4.504304  ,index=874 ,uri=content://media/external/images/media/3719
17:10:03.949 ImageLabelHelper         I  text=promontory,confidence=4.499630  ,index=977 ,uri=content://media/external/images/media/3719
17:10:03.949 ImageLabelHelper         I  text=crane     ,confidence=4.449341  ,index=518 ,uri=content://media/external/images/media/3719
17:10:03.949 ImageLabelHelper         I  text=trailer truck,confidence=4.262432  ,index=868 ,uri=content://media/external/images/media/3719

可以看到使用这个自定义模型,相比与基础模型,返回的图像标签类型更丰富了。同时标签类型索引也和之前的不同了,毕竟这个模型更大了,会有新的标签映射关系。

如何获取自定义模型

如果要使用自定义模型组件,就需要使用自己的模型。那么模型文件从哪里来呢?这个一般有两种方式

  1. 从网上获取别人训练好模型,比如直接从 TenserFlow Hub 下载别人训练好的模型。

这里需要注意的是,从网络上获取模型时要符合 TensorFlow Lite 的规范

选择模式时,从这里选择正确的模型,然后下载即可使用。

  1. 自己进行训练,这种一般是训练通用模型,也就是 PC 端可用的模型,然后转换为 TensorFlow Lite 类型的模型,以便移动端进行使用。许多深度学习框架 PyTorch,Paddle 训练之后的模型,都可以转换为符合 TensorFlow Lite 规范的模型。

    可以参考详细拆解YOLO的导出原理,以tflite格式为例实现Android端的调用

上述相关完整代码可以参考 Matisse

参考

相关推荐
未来智慧谷19 分钟前
华为发布AI推理新技术,降低对HBM内存依赖
人工智能·华为
AKAMAI22 分钟前
通过Akamai分布式计算区域实现直播传输
人工智能·分布式·云计算
坐在地上想成仙28 分钟前
计算机视觉(4)-相机基础知识恶补
人工智能·数码相机·计算机视觉
sssammmm1 小时前
AI入门学习--如何写好prompt?
人工智能·学习·prompt
阿群今天学习了吗1 小时前
“鱼书”深度学习进阶笔记(3)第四章
人工智能·笔记·python·深度学习·算法
神齐的小马1 小时前
机器学习 [白板推导](十)[马尔可夫链蒙特卡洛法]
人工智能·机器学习·概率论
白-胖-子2 小时前
深度剖析主流AI大模型的编程语言与架构选择:行业实践与技术细节解读
人工智能·架构
AI模块工坊2 小时前
IEEE 2025 | 重磅开源!SLAM框架用“法向量+LRU缓存”,将三维重建效率飙升72%!
人工智能·深度学习·神经网络·机器学习·计算机视觉
nbsaas-boot2 小时前
用生成器守住架构,用 AI 放大效率:一套可落地的 AI 编程方法论
人工智能·架构
文弱_书生2 小时前
为什么神经网络的权重矩阵具有低秩特性?如何理解和解释?
人工智能·神经网络·矩阵