编译TensorFlow Android Camera Demo

来源:互联网 发布:三国演义电视剧 知乎 编辑:程序博客网 时间:2024/05/17 07:17

最近这两天探索将TensorFlow移植到Android上的问题,跑了下官方的Demo

参考了http://blog.csdn.net/masa_fish/article/details/54097796

由于环境的不一致,遇到了各种坑,现在将其写下来,以做记忆


1、下载代码

第一步当然是下载代码

项目在github上的地址:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android


git下载代码:

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

--recurse-submodules这个必须添加

Demo在源码中的位置:tensorflow/examples/android2、安装Bazel

官网介绍安装的网站:https://docs.bazel.build/versions/master/install.html

我的系统是ubuntu14.04,也不想研究Bazel的代码,就没有下载源码编译安装

第一步,安装JDK8

    执行:

        sudo apt-get install openjdk-8-jdk


   Ubuntu 14.04 执行下面命令:

        sudo add-apt-repository ppa:webupd8team/java         sudo apt-get update && sudo apt-get install oracle-java8-installer 第二步,添加Bazel作为一个包资源    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


3、安装SDK与NDK

去官网下载,然后放到项目目录下,下载地址自行百度

配置位置,在项目根目录下找到WORKSPACE这个文件,打开

找到android_sdk_repository与android_ndk_repository这个两个配置项,本来它们是被注释掉的,把它们打开

然后修改path属性指向相应的目录,修改使用的版本信息等

android_sdk_repository(
    name = "androidsdk",
    api_level = 26,
    # Ensure that you have the build_tools_version below installed in the
    # SDK manager as it updates periodically.
    build_tools_version = "26.0.1",
    # Replace with path to Android SDK on your system
    path = "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=14)


这里讲下,这里遇到的两个坑。

1、NDK的版本问题,这里不能用最新的NDK,最大只支持到14,但也不要小于10。我就是去官网下了个最新的,然后编译各种c++头文件找不到,崩溃

2、NDK对cmake的版本有要求,我的ubuntu14.04系统的cmake是2.8的,但ndk_r14最小要求3.6版本,所以又去官网下了个最新的3.9版本才可以


4、模型下载问题

源码项目下的编译,每次清空重新编译,都会重新下载下模型文件。这很浪费时间,可以如下改下:

打开文件tensorflow/examples/android/BUILD,把下面红色内容注释掉,即在编译的时候不再下载文件了

android_binary(
    name = "tensorflow_demo",
    srcs = glob([
        "src/**/*.java",
    ]),
    # Package assets from assets dir as well as all model targets. Remove undesired models
    # (and corresponding Activities in source) to reduce APK size.
    assets = [
        "//tensorflow/examples/android/assets:asset_files",
        #":external_assets",
    ],
    assets_dir = "",
    custom_package = "org.tensorflow.demo",
    inline_constants = 1,
    manifest = "AndroidManifest.xml",
    manifest_merger = "legacy",
    resource_files = glob(["res/**"]),
    tags = [
        "manual",
        "notap",
    ],
    deps = [
        ":tensorflow_native_libs",
        "//tensorflow/contrib/android:android_tensorflow_inference_java",
    ],
)


手动下载模型文件,并解压到assert目录,执行下面的shell

BASE_URL=https://storage.googleapis.com/download.tensorflow.org/models
for MODEL_ZIP in inception5h.zip ssd_mobilenet_v1_android_export.zip stylize_v1.zip
do
  curl -L ${BASE_URL}/${MODEL_ZIP} -o /tmp/${MODEL_ZIP}
  unzip /tmp/${MODEL_ZIP} -d tensorflow/examples/android/assets/
done


5、编译

bazel build -c opt //tensorflow/examples/android:tensorflow_demo

成功之后生成下面三个文件

bazel-bin/tensorflow/examples/android/tensorflow_demo_deploy.jar bazel-bin/tensorflow/examples/android/tensorflow_demo_unsigned.apk bazel-bin/tensorflow/examples/android/tensorflow_demo.apk

上述命令编译出来的是armv7版本的,只可以在arm手机上跑,我的模拟器是x86的还是无法运行,后来找到项目里其实有编译的脚本,式了下还是可以用的

编译其它cpu版本的软件:

    打开脚本文件tensorflow/tools/ci_build/builds/android.sh

    将里面的--fat_apk_cpu=x86_64修改为你需要的,然后编译

编译所有cpu支持版本软件:

    执行脚本tensorflow/tools/ci_build/builds/android_full.sh



原创粉丝点击