Tensorflow Lite移动平台编译|Bazel实践

简介: 如果不做定制化操作,我们不需要自己编译TensorFlow Lite Android库。我们可以直接使用位于MavenCentral的TensorFlow Lite AAR。但是在某些情况下,我们需要本地编译TensorFlow Lite。例如,您可能正在构建一个包含operations selected from TensorFlow的自定义二进制文件,或者需要对TensorFlow Lite进行局部修改。

image.png


Android平台编译


如果不做定制化操作,我们不需要自己编译TensorFlow Lite Android库。我们可以直接使用位于MavenCentral的TensorFlow Lite AAR。但是在某些情况下,我们需要本地编译TensorFlow Lite。例如,您可能正在构建一个包含operations selected from TensorFlow的自定义二进制文件,或者需要对TensorFlow Lite进行局部修改。


使用官方mave获取tflite库:


allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'http://oss.sonatype.org/content/repositories/snapshots'
        }
        mavenLocal()
    }
}
dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.1.100'
}


编译过程


1. 安装Bazel及Android开发环境


Android开发环境每个Android开发者都有,这里就不做重复介绍,Bazel构建系统之前的文章已经做过介绍,下面主要说明下官方建议版本:


  1. Android NDK用以编译TensorFlow Lite的C/C++代码,推荐的版本为19c;
  2. Android SDK Build tools API建议大于23.


2. 配置WORKSPACE 和 .bazelrc


我们需要为构建TF Lite库进行环境配置。在TensorFlow源码检出根目录下运行/configure脚本,当脚本要求交互式地为/WORKSPACE配置Android环境变量时,选择“Yes”。该脚本将尝试使用以下环境变量配置设置:


  • ANDROID_SDK_HOME
  • ANDROID_SDK_API_LEVEL
  • ANDROID_NDK_HOME
  • ANDROID_NDK_API_LEVEL


如果没有设置这些变量,则必须在脚本提示符中以交互方式提供它们。成功的配置会在.tf_configure.bazshrc中生成类似于以下的条目:


build --action_env ANDROID_NDK_HOME="/usr/local/android/android-ndk-r19c"
build --action_env ANDROID_NDK_API_LEVEL="21"
build --action_env ANDROID_BUILD_TOOLS_VERSION="28.0.3"
build --action_env ANDROID_SDK_API_LEVEL="23"
build --action_env ANDROID_SDK_HOME="/usr/local/android/android-sdk-linux"


3. 编译和安装


一旦配置完了Bazel,我们就可以从源码根目录构建TensorFlow Lite AAR,执行如下所示命令:


bazel build -c opt --fat_apk_cpu=x86,x86_64,arm64-v8a,armeabi-v7a \
  --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
  //tensorflow/lite/java:tensorflow-lite


编译完将在bazel-bin/tensorflow/lite/java/中生成一个AAR文件。编译完的AAR包含全架构的so库。


我们可以构建更小的AAR文件,只针对以下一组模型:


bash tensorflow/lite/tools/build_aar.sh \
  --input_models=model1,model2 \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a


上面的脚本将生成tensorflow-lite.aar文件和可选的tensorflow-lite-select-tf-ops。如果其中一个模型使用Tensorflow操作,则aar文件。关于tensorflow lite的体积缩减可以参考: Reduce TensorFlow Lite binary size


使用Docker环境编译


在我们自己电脑配置比较麻烦或者有版本及环境冲突等问题,我们可以使用Docker构建,官方提供了编译Android AAR的Docker  file。


1. 安装Docker


从官网下载并安装Docker:www.docker.com/get-started


2. 下载Dockerfile


下载现成的Dockerfile:raw.githubusercontent.com/tensorflow/…


3. 构建镜像


将下载的Docker文件放到一个空文件夹中,运行下面命令构建Docker映像:


docker build . -t tflite-builder -f tflite-android.Dockerfile


4. 启动docker容器


我们使用交互式方式启动docker容器,将当前文件夹挂载到容器内的/host_dir(注意/tensorflow_src是容器内的TensorFlow存储库):


docker run -it -v $PWD:/host_dir tflite-builder bash


5.


进入容器后,我们可以运行以下程序来下载Android工具和库:


android update sdk --no-ui -a --filter tools,platform-tools,android-${ANDROID_API_LEVEL},build-tools-${ANDROID_BUILD_TOOLS_VERSION}


6. 运行编译


配置configure和.bazelrc后,启动编译。


7. 拷贝编译产物


在完成库的构建之后,我们将它们复制到容器中的/host_dir,以便在宿主机器上操作它们。


iOS平台库构建


TensorFlow Lite官方也同样为iOS提供了CocoaPods库。下面提供自定义的编译方案。iOS平台的构建只能在Mac系统。


1. 安装Xcode


如果我们的系统未安装Xcode,需要使用 xcode-select 安装 Xcode 8 或更高版本和工具:


xcode-select --install


如果是首次安装,还需要使用以下命令接受用户许可协议:


brew install automake
brew install libtool


2. 安装Bazel


按照之前文章介绍安装Bazel。


3. 配置工作区和.bazshrc


运行 TensorFlow 源码根目录下的 ./configure 脚本,在询问您是否希望构建支持 iOS 的 TensorFlow 时,选择“Yes”。


4. 构建 TensorFlowLiteC 动态框架(推荐)


正确配置 Bazel 后,使用以下命令构建 TensorFlowLiteC 框架。


bazel build --config=ios_fat -c opt \
  //tensorflow/lite/ios:TensorFlowLiteC_framework


此命令将在 TensorFlow源码 根目录的 bazel-bin/tensorflow/lite/ios/ 目录下生成 TensorFlowLiteC_framework.zip 文件。默认情况下,生成的框架全平台的二进制文件,其中包含 armv7、arm64 和 x86_64(但不包含 i386)。要查看在指定 --config=ios_fat 时使用的构建标志的完整列表,参阅 .bazelrc 文件中的 iOS 配置部分。


5. 构建 TensorFlowLiteC 静态框架


默认情况下,我们仅通过 Cocoapods 拉取到的是动态库。如果要改用静态框架,可以使用以下命令构建

TensorFlowLiteC 静态框架:


bazel build --config=ios_fat -c opt \
  //tensorflow/lite/ios:TensorFlowLiteC_static_framework


此命令将在 TensorFlow 源码根目录的 bazel-bin/tensorflow/lite/ios/ 目录下生成一个名为 TensorFlowLiteC_static_framework.zip 的文件。此静态框架的使用方式与动态框架完全相同。


TensorFlow Bazel脚本分析


tensorflow根目录下.bazelrc文件中注明了各个构建目标对应命令,比如对应Andorid平台:


# Android configs. Bazel needs to have --cpu and --fat_apk_cpu both set to the
# target CPU to build transient dependencies correctly. See
# https://docs.bazel.build/versions/master/user-manual.html#flag--fat_apk_cpu
build:android --crosstool_top=//external:android/crosstool
build:android --host_crosstool_top=@bazel_tools//tools/cpp:toolchain
build:android_arm --config=android
build:android_arm --cpu=armeabi-v7a
build:android_arm --fat_apk_cpu=armeabi-v7a
build:android_arm64 --config=android
build:android_arm64 --cpu=arm64-v8a
build:android_arm64 --fat_apk_cpu=arm64-v8a
build:android_x86 --config=android
build:android_x86 --cpu=x86
build:android_x86 --fat_apk_cpu=x86
build:android_x86_64 --config=android
build:android_x86_64 --cpu=x86_64
build:android_x86_64 --fat_apk_cpu=x86_64


总结


本文主要介绍了Tensorflow在Android和iOS平台的构建,编译的目标文件已经是各自平台可直接使用的了。针对底层库,比如Android,我们可能只需要直接使用动态库,则直接编译出Android对应的动态库即可。如何只编译动态库,以及编译出来的库如何使用,我们后面有时间逐步介绍。心急的同学可以参考一个基于tflite的Android开源库:android_tflite,纯Android NDK实现的GPU加速TensorFlow Lite应用程序。实现了包含高精度人脸检测,年龄和性别估计,人体姿态估计,艺术风格转换等:


人脸检测:


image.png


年龄预估:


image.png


头发分隔:

image.png

目录
相关文章
|
6月前
|
机器学习/深度学习 人工智能 API
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:1~5
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:1~5
192 0
|
6月前
|
机器学习/深度学习 存储 人工智能
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11(3)
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11(3)
117 0
|
Java TensorFlow 算法框架/工具
Android 中集成 TensorFlow Lite图片识别
Android 中集成 TensorFlow Lite图片识别
118 0
|
6月前
|
机器学习/深度学习 搜索推荐 算法
推荐系统离线评估方法和评估指标,以及在推荐服务器内部实现A/B测试和解决A/B测试资源紧张的方法。还介绍了如何在TensorFlow中进行模型离线评估实践。
推荐系统离线评估方法和评估指标,以及在推荐服务器内部实现A/B测试和解决A/B测试资源紧张的方法。还介绍了如何在TensorFlow中进行模型离线评估实践。
421 0
|
6月前
|
并行计算 TensorFlow 算法框架/工具
【环境配置】tensorflow11.1.0编译
【环境配置】tensorflow11.1.0编译
49 2
|
6月前
|
机器学习/深度学习 Dart TensorFlow
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11(5)
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11(5)
145 0
|
3月前
|
自然语言处理 C# 开发者
Uno Platform多语言开发秘籍大公开:轻松驾驭全球用户,一键切换语言,让你的应用成为跨文化交流的桥梁!
【8月更文挑战第31天】Uno Platform 是一个强大的开源框架,允许使用 C# 和 XAML 构建跨平台的原生移动、Web 和桌面应用程序。本文详细介绍如何通过 Uno Platform 创建多语言应用,包括准备工作、设置多语言资源、XAML 中引用资源、C# 中加载资源以及处理语言更改。通过简单的步骤和示例代码,帮助开发者轻松实现应用的国际化。
39 1
|
3月前
|
持续交付 测试技术 jenkins
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
59 0
|
3月前
|
UED 存储 数据管理
深度解析 Uno Platform 离线状态处理技巧:从网络检测到本地存储同步,全方位提升跨平台应用在无网环境下的用户体验与数据管理策略
【8月更文挑战第31天】处理离线状态下的用户体验是现代应用开发的关键。本文通过在线笔记应用案例,介绍如何使用 Uno Platform 优雅地应对离线状态。首先,利用 `NetworkInformation` 类检测网络状态;其次,使用 SQLite 实现离线存储;然后,在网络恢复时同步数据;最后,通过 UI 反馈提升用户体验。
82 0
|
3月前
|
开发者 算法 虚拟化
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
75 0

热门文章

最新文章