首页 > 解决方案 > 边界框到底在哪里开始或结束?

问题描述

在 OpenCV 或对象检测模型中,它们将边界框表示为 4 个数字,例如 x、y、宽度、高度或 x1、y1、x2、y2。

这些数字似乎定义不明确,但是当分辨率很大时就可以了。但这让我想到,当图像的分辨率非常低时,例如 8x8,一个像素的错误会导致事情变得非常错误。

所以我想知道,当你说边界框有 x1=0,x2=100 时,究竟是什么意思?

具体来说,我想在理解良好的情况下消除这些混淆:

所以我认为正确的问题应该是,我如何直观地考虑边界框,这样它们就不会让我感到困惑?

标签: opencvdeep-learningobject-detectionbounding-boxyolo

解决方案


好的。在处理了很多天的边界框之后,我现在对如何考虑边界框坐标有了自己的直觉。

我将坐标分为两类:连续的和离散的。当您尝试在它们之间进行转换时,通常会出现心理问题。

假设图像的宽度=100,高度=100,那么您可以有一个带有 x,y 的连续点,该点可以在 range 中具有任何实数值[0,100]

这意味着像 (0,0), (0.5,7.1,39.83,99.9999) 这样的点是有效点。

现在,您可以通过取数字的底数将图像上的连续点转换为离散点。例如 (5.5, 8.9) 被映射到图像上的像素数 (5,8)。了解您不应该使用上限或舍入操作将其转换为离散版本非常重要。假设您有一个连续点 (0.9,0.9),该点位于 (0,0) 像素中,因此它最接近 (0,0) 像素,而不是 (1,1) 像素。

在此基础上,让我们尝试回答我的问题:

  1. 所以我想知道,当你说边界框有 x1=0,x2=100 时,究竟是什么意思?

    这意味着连续点 1 的 x 值 = 0,连续点 2 的 x 值 = 100。连续点的大小为零。这不是一个像素。

  2. 边界框边界是占据第 0 个像素还是围绕第 0 个像素(其边界在 x=-1)?

    在连续空间中,边界框边框占用零空间。边界非常纤细。但是当我们想将它绘制到图像上时,边框将具有至少 1 像素厚的大小。所以如果我们有一个连续点 (0,0),它将占据图像的第 0 个像素。但理论上,它代表第 0 个像素的左侧和顶部的细边框。

  3. 边界框的确切末端在哪里?如果图像的形状=(8,8),末端是7还是8?

    您可以拥有的最大 x,y 值是 7.999...但是当转换为离散版本时,您将剩下 7 代表最后一个像素。

  4. 如果要表示占据整个图像的边界框,它的值应该是多少?

    由于您拥有的精度,您应该在连续空间而不是离散空间中表示边界框坐标。这意味着最大的边界框从 (0,0) 开始,到 (100,100) 结束。但是如果要绘制这个框,则需要将其转换为离散版本,并在 (0,0) 处绘制边界框,并在 (99,99) 处结束。


推荐阅读