在物联网中应用机器学习(代码片段)

author author     2023-01-15     410

关键词:

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由未来守护者发表于云+社区专栏

本项目探讨如何将机器学习(Machine learning)应用到物联网(IoT,Internet of Things)中。我们将使用 Android Things 作为我们的物联网平台,并且采用 Google TensorFlow 作为我们的机器学习引擎。如今,机器学习与物联网都是技术话题中的大热门。下面是维基百科上对机器学习的一个简单定义

机器学习是计算机科学中的一个领域,它使计算机系统能够利用数据进行 “学习”(即逐步提高特定任务的性能),而不需要进行显式编程(Explicitly programmed)。

换句话说,在进行训练步骤以后,系统就可以预测结果(即使这不是专门为这些结果进行编程的)。另一方面,我们都了解物联网以及连接设备的概念。最有前途的话题之一便是如何将机器学习应用于物联网之中,以构建能够 “学习” 的专家系统。此外,该系统会运用这些知识来控制和管理实物。

下面列举一些应用到机器学习,以及物联网能产生重要价值的领域:

  • 预测维护(Predictive maintenance)中的工业物联网(IIoT,Industrial IoT)。
  • 在消费者物联网(Consumer IoT)中,机器学习可以使设备变得更加智能化,从而适应我们的习惯。

在本教程中,我们将探索如何使用 Android Things 和 TensorFlow 将机器学习应用到物联网中。这一 Android Things 物联网项目背后的基本思想就是,探索如何构建一个能够识别一些基本形状(比如箭头)并被控制的机器人小车(Robot car)。我们已经介绍过如何使用 Android Things 构建机器人小车,我建议您在开始此项目之前先阅读那篇教程。

本次机器学习和物联网项目主要涵盖以下主题:

  • 如何使用 Docker 配置 TensorFlow 环境
  • 如何训练 TensorFlow 系统
  • 如何集成 TensorFlow 与 Android Things
  • 如何使用 TensorFlow 输出结果来控制机器人小车

本项目衍生自 Android Things TensorFlow 图像分类器

我们开始吧!

如何在 Tensorflow 中创建一个图像分类器

在开始之前,我们有必要先安装并配置好 TensorFlow 环境。我并非机器学习专家,所以我需要找一些速成的东西并准备好使用,以便我们可以构建 TensorFlow 图像分类器。因此,我们可以使用 Docker 来运行一个搭载了 TensorFlow 的映像。照着以下步骤进行:

1. 克隆 TensorFlow 仓库:

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

2. 创建一个目录(/tf-data),该目录将保存我们在项目中需要用到的所有文件。

3. 运行 Docker:

docker run -it --volume /tf-data:/tf-data --volume /tensorflow:/tensorflow  
--workdir /tensorflow tensorflow/tensorflow:1.5.0 bash

使用这些命令,我们就可以运行一个交互式 TensorFlow 环境并增加(Mount)一些我们将在项目中使用到的目录。

如何训练 TensorFlow

在 Android Things 系统能够识别图像之前,我们有必要先训练 TensorFlow 引擎,以构建其模型。以此为由,收集一些图片是有必要的。如前所述,我们希望使用箭头来控制 Android Things 机器人小车 —— 所以我们必须收集至少四种类型的箭头:

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

为训练该系统,我们有必要对这四种不同的图像类别创建一个“知识库”。在 /tf-data 中一个名为 images 的目录下创建四个目录,命名如下:

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

现在是时候去搜集图像资源了。我使用的是 Google 图片搜索,您也可以使用其他方法进行搜集。为了简化图片下载过程,您应该安装 Chrome 插件,它能够一键下载所有图片。可别忘了,您下载的图像越多,其训练过程(Training process)越好(即使创建模型的时间可能会有所增加)。

打开浏览器,开始查找以下四类图像:

技术分享图片

每个类别我分别下载了 80 张图。我并不关心图片的扩展。

一旦所有类别都有其图像,请按照以下步骤操作(在 Docker 界面中):

python /tensorflow/examples/image_retraining/retrain.py  
--bottleneck_dir=tf_files/bottlenecks --how_many_training_steps=4000 --output_graph=/tf-data/retrained_graph.pb --output_labels=/tf-data/retrained_labels.txt --image_dir=/tf-data/images

这操作可能需要花费一些时间,所以要耐心等待。最后,在你的文件夹 /tf-data 中应有两个文件:

  1. retrained_graph.pb
  2. retrained_labels.txt

第一个文件包含我们的模型,这是 TensorFlow 训练过程的结果。而第二个文件则包含了与我们的四个图像类别相关的标签。

如何测试 Tensorflow 模型

如果你想测试模型,以检查一切是否正常,你可以使用以下命令:

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

优化模型

在能够使用这个 TensorFlow 模型到 Android Things 项目中之前,我们有必要优化它:

python /tensorflow/python/tools/optimize_for_inference.py --input=/tf-data/retrained_graph.pb --output=/tf-data/opt_graph.pb --input_names="Mul" --output_names="final_result"

这就是我们的模型。我们将使用此模型将机器学习应用于物联网(即集成 Android Things 与 TensorFlow)。其目标是为 Android Things 应用提供智能识别箭头图像,并作出相应反应,从而控制机器人小车的方向。

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

如何使用 Android Things 和 TensorFlow 将机器学习应用到物联网中

一旦 TensorFlow 数据模型准备就绪,我们就可以进入下一步:如何集成 Android Things 与 TensorFlow。为达成这一目的,我们可以将此任务分为两步:

  1. 硬件部分,我们将电机和其他外围设备(Peripheral)连接到 Android Things 板上
  2. 实现应用程序

Android Things 原理图

在深入探讨如何连接外围设备之前,我们先看看下面这个 Android Things 项目中使用的组件列表:

  1. Android Things 板(树莓派 3,Raspberry Pi 3)
  2. 树莓派相机
  3. 一个 LED 灯
  4. LN298N 双H桥(用以控制电机)
  5. 带两个轮子的机器人小车底盘

我不在此介绍如何使用 Android Things 控制电机,因为我们已经在之前的文章中介绍过这一点。

以下是原理图:

技术分享图片

上图中,相机组件并未表现出来。其最终的结果如下:

技术分享图片

基于 TensorFlow 实现 Android Things App

最后一步便是实现 Android Things 应用程序。为此,我们可以重用 GitHub 上名为 TensorFlow 图像分类器示例的示例项目。在开始之前,先克隆 GitHub 仓库,以便您可以修改源代码。

该 Android Things 应用与原来的应用有所不同,在于:

  1. 它不使用按钮来启动相机捕捉图像
  2. 它使用不同的模型
  3. 它使用一个闪烁的 LED 进行通知,摄像机在 LED 停止闪烁后拍摄照片
  4. 它在 TensorFlow 检测到图像(箭头)时控制电机。此外,在从步骤 3 开始循环之前,先打开电机 5 秒

要处理闪烁的 LED,请使用以下代码:

private Handler blinkingHandler = new Handler();
private Runnable blinkingLED = new Runnable() 
  @Override
  public void run() 
    try 
     // If the motor is running the app does not start the cam
     if (mc.getStatus())
       return ;
     Log.d(TAG, "Blinking..");
     mReadyLED.setValue(!mReadyLED.getValue());
     if (currentValue <= NUM_OF_TIMES) 
       currentValue++;
       blinkingHandler.postDelayed(blinkingLED, 
                       BLINKING_INTERVAL_MS);
     
     else 
      mReadyLED.setValue(false);
      currentValue = 0;
      mBackgroundHandler.post(mBackgroundClickHandler);
     
    catch (IOException e) 
     e.printStackTrace();
   
  
;

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

现在有必要关注如何根据检测到的图像来控制电机。修改方法如下:

@Override
public void onImageAvailable(ImageReader reader) 
  final Bitmap bitmap;
   try (Image image = reader.acquireNextImage()) 
     bitmap = mImagePreprocessor.preprocessImage(image);
   
   final List<Classifier.Recognition> results = 
      mTensorFlowClassifier.doRecognize(bitmap);
   Log.d(TAG, 
    "Got the following results from Tensorflow: " + results);
   // Check the result
   if (results == null || results.size() == 0) 
     Log.d(TAG, "No command..");
     blinkingHandler.post(blinkingLED);
     return ;
    
    Classifier.Recognition rec = results.get(0);
    Float confidence = rec.getConfidence();
    Log.d(TAG, "Confidence " + confidence.floatValue());
    if (confidence.floatValue() < 0.55) 
     Log.d(TAG, "Confidence too low..");
     blinkingHandler.post(blinkingLED);
     return ;
    
    String command = rec.getTitle();
    Log.d(TAG, "Command: " + rec.getTitle());
    if (command.indexOf("down") != -1)
       mc.backward();
    else if (command.indexOf("up") != -1)
       mc.forward();
    else if (command.indexOf("left") != -1)
       mc.turnLeft();
    else if (command.indexOf("right") != -1)
       mc.turnRight();

在这种方法中,当 TensorFlow 返回匹配捕获图像的可能标签后,应用程序会将结果与可能的方向进行比较,从而控制电机。

最后,是时候使用在刚开始时创建的模型了。拷贝 assets 文件夹下的 opt_graph.pb 与 reatrained_labels.txt 文件,并替换现有文件。

打开 Helper.java 并修改以下几行:

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

运行应用程序,试试向相机展示箭头,并检查结果。机器人小车必须按照所示的箭头进行移动。

小结

在本教程的最后,我们介绍了如何运用 Android Things 与 TensorFlow 将机器学习应用到物联网中。我们可以使用图像控制机器人小车,并根据显示的图像移动机器人小车。

相关阅读
【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

此文已由作者授权腾讯云+社区发布,更多原文请点击

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区

玩转pubsubclientmqtt库(代码片段)

...系列中,博主一直使用HTTP协议。HTTP连接属于短连接,而在物联网应用中,广泛应用的却是MQTT协议。所以,本篇我们将学习Arduino平台上的MQTT实现库——PubSubClient。2.MQTT协议2.1简介????MQTT协议(MessageQueuingTelemetryTransport),翻译过... 查看详情

使用javascript在物联网设备上实现音频播放(代码片段)

硬件和环境准备基于HaaS开发板,使用JavaScript实现音频播放。环境准备请参考HaaSJS轻应用开发环境搭建功能介绍audioplayer是HaaS轻应用的音频播放器组件,可以播放本地和在线音频,支持wav和mp3两种音频格式。功能使用... 查看详情

什么类型的nosql数据库比较适合应用在物联网应用系统中?

在物联网应用系统中使用NoSQL数据库是一个不错的选择,因为NoSQL数据库可以处理海量、多变的数据,并且拥有优秀的横向扩展性。以下是适合物联网应用系统的几种NoSQL数据库类型:1.文档型数据库:文档型数据库支持存储和查... 查看详情

应用在物联网中的lpwan有哪些优势

物联网的增长会影响企业及其接入的网络。物联网的业务方面对企业成本、收入和利润至关重要。经济地连接数十亿个物联网设备是一项挑战。引入低功耗广域(LPWA)蜂窝技术就是一种解决方案。??服务物联网设备??无线物联网设... 查看详情

爆肝一周,用python在物联网设备上写了个智能语音助手-阿里云智能对话机器人

...配置知识库并进行发布。请参考《爆肝一周,用Python在物联网设备上写了个智能语音助手》中案例体验小节进行体验。1.开通智能对话机器人服务进入智能对话机器人官网点击“立即开通”。跳转到购买页面 查看详情

机器学习基础---应用实例(图片文字识别)和总结(代码片段)

一:问题描述和流程图将介绍一种机器学习的应用实例:照片OCR技术,介绍它的原因:(1)首先,展示一个复杂的机器学习系统是如何被组合起来的;(2)接着,介绍一下机器学习流水线的有关概念以及如何分配资源来对下一... 查看详情

迅为4412开发平台zigbee模块在物联网智能家居中的应用

 物联网智能家居的发展物联网随着互联网的发展,可以通过互联网实现物和物的互联,就有了物联网的概念。传统家居电器 有了物联网之后,在家居电器范围中,就是通过物联网技术将家中的各种设备连接到一起,家居... 查看详情

tools-低代码开发平台

低代码开发平台mendixivxIoTStudio链接:国内外平台对比链接:低代码平台利弊链接:物联网低代码平台IoTStudio链接:在物联网APP开发中的应用mendix官网下载学习地址ivx官网学习地址IoTStudio官网学习地址 查看详情

机器学习模型实例及其应用(代码片段)

机器学习模型及其应用本次以房价预测项目为例。一、明确机器学习的目的理解问题:了解数据集中每个变量特征的含义以及对最终目的的重要程度理解主要特征:项目目的变量。在本次项目中主要特征为----房价#导入需... 查看详情

lora和lorawan无线技术在物联网的应用

...础设施效率、防灾等。”LoRaWAN的用途是什么?LoRaWAN在物联网和智慧城市部署中具有多重用途和功能。LoRaWAN针对低功耗进行了优化,旨在从单一的网关安装扩展到拥有数十亿设备的大型 查看详情

python机器学习《机器学习python实践》整理,sklearn库应用详解(代码片段)

TableofContents1  初始1.1  初识机器学习1.2  python机器学习的生态圈1.3  第一个机器学习项目1.3.1  机器学习中的helloworld项目1.3.2  导入数据1.3.3  概述数据1.3.4  数据可视化1.3.5  评估算法1.3.5.1  分离评估数据集1.3.5.2  创... 查看详情

机器学习基石概述(代码片段)

目录写在前面1.什么是机器学习2.ML在日常生活中的应用3.ML的简单组成4.ML与其他领域的联系写在前面本节内容主要是介绍什么是机器学习,以及机器学习在我们日常生活中的常见应用场景,它与我们的生活并不是分离开来... 查看详情

应用在机器学习中的聚类数据集产生方法(代码片段)

简介:本文根据机器学习中常用的聚类数据集生成方法中的内容进行编辑实验和整理而得。并在之后对于聚类数据库生成进行不断的补充。关键词:机器学习,聚类算法,数据集合 §01直接生成  这类方法是利... 查看详情

区块链技术在物联网中的应用概述

 摘要:物联网正在将传统工业重塑为以数据驱动决策为特征的智能工业。然而,物联网本身的特性带来了一系列挑战,如去中心化、互操作性差、存在隐私和安全漏洞等。区块链技术的出现为物联网应对挑战提供了新的解决... 查看详情

移动信息安全如何在物联网得到应用?

...说给各行各业带来了很多便利。那么,移动信息安全在物联网行业的应用情况如何呢?一、应用于管理平台根据移动信息安全的发展情况,其主要功能是对物联网用 查看详情

#创作者激励#物联网协议mqtt(代码片段)

...中,作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。如:机器与机器(M2M)通信和物联网(IoT)。其在通过链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些... 查看详情

机器学习:随机梯度下降法(线性回归中的应用)(代码片段)

一、随机梯度下降法基础 #梯度中的每一项计算:,要计算所有样本(共m个); #批量梯度下降法的思路:计算损失函数的梯度,找到优化损失函数的最近距离,或者称最直接的方向;  #批量梯度下降法的梯度计算:... 查看详情

python机器学习算法学习的步骤机器学习的应用及流程(获取数据特征工程模型模型评估)(代码片段)

...学基础一步步的推导出来的。需要编程语言把学到的知识应用到实践中,pyth 查看详情