网站首页 > 教程分享 正文
本文由公众号:《Android每日一讲》授权发布。
AI其中一个很重要的应用就是物体识别。
今天我们来看看如何在Android上实现这个功能。
物体识别
物体识别包括两个方面,一个是物体位置识别,划出图片中的物体在什么位置。另一个是物体识别,告诉你这是个什么物体,是人是狗,是桌子还是鸟。
SSD
目前最优秀的物体识别神经网络能够识别1900多种物体。我们把这个网络落地到Android上看看它的效果怎样。
Android导入AI框架
要在Android上使用AI网络,首先需要集成能够解读AI网络的框架。
Google的Tensorflow在Android上做了专门的框架 - Tensorflow-Lite,它能够在移动端上高性能地运算AI模型。
首先需要在app的build.gradle里引入它
dependencies { implementation 'org.tensorflow:tensorflow-lite:1.10.0' }
在Android使用tensorflow我们可以只关注它的 Interpreter 类,
这个类负责加载 AI模型,同时将图片进行运算,输出预算结果。
AI 的输入和输出
拿物体识别模型来说,这个模型能识别1000多种物体,那么它对一张图片的分析结果也会有1000多个输出对不对?
我们先简单地理解这个过程。假设这个模型能识别2种物体,分别是猫和狗,忽略物体的位置的话,那么它的输出结果应该是啥?
仔细想一下,它应该有下面三个输出
- background, background_posibillty
- cat, cat_posibillity
- dog, dog_posibility
翻译一下,这三个输出分别对应
- 没有猫狗的概率
- 有猫的概率,猫的位置
- 有狗的概率,狗的位置
于是我们可以构造下面的输出数据结构
float[][] labelProbArray = new float[3][1]
三个维度分别表示三种物体的概率。
注意这里没有猫狗也必须当做一种情况,不然要是图片里没有猫狗的话它就只能在猫狗里挑一个,就乱套了。
至于输入就简单了,把Camera得到的bitmap当作输入就行。
下面看看怎么使用tensorflow的Interpreter。
开始分析图片
首先需要把AI网络塞进 Interpreter。
物体识别网络通常有两个模型来构成,一个是网络,另一个是标签。
网络是用来分析图片并输出结果的,
标签是用来描述网络能识别什么内容。因为正常来说,网络只能输出一个一维数组表示每个标签的概率,它并不会输出用文字描述的物体…
细想一下要是真这样的话那就恐怖了…
在我们的app中需要先把这两个东西放进去,下面这两个就是网络和标签了
assets
lite是网络模型,txt是标签。
初始化 Interpreter 的过程比较简单,代码如下
Interpreter tflite = new Interpreter(loadModelFile(activity)); /** Memory-map the model file in Assets. */ private MappedByteBuffer loadModelFile(Activity activity) throws IOException { AssetFileDescriptor fileDescriptor = activity.getAssets().openFd(MODEL_PATH); FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor()); FileChannel fileChannel = inputStream.getChannel(); long startOffset = fileDescriptor.getStartOffset(); long declaredLength = fileDescriptor.getDeclaredLength(); return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength); }
分析的过程也相当简单,两行代码
tflite.run(imgData, labelProbArray);
在分析结束后,labelProbArray 就保存了对图片的分析后各个可能存在的物体的概率。
源码下载
上面的内容比较零散,我这里整理了一个可以使用的app提供下载。
需要源码的小伙伴可以在公号(《Android每日一讲》)回复”物体识别“来获取源码回去研究。
下面是AI app的截图。
phone
猜你喜欢
- 2024-10-28 Android开发基础入门(一):UI与基础控件
- 2024-10-28 Android开发新手入门(帧布局FrameLayout)
- 2024-10-28 安卓零基础培训入门课程学习(安卓基础知识快速入门)
- 2024-10-28 Android零基础入门|滚动视图ScrollView
- 2024-10-28 Android系列之Activity入门介绍(activity an)
- 2024-10-28 安卓系统引领下一代制造业,四个步骤快速入门工业4.0
- 2024-10-28 Android实战004:Hello World入门实例体验
- 2024-10-28 Android程序员 如何入门iOS ——故事从这里开始
- 2024-10-28 Android开发新手入门(相对布局RelativeLayout)
- 2024-10-28 重磅首发!腾讯前晚最新爆出的"Android Studio零基础入门教材"
你 发表评论:
欢迎- 最近发表
-
- 有了这份900多页的Android面试指南,你离大厂Offer还远吗?
- K2 Blackpearl 流程平台总体功能介绍:常规流程功能
- 零基础安卓开发起步(一)(安卓开发入门视频)
- 教程:让你的安卓像Windows一样实现程序窗口化运行
- Android事件总线还能怎么玩?(事件总线有什么好处)
- Android 面试被问“谈谈架构”,到底要怎样回答才好?
- Android开发工具Parcel和Serialize
- Android 中Notification的运用(notification widget安卓)
- Android退出所有Activity最优雅的方式
- MT管理器-简单实战-去除启动页(mt管理器怎么去除软件弹窗)
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)