TensorFlow in Android

本文详细介绍了如何在Android环境中利用TensorFlow实现机器学习应用,包括环境配置、编译过程及模型部署等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先说明以下,这只是把实践的过程叙述以下。
参考文章:在Android中借助TensorFlow使用机器学习(译)
Android TensorFlow Machine Learning Example科学上网你懂的

0、前言

环境

  • 系统:Deepin1.4 Beta
  • java版本:open jdk 1.8
  • python版本:2.7
    上述环境用于构建bazel,bazel是tensorflow的构建系统。
  • Android SDK:api 15~api 25
  • Android NDK:android-ndk-r13b-linux-x86_64
    而下面的sdk和ndk是生成安卓下的so文件和java的必须的。
    我们有so文件和java接口的文件就可以了,有兴趣当然可以去编译以下,感受一下,期间会有很多wram,不过不是error就没事啦。当然编译期间也很占内存,我的8g内存,飙到97%过了很久才下来。

如果你有兴趣,可以下载:
+ SDK(含NDK):链接:http://pan.baidu.com/s/1qYdfkxm 密码:fe7d
+ NDK:链接:http://pan.baidu.com/s/1qYNMr7Y 密码:0tzy
+ tensorflow github文件(当然你可以去github直接下载):链接:http://pan.baidu.com/s/1jIQazx8 密码:mxzx
+ bazel(0.4.4):链接:http://pan.baidu.com/s/1eSxIuie 密码:ne4l

SDK中的NDK在ndk-bundle文件夹下就是了,不知道的话,在SDK下找找看吧。
bazel源码编译不要直接从github直接clone而是去release页面下载,直接clone会提示你去release下载编译。源码编译bazel我并没试过,因为我用deb安装成功了,就没去折腾了。bazel网盘中有几个从release页面下载的文件。

编写app前你要如下文件:
+ 编译出来的tensorflow的so库
+ 编译出来的java的jar包
+ tensorflow训练出来的文件
没有自己编译的,可以从这下载so和jar包:链接:https://pan.baidu.com/s/1VSxnHYyUbbFUszvSbTJokA
官方训练完的文件:链接:http://pan.baidu.com/s/1mhPGigg 密码:w4bx
+ so文件大小:10m左右
+ jar包大小:10k+
+ 训练完的文件大小:50m+

所以最后安卓demo App的大小是60m+,运行内存是75m+(当然不同手机可能不一样)
总的感受是太大了。但是本地的东西也算可以了,一般的模式都是去服务器访问,再把结果返回的吧。


原作者Example

点Detech Object进行识别,这个模型的原理大概就是从把拍下的图片分类到已知的类别里面去,因为,下载下来的训练文件有个txt文件就是放这些名词。

1、安装bazel

bazel官网:bazel
python和jdk8自己安装,这里不多讲述。
从我上面给出的deb下载下来

sudo dpkg -i '/home/hui/Downloads/bazel_0.4.4-linux-x86_64.deb'

路径直接把文件拉进去。
输入bazel有显示bazel参数选项就安装成功了。

2、编译so和jar包

首先下载tensorflow源码,以供编译:

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

修改clone 下来的TensorFlow中的WROKSPACE文件:

# Uncomment and update the paths in these entries to build the Android demo.
#android_sdk_repository(
#    name = "androidsdk",
#    api_level = 23,
#    build_tools_version = "25.0.1",
#    # Replace with path to Android SDK on your system
#    path = "<PATH_TO_SDK>",
#)
#
#android_ndk_repository(
#    name="androidndk",
#    path="<PATH_TO_NDK>",
#    api_level=14)

修改后:

# Uncomment and update the paths in these entries to build the Android demo.
android_sdk_repository(
    name = "androidsdk",
    api_level = 23,
    build_tools_version = "25.0.1",
    # Replace with path to Android SDK on your system
    path = "/home/hui/Desktop/Android/android-sdk-linux",
)

android_ndk_repository(
    name="androidndk",
    path="/home/hui/Desktop/Android/android-sdk-linux/ndk-bundle",
    api_level=15)

这个sdk没有api 14,所以写了最小的15
以下编译命令在tensorflow根目录执行,文件路径是相对于tensorflow根目录而言
编译so:

bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so \
   --crosstool_top=//external:android/crosstool \
   --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
   --cpu=armeabi-v7a

编译后文件位置:

bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so

编译jar文件:

bazel build //tensorflow/contrib/android:android_tensorflow_inference_java

编译后文件位置:

bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar

我编译jar的时候,第一失败了,再用多一次命令就搞定了。
这样就编译出so和jar包了。
当然你也可以从百度云直接下载,跳过2。
windows下试了很多次的安装bazel都是败了,果然有些东西要在linux才是最好的。

3、下载训练模型和标签文件

这里我们用google的数据就可以,下载地址,下载后解压可以得到imagenet_comp_graph_label_strings.txt(label for objects) and tensorflow_inception_graph.pb (pre-trained model) 两个文件,这两个文件放置在Android工程的Assets中即可。

4、Android demo的构建

其实这里已经有一个完整的demo地址,所以如果仅仅想体验一下机器学习,可以直接clone代码运行即可,代码地址
如果要自己构建demo,则需要引用之前生成的jar文件和so文件:

  • 引用jar:
compile files('libs/libandroid_tensorflow_inference_java.jar')

jar包放在安卓项目的libs文件夹下。

  • 引用so:
    新建jniLibs文件,并把libtensorflow_inference.so 文件放置在jniLibs/armeabi-v7a/ 中。

在安卓项目的main文件夹下创建jniLibs/armeabi-v7a/ ,so放进去。
同时创建不要包含including c++的项目,因为会找不到so路径。所以普通的项目就行了,因为so是通过ndk生成的,直接放进项目就可以用了,不用动态的编译什么的。

5、自己写项目(其实是复制而已)

https://github.com/MindorksOpenSource/AndroidTensorFlowMachineLearningExample
这是原作者的demo
我们也从demo静静的复制就行了。
放入自己编译jar包:


放入jar包

放入 自己编译so库文件:

放入so库文件

放入下载训练文件:

导入训练文件

从demo复制两行到String.xml:

    <string name="toggle_camera">Toggle Camera</string>
    <string name="detect_object">Detect Object</string>


复制string标签

复制layout和实现类:


主要代码文件

将框框的4个文件直接从那个AndroidTensorFlowMachineLearningExample复制过来

build.gradle添加:

    compile files('libs/libandroid_tensorflow_inference_java.jar')
    compile 'com.flurgle:camerakit:0.9.13'


添加依赖

layout.xml会报错,删除如下:

    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"

以上4行是设置外边距而已。
编译运行吧。
结果是这样的:


效果如下

的确有点违和感。就这样了。
写了很拖沓,你可以去第一个参考博客看比较清晰明了。

note:将以前在简书写的博文补到csdn
TensorFlow in Android

### TensorFlow on ARM Installation and Usage #### Overview of TensorFlow Support for ARM Architecture TensorFlow provides support for various architectures including ARM, which is commonly used in mobile devices like smartphones and tablets. This allows developers to deploy machine learning models efficiently on these platforms. #### Installing TensorFlow Lite for Android ARM64 Devices For deploying TensorFlow models specifically tailored for Android devices with an ARM64 architecture, one can compile the TensorFlow Lite library using Bazel as shown below: ```bash bazel build -c opt //tensorflow/lite:libtensorflowLite.so --config=android_arm64 --cxxopt="-std=c++11"[^2] ``` This command compiles the `libtensorflowLite.so` shared object file optimized for performance on Android ARM64 systems while adhering to C++11 standards. #### Compiling TensorFlow Library for ARM Systems with Limited Memory Resources When working within environments that have limited memory resources such as embedded systems or low-end hardware running ARM processors, it's advisable to limit the number of parallel jobs during compilation to avoid resource exhaustion. The following example demonstrates how this could be achieved by setting up a two-threaded build process: ```bash bazel build --jobs=2 --config=opt //tensorflow/tools/lib_package:libtensorflow[^4] ``` By specifying `--jobs=2`, only two threads will handle tasks simultaneously throughout the entire building phase, reducing peak RAM consumption significantly without compromising too much speed. #### Python Package Installation Example for Older Versions Like TensorFlow 1.6.0 In some cases where specific versions are required due to compatibility reasons, direct installation from pre-built wheel files might become necessary. An instance involving TensorFlow version 1.6.0 installed via pip under Linux environment would look something similar to what follows: ```bash sudo pip install /tmp/tensorflow_pkg/tensorflow-1.6.0-py2-none-any.whl[^1] ``` Here, `/tmp/tensorflow_pkg/` represents the directory containing the downloaded `.whl` package intended for installation into the system-wide site-packages area accessible through root privileges (`sudo`). --related questions-- 1. What considerations should be taken when choosing between different TensorFlow releases? 2. How does optimizing TensorFlow builds impact application performance on ARM-based devices? 3. Can you provide guidance on troubleshooting common errors encountered during cross-compilation targeting ARM architectures? 4. Are there any best practices recommended for integrating TensorFlow applications onto IoT devices powered by ARM CPUs?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值