我在 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个类。我不确定如何解释此输出以及如何提取边界框及其相应的类。有人可以帮我解决这个问题吗?谢谢!
不是完整的答案,而是一个开始: 输出张量尚未通过 NMS(非极大值抑制)运行,YOLO 通常会自动执行此操作。该脚本似乎加载 ONNX 模型(具有相同的输出格式),并将结果转换为具有相关分数的框:
https://github.com/ultralytics/ultralytics/blob/main/examples/YOLOv8-OpenCV-ONNX-Python/main.py
因此,您应该只需要对输出张量执行与此脚本相同的操作。稍后我会亲自尝试一下以验证它是否有效。
请注意,此脚本依赖于 opencv 来执行转置和 NMS。
请关注这篇文章:https://hackernoon.com/deploy-computer-vision-models-with-triton-inference-server
对于 YOLOv5:
我在任何地方都没有看到这个问题的答案,甚至在 Ultralytics 页面上也是如此,所以我决定根据上个月使用相同工具的情况,写下我的结论:
一开始,如果没有此页面的“评论”部分,我的研究就不可能实现: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 的最大值)将使我们清楚地了解图像上所拍摄的内容:每个类别的最大置信度。