便携设备
介绍
在现代世界中,机器学习被用于各个领域:图像分类、消费者需求预测、针对特定人群的电影和音乐推荐、聚类。同时,对于相当大的模型,结果计算(以及更大程度的模型训练)可能是一项资源密集型操作。
为了在最强大的设备以外的设备上使用经过训练的模型,谷歌推出了其 TensorFlow Lite 框架。要使用它,您需要训练使用 TensorFlow 框架(不是 Lite!)构建的模型,然后将其转换为 TensorFlow Lite 格式。之后,该模型可以很容易地在嵌入式或移动设备上使用。
在本文中,我们将描述在 Android 上运行模型的所有步骤。
模型的训练和迁移
例如,采用标准 MobileNet 模型之一。培训将在一组图片 ILSVRC-2012-CLS 上进行。
为了训练,我们将在一个相当强大的 Linux OS 机器上下载一组模型:
git 克隆https://github.com/tensorflow/models.git
根据网站https://docs.bazel.build/versions/master/install.html上的说明安装名为 Bazel的构建系统。
启动模型训练:
bazel build -c opt mobilenet_v1_{eval,train}
。/bazel-bin/mobilenet_v1_train --dataset_dir 图片集的路径
--checkpoint_dir 检查点的路径
这些命令将执行模型的训练并创建带有 * .tflite 扩展名的文件,以供 TensorFlow Lite 解释器使用。
在更一般的情况下,如果需要使用使用 TensorFlow 框架描述的模型,那么在训练之后,应该使用转换器将其保存并转换为 TensorFlow Lite 格式:https://www.tensorflow.org/lite /转换/索引。在我们的例子中,这一步不是必需的。
安卓应用
该应用程序将包含以下功能:
实时从相机捕获图像
使用 TensorFlow Lite 模型进行图像分类
在屏幕上显示分类结果
来自https://github.com/tensorflow/examples/网站的“image_classification”示例的源代码可用作此应用程序的模板。
实时图像捕捉
将使用“android.hardware.camera2”框架,从 Android 5 开始可用。使用 CameraManager 系统服务,我们将通过实现 OnImageAvailableListener 接口在 onImageAvailable 方法中访问相机并接收帧。
帧每秒会出现几次,频率取决于内置摄像头的硬件实现。为了清楚起见,我们还将通过将 TextureView 组件放置在尺寸与屏幕尺寸匹配的布局中,将从相机接收到的图像显示在屏幕上(除了 TextureView 底部的一小部分,我们将在其中放置信息关于对象分类的结果)。为此,我们将此组件与相机的输出相关联。
在onImageAvailable方法中,我们会首先通过调用acquireLatestImage()获取最后一个可用帧。可能会出现帧分类耗时较长的情况,在此期间,相机可能会发出多帧。这就是为什么我们取最后一帧,跳过未处理的帧。框架采用 YUV420 格式。让我们通过将 convertYUV420 调用到 ImageUtils 库来将其转换为 ARGB8888 格式。由于我们需要的格式是范围从 -1 到 1 的单精度浮点数数组,因此我们也将执行此转换。
图像分类
在执行分类之前,在应用程序执行开始时,需要从存储在 Assets 目录中的应用程序本身的连线文件中加载模型。需要将“模型的训练与迁移”阶段获得的模型文件mobilenet_v1_1.0_224.tflite复制到该目录,以及分类对象的描述label.txt。
之后,将创建一个 TensorFlow Lite 解释器对象。模型作为构造函数参数传递。
通过简单地调用解释器的 run 方法来执行分类。该方法的第一个参数是一个可识别的帧,格式为浮点数数组,我们从相机中获得。第二个参数是一个浮点数组。这些数组将填充模型的性能结果。在我们的例子中,结果是一个概率数组。索引为 i 的数组的每个元素是第 i 个对象在帧中的概率。
在屏幕上显示分类结果
让我们在屏幕上显示最可能的对象的名称,使用文件中预加载的对象名称,名称存储在 Assets 中。在我们使用的模型中,名称是英文的,但您可以通过更改文件 labels.txt 预先将它们翻译成俄文。
或者,您不仅可以显示最可能对象的名称,还可以显示 3-5 个最可能对象的列表以及相应的概率。
结论
我们考虑了如何在 Android 操作系统中使用预训练的图像分类模型。此外,模型的使用也可以在嵌入式设备上使用,因为 TensorFlow Lite 解释器还具有 C++ 接口并占用约 300 KB 的内存。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !