由于很久没有接触过Android开发,而且最早用的是eclipse,所以这个demo在android studio上的搭建过程,真的是踩了不少坑。记录这篇文章,纯粹是给自己一点收获。
环境搭建的过程,还是需要一点Android Studio的使用基础的,包括gradle同步、ndk、sdk之类的,另外由于需要在线下载资源,所以准备一个网络畅通的VPN。
一、基础环境
Windows 10系统、Android studio 3.1.2、tensorflow1.10.0、gradle版本为4.4
sdk和ndk的版本如下:
Android SDK Build-Tools
二、需要修改的文件:
(1)Demo项目下的build.gradle文件
进行如下修改:
(2)Demo/app文件下的build.gradle文件
android{ ... }中需要修改的部分:
repositories{ ... }和dependencies{}需要修改的部分,如下图,主要是用于 a) 解决tensorflow-lite:0.0.0-nightly无法下载的情况 b) 依赖项与sdk版本保持一致的问题 c) gradle3.0.0版本以上的依赖默认为implementation,而不是之前的gradle2+版本的compile。
(1)手动下载tensorflow-lite:0.0.0-nightly.aar。
(2)拷贝tensorflow-lite:0.0.0-nightly.aar文件到app/libs目录下(如果不存在libs目录,则自己手动添加一个);
(3)在app下的bulid.gradle中repositories添加:
flatDir{dirs " libs"}代码,
dependencies中添加:
compile fileTree(dir: 'libs', include: ['*.jar']):
compile(name:' tensorflow-lite:0.0.0-nightly', ext:'aar')
dependencies中注释掉:compile compile 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
三、同步gradle文件:
点击同步gradle的按钮,如果没有报错,则android studio “Run” app是可以执行的,否则该按钮是灰色的,不能执行。
四、源码分析
整个demo包含6个java文件:
其中:
-AutoFitTextureView:一个自定义的View;
-CameraActivity: 整个app的入口activity,这个activity只做了一件事,就是加载了一个fragment;
- Camera2BasicFragment: 入口activity中加载的fragment,其中实现了所有跟UI相关的代码;首先在onActivityCreated中,初始化了一个ImageClassifier对象,此类是整个demo的核心,用于加载模型并实现推理运算功能。然后开启了一个后台线程,在线程中反复地对从摄像头获取的图像进行分类操作。
-ImageClassifier:是一个抽象类,demo最重要的部分,但只有两个函数比较重要,一个是构造函数
-ImageClassifierFloatInception为浮点型子类,基类为ImageClassifier,对应的浮点模型为assets资源下的7_float.tflite
-ImageClaaifierQuantizedMobileNet为量化型子类,基类为ImageClassifier,对应的数字量化模型为assets资源下的7.tflite