如何将边界框 (x1, y1, x2, y2) 转换为 YOLO Style (X, Y, W, H)

Ahm*_*yez 7 machine-learning image-processing computer-vision yolo

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

x1, y1, x2, y2 => ex (100, 100, 200, 200)
Run Code Online (Sandbox Code Playgroud)

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

X, Y, W, H => 0.436262 0.474010 0.383663 0.178218
Run Code Online (Sandbox Code Playgroud)

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

gam*_*n67 13

这是python中的代码snipet将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)
Run Code Online (Sandbox Code Playgroud)

检查我的示例程序从 LabelMe 注释工具格式转换为 Yolo 格式https://github.com/ivder/LabelMeYoloConverter

  • @Lxrd-AJ 我已经告诉过您,当您在数据集上准备注释时,不必使坐标相对于网格单元。您能否给我一个链接或来源,告诉您在注释训练数据时必须计算与网格单元相关的坐标,而不是在训练或推理期间? (2认同)
  • 警告其他人,问题询问“(x1, y1, x2, y2)”,而提供的答案在“(xmin, xmax, ymin, ymax)”中,因此请相应调整 (2认同)

nul*_*ull 8

有一种更直接的方法可以使用pybboxes来做这些事情。安装,

pip install pybboxes
Run Code Online (Sandbox Code Playgroud)

如下使用它,

import pybboxes as pbx

voc_bbox = (100, 100, 200, 200)
W, H = 1000, 1000  # WxH of the image
pbx.convert_bbox(voc_bbox, from_type="voc", to_type="yolo", image_size=(W,H))
>>> (0.15, 0.15, 0.1, 0.1)
Run Code Online (Sandbox Code Playgroud)

请注意,转换为 YOLO 格式需要图像宽度和高度进行缩放。


Far*_*azi 7

对于那些寻找相反问题的人(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
Run Code Online (Sandbox Code Playgroud)

  • 不,你不需要,你只是转换不同的格式。将米转换为英寸不需要您知道房子的完整尺寸,您只需运行方程式即可 (2认同)

Jon*_*ton 3

xYOLO 将图像空间标准化,在和两个方向上从 0 到 1 y。要在(x, y)坐标和 yolo(u, v)坐标之间进行转换,您需要将数据转换为,其中,u = x / XMAX是 您正在使用的图像数组的最大坐标。y = y / YMAXXMAXYMAX

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

这是一个执行转换的 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 */
Run Code Online (Sandbox Code Playgroud)