将分类网络应用在android中 part1,编译tensorflow android例子

2024-02-04 03:48

本文主要是介绍将分类网络应用在android中 part1,编译tensorflow android例子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

准备

使用android-studio编译

使用bazel编译

 

准备

如果需要了解如何将tensorflow的分类网络编译进android应用,我想先从google提供的例子着手应该是最好的方式。

首先我们需要下载tensorflow的代码,官方推荐是用--recurse-submodules来下载,否则可能有些protobuf会出现编译问题

git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git

使用android-studio编译

使用这种方法你需要有一定android开发应该的基础,否则配置android-studio估计也要花费一段时间。所以我们默认电脑中已经装好了可以使用的android-studio。

启动android-studio,打开./tensorflow/examples/android这个工程。

接着修改build.gradle文件,将nativeBuildSystem设置为none

// set to 'bazel', 'cmake', 'makefile', 'none'
def nativeBuildSystem = 'none'

检查build.gradle中是否有设置compile 'org.tensorflow:tensorflow-android:+',如果没有就需要加上。

dependencies {if (nativeBuildSystem == 'cmake' || nativeBuildSystem == 'none') {compile 'org.tensorflow:tensorflow-android:+'}
}

接着build工程,就会自动下载下面这些models。

def models = ['inception_v1.zip','object_detection/ssd_mobilenet_v1_android_export.zip','stylize_v1.zip','speech_commands_conv_actions.zip']

但是有一个问题,这些models需要在google服务器上下载,所以可能会被墙,需要合理使用网络。

https://storage.googleapis.com/download.tensorflow.org/models

编译完成后可以直接安装进手机查看效果。

使用bazel编译

另一种方式就是用bazel编译apk。

首先需要下载android SDK,并且解压进tenserflow目录

$ wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
$ tar xvzf android-sdk_r24.4.1-linux.tgz -C ~/tensorflow

接着安装build-tools

$ cd ~/tensorflow/android-sdk-linux
$ tools/android update sdk --no-ui

然后下载NDK

$ wget https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip
$ unzip android-ndk-r14b-linux-x86_64.zip -d ~/tensorflow

再下载训练好的模型

$ 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/

安装brazel,可以参考官网进行安装,安装地址

修改WORKSPACE文件,build_tools_version的版本可以看一下android-sdk-linux/build-tools下面有什么版本,如果版本低于26后面编译会报错。

# Uncomment and update the paths in these entries to build the Android demo.
android_sdk_repository(name = "androidsdk",api_level = 28,# Ensure that you have the build_tools_version below installed in the# SDK manager as it updates periodically.build_tools_version = "28.0.2",# Replace with path to Android SDK on your systempath = "android-sdk-linux",
)android_ndk_repository(name="androidndk",path="android-ndk-r14b",# This needs to be 14 or higher to compile TensorFlow.# Please specify API level to >= 21 to build for 64-bit# archtectures or the Android NDK will automatically select biggest# API level that it supports without notice.# Note that the NDK version is not the API level.api_level=25)

最后用bazel编译APK即可

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

编译的时候如果报错如下,只需要将tensorflow/examples/android/BUILD中android_binary里面的manifest_merger = "legacy"删掉即可,并不会影响后面的编译。

ubuntu@ubuntu:/local/share/DeepLearning/tensorflow$ bazel build //tensorflow/examples/android:tensorflow_demo
ERROR: /local/share/DeepLearning/tensorflow/tensorflow/examples/android/BUILD:64:1: //tensorflow/examples/android:tensorflow_demo: no such attribute 'manifest_merger' in 'android_binary' rule
ERROR: error loading package 'tensorflow/examples/android': Package 'tensorflow/examples/android' contains errors
INFO: Elapsed time: 0.192s
INFO: 0 processes.
FAILED: Build did NOT complete successfully (1 packages loaded)

编译成功后可以看到在bazel-bin下面生成了一系列的文件

ubuntu@ubuntu:/local/share/DeepLearning/tensorflow/bazel-bin/tensorflow/examples/android$ ls
_dx                                   libtensorflow_demo.jar.dex.zip-2.params        tensorflow_demo.ap_                  tensorflow_demo_processed_manifest                    tensorflow_demo_symbols
_javac                                libtensorflow_demo.jar_desugared.jar           tensorflow_demo.apk                  tensorflow_demo_resources.jar                         tensorflow_demo_unsigned.apk
libtensorflow_demo-native-header.jar  libtensorflow_demo.jar_desugared.jar-2.params  tensorflow_demo.srcjar               tensorflow_demo_resources.jar.dex.zip
libtensorflow_demo.jar                libtensorflow_demo.jar_manifest_proto          tensorflow_demo_deploy.jar           tensorflow_demo_resources.jar.dex.zip-2.params
libtensorflow_demo.jar-2.params       libtensorflow_demo.jdeps                       tensorflow_demo_deploy.jar-2.params  tensorflow_demo_resources.jar_desugared.jar
libtensorflow_demo.jar.dex.zip        proguard                                       tensorflow_demo_files                tensorflow_demo_resources.jar_desugared.jar-2.params

安装tensorflow_demo.apk进手机,可以用adb命令安装,也可以直接将apk拷贝到手机中,在手机上点击apk安装。

安装成功后手机上会出现4个应用,TF Classify, TF Detect, TF Stylize, TF speech.

试了一下TF Classify,速度还是不错的。

下一篇介绍如何将自己做的分类网络在手机中实现。

这篇关于将分类网络应用在android中 part1,编译tensorflow android例子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/676274

相关文章

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

python中update()函数的用法和一些例子

《python中update()函数的用法和一些例子》update()方法是字典对象的方法,用于将一个字典中的键值对更新到另一个字典中,:本文主要介绍python中update()函数的用法和一些... 目录前言用法注意事项示例示例 1: 使用另一个字典来更新示例 2: 使用可迭代对象来更新示例 3: 使用

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性: