对象检测任务指南

一只猫和一只狗,用带有正确标签的边界框突出显示

借助 MediaPipe 对象检测器任务,您可以检测图片或视频中是否存在多类对象以及这些对象的位置。例如,对象检测器可以定位图片中的狗。此任务使用机器学习 (ML) 模型处理图片数据,接受静态数据或连续视频流作为输入,并输出检测结果列表。每个检测结果都代表图片或视频中显示的对象。

试试吧!

开始使用

如需开始使用此任务,请按照适用于您所用平台的以下任一实现指南操作:

这些平台专用指南将引导您完成此任务的基本实现,包括推荐的模型,以及包含推荐配置选项的代码示例。

任务详情

本部分介绍了此任务的功能、输入和输出。

功能

  • 输入图片处理 - 处理包括图片旋转、调整大小、归一化和颜色空间转换。
  • 标签映射语言区域 - 设置显示名称所用的语言
  • 得分阈值 - 根据预测得分过滤结果。
  • 前 k 个检测 - 过滤数字检测结果。
  • 标签许可名单和拒绝名单 - 指定检测到的类别。
任务输入 任务输出
Object Detector API 接受以下数据类型之一的输入:
  • 静态图片
  • 解码后的视频帧
  • 实时视频画面
Object Detection API 会针对检测到的对象输出以下结果:
  • 对象类别
  • 概率得分
  • 边界框坐标

配置选项

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

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

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

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

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

模型

Object Detection API 要求您下载对象检测模型并将其存储在项目目录中。如果您还没有模型,请先使用默认的推荐模型。本部分介绍的其他模型在延迟时间和准确性之间进行权衡。

EfficientDet-Lite0 模型使用输入大小为 320x320 的 EfficientNet-Lite0 骨干网络和 BiFPN 特征网络。该模型是使用 COCO 数据集训练的,这是一个大规模的对象检测数据集,包含 150 万个对象实例和 80 个对象标签。请参阅完整列表,了解支持的标签。EfficientDet-Lite0 可作为 int8、float16 或 float32 使用。我们建议使用此模型,因为它能在延迟时间和准确性之间取得平衡。它既准确又轻量,适用于许多用例。

模型名称 输入形状 量化类型 版本
EfficientDet-Lite0 (int8) 320 x 320 int8 最新
EfficientDet-Lite0 (float 16) 320 x 320 float 16 最新
EfficientDet-Lite0 (float 32) 320 x 320 无(float32) 最新

EfficientDet-Lite2 模型

EfficientDet-Lite2 模型使用输入大小为 448x448 的 EfficientNet-Lite2 骨干网络和 BiFPN 特征网络。该模型是使用 COCO 数据集训练的,这是一个大规模的对象检测数据集,包含 150 万个对象实例和 80 个对象标签。请参阅支持的标签的完整列表。EfficientDet-Lite2 可作为 int8、float16 或 float32 模型提供。此模型通常比 EfficientDet-Lite0 更准确,但速度较慢,占用的内存也更多。此模型适用于准确性比速度和大小更重要的用例。

模型名称 输入形状 量化类型 版本
EfficientDet-Lite2 (int8) 448 x 448 int8 最新
EfficientDet-Lite2(浮点 16) 448 x 448 float 16 最新
EfficientDet-Lite2(浮点 32) 448 x 448 无(float32) 最新

SSD MobileNetV2 模型

SSD MobileNetV2 模型使用具有 256x256 输入大小和 SSD 特征网络的 MobileNetV2 骨干。该模型是使用 COCO 数据集训练的,这是一个大规模的对象检测数据集,包含 150 万个对象实例和 80 个对象标签。请参阅支持的标签的完整列表。SSD MobileNetV2 可作为 int8 和浮点 32 模型使用。此模型比 EfficientDet-Lite0 更快、更轻量,但准确性通常较低。此模型适用于需要牺牲一定准确性来实现快速轻量级模型的用例。

模型名称 输入形状 量化类型 版本
SSDMobileNet-V2 (int8) 256 x 256 int8 最新
SSDMobileNet-V2(32 位浮点数) 256 x 256 无(float32) 最新

模型要求和元数据

如果您决定构建要用于此任务的模型,请参阅本部分,了解自定义模型的要求。自定义模型必须采用 TensorFlow Lite 格式,并且必须包含用于描述模型运行参数的metadata

设计要求

输入 形状 说明
输入图片 形状为 [1, height, width, 3] 的 Float32 张量 归一化的输入图片。
输出 形状 说明
detection_boxes 形状为 [1, num_boxes, 4] 的 Float32 张量 每个检测到的对象的框位置。
detection_classes 形状为 [1, num_boxes] 的 Float32 张量 每个检测到的对象的类名称的索引。
detection_scores 形状为 [1, num_boxes] 的 float32 张量 每个检测到的对象的预测得分。
num_boxes 大小为 1 的 Float32 张量 检测到的框的数量。

元数据要求

参数 说明 说明
input_norm_mean 输入张量标准化中使用的均值。 归一化的输入图片。
input_norm_std 输入张量归一化中使用的字段范数。 每个检测到的对象的框位置。
label_file_paths 类别张量标签文件的路径。如果模型没有任何标签文件,请传递一个空列表。 每个检测到的对象的类名称的索引。
score_calibration_md 有关分类张量中的得分校准操作的信息。如果模型不使用得分
校准,则此参数不是必需的。
每个检测到的对象的预测得分。
num_boxes 大小为 1 的 Float32 张量 检测到的框的数量。

任务基准

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

模型名称 CPU 延迟时间 GPU 延迟时间
EfficientDet-Lite0 float32 模型 61.30 毫秒 27.83 毫秒
EfficientDet-Lite0 float16 模型 53.97 毫秒 27.97 毫秒
EfficientDet-Lite0 int8 模型 29.31 毫秒 -
EfficientDet-Lite2 float32 模型 197.98 毫秒 41.15 毫秒
EfficientDet-Lite2 float16 模型 198.77 毫秒 47.31 毫秒
EfficientDet-Lite2 int8 模型 70.91 毫秒 -
SSD MobileNetV2 float32 模型 36.30 毫秒 24.01 毫秒
SSD MobileNetV2 float16 模型 37.35 毫秒 28.16 毫秒