在安卓上运行TensorFlow:让深度学习进入移动端

如果你关注我的前一篇帖子,并按照其中的内容实践,你可能已经学会了如何在Linux上安装一个GPU加速的TensorFlow,并构建了你自己的图像分类器。老实讲,在笔记本上对图片进行分类是很花时间的:需要下载分类用的图片,并在终端里输入很多行命令来运行分类。

不过,尽管没有很多的公开资料,好消息是你也可以在有摄像头的手机上运行TensofrFlow的Inception分类器,甚至是你自定义的分类器。然后你只要把摄像头对准你希望做分类的东西,TensorFlow就会告诉你它认为这是什么东西。TensorFlow是可以在iOS和树莓派上面运行,不过在这个教程里,我会介绍如何在安卓设备上运行TensorFlow。

我会一步一步地介绍如何在安卓设备上运行定制化的图片分类器。实现这个功能需要很多步骤,而且其他地方没有这样的介绍,只能通过反复地查看TensorFlow的GitHub论坛。我希望这篇帖子能帮你避免很多的麻烦。

◆ ◆ ◆

下载安卓的SDK和NDK

你可以在系统终端里用下面的命令下载安卓SDK并解压缩到你的TensorFlow目录里。

$ wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz

$ tar xvzf android-sdk_r24.4.1-linux.tgz -C ~/tensorflow

还需要下载一些额外的SDK编译工具。我在开始为安卓5.1.1版下载开始后关掉了这个终端

$ cd ~/tensorflow/android-sdk-linux

$ tools/android update sdk –no-ui

随后你需要用下面的命令下载安卓NDK,并解压:

$ wget https://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip

$ unzip android-ndk-r12b-linux-x86_64.zip -d ~/tensorflow

◆ ◆ ◆

下载Inception

$ cd ~/tensorflow

$ wget https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip -O /tmp/inception5h.zip

$ unzip /tmp/inception5h.zip -d tensorflow/examples/android/assets/

◆ ◆ ◆

修改WORKSPACE文件

为了使用安卓工具编译我们的应用,需要修改WORKSPACE文件。

$ gedit ~/tensorflow/WORKSPACE

你可以拷贝下面的代码,并替换掉你的WORKSPACE文件里的相应行。

android_sdk_repository(

name = “androidsdk”,

api_level = 24,

build_tools_version = “24.0.3”,

path = “android-sdk-linux”)

android_ndk_repository(

name=”androidndk”,

path=”android-ndk-r12b”,

api_level=21)

◆ ◆ ◆

开启USB调试和adb工具

为了能用adb工具,你必须把你的手机设置成开发模式,并开启USB调试功能。在开启前,确认你的手机没有通过USB和电脑连接,然后进行如下操作:

  • 进入“设置”-“通用”-“我的手机”
  • 进入“软件信息”并连续按“版本号”7次
  • 这样就开启了一个计数器,并会告诉你什么时候你的手机已经进入了开发模式
  • 进入“设置”-“通用”-“开发选项”
  • 开启USB调试

每一个安卓手机都是不同的,我的安卓版LG G4手机就必须在PTP模式下才能使用adb。你需要在设置后通过把手机连到电脑上来确认调试模式已经开启。当连接后手机上出现“允许USB调试”,确保你选择的是“总是允许从这个电脑”,并按下OK。

为了测试调试设置是否成功,可以把手机连上电脑,并用下面的命令安装adb,并测试设备:


$ sudo apt-get install android-tools-adb

$ adb devices

你应该能看到类似于下面的响应内容:


◆ ◆ ◆

编译APK

$ cd ~/tensorflow

$ bazel build //tensorflow/examples/android:tensorflow_demo

◆ ◆ ◆

安装APK

这一步是唯一的我无法客观测试的步骤。每个安卓设备都不一样。如果你在这一步中碰到什么问题,我建议你升级安卓到6.0版。对于我朋友的Moto G手机,就必须把下面的命令里面的–g选项去掉:

$ adb install -r -g bazel-bin/tensorflow/examples/android/tensorflow_demo.apk

至此,你就可以在安卓设备上使用TensorFlow和Inception分类器了。我发现最有趣的是这个分类器偶尔出错的时候。需要注意的是,原版的Inception分类器只能识别ImageNet挑战里出现的1000种图片分类。

◆ ◆ ◆

使用定制化的图片分类器

为了能对我们自己的图片来做分类,我们必须先用我们移动设备的图片文件数据重新训练,并把训练结果放入assets目录

首先我们要编译图片训练优化器:

$ cd ~/tensorflow

$ bazel build tensorflow/python/tools:optimize_for_inference

然后再用这个训练优化器对我们自己的图片数据做训练:

$ bazel-bin/tensorflow/python/tools/optimize_for_inference \

–input=tf_files/retrained_graph.pb \

–output=tensorflow/examples/android/assets/retrained_graph.pb

–input_names=Mul \

–output_names=final_result

◆ ◆ ◆

把训练后的标签放入assets目录

$ cp ~/tensorflow/tf_files/retrained_labels.txt ~/tensorflow/tensorflow/examples/android/assets/

◆ ◆ ◆

编辑TensorflowImageListener.java

$ gedit ~/tensorflow/tensorflow/examples/android/src/org/tensorflow/demo/TensorFlowImageListener.java

我们需要编辑这个文件以能识别我们自己的图片:替换下面这些行的参数所对应的变量值并保存(如果你想回退到原有的文件内容,你可以在这里找到备份文件):

private static final int INPUT_SIZE = 299;

private static final int IMAGE_MEAN = 128;

private static final float IMAGE_STD = 128;

private static final String INPUT_NAME = “Mul:0”;

private static final String OUTPUT_NAME = “final_result:0”;

private static final String MODEL_FILE = “file:///android_asset/retrained_graph.pb”;

private static final String LABEL_FILE = “file:///android_asset/retrained_labels.txt”;

◆ ◆ ◆

重新编译APK

$ cd ~/tensorflow

$ bazel build //tensorflow/examples/android:tensorflow_demo

◆ ◆ ◆

重新安装APL

$ adb install -r -g bazel-bin/tensorflow/examples/android/tensorflow_demo.apk

好的,到这时候我们就可以在安卓设备上使用定制化的分类器了!研究人员和爱好者可以利用这个技术来想出更多的点子并付诸实验。例如我想到的一个点子:就是让分类器能学会通过识别不健康的叶子来发现营养不良或者有植物病的植物。如果你想了解如何进一步压缩图片文件,以及在iPhone上做同样的事,你可以关注这里的Pete Warden的教程

原文发布时间为:2016-11-12

时间: 2024-11-08 19:05:57

在安卓上运行TensorFlow:让深度学习进入移动端的相关文章

如何通过TensorFlow实现深度学习算法并运用到企业实践中

本文根据才云科技首席大数据科学家郑泽宇在QCon2016全球软件开发大会(上海站)上的演讲整理而成,希望大家可以了解如何通过TensorFlow实现深度学习算法,并将深度学习运用到企业实践中. 讲师介绍 郑泽宇,谷歌高级工程师.从 2013 年加入谷歌至今,郑泽宇作为主要技术人员参与并领导了多个大数据项目,拥有丰富机器学习.数据挖掘工业界及科研项目经验.2014 年,他提出产品聚类项目用于衔接谷歌购物和谷歌知识图谱(Knowledge Graph)数据,使得知识卡片形式的广告逐步取代传统的产品列

机器学习:如何在安卓上集成TensorFlow

我们都知道,谷歌有一个开源库叫做TensorFlow,可被用在安卓系统中实现机器学习.换言之,TensorFlow是谷歌为机器智能提供的一个开源软件库. 我在网络上搜寻了很久,都没有找到在安卓上搭建TensorFlow的简单的方法或实例.仔细查阅许多资料以后,我终于可以搭建它了.于是,我决定把我搭建的过程写出来,这样其他人就不必再浪费时间了. 这篇文章是写给那些熟悉机器学习并且知道怎样为机器学习搭建模型的人的(在这个示例中我会使用一个预训练模型).近期,我会写一系列关于机器学习的文章,这样每个人

独家 | 教你在R中使用Keras和TensorFlow构建深度学习模型

引言: 在R和Python之间如何进行选择一直是一个热议的话题.机器学习世界也被不同语言偏好所划分.但是随着深度学习的盛行,天平逐渐向Python倾斜,因为截至目前为止Python具有大量R所没有的深度学习的资源库和框架. 我个人从R转到Python是因为我想更加深入机器学习的领域,而仅仅使用R的话,这(在之前)是几乎不可能实现的事情.不过也仅此而已! 随着Keras在R中的实现,语言选择的斗争又重新回到舞台中央.Python几乎已经慢慢变成深度学习建模的默认语言,但是随着在R中以TensorF

用 Apache Spark 和 TensorFlow 进行深度学习

神经网络在过去几年中取得了惊人的进步,现在已成为图像识别和自动翻译领域最先进的技术.TensorFlow是 Google 为数字计算和神经网络发布的新框架.在这篇博文中,我们将演示如何使用 TensorFlow 和 Spark 一起来训练和应用深度学习模型. 你可能会想:当大多数高性能深度学习实现只是单节点时,Apache Spark 在这里使用什么?为了回答这个问题,我们将通过两个用例来解释如何使用 Spark 和 TensorFlow 的集群机器来改进深度学习流程: 超参数调整:使用 Spa

用不到1000美元攒一台深度学习用的超快的电脑:继续深度学习和便宜硬件的探奇!

是的,你可以在一个39美元的树莓派板子上运行TensorFlow,你也可以在用一个装配了GPU的亚马逊EC2的节点上跑TensorFlow,价格是每小时1美元.是的,这些选择可能比你自己攒一台机器要更现实一点.但是如果你和我是一样的人,你绝对想自己攒一台奇快无比的深度学习的电脑. 好吧,一千块钱对于一个DIY项目来说是太多了.但是一旦你把机器搞定,你就能构建数百个深度学习的应用啦,从拥有增强大脑的机器人到艺术创作(至少这是我为花这些钱找的理由).最差的理由也是,这个机器至少能轻松打败那个2800

打造深度学习的云端实验室

本系列将利用阿里云容器服务的机器学习解决方案,帮助您了解和掌握TensorFlow,MXNet等深度学习库,开启您的深度学习之旅. 第一篇: 打造深度学习的云端实验室 第二篇: GPU资源的监控和报警,支撑高效深度学习的利器 第三篇: 利用TFRecord和HDFS准备TensorFlow训练数据 我们工作中常常会问到:"深度学习从哪里学起?" 在读过了大量的文章,看过了无数的教程后,许多朋友依然表示很无感.这其实很正常,因为纸上得来终觉浅么,绝知此事要躬行.为了帮助大家快速上手这一个

深度学习框架TensorFlow在Kubernetes上的实践

什么是深度学习? 深度学习这个名词听了很多次,它到底是什么东西,它背后的技术其实起源于神经网络.神经网络最早受到人类大脑工作原理的启发,我们知道人的大脑是很复杂的结构,它可以被分为很多区域,比如听觉中心.视觉中心,我在读研究中心的时候,做视频有计算机视觉研究室,做语言有语言所,语音有语音所,不同的功能在学科划分中已经分开了,这个和我们人类对大脑理解多多少少有一些关系.之后科学家发现人类大脑是一个通用的计算模型. 科学家做了这样一个实验,把小白鼠的听觉中心的神经和耳朵通路剪断,视觉输入接到听觉中心

新手神器!不用部署深度学习环境、上传数据集!(附代码&视频教程)

深度学习的浪潮在五年前开始兴起.随着计算能力的爆炸型增长和几个成功的案例,深度学习引起了大肆宣传.深度学习技术可以用来驾驶车辆,在Atari游戏中进行人机对抗,以及诊断癌症. 开始学习神经网络时,我花了两周的时间进行探索,选择合适的工具,对比不同的云服务以及检索在线课程.但回想起来,我还是希望我可以从第一天就能创建神经网络,这也是这篇文章的目的. 你不需要有任何预备知识.当然如果你对Python,命令行和Jupyter notebook有基础的了解会对你有所帮助. 深度学习是机器学习的一个分支,

日本小哥如何使用深度学习和TensorFlow种黄瓜?

◆ ◆ ◆ 导读 现在说机器学习和深度学习的应用只受限于人们的想象力并不夸张.不仅全世界的数据科学家们为之着迷,甚至在日本的农场,一位小哥为了减轻妈妈的工作负担,也开始尝试采用深度学习和Tensor Flow种黄瓜. 大约一年前,曾为日本汽车业内一名嵌入式系统设计师的MakotoKoike开始在父母的黄瓜种植园帮工.根据大小形状颜色和其他属性来分选黄瓜这件事所需的工作量令他吃惊. Makoto Koike那一生致力于提供鲜脆黄瓜的父亲就很为他那些仍带有细刺的扎手黄瓜感到自豪.颜色鲜艳又直又粗并且