Android Things 专题6 完整的栗子:运用TensorFlow解析图像

文| 谷歌开发技术专家 (GDE) 王玉成 (York Wang)

前面絮叨了这么多,好像还没有一个总体的概念,我们如何写一个完整的代码呢?

现在深度学习很火,那我们就在Android Things中,利用摄像头抓拍图片,让 TensorFlow 去识别图像,最后用扬声器告诉我们结果。

是不是很酷?说基本的功能就说了这么长一串,那垒代码得垒多久啊?

项目结构

我们就从 Android Studio 的环始境开始说起吧。

启动 Android Studio 之后,务必把 SDK Tools 的版本升级到 24 及以上。然后再把 SDK 升级到 Android 7.0 及以上。让 Android Studio 自己完成相关组件的更新,导入项目,项目的结构如下:

代码中的 imageclassifier 是用于跟 TensorFlow 做交互的,还有摄头,图片处理的相关 handler。

我们再来看看外部的引用库:

包括了 Android Things 和 TensorFlow 的相关库,当然,Android 的 API 的版本是24。gradle 的依赖和 Manifest 中的 filer 是和之前搭建开发环境的讲解一致的。

引用的 TensorFlow 的库是 aar 打包的 Tensorflow-Android-Inference-alpha-debug.aar,这就意味着,我们不需要 NDK 环境就能够编译整个项目了。

主要是留意 dependencies 这一项,包括了 TensorFlow 的库和 Android thing 的库:

再申请了摄头相关的权限。补充一下,Android Things 是不支持动态权限的申请的。

硬件连接

接下来便是硬件如何连接了。

硬件清单如下:

Android Things 兼容的开发板,比如 Raspberry Pi 3

Android Things 兼容的摄像头,比如 Raspberry Pi 3 摄头模块

元器件:

1 个按钮,见面包板

2 个电阻,这块儿必须要说明一下:由于图片是接的 5V 的电压,一般来说 GPIO 和 led 的承压能力是 3V,有些 GPIO 是兼容 5V 的,所以中间需要串联 100~200 欧的电阻。当然,为了保险,建议用 3.3V 的电压。

1 个LED灯

1 个面包板

杜邦线若干

可选:扬声器或者耳机

可选:HDMI输出

连完了硬件,我们这时候就要理解操作流程了。

操作流程

按照前面讲解的内容,用 Andorid Studio,连接 ADB,配置好开发板的 Wi-Fi,然后把应用加载到开发板上。

操作流程如下:

重启设备,运行程序,直到 LED 灯开始闪烁;

把镜头对准猫啊,狗啊,或者一些家具;

按下开关,开始拍摄图片;

在 Raspberry Pi 3 中,一般在 1s 之内,可以完成图片抓拍,经 Tensorflow 处理,然后再通过 TTS 放出声音。在运行的过程中 LED 灯是熄灭的;

Logcat 中会打印出最终的结果,如果是有显示设备连接的话,图片和结果都会显示出来;

如果有扬声器或者是耳机的话,会把结果语音播报出来。

由于代码的结构特别简单,注意一下几段关健的操作即可。想必图形、摄头的操作在Android 的编程中大家都会了,所以不做讲解了。

代码流程

主要是看 LED 的初始化操作:

有必要说一下,ImageClassifierActivity.java 是应用唯一的 Activity 的入口。在 Manifest 中已经有定义,它初始化了 LED, Camera, TensorfFlow 等组件。其中,我们用到的 Button 是 BCM32 这个管脚,用到的 LED 是 BCM6 管脚,相关的初始化在这个 Activity 中已经完成。

这部分代码是捕捉按键按下的代码。当按下按键时,摄头开始捕捉数据。

把摄像头拍摄的数据转成 Bitmap 文件之后,我们会调用 TensorFlow 来处理图像。

这个函数调用了 TensorFlow 进行处理,最后把结果输出到 logcat 中。如果代码中调用了 tts 引擎,那么则把结果转成语音读出来。看来,最重要的就是 TensorFlowClassifie 类的 recognizeImage() 这个接口了。我们继续往下看。

这是最后的一步,调用 TensorFlow 进行图像识别:

把 RGB 图像转成 TensorFlow 能够识别的数据;

把数据拷到 TensorFlow 中;

识别出图像,给出结果。

调用 TensorFlow 的过程还是挺好玩的,也挺方便。那么,为啥 TensorFlow 一下子就能够识别出是什么图片呢?Tensorflow 的官网给出的解答:

www.tensorflow.org/tutorials/image_recognition

有一点需要提示,TensorFlow 的图像识别分类可以用网络提交到服务器识别,也可以离线的数据识别。可以先把 200M 左右的识别数据放在本地,然后提交后识别。现在大概能分出 1000 个类别的图像,哪 1000 个类别呢?项目代码中已经包含了哦。

是不是运用 TensorFlow 来处理物联网的数据会特别简单,不光是 TensorFlow, Firebase 也可以用到 Android Things 中来。这功能,强大的没话说了!

今天提到的这个项目,来源于 Google 在 GitHub 上维护的项目,项目的地址是

github.com/androidthings/sample-tensorflow-imageclassifier

当然,GitHub 上还有很多 Android Things 的代码可以参考。

是不是迫不急待的自己写一个应用呢?实际上,这个项目稍加改动便能有新的玩法。例如加上一个红外感应器,一旦有生物在附近就马上拍图片,并且识别。

大开你的脑洞吧

后记

这一篇文章是这个专题的最后一篇了。写完整个专题,发现 Android Things 带给开发者太多太多的便利,如何烧写文件?如何运用 SDK?甚至如何用 Google 的其它服务做物联网相关的数据处理?都有太多太多的现成的方案供我们选择,感叹使用 Android Things 进行物联网应用开发实在太方便了!

您如果有任何涉及到 Android Things 方面的想法,都欢迎大家在下方留言,我们会把好的建议转交给 Android Things 的产品部门。也许在某一天,你的建议就是 Andorid Things 的一部分。

时间: 2024-10-29 10:46:56

Android Things 专题6 完整的栗子:运用TensorFlow解析图像的相关文章

Android清理设备内存详细完整示例(一)

MainActivity如下: package come.on; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; i

Android清理设备内存详细完整示例(二)

MainActivity如下: package cc.c; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.List; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo;

Android Graphics专题(1)--- Canvas基础

作为Android Graphics专题的开篇,毫无疑问,我们将讨论Android UI技术的核心概念--Canvas. Canvas是Android UI框架的基础,在Android的控件体系中,所有容器类.控件类在实现上都依赖于Canvas,界面的绘制实质上都是Canvas绘制的.本文将讨论Canvs的由来,并通过实例展示Canvas的基础用法. 对于应用开发而言,我们可以不去深究Canvas与Android 控件体系的实现细节,但明白Canvas与控件的关联有助于我们更好的使用Canvas

Android手游斗地主完整源码

Android手游斗地主完整源码 Android手游斗地主完整源码(支持单机和网络对战) 下载地址:http://www.devstore.cn/code/info/943.html 运行截图:

android开发新浪微博客户端 完整攻略 [新手必读]

开始接触学习android已经有3个礼拜了,一直都是对着android的sdk文档写Tutorials从Hello World到Notepad Tutorial算是初步入门了吧,刚好最近对微博感兴趣就打算开发个android版本的新浪微博客户端作为练手项目,并且以随笔的方式详细的记录开发的全过程.本人对java语言以及eclipse Ide都是初次应用基本上属于边学边用,做移动设备上的东西也是第一次,总的来说属于无基础.无经验.无天赋的纯三无人员,还请广大同学们多多给予指点. 开发第一件事情,那

Android JNI专题交流

<Android JNI 专题>共分为四期: Jni简单demo Jni基本数据类型和方法介绍 Jni解析java自定义数据类型和回调java方法 Jni performance提高和Exception规避 已经整理成CHM和PDF文档,欢迎大家下载参阅: CHM:http://download.csdn.net/detail/cofftech/7657291 PDF:http://download.csdn.net/detail/cofftech/7657309

Android清理设备内存详细完整示例

MainActivity如下: package cc.c; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.List; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo;

Android中的Apk的加固(加壳)原理解析和实现

Android中的Apk的加固(加壳)原理解析和实现 标签: android 2015-09-13 13:58 42287人阅读 评论(49) 收藏 举报 本文章已收录于:  Android知识库  分类: Android(140)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个

Android系列之网络(四)----SAX方式解析XML数据

?[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 联系方式:[email protected] [系列]Android系列之网络:(持续更新) Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据) Android系列之网络(二)----HTTP请求头与响应头 Androi