Tensorflow-lite Android Object Detect 初体验

写在开始

  • 在这篇文章中, 会手把手教你如何在你的电脑上将Tensorflow-lite Android Demo给跑起来, 希望会对那些需要在Android原生应用落地的童鞋有所帮助.

准备工作

  • 下载Android Studio(我直接下的最新的)

下载地址: https://developer.android.com/studio/

  • 从github上clone Tensorflow

➜ sample ✗ git clone https://github.com/tensorflow/tensorflow.git
Cloning into ‘tensorflow’…
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 479815 (delta 0), reused 6 (delta 0), pack-reused 479808
Receiving objects: 100% (479815/479815), 282.03 MiB | 7.41 MiB/s, done.
Resolving deltas: 100% (385210/385210), done.
Checking out files: 100% (13949/13949), done.

导入项目, 开干.!!

  • 打开Android Studio:

  • 先别导入项目, 直接点击Configure->SDK Manager:

  • 这里需要安装SDK和NDK(其实选择Android 9.0和NDK就可以了, 我这里有些包之前装的, 直接打勾, 点ok就好):

  • 安装好SDK和NDK之后, 点击Open an existing Android Studio Project:

  • 选择我们刚刚clone下来的项目中的tensorflow/tensorflow/lite/java/demo目录:

  • 然后需要等待一会, 导入项目会自动去下载一些依赖包, 过一会右下角会有如下提示, 点击 Add root:

  • 如果一直卡在这个界面, 请点击右边那个小叉叉关闭当前的process, 并点击左上角Preferences->Appearance & Behavior->System Settings->HTTP Proxy检查你的proxy配置:

  • 如果出现找不到toolchains的错误, 请手动下载NDK覆盖原NDK目录:

    错误:
    Gradle sync failed: No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
    Consult IDE log for more details (Help | Show Log) (1 m 7 s 18 ms)

解决方案:

  1. 到NDK官网下载对应平台的NDK (我直接下的最新的mac版本) https://developer.android.com/ndk/downloads/?hl=zh-cn

  2. 解压文件, 并拷贝至指定目录(这里以macos为例; Windows, Linux思路一致, 请自行google)

    ➜ ndk ✗ unzip android-ndk-r16b-darwin-x86_64.zip
    ➜ ndk ✗ rm -rvf ~/Library/Android/sdk/ndk-bundle
    ➜ ndk ✗ cp -rvf android-ndk-r16b ~/Library/Android/sdk/ndk-bundle

改为我们手动下载的NDK之后, 点击右上角的这个按钮, sync一下:

  • 然后等一会, 会跳出这个框框要更新Gradle Plugin, 点击Update:

  • 过一会, 发现右下角报了个这个错误:

Gradle sync failed: Could not find method jackOptions() for arguments [build_c83lec3ciu5xopt1opuwlj8q5$_run_closure1$_closure6$_closure11@1b729409] on DefaultConfig_Decorated{name=main, dimension=null, minSdkVersion=DefaultApiVersion{mApiLevel=21, mCodename=’null’}, targetSdkVersion=DefaultApiVersion{mApiLevel=26, mCodename=’null’}, renderscriptTargetApi=null, renderscriptSupportModeEnabled=null, renderscriptSupportModeBlasEnabled=null, renderscriptNdkModeEnabled=null, versionCode=1, versionName=1.0, applicationId=android.example.com.tflitecamerademo, testApplicationId=null, testInstrumentationRunner=null, testInstrumentationRunnerArguments={}, testHandleProfiling=null, testFunctionalTest=null, signingConfig=null, resConfig=null, mBuildConfigFields={}, mResValues={}, mProguardFiles=[], mConsumerProguardFiles=[], mManifestPlaceholders={}, mWearAppUnbundled=null} of type com.android.build.gradle.internal.dsl.DefaultConfig.
Consult IDE log for more details (Help | Show Log) (40 s 747 ms)

别慌, 我们去build.gradle(Module:app)里面将这段内容注释掉就好了, 注意画圈圈的地方:

然后再点击这个小按钮:

  • 又是一小段等待时间, 然后会发现有两个提示, 不着急, 打勾的地方, 一个一个点:

  • 然后catch到另外一个错误:

Could not find com.android.tools.build:aapt2:3.2.1-4818971.
Searched in the following locations:
file:/Users/Kyle/Library/Android/sdk/extras/m2repository/com/android/tools/build/aapt2/3.2.1-4818971/aapt2-3.2.1-4818971.pom
file:/Users/Kyle/Library/Android/sdk/extras/m2repository/com/android/tools/build/aapt2/3.2.1-4818971/aapt2-3.2.1-4818971-osx.jar
file:/Users/Kyle/Library/Android/sdk/extras/google/m2repository/com/android/tools/build/aapt2/3.2.1-4818971/aapt2-3.2.1-4818971.pom
file:/Users/Kyle/Library/Android/sdk/extras/google/m2repository/com/android/tools/build/aapt2/3.2.1-4818971/aapt2-3.2.1-4818971-osx.jar
file:/Users/Kyle/Library/Android/sdk/extras/android/m2repository/com/android/tools/build/aapt2/3.2.1-4818971/aapt2-3.2.1-4818971.pom
file:/Users/Kyle/Library/Android/sdk/extras/android/m2repository/com/android/tools/build/aapt2/3.2.1-4818971/aapt2-3.2.1-4818971-osx.jar
https://jcenter.bintray.com/com/android/tools/build/aapt2/3.2.1-4818971/aapt2-3.2.1-4818971.pom
https://jcenter.bintray.com/com/android/tools/build/aapt2/3.2.1-4818971/aapt2-3.2.1-4818971-osx.jar
https://google.bintray.com/tensorflow/com/android/tools/build/aapt2/3.2.1-4818971/aapt2-3.2.1-4818971.pom
https://google.bintray.com/tensorflow/com/android/tools/build/aapt2/3.2.1-4818971/aapt2-3.2.1-4818971-osx.jar
Required by:
project :app

别慌, 只是少了点东西, 淡定的打开build.gradle(Project:demo), 加上箭头指的这行. (注意标红的两个地方, 一个是文件名, 一个是增加的内容):

然后再点击这个小按钮:

  • 然后经过一小段时间的等待, 可以发现只剩下一个warning了:

  • 既然是警告, 说明代码还是可以正常运行的, 我们继续. 试试能不能编译成apk导出来在手机上安装测试:

  • 出现打包成功的提示, 点击标红的这里, 会自动打开apk所在文件夹:

  • 然后我们将其拷贝到手机上, 安装:

  • 欧了, 跑起来:

写在结束

  • 总体上来说, 坑还是有的, 但是如果用心爬的话, 还是可以爬出来, 这只是开始, 后续想要在Android上面直接跑模型, 还有很长的路要走, 大家共勉吧.