文章目录
- 简介
- 安装
- 初试
- 步骤
- 相关概念
- TODO:代码详解
- 遇到的坑
- 所有示例应用
- 智能问答 BERT Question & Answer
- 数字识别 Digit Classifier
- 手势识别 Gesture Classification
- 图像分类 Image Classification
- 图像分割 Image Segmentation
- 个性化模型 Model Personalization
- 目标检测 Object Detection
- 姿态估计 Pose Estimation
- 姿态估计 Posenet
- 推荐系统 Recommendation
- 智能回复 Smart Reply
- 声音分类 Sound Classification
- 语音控制 Speech Commands
- 风格迁移 Style Transfer
- 超分辨率 Super Resolution
- 文本分类 Text Classification
- Keras 模型转换为 TensorFlow Lite 模型
- 参考文献
简介
部署 TensorFlow Lite 图像分类的示例应用在 Android 手机上
本文以 Windows 为例,编译好的 APK 在文末
安装
- Android Studio 4.1.1,已上传百度网盘(0h7c)
- Android 设备,启用开发者选项并打开USB调试
选项 → 关于手机 → 连续点击版本号 → 找到开发者选项 → 打开 USB 调试
文档说用 Android Studio 3.2.1,然而该版本太旧了,不支持较新的Gradle版本,本人尝试失败
初试
为了下面的步骤能顺利进行,先创建一个 Android 项目
File
→ New
→ New Project...
Language
选 Java
Minimum SDK
选 API 23: Android 6.0 (Marshmallow)
创建项目后会自动下载 gradle-6.5 等,并自动编译
连接手机并打开USB调试
Run
→ Run 'app'
步骤
1. 下载示例应用代码
git clone https://github.com/tensorflow/examples
2. 用 Android Studio 打开项目
examples/lite/examples/image_classification/android
3. 编译项目Build
→ Make Project
build.gradle
文件会让 SDK 自动下载需要的库,可能遇到一些坑,文末有解决方案
这两张图是用 Android Studio 3.2.1 截的,实际上我用 Android Studio 4.1.1 时打开项目便开始自动编译,等它自动装好一堆东西就能 Run 了,不过步骤大致相同的
4. 安装并运行 APP
连接 Android 设备,Run
→ Run 'app'
5. 编译 APK
先在 examples/image_classification/android/app/build/outputs/apk/taskApi/debug
中找找
若没有,Build
→ Build Bundle(s) / APK(s)
→ Build APK(s)
相关概念
浮点模型:floating point
量化模型:quantized model
TODO:代码详解
遇到的坑
1. 报错 Failed to open zip file. Gradle’s dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
删除 C:\Users\Administrator\.gradle\wrapper
中的 dists
文件夹,选择正确的 gradle 版本。
注意!Android Studio 版本较低可能不支持高版本的 gradle
2. 报错 Failed to install the following Android SDK packages as some licences have not been accepted.
cd C:\Users\Administrator\AppData\Local\Android\Sdk\tools\bin
sdkmanager.bat --licenses
接着全部填y
3. 无法Run,按钮是灰色的File → Sync Project with Gradle Files
4. 报错 Build model ‘org.jetbrains.plugins.gradle.model.BuildScriptClasspathModel’ for root project ‘TFLite Image Classification Demo App’ 即 java.lang.AbstractMethodError: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierImpl.getModuleIdentifier()Lorg/gradle/api/artifacts/ModuleIdentifier;
同1
5. Cause: dl.google.com:443 failed to respond
修改 C:\Users\Administrator\.gradle
的 gradle.properties
为
systemProp.https.nonProxyHosts=localhost
systemProp.http.proxyHost=127.0.0.1
systemProp.http.nonProxyHosts=localhost
systemProp.http.proxyPort=1080
或全部注释掉
5. 无法下载模型,缺少 models/download.gradle 中定义的模型
6. 报错 No version of NDK matched the requested version 21.0.6113669. Versions available locally: 22.1.7171670
点 Install NDK '21.0.6113669' and sync project'
即可
7. 可能有用的信息
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.1"
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
所有示例应用
智能问答 BERT Question & Answer
这个应用编译时间非常久,APK 有 109 MB
数字识别 Digit Classifier
手势识别 Gesture Classification
需自行训练模型,已上传百度网盘(0118)
打开 examples/gesture_classification/web/index.html
,拍几张图片,训练 TRAIN
下载模型 DOWNLOAD MODEL,得到 model.json
、model.weights.bin
、labels.txt
三个文件使用 Google Colaboratory → 文件 → 打开笔记本 → GitHub → 填入https://github.com/tensorflow/examples/blob/master/lite/examples/gesture_classification/ml/tensorflowjs_to_tflite_colab_notebook.ipynb
点搜索图标 → 登陆 Google 账号 → 左侧边栏点文件图标 → 上传三个模型文件 → 在图中两处插入代码并运行 → RESTART RUNTIME(若有)
!pip uninstall keras-nightly
!pip uninstall -y tensorflow
!pip install h5py==2.10.0
逐行运行 → 跳过 !rm -rf *.h5 *.tflite *.json *.bin
和 files.upload()
→ 下载得到 model.tflite
将 labels.txt
和 model.tflite
放进 examples/gesture_classification/android/app/src/main/assets
中
编译并运行
图像分类 Image Classification
图像分割 Image Segmentation
个性化模型 Model Personalization
先给 4 个不同分类拍 20 张以上图片,训练,识别
目标检测 Object Detection
姿态估计 Pose Estimation
姿态估计 Posenet
推荐系统 Recommendation
智能回复 Smart Reply
声音分类 Sound Classification
语音控制 Speech Commands
风格迁移 Style Transfer
超分辨率 Super Resolution
文本分类 Text Classification
Keras 模型转换为 TensorFlow Lite 模型
代码
import tensorflow as tf
keras_file = 'model.h5'
model = tf.keras.models.load_model(keras_file)
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
with open('model.tflite', 'wb') as f:
f.write(tflite_model)
命令行
tflite_convert --keras_model_file=model.h5 --output_file=model.tflite
参考文献
- Image classification | TensorFlow Lite
- TensorFlow Lite image classification Android example application
- 示例应用代码详解
- Android Gradle plugin release notes
- TensorFlow Lite 转换器
- Uninitialised Classifier or invalid context
- 手把手教你Android run起基于TensorFlow Lite的手势识别
- python - Tensorflow issue google colab ; tensorflow._api.v1.compat.v2’ has no attribute internal