目录
一、准备工作
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模型移植到手机端。
参考我的博客:tensorflow深度学习实战笔记(一):使用tensorflow slim自带的模型训练自己的数据
参考我的博客:tensorflow深度学习实战笔记(二):把训练好的模型进行固化
链接:https://github.com/tensorflow/models/tree/master/research/slim
在android studio打开tensorflow源码中的官方demo:tensorflow-master/tensorflow/contrib/lite/java
打开后可能会报错,要进行一定的修改
修改后的内容如下:
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)
}
}
*/
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文件,然后拷贝到手机端即可进行愉快的玩耍了。