1. 准备工作
在上一个 Codelab 中,您创建了一个适用于 Android 和 iOS 的应用,该应用使用一个基本图像标签模型,可识别数百个图像类别。它非常笼统地识别出了一张花卉图片,识别出花瓣、花卉、植物和天空。
如需更新应用以识别特定花卉(例如雏菊或玫瑰),您需要一个自定义模型,该模型经过大量您想要识别的每种花卉类型的示例训练。
前提条件
- 此学习路线中的上一个 Codelab。
您将构建和学习的内容
- 如何使用 TensorFlow Lite Model Maker 训练图像分类器自定义模型。
所需条件
- 无需任何特定硬件,一切都可以在浏览器中使用 Google Colab 完成。
2. 开始使用
我们已为您准备好所有后续代码,您可点击此处使用 Google Colab 执行这些代码。如果您无法访问 Google Colab,可以克隆该代码库,然后使用 ImageClassificationMobile->colab 目录中的笔记本 CustomImageClassifierModel.ipynb。
如果您有大量特定花卉的示例,则相对容易使用 TensorFlow Lite Model Maker 训练模型来识别这些花卉。
最简单的方法是创建一个包含图片的 .zip 或 .tgz 文件,并将图片分类放入目录中。例如,如果您使用雏菊、蒲公英、玫瑰、向日葵和郁金香的图片,则可以按如下方式将它们整理到目录中:

将该文件压缩并托管在服务器上,您就可以使用它来训练模型了。在本实验的其余部分,您将使用已为您准备好的一个。
本实验将假定您使用 Google Colab 训练模型。您可以在 colab.research.google.com 上找到 Colab。如果您使用的是其他环境,可能需要安装许多依赖项,尤其是 TensorFlow。
3. 安装和导入依赖项
- 安装 TensorFlow Lite Model Maker。您可以使用 pip install 来完成此操作。末尾的 &> /dev/null 只是抑制输出。Model Maker 会输出许多并非立即相关的内容。该通知已被抑制,以便您专注于当前任务。
# Install Model maker
!pip install -q tflite-model-maker &> /dev/null
- 接下来,您需要导入要使用的库,并确保您使用的是 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 文件,那么当您下载并解压缩该 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 返回的数据集的 split 方法可以轻松实现这一点。通过将 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 个周期 - 其中一个周期是指神经网络尝试将图片与其标签相匹配的完整训练周期。在 1 分钟内完成 5 个周期后,模型在训练数据上的准确率达到了 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%,因此在实际应用中使用默认模型时,应预期达到这一准确率。对于您在约 1 分钟内训练的默认模型来说,这个结果还不错。当然,您可能可以进行大量调整来改进模型,而这本身就是一门科学!
6. 导出模型
现在模型已训练完毕,下一步是以移动应用可用的 .tflite 格式导出模型。Model Maker 提供了一种简单的导出方法,您只需指定输出目录即可。
代码如下:
model.export(export_dir='/mm_flowers')
如果您在 Google Colab 中运行此代码,则可以点击屏幕左侧的文件夹图标来查看模型:

在此处,您会看到当前目录的列表。使用指示的按钮可将目录“上移”:

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

选择文件后,您会在右侧看到 3 个点。点击这些链接会显示一个上下文菜单,您可以在其中下载模型。

片刻之后,模型将下载到您的下载文件夹中。
7. 恭喜
现在,您可以将其集成到移动应用中了!您将在下一个实验中执行此操作。