Android Things和机器学习

Android Things可让您使用简单的代码制造出惊人的IoT设备,但使设备与众不同的一件事就是机器学习。 尽管有一些在线服务可以使您上载数据并返回结果,但能够在本地和离线使用机器学习功能非常有用。

在本文中,我将分享一些使用TensorFlow图像分类器的经验,首先从Google的Android Things TensorFlow示例开始

为什么要使用机器学习?

机器学习可以帮助解决传统应用程序无法解决的问题。 为了提供上下文,让我们看一个简单的示例,其中机器学习可以与IoT设备一起使用以改善日常生活。

在科罗拉多州,看到有关野生生物从山上走出来并在市中心漫步的新闻报道并不少见:

科罗拉多州博尔德市区的一只麋鹿的新闻报导

或在当地大学里爬树:

科罗拉多州CU Boulder的一只熊的新闻报道

我什至有一个朋友在他们家门外张贴了一只熊的视频!

屋外熊的视频快照

虽然这些情况通常都会得到妥善解决,但科罗拉多州公园与野生生物司提供了一些公开数据,其中详细介绍了黑熊与人的冲突以及各种野生动植物的活动/范围 。 通过查看Google Earth中的黑熊与人的冲突数据,我们可以找到遇到熊可能会危害公共安全的区域。

科罗拉多熊与人类的冲突地图

此外,当我在读取该州的野生动植物数据时,一位朋友在驾车前往科罗拉多州杜兰戈的事故中发生了一起麋鹿事故,并张贴了自己汽车的图像。据科罗拉多州交通部(CDOT)撞车事故书中 ,在一年多的时间里,科罗拉多发生了超过4,000起涉及野生动植物的事故,造成约150人受伤和1人死亡。 根据《野生动物保护者概况》报道,在整个美国,这一数字跃升至725,000至1,500,000起事故,每年造成约200人死亡。

在科罗拉多州杜兰戈附近撞到麋鹿后的车

那么我们如何使用机器学习来解决这个问题呢? 通过图像识别,我们可以创建一个可触发运动的设备,该设备可以使用Raspberry Pi拍照,然后对其进行分析以检测潜在的危险野生动物。

使用Google示例,我们可以创建一个Android Things设备,该设备使用Raspberry Pi拍摄图片,并根据一千多个可能的标签对这些图片的内容进行分类。 但是这些标签与我们需要使用的标签不完全匹配。

通过训练TensorFlow使用我们自己的图像和标签,我们可以创建一种可以识别麋鹿,驼鹿或黑熊的设备,然后在检测到一个人时执行操作。 这使我们能够制造一种可以挽救生命,同时仍然易于创建的设备。

创建自定义TensorFlow图像分类器

安装并运行Google的Android Things版TensorFlow示例后,就该开始对其进行修改了。 您要做的第一件事是确保TensorFlow在计算机上并且可以正常工作。 这可能相当复杂,而我发现要使其在生成受训文件的整个过程中正常工作的最简单方法是安装和使用Docker 。 该程序将允许您在计算机上运行为TensorFlow预配置的虚拟机。

一旦安装了Docker并使其在计算机上运行,​​则应打开其首选项并设置虚拟机的内存使用率。 我将自己的内存设置为使用7 GB,这可能超出了您的需求,但是我花了几天的时间试图让TensorFlow正确创建所需的经过训练的图形而不会崩溃,然后才意识到虚拟机内存不足。

在此示例中,我们将重新训练现有的机器学习示例以使用我们自己的数据,因为这比从头开始训练新的数据集要快得多。 有关我们正在做什么的更详细说明,您可以查看官方TensorFlow文档

Docker高级设置屏幕

一旦安装了Docker并在机器上启动它,就需要从终端运行它并拉下映像。 对于此示例,我在macOS下运行,因此命令可能与您的平台有所不同。

docker run -it -v $HOME/tf_files:/tf_files gcr.io/tensorflow/tensorflow:latest-devel
cd /tensorflow
git pull
git checkout v1.0.1

一切完成设置后,您应该在终端中看到类似以下的提示:

root@1643721c503b:/tensorflow#

此时,您将需要一组图像来训练TensorFlow。 我使用Fatkun Batch Download Image Chrome插件从Google搜索集中下载了返回的图像。 安装插件后,您可以搜索要分类的内容,然后开始选择要保存的图像。

Chrome插件屏幕,用于下载批量图像

为了使命名更容易一些,您可能还需要进入“ 更多选项”部分,并让插件在下载图像时重命名它们。

批量图片下载重命名设置

接下来,您需要将正在使用的图像移动到主目录下tf_files中的文件夹中,该文件夹是我们在初始化Docker计算机时创建的文件夹。 在此示例中,我的图像目录称为TensorFlowTrainingImages 。 每个可分类的项目在该目录中应有其自己的文件夹,如下所示。

TensorFlow训练图像文件夹结构

设置目录后,您可以从Docker终端使用以下命令开始重新培训:

python tensorflow/examples/image_retraining/retrain.py \
  --bottleneck_dir=/tf_files/bottlenecks \
  --how_many_training_steps 3000 \
  --model_dir=/tf_files/inception \
  --output_graph=/tf_files/graph.pb \
  --output_labels=/tf_files/labels.txt \
  --image_dir /tf_files/TensorFlowTrainingImages

上面的命令将生成瓶颈 ,本质上是最终分类数据传递使用的数据,以及用于分类的图形和标签文件。

从现在开始,我们使用TensorFlow进行的操作可能需要几分钟到一个小时以上的时间,具体取决于计算机的速度。 这可能是泡咖啡或散步的好时机。

随着retraining命令的运行,您应该在终端中看到很多类似于以下内容的输出:

2017-04-12 18:21:28.495685: Step 130: Train accuracy = 95.0%
2017-04-12 18:21:28.495779: Step 130: Cross entropy = 0.250339
2017-04-12 18:21:28.748928: Step 130: Validation accuracy = 92.0% (N=100)

产生瓶颈后,将有一个graph.pb文件和一个代表数据的labels.txt文件。 虽然这些格式在计算机上运行分类时效果很好,但当放置到Android应用程序中时,它们往往不起作用。 您将需要优化它们。

首先运行以下命令。 接受所有默认值。

./configure
Please specify the location of python. [Default is /usr/bin/python]:
Please specify optimization flags to use during compilation [Default is -march=native]:
Do you wish to use jemalloc as the malloc implementation? (Linux only) [Y/n]
jemalloc enabled on Linux
Do you wish to build TensorFlow with Google Cloud Platform support? [y/N]
No Google Cloud Platform support will be enabled for TensorFlow
Do you wish to build TensorFlow with Hadoop File System support? [y/N]
No Hadoop File System support will be enabled for TensorFlow
Do you wish to build TensorFlow with the XLA just-in-time compiler (experimental)? [y/N]
No XLA support will be enabled for TensorFlow
Found possible Python library paths:
  /usr/local/lib/python2.7/dist-packages
  /usr/lib/python2.7/dist-packages
Please input the desired Python library path to use.  Default is [/usr/local/lib/python2.7/dist-packages]
Using python library path: /usr/local/lib/python2.7/dist-packages
Do you wish to build TensorFlow with OpenCL support? [y/N]
No OpenCL support will be enabled for TensorFlow
Do you wish to build TensorFlow with CUDA support? [y/N]
No CUDA support will be enabled for TensorFlow
Configuration finished
Extracting Bazel installation...
..............
INFO: Starting clean (this may take a while). Consider using --expunge_async if the clean takes more than several minutes.
............
INFO: All external dependencies fetched successfully.

配置完成后,运行以下命令来设置优化工具。 这一步在我的机器上花费了大约一个小时,因此耐心是关键!

bazel build tensorflow/python/tools:optimize_for_inference

构建优化工具后,您可以使用它来优化图形文件。

bazel-bin/tensorflow/python/tools/optimize_for_inference \
  --input=/tf_files/graph.pb \
  --output=/tf_files/optimized_graph.pb \
  --input_names=Mul \
  --output_names=final_result

现在已经生成了优化的图形,您可以在主目录的tf_files文件夹中找到带有标签的图形

生成机器学习数据后TensorFlow目录的内容

将自定义分类器添加到Android Things示例

恭喜你! 生成TensorFlow图和标签是困难的部分,可能需要花些时间才能使生成正确。 现在您已经拥有了它们,是时候编辑Android Things示例项目以使用您自己的数据了。 首先,进入应用程序的build.gradle文件,并删除以下部分及其插件声明:

apply plugin: 'de.undercouch.download'

// Download model zip file into ../../assets directory
// unzip it to demo project's own ./assets directory
import de.undercouch.gradle.tasks.download.Download
task downloadFile(type: Download) {
    src 'https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip'
    dest projectDir.toString() + '/../../assets/inception.zip'
}
task unzip(type: Copy) {
    from zipTree(projectDir.toString() + '/../../assets/inception.zip')
    into file(projectDir.toString() + '/assets')
}
unzip.dependsOn downloadFile

project.afterEvaluate {
    if (!(new File(projectDir.toString() + '/assets')).exists()) {
        preBuild.dependsOn unzip
    }
}

上面的代码下载了Google的示例图和标签,并将它们添加到资产目录。 由于我们已经生成了自己的行,因此我们不必担心这些,可以删除这些行。

接下来,打开TensorFlowImageClassifier.java文件。 您应该在文件顶部看到一些已声明的变量,并对要使用代码实验室生成的图形(与上述操作非常接近)需要更改的内容进行了较长的评论。 )。

// These are the settings for the original v1 Inception model. If you want to
// use a model that's been produced from the TensorFlow for Poets codelab,
// you'll need to set IMAGE_SIZE = 299, IMAGE_MEAN = 128, IMAGE_STD = 128,
// INPUT_NAME = "Mul:0", and OUTPUT_NAME = "final_result:0".
// You'll also need to update the MODEL_FILE and LABEL_FILE paths to point to
// the ones you produced.

public static final int INPUT_SIZE = 224;

// Note: the actual number of classes for Inception is 1001, but the output layer size is 1008.
private static final int NUM_CLASSES = 1008;
private static final int IMAGE_MEAN = 117;
private static final float IMAGE_STD = 1;
private static final String INPUT_NAME = "input:0";
private static final String OUTPUT_NAME = "output:0";

private static final String MODEL_FILE = "file:///android_asset/tensorflow_inception_graph.pb";
private static final String LABEL_FILE =
        "file:///android_asset/imagenet_comp_graph_label_strings.txt";

更改MODEL_FILELABEL_FILE的最后一部分,以匹配优化的图形和标签的名称。

private static final String MODEL_FILE = "file:///android_asset/optimized_graph.pb";
private static final String LABEL_FILE =
        "file:///android_asset/labels.txt";

回到原始来源的冗长评论,让我们继续编辑文件以符合Google的建议。

public static final int NUM_CLASSES = 4;
public static final int INPUT_SIZE = 299;
public static final int IMAGE_MEAN = 128;
public static final float IMAGE_STD = 128;
public static final String INPUT_NAME = "Mul";
public static final String OUTPUT_NAME = "final_result";

您会注意到我们将NUM_CLASSES设置为4 。 这是可供我们的机器学习算法分类的项目数。 您可以更改它以匹配您受过训练的分类类别的数量。

总结一下,将优化的图形文件和标签移动到app / src / main / assets目录中。 完成后,您可以将示例应用程序安装到带有相机模块的Raspberry Pi上并进行拍摄。 下面是我使用设备拍摄的照片:

用Android Things设备拍摄的熊的图片

并将结果发送到Firebase(对示例应用程序进行了一些细微修改)。

来自机器学习图像分类的输出数据
如您所见,设备成功识别出图片中的黑熊!

结论

在本教程中,您简要介绍了如何使用TensorFlow进行机器学习并将其集成到Android Things应用中。 如您所见,机器学习是一个功能强大的工具,可用于解决常规应用程序会遇到的各种问题。 将机器学习与物联网相结合时,您可以创建一些令人惊奇且有用的设备,与周围的世界进行交互。

翻译自: https://code.tutsplus.com/articles/android-things-and-machine-learning--cms-28089

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值