如何使用Android Things和TensorFlow在物联网上应用机器学习

作者: Francesco Azzola 2018-08-02 08:45:48

如何使用Android Things和TensorFlow在物联网上应用机器学习

探索如何将 Android Things 与 Tensorflow 集成起来,以及如何应用机器学习到物联网系统上。学习如何在装有 Android Things 的树莓派上使用 Tensorflow 进行图片分类。

这个项目探索了如何将机器学习应用到物联网上。具体来说,物联网平台我们将使用 Android Things,而机器学习引擎我们将使用 Google TensorFlow

现如今,Android Things 处于名为 Android Things 1.0 的稳定版本,已经可以用在生产系统中了。如你可能已经知道的,树莓派是一个可以支持 Android Things 1.0 做开发和原型设计的平台。本教程将使用 Android Things 1.0 和树莓派,当然,你可以无需修改代码就能换到其它所支持的平台上。这个教程是关于如何将机器学习应用到物联网的,这个物联网平台就是 Android Things Raspberry Pi。

物联网上的机器学习是最热门的话题之一。要给机器学习一个最简单的定义,可能就是 维基百科上的定义

机器学习是计算机科学中,让计算机不需要显式编程就能去“学习”(即,逐步提升在特定任务上的性能)使用数据的一个领域。

换句话说就是,经过训练之后,那怕是它没有针对它们进行特定的编程,这个系统也能够预测结果。另一方面,我们都知道物联网和联网设备的概念。其中前景最看好的领域之一就是如何在物联网上应用机器学习,构建专家系统,这样就能够去开发一个能够“学习”的系统。此外,还可以使用这些知识去控制和管理物理对象。在深入了解 Android Things 的细节之前,你应该先将其安装在你的设备上。如果你是***次使用 Android Things,你可以阅读一下这篇如何在你的设备上安装 Android Things 的教程。

这里有几个应用机器学习和物联网产生重要价值的领域,以下仅提到了几个有趣的领域,它们是:

  • 在工业物联网(IIoT)中的预见性维护
  • 消费物联网中,机器学习可以让设备更智能,它通过调整使设备更适应我们的习惯

在本教程中,我们希望去探索如何使用 Android Things 和 TensorFlow 在物联网上应用机器学习。这个 Adnroid Things 物联网项目的基本想法是,探索如何去构建一个能够识别前方道路上基本形状(比如箭头)并控制其道路方向的无人驾驶汽车。我们已经介绍了 如何使用 Android Things 去构建一个无人驾驶汽车,因此,在开始这个项目之前,我们建议你去阅读那个教程。

这个机器学习和物联网项目包含如下的主题:

  • 如何使用 Docker 配置 TensorFlow 环境
  • 如何训练 TensorFlow 系统
  • 如何使用 Android Things 去集成 TensorFlow
  • 如何使用 TensorFlow 的成果去控制无人驾驶汽车

这个项目起源于 Android Things TensorFlow 图像分类器

我们开始吧!

如何使用 Tensorflow 图像识别

在开始之前,需要安装和配置 TensorFlow 环境。我不是机器学习方面的专家,因此,我需要找到一些快速而能用的东西,以便我们可以构建 TensorFlow 图像识别器。为此,我们使用 Docker 去运行一个 TensorFlow 镜像。以下是操作步骤:

1、 克隆 TensorFlow 仓库:

  1. git clone https://github.com/tensorflow/tensorflow.git
  2. cd /tensorflow
  3. git checkout v1.5.0

2、 创建一个目录(/tf-data),它将用于保存这个项目中使用的所有文件。

3、 运行 Docker:

  1. docker run -it \
  2. --volume /tf-data:/tf-data \
  3. --volume /tensorflow:/tensorflow \
  4. --workdir /tensorflow tensorflow/tensorflow:1.5.0 bash

使用这个命令,我们运行一个交互式 TensorFlow 环境,可以挂载一些在使用项目期间使用的目录。

如何训练 TensorFlow 去识别图像

在 Android Things 系统能够识别图像之前,我们需要去训练 TensorFlow 引擎,以使它能够构建它的模型。为此,我们需要去收集一些图像。正如前面所言,我们需要使用箭头来控制 Android Things 无人驾驶汽车,因此,我们至少要收集四种类型的箭头:

  • 向上的箭头
  • 向下的箭头
  • 向左的箭头
  • 向右的箭头

为训练这个系统,需要使用这四类不同的图像去创建一个“知识库”。在 /tf-data 目录下创建一个名为 images 的目录,然后在它下面创建如下名字的四个子目录:

  • up-arrow
  • down-arrow
  • left-arrow
  • right-arrow

现在,我们去找图片。我使用的是 Google 图片搜索,你也可以使用其它的方法。为了简化图片下载过程,你可以安装一个 Chrome 下载插件,这样你只需要点击就可以下载选定的图片。别忘了多下载一些图片,这样训练效果更好,当然,这样创建模型的时间也会相应增加。

扩展阅读

打开浏览器,开始去查找四种箭头的图片:

TensorFlow image classifier

TensorFlow image classifier

每个类别我下载了 80 张图片。不用管图片文件的扩展名。

为所有类别的图片做一次如下的操作(在 Docker 界面下):

  1. python /tensorflow/examples/image_retraining/retrain.py \
  2. --bottleneck_dir=tf_files/bottlenecks \
  3. --how_many_training_steps=4000 \
  4. --output_graph=/tf-data/retrained_graph.pb \
  5. --output_labels=/tf-data/retrained_labels.txt \
  6. --image_dir=/tf-data/images

这个过程你需要耐心等待,它需要花费很长时间。结束之后,你将在 /tf-data 目录下发现如下的两个文件:

  1. retrained_graph.pb
  2. retrained_labels.txt

***个文件包含了 TensorFlow 训练过程产生的结果模型,而第二个文件包含了我们的四个图片类相关的标签。

如何测试 Tensorflow 模型

如果你想去测试这个模型,去验证它是否能按预期工作,你可以使用如下的命令:

  1. python scripts.label_image \
  2. --graph=/tf-data/retrained-graph.pb \
  3. --image=/tf-data/images/[category]/[image_name.jpg]

优化模型

在 Android Things 项目中使用我们的 TensorFlow 模型之前,需要去优化它:

  1. python /tensorflow/python/tools/optimize_for_inference.py \
  2. --input=/tf-data/retrained_graph.pb \
  3. --output=/tf-data/opt_graph.pb \
  4. --input_names="Mul" \
  5. --output_names="final_result"

那个就是我们全部的模型。我们将使用这个模型,把 TensorFlow 与 Android Things 集成到一起,在物联网或者更多任务上应用机器学习。目标是使用 Android Things 应用程序智能识别箭头图片,并反应到接下来的无人驾驶汽车的方向控制上。

如果你想去了解关于 TensorFlow 以及如何生成模型的更多细节,请查看官方文档以及这篇 教程

如何使用 Android Things 和 TensorFlow 在物联网上应用机器学习

TensorFlow 的数据模型准备就绪之后,我们继续下一步:如何将 Android Things 与 TensorFlow 集成到一起。为此,我们将这个任务分为两步来完成:

  1. 硬件部分,我们将把电机和其它部件连接到 Android Things 开发板上
  2. 实现这个应用程序

Android Things 示意图

在深入到如何连接外围部件之前,先列出在这个 Android Things 项目中使用到的组件清单:

  1. Android Things 开发板(树莓派 3)
  2. 树莓派摄像头
  3. 一个 LED 灯
  4. LN298N 双 H 桥电机驱动模块(连接控制电机)
  5. 一个带两个轮子的无人驾驶汽车底盘

我不再重复 如何使用 Android Things 去控制电机 了,因为在以前的文章中已经讲过了。

下面是示意图:

Integrating Android Things with IoT

Integrating Android Things with IoT

上图中没有展示摄像头。最终成果如下图:

Integrating Android Things with TensorFlow

Integrating Android Things with TensorFlow

使用 TensorFlow 实现 Android Things 应用程序

***一步是实现 Android Things 应用程序。为此,我们可以复用 Github 上名为 TensorFlow 图片分类器示例 的示例代码。开始之前,先克隆 Github 仓库,这样你就可以修改源代码。

这个 Android Things 应用程序与原始的应用程序是不一样的,因为:

  1. 它不使用按钮去开启摄像头图像捕获
  2. 它使用了不同的模型
  3. 它使用一个闪烁的 LED 灯来提示,摄像头将在 LED 停止闪烁后拍照
  4. 当 TensorFlow 检测到图像时(箭头)它将控制电机。此外,在第 3 步的循环开始之前,它将打开电机 5 秒钟。

为了让 LED 闪烁,使用如下的代码:

  1. private Handler blinkingHandler = new Handler();
  2. private Runnable blinkingLED = new Runnable() {
  3. @Override
  4. public void run() {
  5. try {
  6. // If the motor is running the app does not start the cam
  7. if (mc.getStatus())
  8. return ;
  9.  
  10. Log.d(TAG, "Blinking..");
  11. mReadyLED.setValue(!mReadyLED.getValue());
  12. if (currentValue <= NUM_OF_TIMES) {
  13. currentValue++;
  14. blinkingHandler.postDelayed(blinkingLED,
  15. BLINKING_INTERVAL_MS);
  16. }
  17. else {
  18. mReadyLED.setValue(false);
  19. currentValue = 0;
  20. mBackgroundHandler.post(mBackgroundClickHandler);
  21. }
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. };

当 LED 停止闪烁后,应用程序将捕获图片。

现在需要去关心如何根据检测到的图片去控制电机。修改这个方法:

  1. @Override
  2. public void onImageAvailable(ImageReader reader) {
  3. final Bitmap bitmap;
  4. try (Image image = reader.acquireNextImage()) {
  5. bitmap = mImagePreprocessor.preprocessImage(image);
  6. }
  7.  
  8. final List<Classifier.Recognition> results =
  9. mTensorFlowClassifier.doRecognize(bitmap);
  10.  
  11. Log.d(TAG,
  12. "Got the following results from Tensorflow: " + results);
  13.  
  14. // Check the result
  15. if (results == null || results.size() == 0) {
  16. Log.d(TAG, "No command..");
  17. blinkingHandler.post(blinkingLED);
  18. return ;
  19. }
  20.  
  21. Classifier.Recognition rec = results.get(0);
  22. Float confidence = rec.getConfidence();
  23. Log.d(TAG, "Confidence " + confidence.floatValue());
  24.  
  25. if (confidence.floatValue() &lt; 0.55) {
  26. Log.d(TAG, "Confidence too low..");
  27. blinkingHandler.post(blinkingLED);
  28. return ;
  29. }
  30.  
  31. String command = rec.getTitle();
  32. Log.d(TAG, "Command: " + rec.getTitle());
  33.  
  34. if (command.indexOf("down") != -1)
  35. mc.backward();
  36. else if (command.indexOf("up") != -1)
  37. mc.forward();
  38. else if (command.indexOf("left") != -1)
  39. mc.turnLeft();
  40. else if (command.indexOf("right") != -1)
  41. mc.turnRight();
  42. }

在这个方法中,当 TensorFlow 返回捕获的图片匹配到的可能的标签之后,应用程序将比较这个结果与可能的方向,并因此来控制电机。

***,将去使用前面创建的模型了。拷贝 assets 文件夹下的 opt_graph.pb 和 reatrained_labels.txt 去替换现在的文件。

打开 Helper.java 并修改如下的行:

  1. public static final int IMAGE_SIZE = 299;
  2. private static final int IMAGE_MEAN = 128;
  3. private static final float IMAGE_STD = 128;
  4. private static final String LABELS_FILE = "retrained_labels.txt";
  5. public static final String MODEL_FILE = "file:///android_asset/opt_graph.pb";
  6. public static final String INPUT_NAME = "Mul";
  7. public static final String OUTPUT_OPERATION = "output";
  8. public static final String OUTPUT_NAME = "final_result";

运行这个应用程序,并给摄像头展示几种箭头,以检查它的反应。无人驾驶汽车将根据展示的箭头进行移动。

总结

教程到此结束,我们讲解了如何使用 Android Things 和 TensorFlow 在物联网上应用机器学习。我们使用图片去控制无人驾驶汽车的移动。

物联网 机器学习 Tensorflow
上一篇:如何利用DeepFM算法设计推荐系统 下一篇:区块链技术该如何解决人工智能存在的弊端?
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

基于机器学习的自动漏洞修复分析方法

。在本文中,我们提出了一个基于机器学习的自动化框架来自动化电力公司的修复决策分析。我们将其应用于一家电力公司,并对从该公司获得的两个真实运行数据集进行了大量实验。结果表明,该解决方案具有很高的有效性。

佚名 ·  19h前
解锁人工智能、机器学习和深度学习

深度学习是机器学习的子集,而机器学习又是人工智能的子集,但是这些名称的起源来自一个有趣的历史。此外,还有一些引人入胜的技术特征,可将深度学习与其他类型的机器学习区分开来……对于技能水平较高的ML、DL或AI的任何人来说,这都是必不可少的工作知识。

佚名 ·  20h前
物联网和人工智能是提升企业生产力的完美合作伙伴

从技术上讲,物联网和人工智能紧密关联。一方面,物联网可通过互联网连接获得高质量的见解,另一方面,人工智能则有能力根据智能分析做出明智的决策。

iothome ·  21h前
你只需要这三个机器学习工具

在这件作品中,我们将讨论唯一需要的3个机器学习工具,使您的团队在产品中应用机器学习方面取得成功。

闻数起舞 ·  21h前
开发板能这么用?美国学者用Jetson Nano支持假肢,控制每一根手指

在一篇新论文中,来自明尼苏达大学等机构的研究者提出了一种基于嵌入式深度学习控制的神经假肢实现。

佚名 ·  3天前
机器学习如何影响系统设计:Learned Index Structures浅析

本文简要介绍了Learned Index Structures的实现和优缺点,希望可以给大家带来一些系统设计的启发和思路。

作者Victor ·  3天前
吴恩达的二八定律:80%的数据+20%的模型=更好的机器学习

一个机器学习团队80%的工作应该放在数据准备上,确保数据质量是最重要的工作,每个人都知道应该如此做,但没人在乎。

新智元 ·  3天前
机器学习在铁路缺陷检测中的实际应用

本文介绍了在铁轨的超声波检测过程中有效使用机器学习技术自动检测缺陷的经验,并提出了一种使用数学建模为神经网络创建训练数据集的有效方法,为实际缺陷图的识别提供了更高精度的指标。文中训练神经网络运算的原型实例,其实际缺陷图的预测精度高达92%。

李睿 ·  3天前
Copyright©2005-2021 51CTO.COM 版权所有 未经许可 请勿转载