基于TensorFlow Lite实现的Android花卉识别应用
介绍
本教程将在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包,并解压缩到工作目录。
运行初始代码
- 打开Android Studio,选择“Open an Existing Project”
- 选择TFLClassify/build.gradle生成整个项目。项目包含两个module:finish 和 start,finish模块是已经完成的项目,start则是本项目实践的模块。
- 第一次编译项目时,弹出“Gradle Sync”,将下载相应的gradle wrapper 。
- 手机通过USB接口连接开发平台,并设置手机开发者选项允许调试。
- 选择真实物理机(而不是模拟器)运行start模块
- 允许应用获取手机摄像头的权限,得到下述效果图,界面利用随机数表示虚拟的识别结果。
向应用中添加TensorFlow Lite
- 选择"start"模块
- 右键“start”模块,或者选择File,然后New>Other>TensorFlow Lite Model
- 选择已经下载的自定义的训练模型。本教程模型训练任务以后完成,这里选择finish模块中ml文件下的FlowerModel.tflite。
点击“Finish”完成模型导入,系统将自动下载模型的依赖包并将依赖项添加至模块的build.gradle文件。 - 最终TensorFlow Lite模型被成功导入,并生成摘要信息
检查代码中的TODO项
本项目初始代码中包括了若干的TODO项,以导航项目中未完成之处。为了方便起见,首先查看TODO列表视图,View>Tool Windows>TODO
默认情况下了列出项目所有的TODO项,进一步按照模块分组(Group By)
添加代码重新运行APP
- 定位“start”模块MainActivity.kt文件的TODO 1,添加初始化训练模型的代码
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :ImageAnalysis.Analyzer {...// TODO 1: Add class variable TensorFlow Lite Modelprivate val flowerModel = FlowerModel.newInstance(ctx)...
}
- 在CameraX的analyze方法内部,需要将摄像头的输入
ImageProxy
转化为Bitmap
对象,并进一步转化为TensorImage
对象
override fun analyze(imageProxy: ImageProxy) {...// TODO 2: Convert Image to Bitmap then to TensorImageval tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))...
}
- 对图像进行处理并生成结果,主要包含下述操作:
- 按照属性
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 resultsval outputs = flowerModel.process(tfImage).probabilityAsCategoryList.apply {sortByDescending { it.score } // Sort with highest confidence first}.take(MAX_RESULT_DISPLAY) // take the top results...
}
- 将识别的结果加入数据对象
Recognition
中,包含label
和score
两个元素。后续将用于RecyclerView
的数据显示
override fun analyze(imageProxy: ImageProxy) {...// TODO 4: Converting the top probability items into a list of recognitionsfor (output in outputs) {items.add(Recognition(output.label, output.score))}...
}
- 将原先用于虚拟显示识别结果的代码注释掉或者删除
// 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.
- 以物理设备重新运行start模块
- 最终运行效果
基于TensorFlow Lite实现的Android花卉识别应用相关推荐
- 基于TensorFlow实现的CNN神经网络 花卉识别系统Demo
基于TensorFlow实现的CNN神经网络 花卉识别系统Demo Demo展示 登录与注册 主页面 模型训练 识别 神经网络 训练 Demo下载 Demo展示 登录与注册 主页面 模型训练 识别 神 ...
- 毕业设计 - 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉
文章目录 0 前言 1 项目背景 2 花卉识别的基本原理 3 算法实现 3.1 预处理 3.2 特征提取和选择 3.3 分类器设计和决策 3.4 卷积神经网络基本原理 4 算法实现 4.1 花卉图像数 ...
- 基于TensorFlow的CNN卷积网络模型花卉分类GUI版(2)
一.项目描述 10类花的图片1100张,按{牡丹,月季,百合,菊花,荷花,紫荆花,梅花,-}标注,其中1000张作为训练样本,100张作为测试样本,设计一个CNN卷积神经网络花卉分类器进行花卉的分类, ...
- TF之LiR:基于tensorflow实现手写数字图片识别准确率
TF之LiR:基于tensorflow实现手写数字图片识别准确率 目录 输出结果 代码设计 输出结果 Extracting MNIST_data\train-images-idx3-ubyte.gz ...
- 基于TensorFlow Lite的人声识别在端上的实现
通过TensorFlow Lite,移动终端.IoT设备可以在端上实现声音识别,这可以应用在安防.医疗监护等领域.来自阿里巴巴闲鱼技术互动组仝辉和上叶通过TensorFlow Lite实现了一套完整的 ...
- 面向Android的开发基于Tensorflow Lite框架深度学习的应用(一)
Android配置tensorflow lite 按照官方网站的指导在项目的模块的构建文件build.gradle中配置中增加如下配置: implementation 'org.tensorflow: ...
- 使用Tensorflow Lite创建一个Android AI应用
目录 下一步 在这里,我们使用TensorFlow Lite解释器检查图像并产生其输出. 这是将神经网络与Android上的TensorFlow Lite结合使用的系列文章中的第三篇.在本系列的第2部 ...
- 基于TensorFlow的CNN卷积网络模型花卉分类(1)
一.项目描述 使用TensorFlow进行卷积神经网络实现花卉分类的项目,加载十种花分类,建立模型后进行预测分类图片 环境:win10 +TensorFlow gpu 1.12.0+pycharm 训 ...
- mnist手写数字识别python_基于tensorflow的MNIST手写数字识别(二)--入门篇
一.本文的意义 因为谷歌官方其实已经写了MNIST入门和深入两篇教程了,那我写这些文章又是为什么呢,只是抄袭?那倒并不是,更准确的说应该是笔记吧,然后用更通俗的语言来解释,并且补充更多,官方文章中没有 ...
最新文章
- Xamarin XAML语言教程构建ControlTemplate控件模板 (三)
- pyhton3 适配器模式编写
- 项目管理的五个核心风险区
- JavaScript 进阶(二)变量作用域
- linux加密框架 crypto 算法管理 - 算法查找接口 crypto_alg_lookup函数
- linux core 永久生效,【调试】Core Dump是什么?Linux下如何正确永久开启?
- 解读革命性容器集群CCE Turbo:计算、网络、调度全方位加速
- 计算机软件服务板块,信息技术板块
- 小程序文本框为空自动填写_微信免费转码机器人!小程序自动转码!
- Python——匿名函数lambda
- 博士应该采取什么策略读文献?
- Write a program that gives count of common characters presented in an array of strings..(or array of
- 传感器连接mysql_获取传感器数据并传入数据库-HTTP/POST/ASP.NET
- Hadoop HA集群部署 - A - 详解
- Flink(1.12版本)
- c++实现二分查找法和求平方根
- bing搜索抓取错误警报列表
- [ 多智能体网络中的图论方法汉化 ] (一)前言第一章
- 1658_MIT 6.828 JOS memmap以及一些存储划分定义的解读-第二部分
- 论文阅读:EfficientDet: Scalable and Efficient Object Detection