基于TensorFlow Lite实现的Android花卉识别应用

2023-11-11

介绍

本教程将在Android设备上使用TensorFlow Lite运行图像识别模型,具体包括:

  • 使用TensorFlow Lite Model Maker训练自定义的图像分类器
  • 利用Android Studio导入训练后的模型,并结合CameraX使用
  • 利用手机GPU加速模型运行

最终的应用将呈现如下的界面:

预备工作

安装Android Studio 4.1以上版本

下载初始代码

创建工作目录,使用

git clone https://github.com/hoitab/TFLClassify.git

拷贝代码;或者直接访问github链接下载代码的ZIP包,并解压缩到工作目录。

运行初始代码

  1. 打开Android Studio,选择“Open an Existing Project”
    在这里插入图片描述
  2. 选择TFLClassify/build.gradle生成整个项目。项目包含两个module:finish 和 start,finish模块是已经完成的项目,start则是本项目实践的模块。
  3. 第一次编译项目时,弹出“Gradle Sync”,将下载相应的gradle wrapper 。
    在这里插入图片描述
  4. 手机通过USB接口连接开发平台,并设置手机开发者选项允许调试。
  5. 选择真实物理机(而不是模拟器)运行start模块
    在这里插入图片描述
  6. 允许应用获取手机摄像头的权限,得到下述效果图,界面利用随机数表示虚拟的识别结果。

向应用中添加TensorFlow Lite

  1. 选择"start"模块
    在这里插入图片描述
  2. 右键“start”模块,或者选择File,然后New>Other>TensorFlow Lite Model
    在这里插入图片描述
  3. 选择已经下载的自定义的训练模型。本教程模型训练任务以后完成,这里选择finish模块中ml文件下的FlowerModel.tflite。
    在这里插入图片描述
    点击“Finish”完成模型导入,系统将自动下载模型的依赖包并将依赖项添加至模块的build.gradle文件。
  4. 最终TensorFlow Lite模型被成功导入,并生成摘要信息
    在这里插入图片描述

检查代码中的TODO项

本项目初始代码中包括了若干的TODO项,以导航项目中未完成之处。为了方便起见,首先查看TODO列表视图,View>Tool Windows>TODO
在这里插入图片描述
默认情况下了列出项目所有的TODO项,进一步按照模块分组(Group By)在这里插入图片描述

添加代码重新运行APP

  1. 定位“start”模块MainActivity.kt文件的TODO 1,添加初始化训练模型的代码
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx)

  ...
}
  1. 在CameraX的analyze方法内部,需要将摄像头的输入ImageProxy转化为Bitmap对象,并进一步转化为TensorImage 对象
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}
  1. 对图像进行处理并生成结果,主要包含下述操作:
  • 按照属性score对识别结果按照概率从高到低排序
  • 列出最高k种可能的结果,k的结果由常量MAX_RESULT_DISPLAY定义
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 3: Process the image using the trained model, sort and pick out the top results
  val outputs = flowerModel.process(tfImage)
      .probabilityAsCategoryList.apply {
          sortByDescending { it.score } // Sort with highest confidence first
      }.take(MAX_RESULT_DISPLAY) // take the top results

  ...
}
  1. 将识别的结果加入数据对象Recognition 中,包含labelscore两个元素。后续将用于RecyclerView的数据显示
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 4: Converting the top probability items into a list of recognitions
  for (output in outputs) {
      items.add(Recognition(output.label, output.score))
  }
  ...
}
  1. 将原先用于虚拟显示识别结果的代码注释掉或者删除
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
    items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
  1. 以物理设备重新运行start模块
  2. 最终运行效果
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于TensorFlow Lite实现的Android花卉识别应用 的相关文章

随机推荐

  • Window的Java环境安装

    一 Window的Java环境安装 1 下载百度网盘的Java环境jdk 8u131 windows x64 exe 2 点击jdk 8u131 windows x64 exe 下一步 3 更改Java你想安装位置 点击下一步 4 Java
  • MATLAB反三角函数arcsecx, arccscx, arctanx, arccotx, arcsinx, arccosx绘图表示

    matlab源代码 依次为 arcsecx arccscx arctanx arccotx arcsinx arccosx figure 1 x 0 0 01 pi y sec x plot y x title arcsecx set gc
  • (一)调试RocketMq源码

    文章目录 一 启动NameServer 1 1namesrv模块找到NamesrvStartup java 1 2修改配置文件目录 1 3启动NamesrvStartup java 二 配置Broker 2 1配置BrokerStartup
  • Ubuntu Linux中hostname`命令

    当然 让我们将关于在Ubuntu Linux中理解hostname的知识转化为列表形式 参考 https www howtouseubuntu com network change hostname in ubuntu linux 定义 h
  • 第四章 Linux实用操作

    1 软件安装 1 1 CentOS 1 2 Ubuntu 2 systemctl控制软件启动关闭 mp4 3 软链接 4 日期和时区 4 1 date命令 4 2 ntp程序 4 3 小结 5 IP地址和主机名 6 配置Linux固定IP地
  • 【干货】PCB线宽与电流关系

    以下总结了八种电流与线宽的关系公式 表和计算公式 虽然各不相同 大体相近 但大家可以在实际的PCB板设计中 综合考虑PCB板的大小 通过电流 选择一个合适的线宽 PCB电流与线宽 PCB载流能力的计算一直缺乏权威的技术方法 公式 经验丰富C
  • MoCo v1 论文笔记

    Momentum Contrast for Unsupervised Visual Representation Learning 论文笔记 DETR 论文笔记 Momentum Contrast for Unsupervised Visu
  • 三因素方差分析_【科研加油站】SPSS操作之三因素方差分析

    点击上方蓝字 轻松关注我们 以下内容转载自 医咖会 微信公众号 medieco ykh 作者Jane 上一期我们讨论了双因素方差分析 本期 科研加油站 栏目 我们一起来探讨三因素方差分析 问题与数据 某研究者想研究某类新药降低胆固醇水平的效
  • CData API Server全面且文档完整的API

    CData API Server全面且文档完整的API 使用现有业务信息创建API 连接到任何SQL以及NoSQL数据库以及API服务器 都会立即生成灵活 全面且文档完整的API 发现数据集成的潜力 API服务器API服务器提供了在企业AP
  • register的用法c语言,C语言中auto,static,register,extern存储类型的用法

    在C语言中提供的存储类型说明符有auto extern static register 说明的四种存储类别 四种存储类别说明符有两种存储期 自动存储期和静态存储期 其中auto和register对应自动存储期 具有自动存储期的变量在进入声明
  • Unity脚本API—Transform 变换

    场景中的每一个对象都有一个Transform 用于储存并操控物体的位置 旋转和缩放 每一个Transform可以有一个父级 允许你分层次应用位置 旋转和缩放 可以在Hierarchy面板查看层次关系 他们也支持计数器 enumerator
  • AGV调度系统/两阶段算法模拟源代码 地图建模

    多 AGV调度系统 两阶段算法模拟源代码 地图建模c openTCS1 AGV调度系统源码 OpenTCS OpenTCS是一个开源的AGV调度系统程序 能给初入AGV行业的人士一些帮助 该实例是包含源码的程序 可成功运行 2 openTC
  • UE4 蓝图数组反转节点ReverseforEachLoop的坑

    由于蓝图没有直接反转数组的节点类似于C 的reverse 所以只好用ReverseforEachLoop这个节点 但是这个节点有个坑 就是ArrayIndex是从数组末尾元素下标开始输出 并非是从0开始 因此如果要用到ArrayIndex得
  • 记录一次JVM发生OOM问题的解决,包括jvisualvm工具的使用,以及对GC的理解等

    目录 OOM原因分析 解决 利用hprof文件分析的步骤 结合jvisualvm工具 jvisualvm实时监控本地jvm jvisualvm实时监控远程jvm 对于JVM的GC理解 Minor GC Full GC 常用JVM参数配置 查
  • WIN32 资源

    首先解释一下句柄 win32中的句柄在数值上表示一个32位的数 用来标识应用程序 进程中不同对象以及同类对象中的不同实例 而所谓实例就是指被实例化的对象 实例化的过程就是通过类创建对象的过程 实例化对象的目地是为对象开辟内存空间 所以句柄是
  • Java - 常用类 - BigInteger 和 BigDecimal

    文章目录 BigInteger 和 BigDecimal 介绍 应用场景 BigInteger 和 BigDecimal 介绍 应用场景 BigInteger适合保存比较大的整型 BigDecimal适合保存精度更高的浮点型 小数 pack
  • 智能人机交互

    前言 随着移动机器人越来越多地走向实 际应用 需要提高机器人与人类之 间的协同水平 实现机器人与人类的共融 一 人机交互的三个级别 二 火星车的遥操作控制 火星车的遥操作控制 超大时延 地面团队将命令序列发至火 星车 如要求火星车往前行驶1
  • C# 进度条使用

    前言 介绍C 自带的Progressbar控件的调用方法 对程序运行的进度进行提示 内容 接下来 介绍进度条在Winform界面中具体的应用和步骤 在项目中新建一个Winform界面 上面放一个ProgressBar和label控件 默认命
  • SourceInsight4.0.0124中文版-黑色背景主题

    此背景目前只在SI 4 0 0124中文版试过 此黑色主题是自己改的 亲测可用 只适用于4 0 0124中文版 4 0 0124中文版 4 0 0124中文版 其他中文版的没试过 此主题不适用英文版 也没必要用在英文版 因为英文版本身已自带
  • 基于TensorFlow Lite实现的Android花卉识别应用

    介绍 本教程将在Android设备上使用TensorFlow Lite运行图像识别模型 具体包括 使用TensorFlow Lite Model Maker训练自定义的图像分类器 利用Android Studio导入训练后的模型 并结合Ca