
nb-iot
该项目探讨了如何将机器学习应用于物联网。 更详细地说,作为物联网平台,我们将使用Android Things ;作为机器学习引擎,我们将使用Google TensorFlow 。 如今,机器学习是物联网中最有趣的技术主题之一。 为了给机器学习一个简单的定义,可以用Wikipedia定义:
机器学习是计算机科学的一个领域,它使计算机系统能够“学习”(即逐步提高特定任务的性能)数据,而无需进行明确的编程。
换句话说,在训练步骤之后,即使系统没有专门针对结果进行编程,也可以预测结果。 另一方面,我们都知道物联网和连接设备的概念。 最有前途的主题之一是如何将机器学习应用于物联网,构建专家系统,以便有可能开发一种能够“学习”的系统。 而且,它使用此知识来控制和管理物理对象。
在机器学习和物联网应用中产生重要价值的领域有几个,仅举几个有趣的领域,它们是:
- 工业物联网(IIoT)的预测性维护
- 消费物联网,通过机器赚钱可以使设备智能化,从而适应我们的习惯
在本教程中,我们想探索如何使用Android Things和TensorFlow将机器学习应用于IoT。 这个Android Things IoT项目背后的基本思想是探索如何构建能够识别一些基本形状(如箭头)并以此方式控制机器人方向的机器人汽车。 我们已经介绍了如何使用Android Things构建机器人汽车,因此建议您在开始该项目之前先阅读本教程。
这个机器学习和物联网项目涵盖以下主要主题:
- 如何使用Docker设置TensorFlow环境
- 如何训练TensorFlow系统
- 如何将TensorFlow与Android Things集成
- 如何使用TensorFlow结果控制机器人车
该项目源自Android Things TensorFlow图像分类器。
让我们开始吧!
如何在Tensorflow中创建图像分类器
在开始之前,有必要安装和配置TensorFlow环境。 我不是机器学习专家,所以我需要快速找到可用的东西,以便我们构建TensorFlow图像分类器。 因此,我们可以使用Docker运行TensorFlow的映像。 按着这些次序:
- 克隆TensorFlow存储库:
git clone https://github.com/tensorflow/tensorflow.git cd /tensorflow git checkout v1.5.0
- 创建一个目录(
/tf-data
),该目录将保存我们在项目期间将使用的所有文件。 - 运行Docker:
docker run -it \ --volume /tf-data:/tf-data \ --volume /tensorflow:/tensorflow \ --workdir /tensorflow tensorflow/tensorflow:1.5.0 bash
使用此命令,我们运行交互式TensorFlow环境,并安装一些在项目期间将使用的目录
如何训练TensorFlow
在Android Things系统能够识别图像之前,必须训练TensorFlow引擎,以便它可以构建其模型。 为此,有必要收集多个图像。 如前所述,我们想使用箭头来控制Android Things机器人车,以便我们必须至少收集四种箭头类型:
- 向上箭头
- 向下箭头
- 左箭头
- 右箭头
要训练系统,必须创建具有这四个不同图像类别的“知识基础”。 在/tf-data
创建一个名为images
的目录,并在其下创建四个子目录,这些子目录分别为:
- 向上箭头
- 下箭头
- 左箭头
- 右箭头
现在是时候寻找图像了。 我使用过Google图片搜索,但是您也可以使用其他方法。 为了简化图片下载过程,您应该安装一个Chrome插件,只需单击一下即可下载所有图片。 不要忘记下载更多图像,这是训练过程,即使创建模型的时间可能会增加。
打开浏览器,然后开始寻找四个图像类别:
我为每个类别下载了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
文件夹中有两个文件:
- retrained_graph.pb
- retrained_labels.txt
第一个文件包含TensorFlow训练过程的结果,而第二个文件包含与我们的四个图像类别相关的标签。
如何测试Tensorflow模型
如果要测试模型以检查一切是否正常,可以使用以下命令:
python scripts.label_image \
--graph=/tf-data/retrained-graph.pb \
--image=/tf-data/images/[category]/[image_name.jpg]
优化模型
在我们在Android Things项目中使用此TensorFlow模型之前,有必要对其进行优化:
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"
这就是我们拥有的模型。 我们将使用此模型将机器学习应用于IoT,或更详细地将Android Things与TensorFlow集成在一起。 目标是将智能识别功能应用于Android Things应用,以识别箭头图像并做出React,从而控制机器人的行车方向。
如果您想了解有关TensorFlow以及如何生成模型的更多详细信息,请参阅官方文档和本教程。
如何使用Android Things和TensorFlow将机器学习应用于IoT
一旦TensorFlow数据模型准备就绪,我们就可以进行下一步:如何将Android Things与TensorFlow集成。 为此,我们可以将该任务分为两个步骤:
- 硬件部分,我们将电机和其他外围设备连接到Android Things板
- 实施应用
Android Things示意图
在深入探讨如何连接外设之前,这是此Android Things项目中使用的组件的列表:
- Android Things开发板(Raspberry Pi 3)
- 树莓派相机
- 一个LED
- LN298N双H桥(用于控制电动机)
- 具有两个轮子的机器人汽车底盘
我不会再介绍如何使用Android Things控制电机,因为我们在上一篇文章中已经介绍过。
在原理图下方:
在上图中,未显示相机。 最终结果是:
使用TensorFlow实施Android Things应用
最后一步是实现Android Things应用。 为此,我们可以重用Github中可用的示例TensorFlow图像分类器。 开始之前,请克隆Github存储库,以便您可以修改源代码。
此Android Things应用与原始应用不同,因为:
- 它不使用按钮启动相机来捕获图像
- 它使用不同的模型
- 当LED停止闪烁时,它会使用闪烁的LED来通知相机将拍摄照片
- 当TensorFlow检测到图像时(箭头),它将控制电动机。 此外,在从步骤3开始循环之前,它会打开电动机5秒钟。
要处理闪烁的LED,请使用以下代码:
private Handler blinkingHandler = new Handler();
private Runnable blinkingLED = new Runnable() {@Overridepublic void run() {try {// If the motor is running the app does not start the camif (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 resultif (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返回与所捕获图像匹配的可能标签后,应用程序会将结果与可能的方向进行比较,从而控制电机。
最后,是时候使用开始时创建的模型了。 复制资产文件夹下的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将机器学习应用于IoT。 我们可以使用图像控制机器人汽车,并根据显示的图像移动机器人汽车。
翻译自: https://www.javacodegeeks.com/2018/03/apply-machine-learning-iot-using-android-things-tensorflow.html
nb-iot