之前写了android demo在手机上的运用,但是模型都是官方给的,想要替换成自己的模型,所以尝试了下将自己训练的yolo模型来替换demo给的模型。
首先,darknet的训练和.weight文件到.pb文件的转化,以及android demo的实现见之前的博客。在此不再叙述sdk,nkd等配置问题,且直接使用.pb文件。其次,默认已安装android studio。
(1)终端进入(android安装目录)/bin,输入./stuodio.sh
开启android studio
(2)点击new,import project导入(tensorflow所在路径)/tensorflow/examples/android文件夹
(可连接手机先run,保证demo能够正常运行后再行修改)
(3)将build.gradle中68行的bazelLocation改为自己bazel的路径:def bazelLocation = '/home/seven/bin/bazel'
185行apply from: "download-models.gradle"
注释掉,并在第112行,增加//*/
(不然后面的内容都被当做注释了):
if (nativeBuildSystem == 'bazel' || nativeBuildSystem == 'makefile') {
// TensorFlow Java API sources.
java {
srcDir '../../java/src/main/java'
exclude '**/examples/**'
//*/
}
// Android TensorFlow wrappers, etc.
java {
最后,将第76行开始的内容改为自己需要的版本号:
android {
compileSdkVersion 25
buildToolsVersion "26.0.1"
if (nativeBuildSystem == 'cmake') {
defaultConfig {
applicationId = 'org.tensorflow.demo'
minSdkVersion 21
targetSdkVersion 25
ndk {
abiFilters "${cpuType}"
}
(4)将转化得到的.pb文件放在(tensorflow所在路径)/tensorflow/examples/android/assets文件夹内,为方便起见,可将此.pb重命名为graph-tiny-yolo-voc.pb。若文件夹中已存在此文件名的文件,删除之。
(5)该项目将一次性生成三个app,因为我只需要detect一个,在AndroidManifest.xml中删除关于另外的两个activity,修改后的文件如图
(6)打开(tensorflow所在路径)/tensorflow/examples/android/src/org/tensorflow/demo中的DetectorActivity.java,修改其中的第78行的false改为true
private static final boolean USE_YOLO =true;
(7)打开相同目录下的TensorFlowYoloDetector.java,将其中的labels改为自己的类别,我的类别名为QR_code:
private static final String[] LABELS = {
"QR_code"
};
并修改NUM_CLASSES为你的类别数,我的为1类:private static final int NUM_CLASSES = 1;
(8)run! 大功告成!
==============================================================完美的分割线
2017年8月,tensorflow对android demo作出了更新,不仅适用于yolo,也适用于其object_detection中的ssd_mobilenets,因此代码发生些许改变,想要移植yolo,略做改动即可:
(1)-(5)不变
(6) 打开(tensorflow所在路径)/tensorflow/examples/android/src/org/tensorflow/demo中的DetectorActivity.java,将第86行由
private static final DetectorMode MODE = DetectorMode.TF_OD_API;
改为
private static final DetectorMode MODE = DetectorMode.YOLO;
(7)(8)同之前
(9) 如此安装的tf detect没有方框,打开tensorflow/tensorflow/example/android/src/org/tensorflow/demo中的CameraActivity.java,将其中的第300行和301行注释,并在后面加上一句代码,如下
//useCamera2API = isHardwareLevelSupported(characteristics,
// CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL);
useCamera2API = true;
LOGGER.i("Camera API lv2?: %s", useCamera2API);
return cameraId;
大功告成!