tensorflow 移植到android平台(转)

原文地址:https://blog.csdn.net/shichaog/article/details/73551029

 

语音增强和语音识别系列博文

本文基于 
https://github.com/MindorksOpenSource/AndroidTensorFlowMachineLearningExample

下载和安装jdk,ndk和sdk

下载

JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 
我选择的是jdk-8u131-linux-x64.tar.gz 
下载后解压到/opt目录下,我的解压后目录如下:

gsc@X250:/opt/jdk1.8.0_131$ pwd
/opt/jdk1.8.0_131

配置

gsc@X250:/opt/jdk1.8.0_131$ vim ~/.bashrc 
在文件末尾加上如下内容

export JAVA_HOME=/opt/jdk1.8.0_131
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

Android SDK安装

法一SDK安装

下载DSK

$ 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版本和buildtools版本

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

选中build-tools版本24.0.3和Android 6.0(API 23) 
这里写图片描述 
安装完后最后一列由not installed变为installed。

法二android studio方法

如下图打开sdk manager 
这里写图片描述 
在SDK platforms里选则API23,在SDK tools里选中24.0.3.最新的26编译会出错。 
这里写图片描述

NDK安装

使用r12b,r12b可以支持armv7和armv8的编译,不要使用最新的。

$ wget https://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip
$ unzip android-ndk-r12b-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/
  •  

修改WORKSPACE文件

按如下方式修改

# Uncomment and update the paths in these entries to build the Android demo.
android_sdk_repository(
    name = "androidsdk",
    api_level = 23,
    # Ensure that you have the build_tools_version below installed in the
    # SDK manager as it updates periodically.
    build_tools_version = "24.0.3",
    # Replace with path to Android SDK on your system
    path = "android-sdk-linux",
)

# Android NDK r12b is recommended (higher may cause issues with Bazel)
android_ndk_repository(
    name="androidndk",
    path="/home/gsc/android-ndk-r12b",
    # This needs to be 14 or higher to compile TensorFlow.
    # Note that the NDK version is not the API level.
    api_level=21)

编译APK

32位编译

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

demo 编译不支持64位armv8 
这里写图片描述

64位编译(demo并不支持该选项)

编译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=arm64-v8a
so库所在目录是:
bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so

这里写图片描述
编译jar包

bazel build //tensorflow/contrib/android:android_tensorflow_inference_java
jar包所在目录是:
bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar

这里写图片描述

把编译好的包拷贝如下目录:

gsc@X250:~/Android/APP/AndroidTensorFlowMachineLearningExample$ 
./app/src/main/jniLibs/armeabi-v7a/libtensorflow_inference.so
./app/libs/libandroid_tensorflow_inference_java.jar

安装APK

$ adb install -r -g bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
  • 1

这里写图片描述
黑色是识别结果,白色反映了网络结构和各个模块的耗时以及cpu利用率情况。

使用自己的分类器

这个分类器是谷歌的,大约能够识别一千种图片,如果想只识别人脸等的应用,就需要使用自己的分类器了。 
编译图优化器

$ 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

将标签拷贝到asset目录

$ 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
$ adb install -r -g bazel-bin/tensorflow/examples/android/tensorflow_demo.apk

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值