当前位置: 首页 > news >正文

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


0?wx_fmt=png


如果你关注我的前一篇帖子,并按照其中的内容实践,你可能已经学会了如何在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


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


640?wx_fmt=jpeg


◆ 

编译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

本文来自云栖社区合作伙伴“大数据文摘”,了解相关信息可以关注“BigDataDigest”微信公众号

相关文章:

  • NTFS权限
  • 一般杀毒软件检测病毒原理
  • 关于OleVariant类型的疑问???
  • 技术助力第三次革命
  • redis持久化之RDB
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • CAML语句 多条件and使用
  • 第二节 Windows Communication Foundation 基础概念
  • vista下sql2008不能在c盘建数据库
  • 编程的真实样子
  • 比特币亿万富翁出手拯救 OpenBSD
  • 弹出窗口生成器
  • VTK的学习资源
  • 时代亿信身份认证成功案例——武警森林部队SID安全身份认证及访问控制系统...
  • Vala 编程语言以及相关的开源软件
  • 2017 年终总结 —— 在路上
  • CSS实用技巧干货
  • CSS相对定位
  • ES6 ...操作符
  • Git学习与使用心得(1)—— 初始化
  • HomeBrew常规使用教程
  • Mysql数据库的条件查询语句
  • Puppeteer:浏览器控制器
  • Python连接Oracle
  • react-native 安卓真机环境搭建
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Unix命令
  • Vue实战(四)登录/注册页的实现
  • Webpack 4x 之路 ( 四 )
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前端js -- this指向总结。
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 详解移动APP与web APP的区别
  • 鱼骨图 - 如何绘制?
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 终端用户监控:真实用户监控还是模拟监控?
  • MPAndroidChart 教程:Y轴 YAxis
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​2020 年大前端技术趋势解读
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (1)SpringCloud 整合Python
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (强烈推荐)移动端音视频从零到上手(上)
  • (小白学Java)Java简介和基本配置
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net Winform开发笔记(一)
  • .NET 使用配置文件