百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Android端运行Tensorflow的demo去分类自己的数据集(安卓tensorflow)

toyiye 2024-04-04 11:34 21 浏览 0 评论

毕业设计用到了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 很方便, 但建议先安装和配置Java

1.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

注意用 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.zip
curl -L https://storage.googleapis.com/download.tensorflow.org/models/mobile_multibox_v1.zip -o /tmp/mobile_multibox_v1.zip
unzip /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_image

4.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_result

4.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_demo

5.2 把新的apk文件放到安卓手机上安装,最后运行tf_classify ,效果如下图

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码