图片分类任务指南

借助 MediaPipe 图像分类器任务,您可以对图像执行分类。您可以使用此任务在训练时定义的一组类别中识别某张图片所代表的含义。此任务使用机器学习 (ML) 模型作为静态数据或连续流处理图片数据,并输出按概率得分降序排列的潜在类别列表。

试试吧!

开始使用

如需开始使用此任务,请按照适用于您的目标平台的其中一个实现指南进行操作。这些平台专用指南将引导您使用推荐的模型完成此任务的基本实现,并提供包含推荐配置选项的代码示例:

任务详情

本部分介绍此任务的功能、输入、输出和配置选项。

特性

  • 输入图片处理 - 处理包括图片旋转、调整大小、归一化和颜色空间转换。
  • 兴趣区域 - 对图片的某个区域(而不是整个图片)执行分类。
  • 标签地图语言区域 - 设置显示名称使用的语言。
  • 分数阈值 - 根据预测分数过滤结果。
  • Top-k 分类 - 限制分类结果的数量。
  • 标签许可名单和拒绝名单 - 指定已分类的类别。
任务输入 任务输出
输入可以是以下数据类型之一:
  • 静态图片
  • 已解码的视频帧
  • 实时视频画面
图像分类器会输出一个包含以下内容的类别列表:
  • 类别索引:类别在模型输出中的索引
  • 分数:此类别的置信度分数,通常为 [0,1] 之间的概率
  • 类别名称(可选):TFLite 模型元数据中指定的类别名称(如果有)
  • 类别显示名称(可选):TFLite 模型元数据中指定的类别的显示名称,采用通过显示名称语言区域选项指定的语言(如果有)

配置选项

此任务具有以下配置选项:

选项名称 说明 值范围 默认值
running_mode 设置任务的运行模式。有三种模式:

IMAGE:单张图片输入的模式。

VIDEO:视频的已解码帧的模式。

LIVE_STREAM:输入数据(例如来自摄像头)的直播的模式。在此模式下,必须调用 resultListener,以设置用于异步接收结果的监听器。
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
display_names_locale 设置任务模型元数据中提供的显示名(如果有)要使用的标签语言。英语的默认值为 en。您可以使用 TensorFlow Lite Metadata Writer API 向自定义模型的元数据添加本地化标签 语言区域代码 en
max_results 设置要返回的得分最高的分类结果的数量上限(可选)。如果小于 0,将返回所有可用的结果。 任何正数 -1
score_threshold 设置预测分数阈值,以替换模型元数据中提供的阈值(如果有)。低于此值的结果会被拒绝。 任意浮点数 未设置
category_allowlist 设置允许的类别名称的可选列表。如果为非空,则类别名称不在此集合中的分类结果将被滤除。系统会忽略重复或未知的类别名称。 此选项与 category_denylist 互斥,如果同时使用这两者,就会引发错误。 任何字符串 未设置
category_denylist 设置不允许使用的类别名称的可选列表。如果非空,则类别名称在此集合中的分类结果将被滤除。系统会忽略重复或未知的类别名称。此选项与 category_allowlist 互斥,同时使用这两者会导致错误。 任何字符串 未设置
result_callback 设置结果监听器,以在图像分类器处于直播模式时异步接收分类结果。只能在跑步模式设为“LIVE_STREAM”时使用 N/A 未设置

模型

如需使用图片分类器,您需要下载图片分类模型并将其存储在项目目录中。开始使用此任务进行开发时,请先使用适用于目标平台的默认推荐模型。其他可用模型通常会在性能、准确性、分辨率和资源要求之间进行权衡,在某些情况下,还会包含其他功能。

EfficientNet-Lite0 模型使用 EfficientNet 架构,并使用 ImageNet 进行训练,以识别 1,000 种类别,例如树木、动物、食物、车辆、人等。请参阅支持的标签完整列表。EfficientNet-Lite0 作为 int8 和 float 32 模型提供。推荐使用此模型,因为它能够在延迟时间和准确率之间取得平衡。它既准确又轻量,对于许多使用场景来说都足够。

模型名称 输入形状 量化类型 Versions
EfficientNet-Lite0 (int8) 224 x 224 int8 最新动态
EfficientNet-Lite0(浮点数 32) 224 x 224 无 (float32) 最新动态

EfficientNet-Lite2 模型

EfficientNet-Lite2 模型使用 EfficientNet 架构,并使用 ImageNet 进行训练,以识别 1,000 个类别,例如树木、动物、食物、车辆、人等。请参阅支持的标签完整列表。EfficientNet-Lite2 以 int8 和 float 32 模型的形式提供。此模型通常比 EfficientNet-Lite0 更准确,但速度也较慢且内存占用量也更大。此模型适用于准确性高于速度或大小的用例。

模型名称 输入形状 量化类型 Versions
EfficientNet-Lite2 (int8) 224 x 224 int8 最新动态
EfficientNet-Lite2(浮点数 32) 224 x 224 无 (float32) 最新动态

任务基准

以下是基于上述预训练模型的整个流水线的任务基准。延迟时间结果是 Pixel 6 使用 CPU / GPU 时的平均延迟时间。

模型名称 CPU 延迟时间 GPU 延迟时间
EfficientNet-Lite0(浮点数 32) 23.52 毫秒 18.90 毫秒
EfficientNet-Lite0 (int8) 10.08 毫秒 -
EfficientNet-Lite2(浮点数 32) 44.17 毫秒 22.20 毫秒
EfficientNet-Lite2 (int8) 19.43 毫秒 -

自定义模型

如果您想改进或更改所提供模型的功能,可以将自定义机器学习模型用于此任务。您可以使用 Model Maker 修改现有模型,或使用 TensorFlow 等工具构建模型。与 MediaPipe 搭配使用的自定义模型必须采用 TensorFlow Lite 格式,并且必须包含描述模型操作参数的特定元数据。在构建您自己的模型之前,您应该考虑使用 Model Maker 修改为此任务提供的模型。

如果您有兴趣使用自己的数据集创建自定义图片分类器,请从图片分类器自定义教程开始。