【问题标题】:Windows ML ONNX model gives weird coordinates for boxesWindows ML ONNX 模型为盒子提供了奇怪的坐标
【发布时间】:2021-08-19 11:10:31
【问题描述】:

我使用www.customvision.ai 创建了一个 ONNX 模型来对图像进行一些对象检测。这包括一个关于如何使用它的 python 示例。但我想在 C# 中使用它。 我确实找到了一些关于如何在 C# 中使用它的示例,但都是不同的。

microsoft 有一个官方消息。但这太复杂了。首先,模型输出与我的不同。其次,你必须制作这么多的辅助方法,并且没有太多解释。我只是一个初学者。

我还尝试了在 Visual Studio 中使用 object builder (preview) 的示例。这生成了一个更简单的代码库。但是当我用我的图像尝试它时,它失败了。

然后我找到了另一个example。有了这个,我可以使用我在计算机视觉中创建的 ONNX 模型。 它给了我一个输出,但盒子的坐标不是我所期望的

我必须使用这些值来计算有效坐标吗?

分数有效。图像中有浮标。我尝试了另一张没有浮标的图像,分数低于 10%。

我在github上有一个测试项目:https://github.com/puppetSpace/MlTest 这包括 ONNX 模型和用于测试的图像。 目标检测的目标是检测水中的浮标。

我的模型的额外信息:

【问题讨论】:

    标签: c# computer-vision object-detection ml.net


    【解决方案1】:

    不确定这是否在您从事此项目时的文档中,但添加了一条注释,说明如何对使用模型生成器训练的模型的坐标进行归一化/缩放。

    https://docs.microsoft.com/dotnet/machine-learning/tutorials/object-detection-model-builder#web-api

    这是注释:

    边界框坐标被归一化为 800 像素的宽度和 600 像素的高度。要在进一步的后期处理中缩放图像的边界框坐标,您需要:

    上下坐标乘以原图高度,左右坐标乘以原图宽度。 上下坐标除以600,左右坐标除以800。

    例如,给定原始图像尺寸,actualImageHeight 和actualImageWidth,以及称为预测的ModelOutput,以下代码sn-p 显示如何缩放BoundingBox 坐标:

    var top = originalImageHeight * prediction.Top / 600;
    var bottom = originalImageHeight * prediction.Bottom / 600;
    var left = originalImageWidth * prediction.Left / 800;
    var right = originalImageWidth * prediction.Right / 800;
    

    一幅图像可能有多个边界框,因此需要对图像中的每个边界框应用相同的处理。

    【讨论】:

    • 做到了。仍然没有给我正确的坐标
    • 在“模型构建器评估”步骤中,如果您尝试使用图像创建模型。它是否正确绘制边界框?
    • 在customvision.ai上使用快速测试时,它会显示对象周围的边框。 screenshot
    • 很抱歉给您带来了困惑。我以为您使用ML.NET Model Builder 来训练您的模型,而不是认知服务(自定义视觉)。正如您在原始帖子中提到的那样,它们是不同的情况。我的回答是指使用 ML.NET Model Builder 训练的模型。当您说使用模型生成器失败时,您能再澄清一下吗?要使用自定义视觉模型,请查看研讨会的这一部分,该部分正好适合您的场景。 mlnet-workshop.azurewebsites.net/category/ONNX
    【解决方案2】:

    我相信输出值是宽度和高度的比率。因此,这个实际的宽度和高度是由(在 C# 中)找到的:

    var pixelLeft = leftRatio * imageWidth;
    var pixelTop = topRatio * imageHeight;
    var pixelRight = rightRatio * imageWidth;
    var pixelBottom = bottomRatio * imageHeight;
    

    如果您想在System.Drawing 内的图像上叠加框,creating a rectangle 的参数为:

    public void DrawRectangle (System.Drawing.Pen pen, int x, int y, int width, int height);
    

    public void DrawRectangle (System.Drawing.Pen pen, float x, float y, float width, float height);
    

    因此需要进行一些调整:

    var x = pixelLeft;
    var y = pixelTop;
    var width = pixelRight - pixelLeft;
    var height = pixelTop - pixelBottom;
    

    【讨论】:

      猜你喜欢
      • 2020-10-10
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      相关资源
      最近更新 更多