借助 MediaPipe 对象检测器任务,您可以检测多个对象是否存在 对象的类别。此任务获取图片数据并输出一个检测列表 结果,每个结果代表图片中标识的一个对象。代码示例 这些说明中描述的 CodePen。
要了解此任务的实际运行情况,请查看 演示。 如需详细了解其功能、模型和 配置选项,请参阅概览。
代码示例
对象检测器的示例代码提供了此检测器的完整实现。 供您参考。此代码可帮助您测试此任务 开始构建您自己的文本分类应用。您可以查看、运行 修改对象检测器示例代码 只需使用网络浏览器即可。
设置
本部分介绍设置开发环境的关键步骤 专门用于使用对象检测器。有关 设置 Web 和 JavaScript 开发环境 平台版本要求,请参阅 网页版设置指南。
JavaScript 软件包
对象检测器代码可通过 MediaPipe @mediapipe/tasks-vision
获取
NPM 软件包。您可以
按照平台中的说明查找并下载这些库
设置指南。
您可以通过 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
下图直观显示了任务输出:
对象检测器示例代码演示了如何显示检测结果 结果,请参阅 代码示例 了解详情。