Tensorflow Lite demo for Android 正确使用

  • 内容
  • 评论
  • 相关

1、背景

2017年,谷歌发布了一个专门针对移动设备优化的Tensorflow版本——Tensorflow Lite,并于年末开放了开发者预览版。
当前ML,DL系统通常软件服务商的服务端为用户进行服务,而此次Google希望能将一部分相关处理转移到用户的移动设备上,从而减轻服务端的压力。同时,并且一些需要学习的用户数据涉及用户的敏感信息,并不适合通过网络连接发送给服务商,因此利用Tensorflow Lite可以使得在设备本地进行模型的train与inference。

2、特点

TensorFlow Lite具有的特点如下:
  1. 轻量级:允许小 binary size 和快速初始化/启动的设备端机器学习模型进行推断。
  2. 跨平台:运行时的设计使其可以在不同的平台上运行,如目前支持的android和 iOS。
  3. 快速:专为移动设备进行优化,包括大幅提升模型加载时间,支持硬件加速。

3、运行环境

ide:Android Studio最新版本:3.1.3
SDK:Android SDK 高于26
NDK:16以上
JDK:jdk1.8以上
如果没有配置好,建议安装Android Studio最新版本3.1.3后进行sdk、ndk升级。

4、下载demo进行编译

4.1 下载

4.2 导入Android studio编译

下面是导入后的目录结构:
build的时候你会遇到很多问题,这个时候你需要修改project的build.gradle以及APP的build.gradle
project的build.gradle文件修改后的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Top-level build file where you can add configuration options common to all sub-projects/modules.
 
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.3'
 
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
 
allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
    }
}
 
task clean(type: Delete) {
    delete rootProject.buildDir
}
APP的build.gradle文件修改后的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
apply plugin: 'com.android.application'
 
android {
    compileSdkVersion 27
    buildToolsVersion "27.0.3"
    defaultConfig {
        applicationId "android.example.com.tflitecamerademo"
        // Required by Camera2 API.
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 
    }
    lintOptions {
        abortOnError false
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    aaptOptions {
        noCompress "tflite"
    }
 
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
 
repositories {
    maven {
        url 'https://google.bintray.com/tensorflow'
    }
}
 
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    implementation 'com.android.support:design:27.1.1'
    implementation 'com.android.support:support-annotations:27.1.1'
    implementation 'com.android.support:support-v13:27.1.1'
 
    implementation 'org.tensorflow:tensorflow-lite:1.9.0'
 
    testImplementation 'junit:junit:4.12'
}
 
def modelDownloadUrl = "https://storage.googleapis.com/download.tensorflow.org/models/tflite/mobilenet_v1_224_android_quant_2017_11_08.zip"
def localCache = "build/intermediates/mobilenet_v1_224_android_quant_2017_11_08.zip"
def targetFolder = "src/main/assets"
 
task downloadModel(type: DownloadUrlTask) {
    doFirst {
        println "Downloading ${modelDownloadUrl}"
    }
    sourceUrl = "${modelDownloadUrl}"
    target = file("${localCache}")
}
 
task unzipModel(type: Copy, dependsOn: 'downloadModel') {
    doFirst {
        println "Unzipping ${localCache}"
    }
    from zipTree("${localCache}")
    into "${targetFolder}"
}
 
// Ensure the model file is downloaded and extracted before every build
preBuild.dependsOn unzipModel
 
class DownloadUrlTask extends DefaultTask {
    @Input
    String sourceUrl
 
    @OutputFile
    File target
 
    @TaskAction
    void download() {
        ant.get(src: sourceUrl, dest: target)
    }
}
其中TensorFlow Lite的最新版本库是:

1
org.tensorflow:tensorflow-lite:1.9.0
最新的里面有setNumThreads()方法的实现。

4、运行demo

如果有什么问题请QQ联系我。