适用于 Web 的对象检测指南

借助 MediaPipe 对象检测器任务,您可以检测多个对象是否存在 对象的类别。此任务获取图片数据并输出一个检测列表 结果,每个结果代表图片中标识的一个对象。代码示例 这些说明中描述的 CodePen

要了解此任务的实际运行情况,请查看 演示。 如需详细了解其功能、模型和 配置选项,请参阅概览

代码示例

对象检测器的示例代码提供了此检测器的完整实现。 供您参考。此代码可帮助您测试此任务 开始构建您自己的文本分类应用。您可以查看、运行 修改对象检测器示例代码 只需使用网络浏览器即可。

设置

本部分介绍设置开发环境的关键步骤 专门用于使用对象检测器。有关 设置 Web 和 JavaScript 开发环境 平台版本要求,请参阅 网页版设置指南

JavaScript 软件包

对象检测器代码可通过 MediaPipe @mediapipe/tasks-vision 获取 NPM 软件包。您可以 按照平台中的说明查找并下载这些库 设置指南

<ph type="x-smartling-placeholder">

您可以通过 NPM 安装所需的软件包 创建 Deployment

npm install @mediapipe/tasks-vision

如果您想通过内容分发网络 (CDN) 导入任务代码 服务,请在 HTML 文件的 <head> 标记中添加以下代码:

<!-- You can replace JSDeliver with another CDN if you prefer to -->
<head>
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/vision_bundle.js"
    crossorigin="anonymous"></script>
</head>

型号

MediaPipe 对象检测器任务需要一个与此任务兼容的经过训练的模型 任务。如需详细了解对象检测器可用的经过训练的模型,请参阅 查看“模型”部分的任务概览。

选择并下载模型,然后将其存储在项目目录中:

<dev-project-root>/app/shared/models/

创建任务

使用其中一个对象检测器 ObjectDetector.createFrom...() 函数 为运行推理准备任务。使用 createFromModelPath() 函数。 如果模型已加载到内存中,您可以使用 createFromModelBuffer() 方法结合使用。以下代码示例演示了如何使用 createFromOptions() 函数,可让您设置更多配置 选项。如需详细了解可用的配置选项,请参阅 配置选项部分。

以下代码演示了如何构建和配置此任务:

const vision = await FilesetResolver.forVisionTasks(
  // path/to/wasm/root
  "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
objectDetector = await ObjectDetector.createFromOptions(vision, {
  baseOptions: {
    modelAssetPath: `https://storage.googleapis.com/mediapipe-tasks/object_detector/efficientdet_lite0_uint8.tflite`
  },
  scoreThreshold: 0.5,
  runningMode: runningMode
});

有关创建对象检测器任务的完整实现,请参阅 代码示例

配置选项

此任务具有以下适用于 Web 应用的配置选项:

选项名称 说明 值范围 默认值
runningMode 设置任务的运行模式。有两个 模式:

IMAGE:单图输入的模式。

视频:已解码的帧的模式。 视频或对输入数据(例如来自摄像头的直播数据)进行直播。
{IMAGE, VIDEO} IMAGE
displayNamesLocale 设置要用于 任务模型的元数据(如果有)。默认值为 en, 英语。您可以向自定义模型的元数据中添加本地化标签 使用 TensorFlow Lite Metadata Writer API 语言区域代码 en
maxResults 将可选的最高评分检测结果数上限设置为 return。 任何正数 -1(返回所有结果)
scoreThreshold 设置预测分数阈值,以替换 模型元数据(如果有)。低于此值的结果将被拒绝。 任意浮点数 未设置
categoryAllowlist 设置允许的类别名称的可选列表。如果不为空, 类别名称未在此集合内的检测结果 已滤除。重复或未知的类别名称会被忽略。 此选项与 categoryDenylist 互斥,使用 都会导致错误。 任何字符串 未设置
categoryDenylist 设置不允许使用的类别名称的可选列表。如果 非空,则类别名称在此集中的检测结果将被滤除 。重复或未知的类别名称会被忽略。这个选项 categoryAllowlist 不包含,同时使用这两个元素会导致错误。 任何字符串 未设置

准备数据

对象检测器可以检测图片中采用 托管浏览器该任务还会处理数据输入预处理,包括 调整大小、旋转和值归一化。要检测视频中的对象, 可以使用该 API 使用 帧以确定手势在视频中出现的时间。

运行任务

对象检测器使用 detect() 处理单张图片,以及 detectForVideo():检测视频帧中的对象。任务处理 数据、尝试识别对象并报告结果。

系统会运行对 detect()detectForVideo() 方法的调用 同时阻塞界面线程。如果您能识别出 视频帧,每个分类都会屏蔽主要的 线程。为防止出现这种情况,您可以部署 Web Worker 在 另一个线程。

以下代码演示了如何使用任务模型执行处理:

映像

const image = document.getElementById("image") as HTMLImageElement;
const detections = objectDetector.detect(image);

视频

await objectDetector.setOptions({ runningMode: "video" });

let lastVideoTime = -1;
function renderLoop(): void {
  const video = document.getElementById("video");

  if (video.currentTime !== lastVideoTime) {
    const detections = detector.detectForVideo(video);
    processResults(detections);
    lastVideoTime = video.currentTime;
  }

  requestAnimationFrame(() => {
    renderLoop();
  });
}

有关运行对象检测器任务的更完整实现,请参阅 代码示例

处理和显示结果

对象检测器会为每个运行检测生成检测结果对象。 results 对象包含检测结果列表,其中每项检测都包含 检测对象的边界框和类别信息,包括 对象名称和置信度分数。

以下示例展示了此任务的输出数据:

ObjectDetectorResult:
 Detection #0:
  Box: (x: 355, y: 133, w: 190, h: 206)
  Categories:
   index       : 17
   score       : 0.73828
   class name  : dog
 Detection #1:
  Box: (x: 103, y: 15, w: 138, h: 369)
  Categories:
   index       : 17
   score       : 0.73047
   class name  : dog

下图直观显示了任务输出:

对象检测器示例代码演示了如何显示检测结果 结果,请参阅 代码示例 了解详情。