给定一张图像或视频流,目标检测模型可以识别已知对象集中可能存在的对象,并提供有关它们在图像中位置的信息。
例如,示例应用程序 的此屏幕截图显示了如何识别两个对象以及它们的位置注释
入门
要了解如何在移动应用程序中使用目标检测,请探索 示例应用程序和指南。
如果您使用的是 Android 或 iOS 以外的平台,或者您已经熟悉 TensorFlow Lite API,您可以下载我们的目标检测入门模型和相应的标签。
有关元数据和关联字段(例如:labels.txt
)的更多信息,请参阅 从模型中读取元数据
如果您想为自己的任务训练自定义检测模型,请参阅 模型自定义。
对于以下用例,您应该使用不同类型的模型
示例应用程序和指南
如果您是 TensorFlow Lite 的新手,并且正在使用 Android 或 iOS,我们建议您探索以下示例应用程序,它们可以帮助您入门。
Android
您可以利用 TensorFlow Lite 任务库 的开箱即用 API,只需几行代码即可集成目标检测模型。您还可以使用 TensorFlow Lite 解释器 Java API 构建自己的自定义推理管道。
以下 Android 示例演示了使用 任务库 和 解释器 API 分别实现这两种方法。
iOS
您可以使用 TensorFlow Lite 解释器 Swift API 集成模型。请参阅以下 iOS 示例。
模型描述
本节介绍从 TensorFlow 对象检测 API 转换为 TensorFlow Lite 的 单次检测器 模型的签名。
目标检测模型经过训练,可以检测多个类别对象的出现和位置。例如,一个模型可能经过训练,可以识别包含各种水果的图像,以及指定它们代表的水果类别的标签(例如苹果、香蕉或草莓),以及指定每个对象在图像中出现位置的数据。
当随后向模型提供图像时,它将输出检测到的对象的列表、包含每个对象的边界框的位置,以及指示检测正确性的置信度得分。
输入签名
模型以图像作为输入。
假设预期图像为 300x300 像素,每个像素有三个通道(红色、蓝色和绿色)。这应该作为 270,000 字节值的扁平缓冲区(300x300x3)馈送到模型。如果模型是 量化 的,则每个值应该是一个字节,表示介于 0 到 255 之间的值。
您可以查看我们的 示例应用程序代码,了解如何在 Android 上执行此预处理。
输出签名
模型输出四个数组,映射到索引 0-4。数组 0、1 和 2 描述 N
个检测到的对象,每个数组中的一个元素对应于每个对象。
索引 | 名称 | 描述 |
---|---|---|
0 | 位置 | 介于 0 到 1 之间的 [N][4] 个浮点值的二维数组,内部数组以 [顶部、左侧、底部、右侧] 的形式表示边界框 |
1 | 类别 | 包含 N 个整数(输出为浮点数)的数组,每个整数表示来自标签文件的类别标签的索引。 |
2 | 分数 | 包含 N 个介于 0 到 1 之间的浮点数的数组,表示检测到某个类别的概率。 |
3 | 检测数量 | N 的整数值。 |
例如,假设一个模型经过训练可以检测苹果、香蕉和草莓。当提供一张图像时,它将输出一组检测结果 - 在此示例中为 5 个。
类别 | 分数 | 位置 |
---|---|---|
苹果 | 0.92 | [18, 21, 57, 63] |
香蕉 | 0.88 | [100, 30, 180, 150] |
草莓 | 0.87 | [7, 82, 89, 163] |
香蕉 | 0.23 | [42, 66, 57, 83] |
苹果 | 0.11 | [6, 42, 31, 58] |
置信度分数
要解释这些结果,我们可以查看每个检测到的对象的得分和位置。得分是介于 0 到 1 之间的数字,表示对对象确实被检测到的置信度。数字越接近 1,模型的置信度就越高。
根据您的应用程序,您可以决定一个截止阈值,低于该阈值您将丢弃检测结果。对于当前示例,一个合理的截止值是 0.5 的得分(意味着检测有效的概率为 50%)。在这种情况下,数组中的最后两个对象将被忽略,因为它们的置信度得分低于 0.5。
类别 | 分数 | 位置 |
---|---|---|
苹果 | 0.92 | [18, 21, 57, 63] |
香蕉 | 0.88 | [100, 30, 180, 150] |
草莓 | 0.87 | [7, 82, 89, 163] |
香蕉 | 0.23 | [42, 66, 57, 83] |
苹果 | 0.11 | [6, 42, 31, 58] |
您使用的截止值应基于您对误报(错误识别的对象,或图像中错误识别为对象的区域,而实际上并非如此)还是漏报(由于置信度低而错过的真实对象)更敏感。
例如,在以下图像中,一个梨(不是模型经过训练要检测的对象)被错误识别为“人”。这是一个误报的示例,可以通过选择适当的截止值来忽略。在这种情况下,0.6(或 60%)的截止值将轻松排除误报。
位置
对于每个检测到的对象,模型将返回一个包含四个数字的数组,表示包围其位置的边界矩形。对于提供的入门模型,数字的顺序如下:
[ | 顶部 | 左侧 | 底部 | 右侧 | ] |
顶部值表示矩形顶部边缘到图像顶部的距离(以像素为单位)。左侧值表示左侧边缘到输入图像左侧的距离。其他值以类似的方式表示底部和右侧边缘。
性能基准
我们 入门模型 的性能基准数字是使用 此处描述的工具 生成的。
模型名称 | 模型大小 | 设备 | GPU | CPU |
---|---|---|---|---|
COCO SSD MobileNet v1 | 27 Mb | Pixel 3(Android 10) | 22ms | 46ms* |
Pixel 4(Android 10) | 20ms | 29ms* | ||
iPhone XS(iOS 12.4.1) | 7.6ms | 11ms** |
* 使用 4 个线程。
** 在 iPhone 上使用 2 个线程以获得最佳性能结果。
模型自定义
预训练模型
可以在 检测动物园 中找到具有各种延迟和精度特征的移动优化检测模型。它们中的每一个都遵循以下部分中描述的输入和输出签名。
大多数下载的压缩包都包含一个 model.tflite
文件。如果没有,可以使用 这些说明 生成 TensorFlow Lite flatbuffer。来自 TF2 对象检测动物园 的 SSD 模型也可以使用 此处 的说明转换为 TensorFlow Lite。需要注意的是,检测模型不能直接使用 TensorFlow Lite 转换器 转换,因为它们需要生成移动友好源模型的中间步骤。上面链接的脚本执行此步骤。
TF1 和 TF2 导出脚本都具有可以启用更多输出对象或更慢、更准确的后处理的参数。请使用 --help
与脚本一起查看支持参数的详尽列表。
目前,仅对 SSD 模型进行了设备上推理优化。正在研究对其他架构(如 CenterNet 和 EfficientDet)的更好支持。
如何选择要自定义的模型?
每个模型都具有其自身的精度(由 mAP 值量化)和延迟特征。您应该选择最适合您的用例和预期硬件的模型。例如, Edge TPU 模型非常适合在 Pixel 4 上的 Google Edge TPU 上进行推理。
您可以使用我们的 基准测试工具 来评估模型并选择最有效的可用选项。
在自定义数据上微调模型
我们提供的预训练模型经过训练可以检测 90 类对象。有关类别的完整列表,请参阅 模型元数据 中的标签文件。
您可以使用称为迁移学习的技术来重新训练模型以识别原始集中不存在的类别。例如,您可以重新训练模型以检测多种类型的蔬菜,尽管原始训练数据中只有一种蔬菜。为此,您将需要为要训练的每个新标签提供一组训练图像。推荐的方法是使用 TensorFlow Lite Model Maker 库,该库使用几行代码简化了使用自定义数据集训练 TensorFlow Lite 模型的过程。它使用迁移学习来减少所需的训练数据量和时间。您还可以从 Few-shot 检测 Colab 中学习,作为使用少量示例微调预训练模型的示例。
对于使用更大数据集进行微调,请查看以下指南,了解如何使用 TensorFlow 对象检测 API 训练自己的模型: TF1, TF2。训练完成后,可以使用此处提供的说明将其转换为 TFLite 友好格式: TF1, TF2