为图片分类器创建自定义模型

1. 准备工作

在上一个 Codelab 中,您创建了一个适用于 Android 和 iOS 的应用,该应用使用可以识别数百种图片的基本图片标签模型。它识别出了一幅非常宽泛的花卉:花瓣、花朵、植物和天空。

例如,要更新应用以识别特定的花卉、雏菊或玫瑰,您需要一个根据您希望识别的每种类型的花卉的大量示例训练的自定义模型。

前提条件

  • 此学习路线中的上一个 Codelab。

您将构建和学习的内容

  • 如何使用 TensorFlow Lite Model Maker 训练图像分类器自定义模型。

所需物品

  • 无需任何特定的硬件 - 一切都可以使用浏览器中的 Google Colab 完成。

2. 开始使用

所有后续代码已为您准备就绪,可以使用此处的 Google Colab 执行。如果您无法访问 Google Colab,您可以克隆代码库并使用名为 CustomImageClassifierModel.ipynb 的笔记本,该笔记本位于 ImageClassificationMobile->colab 目录中。

如果您有大量特定花卉的样本,则使用 TensorFlow Lite 模型制造商训练模型时识别这些模型相对容易。

最简单的方法是创建一个包含图片的 .zip 或 .tgz 文件,这些文件会放入目录中。例如,如果您使用雏菊、蒲公英、玫瑰、向日葵和郁金香图片,可以按如下方式将它们整理到目录中:

4ee12554e75b103f.png

将其压缩并托管在服务器上,您就可以用它训练模型了。在本实验的剩余步骤中,您将使用已经为您准备好的解决方案。

本实验将假设您使用 Google Colab 训练模型。您可以在 colab.research.google.com 上找到 colab。如果您使用的是其他环境,则可能需要安装大量依赖项,特别是 TensorFlow。

3.安装并导入依赖项

  1. 安装 TensorFlow Lite Model Maker。您可以使用 pip 安装执行此操作。末尾的 &> /dev/null 只是抑制输出。Model Maker 输出了大量内容,并且内容之间并没有直接关系。此工具并未显示,因此您可以专注于当前的任务。
# Install Model maker
!pip install -q tflite-model-maker &> /dev/null
  1. 接下来,您需要导入需要使用的库,并确保您使用的是 TensorFlow 2.x:
# Imports and check that we are using TF2.x
import numpy as np
import os

from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import image_classifier
from tflite_model_maker.image_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

现在环境已准备就绪,是时候开始创建模型了!

4.下载和准备数据

如果您的图片整理到文件夹中,并将这些文件夹压缩后,如果您下载 zip 文件并解压缩,系统会自动根据图片所在的文件夹为您的图片添加标签。此目录将引用为 data_path

data_path = tf.keras.utils.get_file(
      'flower_photos',
      'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
      untar=True)

然后,可以将此数据路径加载到神经网络模型中,以使用 TensorFlow Lite Model Maker 的 ImageClassifierDataLoader 类进行训练。只需对准文件夹,就可以了。

使用机器学习模型训练模型时,一个重要的元素是不要使用所有数据进行训练。 稍等片刻,以用之前未见过的数据测试模型。通过 ImageClassifierDataLoader 返回的数据集的拆分方法可以轻松做到这一点。通过将 0.9 传递到该模型中,您会获得 90% 的训练数据,以及 10% 的测试数据:

data = DataLoader.from_folder(data_path)
train_data, test_data = data.split(0.9)

现在,您的数据已准备就绪,您可以使用这些数据创建模型了。

5. 创建图像分类器模型

Model Maker 抽象隐藏了神经网络设计方面的许多细节,因此您无需处理网络设计,以及卷积、密集、ReLU、展平、损失函数和优化器等问题。对于默认模型,您只需使用一行代码来创建模型,方法是使用提供的数据训练神经网络:

model = image_classifier.create(train_data)

运行此命令时,您会看到类似于以下内容的输出:

Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024
_________________________________________________________________
dropout_2 (Dropout)          (None, 1280)              0
_________________________________________________________________
dense_2 (Dense)              (None, 5)                 6405
=================================================================
Total params: 3,419,429
Trainable params: 6,405
Non-trainable params: 3,413,024
_________________________________________________________________
None
Epoch 1/5
103/103 [===] - 15s 129ms/step - loss: 1.1169 - accuracy: 0.6181

Epoch 2/5
103/103 [===] - 13s 126ms/step - loss: 0.6595 - accuracy: 0.8911

Epoch 3/5
103/103 [===] - 13s 127ms/step - loss: 0.6239 - accuracy: 0.9133

Epoch 4/5
103/103 [===] - 13s 128ms/step - loss: 0.5994 - accuracy: 0.9287

Epoch 5/5
103/103 [===] - 13s 126ms/step - loss: 0.5836 - accuracy: 0.9385

第一部分是展示模型架构。模型制造商在后台进行的操作称为迁移学习,它使用现有的预训练模型作为起点,并且仅通过该模型学到的影像构造方式并加以应用来理解这 5 朵花 您可以在第一行中看到以下内容:

hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024

关键是使用了“Hub”一词,表示此模型来自 TensorFlow Hub。默认情况下,TensorFlow Lite Model Maker 使用名为“MobileNet”的模型,该模型旨在识别 1000 种图片。这里的逻辑是,它可以重复使用通过学习“特征”来区分 1000 个类的方法。相同的“特征”可以映射到我们的 5 类花,因此无需从头学习。

模型经历了 5 个周期 - 一个周期是一个训练的整个周期,神经网络会尝试将图像与其标签进行匹配。在完成 5 个周期时,大约 1 分钟,训练数据的准确率就达到了 93.85%。假设有 5 门课程,随机猜测的准确率为 20%,这才算是进步了!(它还会报告一个“损失”数字,但您暂时忽略它)。

之前,您可以将数据拆分为训练和测试数据,这样您就可以通过一个标准来测量网络对之前未见过的数据的表现,通过使用model.evaluate测试数据:

loss, accuracy = model.evaluate(test_data)

这将输出如下:

12/12 [===] - 5s 115ms/step - loss: 0.6622 - accuracy: 0.8801

请注意这里的准确率。模型的正确率为 88.01%,因此在现实环境中使用默认模型时,准确率应该会达到预期。这对于您在大约一分钟内训练的默认模型而言还不错。当然,您可能需要进行大量的调整来改进模型,这是一门科学!

6.导出模型

现在模型已经过训练,下一步是以移动应用可以使用的 .tflite 格式导出。Model Maker 提供了一种简单的导出方法 - 只需指定要输出到的目录。

代码如下:

model.export(export_dir='/mm_flowers')

如果您是在 Google Colab 中运行模型,则可以点击屏幕左侧的文件夹图标查看模型:

cc5b9988775633b4.png

在这里,您会看到当前目录的列表。使用所示的按钮“向上”移动目录:

51e6ac47c992142a.png

在代码中,您指定导出到 mm_flowers 目录。打开该文件,您将看到一个名为“model.tflite”的文件。这是经过训练的模型。

57bad87f294fd189.png

选择文件后,您会看到右侧弹出 3 个点。点击这些按钮即可获取上下文菜单,您可以从中下载该模型。

aee14ad10c4a8a1a.png

片刻之后,模型便会下载到您的下载文件夹中。

7. 恭喜

您现在可以将其集成到您的移动应用中!您将在下一个实验中完成相关操作。