Android端运行Tensorflow的demo去分类自己的数据集
2017-06-02 23:16
337 查看
声明: 本人的第一篇博客, 描述不清楚请见谅。
毕业设计用到了tensorflow, 最近在看其github库时发现tf 可以在手机上运行。
官方的链接
于是就按照官方的教程用Bazel 编译 Tensorflow 环境,并参考这一篇教程, 训练一个分类自己数据集合的模型(fine tuning Inception net)并把它部署在了安卓手机上。
结果如下:
![](https://img-blog.csdn.net/20170603125455096?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHh0MTk5NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
下面我会介绍下如何实现此操作。
Tensorflow 1.0 (此时的tf版本已经更新到了1.2)
安卓手机(魅族)
1.1 安装Java 8 你可以参考这个教程
1.2 以此执行如下命令:
注意一定要注意Bazel 的版本. 输入 bazel version 去检验。
![](https://img-blog.csdn.net/20170602235020153?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHh0MTk5NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2, 下载Tensorflow源码和 Android studio 以及 Android ndk, 运行官方的demo
2.1 下载tensorflow (事先安装好git工具,否则 cmd 输入 sudo apt-get install git )
cmd下输入
毕业设计用到了tensorflow, 最近在看其github库时发现tf 可以在手机上运行。
官方的链接
于是就按照官方的教程用Bazel 编译 Tensorflow 环境,并参考这一篇教程, 训练一个分类自己数据集合的模型(fine tuning Inception net)并把它部署在了安卓手机上。
结果如下:
下面我会介绍下如何实现此操作。
实验环境
Ubuntu 16.04 LTS (Win10 也可以,但前提是Bazel 要成功地安装,并且版本在4.5以上)Tensorflow 1.0 (此时的tf版本已经更新到了1.2)
安卓手机(魅族)
配置环境
1,安装Bazel
这个可以参考官方教程。Ubuntu 安装Bazel 很方便, 但建议先安装和配置Java1.1 安装Java 8 你可以参考这个教程
1.2 以此执行如下命令:
echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
sudo apt-get update && sudo apt-get install bazel
sudo apt-get upgrade bazel
注意一定要注意Bazel 的版本. 输入 bazel version 去检验。
2, 下载Tensorflow源码和 Android studio 以及 Android ndk, 运行官方的demo
2.1 下载tensorflow (事先安装好git工具,否则 cmd 输入 sudo apt-get install git )
cmd下输入git clone https://github.com/tensorflow/tensorflow[/code]
注意用 git checkout origin/r1.0 切换到版本1.0 (也可以不执行此操作但是有一点不同的地方,在文章末尾指明)2.2 下载 Android studio 和Android ndk
注意sdk 的版本要在23.0.3以上,最好是24或 25。 (最新的是25.0.3)用Android studio 里面自带的 SDK manager 更新下SDK的版本。
ndk 可以到官方网站下载。 以下是下载结果。下载后解压。2.3 配置tensorflow代码根目录下的 WORKSPACE文件
取消注释,修改你对应的sdk和ndk的版本号以及path# Uncomment and update the paths in these entries to build the Android demo. android_sdk_repository( name = "androidsdk", api_level = 25, build_tools_version = "25.0.3", # Replace with path to Android SDK on your system path = "/home/lxt-bupt/Android/Sdk", # ) # android_ndk_repository( name="androidndk", path="/home/lxt-bupt/Android/android-ndk-r12b",# api_level=21)
3 用Bazel 编译Tensorflow 的Android 环境
在编译之前,先下载和解压 demo的model文件(Imagenet dataset训练出来的)curl -L https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip -o /tmp/inception5h.zipcurl -L https://storage.googleapis.com/download.tensorflow.org/models/mobile_multibox_v1.zip -o /tmp/mobile_multibox_v1.zipunzip /tmp/inception5h.zip -d tensorflow/examples/android/assets/unzip /tmp/mobile_multibox_v1.zip -d tensorflow/examples/android/assets/
然后运行bazel build -c opt //tensorflow/examples/android:tensorflow_demo
运行时报protocol 的错误时,运行git submodule update --init命令,重新编译。
这个编译时间很长,期间会出现很多的warning 如果成功的话,会得出如下结果。
此时在tensorflow代码根目录/bazel-bin/tensorflow/examples/android下,会有 tensorflow_demo.apk 此时可以把该文件移动到手机上安装,
会有3个app 生成如下图, 这3个app就是tensorflow 官方的demo。分别用于分类,检测,和更改图片的风格。
3,用自己的数据finetuning Inception模型。
1,准备自己的数据。
自己的数据集有5个类别, 可乐,雪碧,芬达,农夫山泉,怡宝, 新建立一个data目录
2,Bazel 编译retrain 模块
在根目录下输入:bazel build tensorflow/examples/image_retraining:retrain
编译时间很长,耐心等待, 注意可能要安装一些Python的依赖库numpy mock 等等
3, 训练自己的模型
在tensorflow根目录下新建model目录(存放训练后的模型)和retrain_logs目录(记录训练过程,以便于用tensorboard可视化),接着输入如下命令:
note: 还有其他的参数可以选择,可以看 tensorflow/examples/image_retraining/retrain.py 文件中有哪些可以选取.bazel-bin/tensorflow/examples/image_retraining/retrain\ --bottleneck_dir=./model/bottlenecks \ --how_many_training_steps 4000 \ --model_dir=./model/inception \ --output_graph=./model/retrained_graph.pb \ --output_labels=./model/retrained_labels.txt \ --image_dir ./data/ \ --summaries_dir ./retrain_logs/开始了训练过程(先创建bottlenecks,再开始训练4000次迭代,注意图片格式是jpeg,否则会报错)
训练完毕后会在model目录下有retrained_graph.pb (模型) 和 retrain_labels.txt (标签) 两个文件4,优化和测试模型
必须要进行如下build操作, 在根目录依次输入如下Bazel命令: (依然是漫长的等待过程)bazel build tensorflow/python/tools:optimize_for_inference bazel build tensorflow/examples/label_image:label_image4.1 优化模型
在根目录下输入如下命令:bazel-bin/tensorflow/python/tools/optimize_for_inference \ --input=./model/retrained_graph.pb \ --output=./model/optimized_graph.pb \ --input_names=Mul \ --output_names=final_result4.2用优化后的模型测试图片
取一张可乐的图片放到model目录下测试,输入如下命令: 你也可以测试其他的图片:)bazel-bin/tensorflow/examples/label_image/label_image \ --output_layer=final_result \ --labels=./model/retrained_labels.txt \ --image=./model/img28.jpg \ --graph=./model/optimized_graph.pb
结果如下图:4.3 修改相关的java文件, /tensorflow/tensorflow/examples/android/src/org/tensorflow/demo 目录下的ClassifierActivity.java文件
修改相关行
按照下图去每个值的大小:
并把上述两个文件移(optimized_graph.pb 和 retrained_labels.txt)动到 /tensorflow/tensorflow/examples/android/assets 目录下5,部署模型到安卓手机
5.1 重新编译Android 环境
根目录输入:
bazel build -c opt //tensorflow/examples/android:tensorflow_demo5.2 把新的apk文件放到安卓手机上安装,最后运行tf_classify ,效果如下图
所以只要有自己的数据,就可以打造属于自己的分类器 : )
相关文章推荐
- 编译tensorflow并在Android上运行图像分类
- tensorflow训练自己的数据集实现CNN图像分类2(保存模型&测试单张图片)
- Android JNI NDK 全程配置和运行demo,总结csdn所有博客自己提炼!!!!最易懂
- tensorflow训练自己的数据集实现CNN图像分类1
- Ubuntu TensorFlow 源码 Android Demo的编译运行
- Android中运行Tensorflow程序2-编写自己的程序
- 详解tensorflow训练自己的数据集实现CNN图像分类
- 编译运行 pocketsphinx android demo 需要注意的问题
- 自己编译Android gdbserver(解决运行 gdbserver时 Segmentation fault 问题)
- unity3d运行在android平台的一个demo
- Android下通过pocketsphinx实现离线语音识别的环境搭建和demo运行(续)--实现Windows下的语音识别
- Android下通过pocketsphinx实现离线语音识别的环境搭建和demo运行(续)--实现Windows下的语音识别
- 自己编译Android gdbserver(解决运行 gdbserver时 Segmentation fault 问题)
- android例子程序(ApiDemo)的简单分类整理
- 在android真机上运行cocos2d-html5-2.2自带的HelloHTML5World和其它demo
- 关于Cocos2d-x android的环境搭建、Demo运行的注意事项。
- Android 开发自己的网络收音机3——电台分类(ExpandableListView)
- Android 最好的数据库框架 ORMLite的分析 (附时序图和自己写的DEMO)
- 使用自己编译的在Android上运行的内核(Linux Kernel)
- 关于arcgis for android demo中加载自己发布的地图服务出错