【问题标题】:How to convert bounding box (x1, y1, x2, y2) to YOLO Style (X, Y, W, H)如何将边界框(x1、y1、x2、y2)转换为 YOLO 样式(X、Y、W、H)
【发布时间】:2019-09-30 14:56:05
【问题描述】:

我正在训练一个 YOLO 模型,我有这种格式的边界框:-

x1, y1, x2, y2 => ex (100, 100, 200, 200)

我需要将其转换为 YOLO 格式,如下所示:-

X, Y, W, H => 0.436262 0.474010 0.383663 0.178218

我已经计算了中心点 X、Y、高度 H 和重量 W。 但是仍然需要将它们转换为前面提到的浮点数。

【问题讨论】:

    标签: machine-learning image-processing computer-vision yolo


    【解决方案1】:

    这是python中的代码片段,用于将x,y坐标转换为yolo格式

    def convert(size, box):
        dw = 1./size[0]
        dh = 1./size[1]
        x = (box[0] + box[1])/2.0
        y = (box[2] + box[3])/2.0
        w = box[1] - box[0]
        h = box[3] - box[2]
        x = x*dw
        w = w*dw
        y = y*dh
        h = h*dh
        return (x,y,w,h)
    
    im=Image.open(img_path)
    w= int(im.size[0])
    h= int(im.size[1])
    
    
    print(xmin, xmax, ymin, ymax) #define your x,y coordinates
    b = (xmin, xmax, ymin, ymax)
    bb = convert((w,h), b)
    

    查看我的示例程序,将LabelMe标注工具格式转换为Yolo格式https://github.com/ivder/LabelMeYoloConverter

    【讨论】:

    • 这不会将其转换为中心标准化坐标吗?这是否与相对于网格单元格的 YOLO 边界框编码相同??
    • @Lxrd-AJ 执行检测时它与网格单元格相关。此格式用于训练数据
    • 我认为这是错误的。 convert 返回中心标准化坐标中的坐标。这是相对于整个图像而不是网格单元格的。为了使其相对于网格单元,您需要乘以 (7 * center_x) - floor(7 * center_x),假设网格大小为 7
    • @Lxrd-AJ 我已经告诉过您,当您在数据集上准备注释时,您不必制作相对于网格单元格的坐标。您能否给我一个链接或来源,告诉您在 ANNOTATING 训练数据时必须计算与网格单元相关的坐标,而不是在训练或推理期间?
    • 警告其他人,问题问(x1, y1, x2, y2),而提供的答案在(xmin, xmax, ymin, ymax),所以请相应地调整
    【解决方案2】:

    对于那些寻找问题相反的人(yolo 格式到普通 bbox 格式)

    def yolobbox2bbox(x,y,w,h):
        x1, y1 = x-w/2, y-h/2
        x2, y2 = x+w/2, y+h/2
        return x1, y1, x2, y2
    

    【讨论】:

    • 你不需要总尺寸吗?
    • 不,你没有,你只是在转换不同的格式。将米转换为英寸不需要你知道房子的全尺寸,你只需运行等式
    • 你的方程和你把它放在这里的事实昨天为我节省了 15 分钟,非常感谢,为此我也赞成它。即使我必须将乘法与大小相加,因为转换回像素坐标非常需要大小。 500px 图像中的 0.4 是 x=200。 1000 像素图像中的 0.4 是 x=400。如果您没有转换回基于像素的格式,最好在帖子中提及这一点。
    • 实际上不需要乘以转换为像素坐标,但您可能确实需要对其进行舍入。在示例中:yolobbox2bbox(5,5,2,2): output:(4.0, 4.0, 6.0, 6.0)。这正是像素尺寸。检查您对该函数的输入,如果最大值为 1,那么这就是您需要相乘的原因,该函数是通用的,它采用像素坐标并返回像素坐标,或者采用缩放坐标 (0,1) 并返回缩放坐标。您可以在之前或之后对其进行缩放。如果输入是像素,则不需要相乘。
    【解决方案3】:

    YOLO 将图像空间规范化为在 xy 方向上从 0 运行到 1。要在 (x, y) 坐标和 yolo (u, v) 坐标之间进行转换,您需要将数据转换为 u = x / XMAXy = y / YMAX 其中XMAXYMAX 是您正在使用的图像数组的最大坐标。

    这一切都取决于以相同方式定向的图像阵列。

    这是一个执行转换的 C 函数

    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    #include <math.h>
    
    struct yolo {
        float   u;
        float   v;
        };
    
    struct yolo
    convert (unsigned int x, unsigned int y, unsigned int XMAX, unsigned int YMAX)
    {
        struct yolo point;
    
        if (XMAX && YMAX && (x <= XMAX) && (y <= YMAX))
        {
            point.u = (float)x / (float)XMAX;
            point.v = (float)y / (float)YMAX;
        }
        else
        {
            point.u = INFINITY;
            point.v = INFINITY;
            errno = ERANGE;
        }
    
        return point;
    }/* convert */
    
    
    int main()
    {
        struct yolo P;
    
        P = convert (99, 201, 255, 324);
    
        printf ("Yolo coordinate = <%f, %f>\n", P.u, P.v);
    
        exit (EXIT_SUCCESS);
    }/* main */
    

    【讨论】:

      【解决方案4】:

      对于yolo格式转x1,y1,x2,y2格式

      def yolobbox2bbox(x,y,w,h):
          x1 = int((x - w / 2) * dw)
          x2 = int((x + w / 2) * dw)
          y1 = int((y - h / 2) * dh)
          y2 = int((y + h / 2) * dh)
      
          if x1 < 0:
              x1 = 0
          if x2 > dw - 1:
              x2 = dw - 1
          if y1 < 0:
              y1 = 0
          if y2 > dh - 1:
              y2 = dh - 1
      
      return x1, y1, x2, y2
      

      【讨论】:

        【解决方案5】:

        只是阅读我也在寻找这个的答案,但发现这更能了解后端发生的事情。 在此填写:Source

        假设x/yminx/ymax 分别是您的边界角,top left and bottom right。那么:

        x = xmin
        y = ymin
        w = xmax - xmin
        h = ymax - ymin
        

        然后你需要normalize这些,这意味着将它们作为整个图像的一部分,所以简单地将每个值除以其各自的大小从上面的值:

        x = xmin / width
        y = ymin / height
        w = (xmax - xmin) / width
        h = (ymax - ymin) / height
        

        这假定原点位于左上角,如果不是这种情况,则必须应用移位因子。

        所以答案

        【讨论】:

          猜你喜欢
          • 2020-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-12
          • 2017-11-18
          • 1970-01-01
          相关资源
          最近更新 更多