第三课:把tensorflow,模型和测试数据导入Android工程

时间:2022-05-04
本文章向大家介绍第三课:把tensorflow,模型和测试数据导入Android工程,主要内容包括导入 Inference Interface、导入 Pre-trained Model、导入测试数据、关键的代码、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

关于Android项目的创建这里就不做赘述了,我们直接进入主题,看下如何把机器学习库和训练的模型导入一个安卓应用中。

导入 Inference Interface

在上一课时中我们下载了 Inference Interface 的 nightly build 的 AAR 文件,这个AAR其实就是库文件,需要把这个文件导入到项目中,通常会把这个 AAR 文件放在 app/libs 下面:

为了导入这个 AAR,首先需要在 app/build.gradle 中声明一个本地的 flatDir 仓库:

   repositories {
        flatDir {
           dirs 'libs'
      }
    }

然后指定依赖:

compile name: 'tensorflow', ext: 'aar'

最后再做一个 Project Sync 就完成了 Inference Interface 的导入,完整的 app/build.gradle 应该是这样的:

    ....
    repositories {
       flatDir {
          dirs 'libs'
       }
    }
    android{
      .....
    }
    dependencies{
        .....
        compile name: 'tensorflow', ext: 'aar'
        .....
    }

导入 Pre-trained Model

在上一课时中已经下载了 Pre-trained model 的二进制包,解压缩这个包,会发现里面有这些文件:

其中model.ckpt.* 是我们在训练自己的模型时会用到的文件(下一系列课程我们会专门讲解如何训练自己的模型),这里暂时忽略;frozen_inference_graph.pb 文件正是我们需要的,开箱即用的模型文件,把这个文件作为一个 asset 导入项目中。在 Android Studio 中,单击 New | Folder | Assets Folder 命令创建一个 assets 目录,将 frozen_inference_graph.pb 复制到 assets 目录中,重命名为 model.pb。

导入测试数据

在机器学习的世界里面,绝大部分的输入和输出数据都是数字,换句话来说,当训练这个识别模型的时候,你不会告诉它这张图片上的是人,而是告诉它这个图片上面的物体代号是 1;模型在输出识别结果的时候,也不会输出人,汽车这样的字符,而是输出 1、2、3 这样的数字,那么这些数字代表的是什么,去哪里找这样的对应关系呢?

首先我们要清楚一点,模型和训练数据要存在一一对应关系。要么是使用的数据提前训练了模型,要么数据当下训练模型。因为TensorFlow Object Detection API 中的模型训练时使用的是 MS COCO 的物体数据集合,所以我们可以在这里(关注公众号,后台留言提供下载链接)下载到相应的标签文件, 我们打开这个文件:

0: unlabeled
1: person
2: bicycle
3: car
4: motorcycle
5: airplane
6: bus
7: train
8: truck
9: boat
10: traffic light
11: fire hydrant
12: street sign
13: stop sign
14: parking meter
15: bench
16: bird
17: cat
18: dog
19: horse
20: sheep
21: cow
22: elephant
23: bear

把这个文件也存到 assets 目录中,重命名为 labels.txt,现在 assets 目录应该是这样的:

关键的代码

现在相关的资源都导入到项目里面了,接下来我们写一点代码把模型和数据加载起来!

想一想我们需要做哪些工作:

  1. 加载模型 model.pb,获取一个 TensorFlowInferenceInterface 来进行后续操作。
TensorFlowInferenceInterface inferenceInterface = new TensorFlowInferenceInterface(getAssets(), "model.pb");

获取到 TensorFlowInferenceInterface 的对象之后就可以在这个对象上面输入图片数据并获取识别结果了。夸张的讲人工智能科学家大牛们现在研究的就是如何实现这个接口,这里我们先不探究原理,只会用就好,以后的系列课程我们慢慢的去剖析机器学习的原理。

  1. 把数据集 labels.txt 的内容读到数组中,供查询识别结果中的物体名称;
    List<String> labels = new ArrayList<>();
    InputStream labelsInput = getAssets().open("labels.text");
    BufferedReader br = new BufferedReader(new InputStreamReader(labelsInput));
    String line;
    while ((line = br.readLine()) != null) {
          labels.add(line);
    }
    br.close();

至此,相信你应该了解了tensorflow框架,训练模型,测试数据是如何在一个应用程序中实现的。是不是很简单!下一课程让我们一起完成一个完整的apk程序,也会把完成的源代码后台发给大家!