[翻译] Android + TensorFlow机器学习示例

原文地址: https://blog.mindorks.com/android-tensorflow-machine-learning-example-ff0e9b2654cc#.yjxydsasw

tensor.png

机器学习: 将TensorFlow整合到Android中<a id="orgheadline1"></a>

众所周知, 谷歌开源了一个名为 TensorFlow 的库, 可以在Android中使用,用来实现机器学习. TensorFlow是谷歌提供的的具有机器智能的开源库.

我在网上找了很久都没找到一个可以简单编译Android版TensorFlow的方法或示例.
翻阅了很多资料之后, 我自己编译成功了. 所以我决定把过程写下来, 以节省他人的时间.

本文主要面向熟悉机器学习以及知道如何为机器学习构建模型(例如本文示例中使用到了预训模型). 未来我打算写一系列关于机器学习的文章, 这样大家可以学习如何构建机器学习模型.

Android库编译过程<a id="orgheadline2"></a>

有一些需要实现知道的要点:

  1. TensorFlow的核心代码是用C++写的.
  2. 为了编译库, 需要使用JNI来调用C++函数, 例如loadModel, getPredictions等.
  3. 所以需要一个 .so 文件以及jar文件. jar中包含了可以调用C++接口的API.
    这样就可以直接通过Java api去做事情.
  4. 必须有一个预训模型文件和标签文件用于分类.

我们会构建如下的物体识别.

tensor1.png

编译jar包和 .so 文件<a id="orgheadline3"></a>

  1. 下载tensorflow:
    git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git
    注:–recurse-submodules 用于获取子模块

  2. 这里 下载NDK.

  3. 下载Android SDK或使用 Android Studio的SDK(需要提供一个路径).

  4. 安装Bazel. 它是TensorFlow的编译系统.

  5. 编辑TensorFlow代码库目录下的WORKSPACE文件. 该文件的内容大致如下:
    # 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)

    把你电脑中sdk和ndk的路径添加进去, 例如:
    android_sdk_repository(
    name = "androidsdk",
    api_level = 23,
    build_tools_version = "25.0.1",
    # Replace with path to Android SDK on your system
    path = "/Users/amitshekhar/Library/Android/sdk/",
    )
    android_ndk_repository(
    name="androidndk",
    path="/Users/amitshekhar/Downloads/android-ndk-r13/",
    api_level=14)

  6. 使用下面命令编译 .so 文件(cpu改成你手机的架构)
    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

    编译后的 .so 文件的位置:
    bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so

  7. 编译相应的jar包.
    bazel build //tensorflow/contrib/android:android_tensorflow_inference_java

    编译后的jar包目录:
    bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar

OK, 目前位置, 我们已经有了 .so 文件和jar包, 可以在项目中使用他们了.
我在github上创建了一个可以运行的示例程序, 参见这里.

但是, 我们仍然需要预训模型和标签文件. 这上面的示例中, 我使用了谷歌的
预训模型, 该模型可以根据给出的图片识别出物体. 可以在这里 下载模型.
解压zip包, 我们即可获得imagenet_comp_graph_label_strings.txt(标签)和tensorflow_inception_graph.pb (预训模型).

接下来, 创建一个android工程,

  1. 将上面两个文件放入assets目录.
  2. 将编译好的jar包放入libs目录, 并添加依赖.
    compile files('libs/libandroid_tensorflow_inference_java.jar')
  3. 将 libtensorflow_inference.so 文件放入jniLibs/armeabi-v7a/目录.

然后我们就可以调用TensorFlow的Java接口了. Java API通过类 TensorFlowInferenceInterface
提供了所有需要的方法. 通过加载下载好的模型, 然后提供给他一个图片, 就可以
做预测了.

如果想看到完整的工作, 可以下载我的工程, 运行一下.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容