如何解释 YOLOv8 Web 模型的输出张量?

问题描述 投票:0回答:3

我在 React 应用程序中使用 YOLOv8 进行对象检测,但在解释模型的输出时遇到问题。我已经从 Ultralytics 获取了官方的“yolov8n.pt”模型,并将其转换为 Python 中的 Web 模型,如下所示:

model = YOLO("yolov8n.pt")  # load an official model
model.export(format="tfjs") # Export the model

我已将生成的 model.json 添加到 React 应用程序中的公共文件夹中。然后,我预处理图像并使用如下模型进行预测:

const imagePrediction = async () => {
  const model = await loadGraphModel('/yolon-model/model.json');

  const image = document.getElementsByClassName('catImage')[0]
  const tfimg = tf.browser.fromPixels(image).toInt();
  const tfimg_res = tf.image.resizeBilinear(tfimg, [640, 640]);
  const expandedimg = tfimg_res.transpose([0, 1, 2]).expandDims();
  
  const predictions = await model.executeAsync(expandedimg);

  console.log(predictions)
}

输出张量的形状为1x84x8400,官方yolov8n模型中有80个类。我不确定如何解释此输出以及如何提取边界框及其相应的类。有人可以帮我解决这个问题吗?谢谢!

tensorflow object-detection yolo tensorflow.js yolov8
3个回答
1
投票

不是完整的答案,而是一个开始: 输出张量尚未通过 NMS(非极大值抑制)运行,YOLO 通常会自动执行此操作。该脚本似乎加载 ONNX 模型(具有相同的输出格式),并将结果转换为具有相关分数的框:

https://github.com/ultralytics/ultralytics/blob/main/examples/YOLOv8-OpenCV-ONNX-Python/main.py

因此,您应该只需要对输出张量执行与此脚本相同的操作。稍后我会亲自尝试一下以验证它是否有效。

请注意,此脚本依赖于 opencv 来执行转置和 NMS。


1
投票

请关注这篇文章:https://hackernoon.com/deploy-computer-vision-models-with-triton-inference-server

对于 YOLOv5:

  • 输出变暗 [ 25200, 85 ],根据 yolo 输出形状。
  • 模型在每个锚点处有 80 个类 + 4 个框 + 1 个对象置信度输出,并且每个图像有 25200 个锚点,因此如果您有 4 个类要检测,则应将 85 更改为 9。

0
投票

我在任何地方都没有看到这个问题的答案,甚至在 Ultralytics 页面上也是如此,所以我决定根据上个月使用相同工具的情况,写下我的结论:

  • 一次处理一张图像将导致第一维为 1
  • 与 N 个班级合作将负责 N + 4 的第二维
  • 最后,默认情况下,导出为 tfjs 格式的 yolo 模型会创建 8400 个边界框预测 我不知道是否可以更改

一开始,如果没有此页面的“评论”部分,我的研究就不可能实现:Ultralytics tfjs 集成。使用这些技巧进行一些研究后,我选择下载 .txt 格式的预测数据并在 python 中进行分析。

此图显示了这些预测中的所有值:tfjs 格式的 yolo11n 模型的输出 看到开头(0 到 640 之间)和索引 ~40000(大约 0)之后的这些值,我们可以得出结论,前几行与维度有关,其他行与置信度有关。从这张图片中:前四行我们可以看到这些尺寸是x_min,y_min,x_max,y_max

为了让这个答案更清晰,我将只发布前 100 个框的图像,看看它们的样子:前 100 个边界框最后 100 个边界框。 可以看出,检测从左上角开始,几乎覆盖整个图像。由于我位于图像的中间,并占据了图像的大部分空间,COCO 数据集中的 0 类(“人”)的置信度分数对于前 8200 个框来说约为 0,而对于最后的框则高于 0.8: 0 类的置信度分数,其他类的置信度分数可以忽略不计,如下所示:“bus”类的置信度分数

仅取每个类别的最大值(将数据重塑为 84 x 8400 并计算沿轴 1 的最大值)将使我们清楚地了解图像上所拍摄的内容:每个类别的最大置信度

© www.soinside.com 2019 - 2024. All rights reserved.