tensorflow深度学习实战笔记(三):使用tensorflow lite把训练好的模型移植到手机端,编译成apk文件

目录

一、准备工作

1.1模型训练

1.2模型固化和pb转tflite

1.3下载tensorflow源码

1.4安装android studio

二、在Android studio中进行开发

2.1修改app的build.gradle文件

2.2导入自己的模型和标签并进行编译


tensorflow深度学习实战笔记(二):把训练好的模型进行固化,讲解了如何固化模型以及把pb模型转换为tflite模型,现在讲解如何用官方的demo把生成的ttlite模型移植到手机端。

一、准备工作

1.1模型训练

参考我的博客:tensorflow深度学习实战笔记(一):使用tensorflow slim自带的模型训练自己的数据

1.2模型固化和pb转tflite

参考我的博客:tensorflow深度学习实战笔记(二):把训练好的模型进行固化

1.3下载tensorflow源码

链接:https://github.com/tensorflow/models/tree/master/research/slim

1.4安装android studio

二、在Android studio中进行开发

在android studio打开tensorflow源码中的官方demo:tensorflow-master/tensorflow/contrib/lite/java

打开后可能会报错,要进行一定的修改

2.1修改app的build.gradle文件

修改后的内容如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    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"

        // Remove this block.
        //jackOptions {
         //   enabled true
        //}
    }
    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'
    }
    flatDir{
        dirs "libs"
    }
}

//此处要重点修改,不然会报错
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    //    exclude group: 'com.android.support', module: 'support-annotations'
    //})
    implementation 'com.android.support:appcompat-v7:25.2.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    implementation 'com.android.support:design:25.2.0'
    implementation 'com.android.support:support-annotations:27.1.1'
    implementation 'com.android.support:support-v13:25.2.0'
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'

    //compile(name:'tensorflow-lite-1.10.0', ext:'aar')
    //compile 'org.tensorflow:tensorflow-lite:+'

    testCompile '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)
    }

}
*/

2.2导入自己的模型和标签并进行编译

a)导入模型和标签

在assets文家夹下放置自己的pb文件和标签的txt文件

b)修改ImageClassifierFloatInception.java中的内容

案例中提供了两种分类器,一种是“浮点模型”:ImageClassifierFloatInception,另一种是“量化模型”:ImageClassifierQuantizedMobileNet,此处我们使用浮点模型进行移植,因此我们只修改ImageClassifierFloatInception中的内容,量化模型也同理。

修改ImageClassifierFloatInception中的内容(共两处):

//修改一
 //把return "inceptionv3_slim_2016.tflite"修改为return "自己的tflite文件名",示例如下:
//return "inceptionv3_slim_2016.tflite";
    return "frozen_inceptionv3_v3.tflite";

//修改二
//把return "labels_imagenet_slim.txt"修改为return "自己的txt文件名",示例如下:
//return "labels_imagenet_slim.txt";
    return "labels.txt";

如果使用的是其他的模型,如mobilenet等,还得修改图片尺寸的参数:

//如果是mobilenet,修改为224,如果是inceptionv3,用默认的299就可以了
  protected int getImageSizeX() {
    return 224;
  }

  protected int getImageSizeY() {
    return 224;
  }

c)修改分类器的入口(Camera2BasicFragment.java文件中修改,只需修改一处)

//在文件Camera2BasicFragment.java中找到下面这串代码并进行修改
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    try {
      // create either a new ImageClassifierQuantizedMobileNet or an ImageClassifierFloatInception

        //默认的为下面这行
      //classifier = new ImageClassifierQuantizedMobileNet(getActivity());
        //修改为下面这行
      classifier = new ImageClassifierFloatInception(getActivity());

    } catch (IOException e) {
      Log.e(TAG, "Failed to initialize an image classifier.", e);
    }
    startBackgroundThread();
  }

d)至此,基本完成了配置工作,就可以进行编译了。可以点击run直接在手机上进行编译,也可以点击build直接编译成apk文件,然后拷贝到手机端即可进行愉快的玩耍了。

 

 

 

展开阅读全文

没有更多推荐了,返回首页