如何在 Flutter 中构建计算机视觉移动应用

已发表: 2020-04-22

机器学习功能已成为当今应用程序中的必备功能。 它们可以提高满意度并为您的受众提供他们想要的非凡应用体验。 由于最近的硬件和软件优化,机器学习模型的执行正在从云端转移到移动设备本身。

通过消除响应延迟和解决隐私问题,这对用户体验产生了巨大影响。 当我们决定开发一款帮助用户照看室内植物的应用程序 Planter 时,我们知道能够让它在应用程序市场上脱颖而出的东西就是人工智能。

我们的想法是添加功能,使用计算机视觉技术从图像中识别室内植物的类型。 由于 TensorFlow Lite 对设备性能的优化,该应用程序可以仅在用户设备上运行我们的分类模型。 在本文中,我将解释如何快速准备图像分类模型,并将其部署到使用 Flutter 开发的应用程序中。

在 Flutter 中构建机器学习模块——一步一步

处理小数据问题

构建机器学习模型的第一步是数据收集。 为了创建一个训练数据集,我们使用了谷歌图片下载器,它允许我们从谷歌搜索中下载植物图片,并带有标记为商业重用的权利,并带有以下简短脚本:

 $ googleimagesdownload --keywords "Zamioculcas zamiifolia" --usage_rights 标记为重用

我们的最终数据集由每个物种约 70-170 张图像组成。 用这么少的数据从头开始准备一个性能良好的图像分类模型是非常困难的。

幸运的是,有一些强大的预训练人工神经网络公开可用,可用于构建高精度图像分类器,即使您的数据集每个类别仅包含大约一百个示例。 这种使用预训练模型并将其修改为特定用例的技术称为迁移学习。

数据增强

为了最大限度地利用我们的数据集,我们使用了 keras 的 ImageDataGenerator 预处理包,它可以生成成批的张量图像,并在运行中对其进行扩充。 我们使用了以下转换:

  • 水平翻转输入:horizo​​ntal_flip = True
  • 从范围设置亮度偏移值: brightness_range = (0.75, 1.25)
  • 使用提供的强度剪切: shear_range = 15
  • 重新缩放,通过乘以指定值: rescale=1./255
  • 放大和缩小: zoom_range=0.4
  • 向任意方向移动: width_shift_range = 0.1, height_shift_range = 0.15
 train_datagen_augment =

           ImageDataGenerator(rotation_range = 30,

           水平翻转=真,

           亮度范围 = (0.75,1.25),

           剪切范围 = 15,

           重新缩放=1./255,

           缩放范围=0.4,

           width_shift_range = 0.1,

           height_shift_range = 0.15)

训练

我们使用了 NASNet-Mobile,这是一种卷积神经网络,它在 ImageNet 数据集中的超过一百万张图像上进行了训练。 NasNetMobile 架构由一组用神经网络单元构建的块组成。

Block 是一个操作模块,包括从图像分类神经网络中已知的转换,包括:正常卷积、可分离卷积、最大池化、平均池化、恒等映射等。该网络已被训练以分配给图像 1 out of 1000 个类别,包括动物、花卉和家具。 结果,网络“学习”了广泛图像的丰富特征表示。

我们创建了完成以下步骤的模型:

  • 移除预训练网络的最后一层
  • 在网络末端添加卷积模型
  • 冻结组合网络中的所有层,除了来自添加模型的层
  • 训练模型直到准确性停止提高
  • 解冻预训练模型的最后一个冻结卷积块中的所有层
  • 训练模型直到准确性停止提高
  • 重复第 5 点和第 6 点五次
  • 解冻整个模型,并对其进行训练,直到准确性停止提高

模型评估

Planter 的分类模型尝试根据照片将植物类型分配给室内植物。 该模型返回分配给最高概率的三种类型,用户可以从中选择一种。 在评估模型期间,我们使用了以下两个指标:

  • 分类准确度,
  • top_k_categorical_accuracy(k=3)。

下图显示了我们模型的每个训练时期的分类准确度。

每个训练时期的分类准确度

评估集的最终分类准确率为 0.870,前 3 名的分类准确率为 0.916。 考虑到所使用的训练数据集较小,这些结果非常令人满意。

模型转换

如果我们想在移动应用中使用 keras 模型,则需要将其转换为 TensorFlow Lite FlatBuffer 对象。 这可以使用下面示例中显示的代码来完成。

 将 tensorflow.lite 导入为 lite

keras_model_path = "模型/keras_model"

tflite_model_path = "模型/model.tflite"

模型.保存(keras_model_path)

转换器 = lite.TFLiteConverter.from_keras_model_file(keras_model_path)

tflite_model = 转换器.convert()

打开(tflite_model_path,“wb”)。写(tflite_model)

现在我们已经将优化模型存储在 model/model.tflite 路径中,我们可以轻松地在原生移动应用程序中使用它,使用:

  • Core ML – 适用于 iOS 应用
  • TensorFlow Lite Android 支持库 – 适用于 Android 应用

现在,我将根据我们使用 Planter 的经验向您展示如何在 Flutter 中使用该模型。

为什么颤振?

Flutter 是谷歌旗下的 UI 工具包。 它的创建是为了从单个代码库为移动、Web 和桌面构建本机编译的应用程序。 如果您想知道是否应该使用 Flutter,我建议您阅读这篇文章,这是 Miquido 在 Flutter 中开发的 Abbey Road Studios 的 Topline 案例研究。

我们可以将我们的模型与 tflite 库一起使用。 它是一个用于访问 TensorFlow Lite API 的 Flutter 插件。 它支持 iOS 和 Android 平台上的图像分类、对象检测、Pix2Pix、Deeplab 和 PoseNet。

跨平台开发服务图标

对 Flutter 开发感到好奇?

学到更多

在我们的应用程序开发过程中,我们必须完成以下步骤:

  • 在我们的 pubspec.yaml 文件中添加 tflite 作为依赖项
  • 创建一个 assets 文件夹并在其中放置一个标签文件和一个模型文件。
  • 在 pubspec.yaml 中,添加:
 资产:

   - 资产/标签.txt

   - 资产/mobilenet_v1_1.0_224.tflite
  • 导入库 tflite:
 导入“包:tflite/tflite.dart”;
  • 加载模型和标签:
 字符串 res = 等待 Tflite.loadModel(

  模型:“资产/model.tflite”,

  标签:“资产/标签.txt”,

  numThreads: 1 // 默认为 1

);
  • 在图像上运行模型(进行预测):
 var 识别 = 等待 Tflite.runModelOnImage(

        路径:tfResizedImage.path, 

        图像标准:255.0, 

        numResults: 3, 

        阈值:0.00001, 

        异步:真    

 );

预测输出具有以下示例中所示的格式:

 [{confidence: 0.03441339731216431, index: 46, label: Vriesea splendens}, {confidence: 2.086162567138672e-7, index: 7, label: Aphelandra squarrosa}, {confidence: 1.4901161193847656e-7, index: 19, label: Fern arum }]
  • 发布资源:
 等待 Tflite.close();

最终结果

Planter 允许您将带有图像的植物添加到您的库中。 您可以通过拍摄植物照片或从手机图库中选择一张来获取图像。 包含的室内植物分类模型返回三个被识别的概率最高的物种,并将它们呈现在一个列表中。

单击一个物种将引导您进入植物摘要视图,其中包含一个预先填写的表格,其中包含建议的浇水和施肥时间表,以及有关植物的一些附加信息。 在下面的流程中,您可以看到一个示例,其中 Zamioculcas zamiifolia 在使用照相手机拍摄的图像中被识别。

播种机的工作原理
播种机 - 识别系统
如何在 Planter 中添加植物

将您的机器学习转移到移动设备上!

在本文中,我想说服您,在您的移动应用程序中添加用户喜欢的 AI 功能可以简单快捷。 更重要的是,将模型执行转移到移动设备上,通过消除 API 响应延迟,为您的用户提供令人愉悦的用户体验。 它还有助于确保数据安全,因为不需要将数据发送到云端。

您可以从使用 Flutter 及其同时为 iOS 和 Android 原生应用程序编译代码的能力中受益匪浅。 不费吹灰之力,您就可以让您的应用在市场上脱颖而出,并最大限度地提高应用的受众保留率。

准备好您的下一个项目了吗? 不要犹豫,与我们联系!