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

1. 准备工作

在上一个 Codelab 中,您创建了一个适用于 Android 和 iOS 的应用,该应用使用一个可识别几百类图片的基本图片标签模型。它非常常见地识别出花朵的图片,即看到花瓣、花朵、植物和天空。

要更新应用以识别特定的花朵、雏菊或玫瑰,您需要一个自定义模型,该模型已针对您想要识别的每种花卉类型进行了大量示例训练。

前提条件

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

您将构建和学习的内容

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

所需条件

  • 无需特定的硬件,所有操作都可以在浏览器中使用 Google Colab 完成。

2. 开始使用

所有需要跟随的代码都已为您准备好,可以在此处使用 Google Colab 执行。如果您无法访问 Google Colab,则可以克隆代码库并使用名为 CustomImageClassifierModel.ipynb 的笔记本(可在 ImageClassificationMobile->colab 目录中找到)。

如果您有大量特定花朵的样本,那么使用 TensorFlow Lite Model Maker 训练模型识别这些花朵的例子相对容易。

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

4ee12554e75b103f

将其压缩并托管在服务器上,您就可以用它训练模型了。在本实验的其余部分,您将使用为您准备好的模板。

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

3. 安装和导入依赖项

  1. 安装 TensorFlow Lite Model Maker。您可以通过 pip 安装来完成此操作。&>/dev/null at the end just suppresses the output.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

第一部分展示您的模型架构。Model Maker 在后台执行的操作称为迁移学习,它使用现有的预训练模型作为起点,利用该模型在构建图像时学到的内容,并将其应用于理解这 5 种花卉。您可以在第一行中看到以下内容:

hub_keras_layer_v1v2_2 (HubK (None, 1280)              3413024

关键是“Hub”一词,它告诉我们该模型来自 TensorFlow Hub。默认情况下,TensorFlow Lite Model Maker 使用名为“MobileNet”的模型这种模型能够识别 1000 种图片。这里的逻辑是,它通过学习“特征”可以重复使用,以区分 1, 000 个类。相同的“功能”可以映射到我们的 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

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

57bad87f294fd189

选择该文件,您会看到右侧弹出 3 个点。点击这些图标可获得上下文菜单,然后便可从该菜单中下载模型。

aee14ad10c4a8a1a.png

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

7. 恭喜

现在,您可以将它集成到您的移动应用中了!您将在下一个实验中执行此操作。