yolo模型移植到android手机端

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010122972/article/details/77380785

之前写了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;

大功告成!

阅读更多

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