欢迎你们前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~html
本文由 将来守护者发表于 云+社区专栏
本项目探讨如何将机器学习(Machine learning)应用到物联网(IoT,Internet of Things)中。咱们将使用 Android Things 做为咱们的物联网平台,而且采用 Google TensorFlow 做为咱们的机器学习引擎。现在,机器学习与物联网都是技术话题中的大热门。下面是维基百科上对机器学习的一个简单定义:java
机器学习是计算机科学中的一个领域,它使计算机系统可以利用数据进行 “学习”(即逐步提升特定任务的性能),而不须要进行显式编程(Explicitly programmed)。python
换句话说,在进行训练步骤之后,系统就能够预测结果(即便这不是专门为这些结果进行编程的)。另外一方面,咱们都了解物联网以及链接设备的概念。最有前途的话题之一即是如何将机器学习应用于物联网之中,以构建可以 “学习” 的专家系统。此外,该系统会运用这些知识来控制和管理实物。android
下面列举一些应用到机器学习,以及物联网能产生重要价值的领域:git
在本教程中,咱们将探索如何使用 Android Things 和 TensorFlow 将机器学习应用到物联网中。这一 Android Things 物联网项目背后的基本思想就是,探索如何构建一个可以识别一些基本形状(好比箭头)并被控制的机器人小车(Robot car)。咱们已经介绍过如何使用 Android Things 构建机器人小车,我建议您在开始此项目以前先阅读那篇教程。github
本次机器学习和物联网项目主要涵盖如下主题:docker
本项目衍生自 Android Things TensorFlow 图像分类器。编程
咱们开始吧!浏览器
在开始以前,咱们有必要先安装并配置好 TensorFlow 环境。我并不是机器学习专家,因此我须要找一些速成的东西并准备好使用,以便咱们能够构建 TensorFlow 图像分类器。所以,咱们可使用 Docker 来运行一个搭载了 TensorFlow 的映像。照着如下步骤进行:bash
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)一些咱们将在项目中使用到的目录。
在 Android Things 系统可以识别图像以前,咱们有必要先训练 TensorFlow 引擎,以构建其模型。以此为由,收集一些图片是有必要的。如前所述,咱们但愿使用箭头来控制 Android Things 机器人小车 —— 因此咱们必须收集至少四种类型的箭头:
为训练该系统,咱们有必要对这四种不一样的图像类别建立一个“知识库”。在 /tf-data 中一个名为 images 的目录下建立四个目录,命名以下:
如今是时候去搜集图像资源了。我使用的是 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 中应有两个文件:
第一个文件包含咱们的模型,这是 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 的细节,以及如何生成模型,请查看官方文档和这个教程。
一旦 TensorFlow 数据模型准备就绪,咱们就能够进入下一步:如何集成 Android Things 与 TensorFlow。为达成这一目的,咱们能够将此任务分为两步:
在深刻探讨如何链接外围设备以前,咱们先看看下面这个 Android Things 项目中使用的组件列表:
我不在此介绍如何使用 Android Things 控制电机,由于咱们已经在以前的文章中介绍过这一点。
如下是原理图:
上图中,相机组件并未表现出来。其最终的结果以下:
最后一步即是实现 Android Things 应用程序。为此,咱们能够重用 GitHub 上名为 TensorFlow 图像分类器示例的示例项目。在开始以前,先克隆 GitHub 仓库,以便您能够修改源代码。
该 Android Things 应用与原来的应用有所不一样,在于:
要处理闪烁的 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 送你一份技术课程大礼包!
海量技术实践经验,尽在云加社区!