Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert bounding box (x1, y1, x2, y2) to YOLO Style (X, Y, W, H)

I'm training a YOLO model, I have the bounding boxes in this format:-

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

I need to convert it to YOLO format to be something like:-

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

I already calculated the center point X, Y, the height H, and the weight W. But still need a away to convert them to floating numbers as mentioned.

like image 844
Ahmed Fayez Avatar asked May 13 '19 15:05

Ahmed Fayez


People also ask

How do you convert bounding box to Yolo?

To convert between your (x, y) coordinates and yolo (u, v) coordinates you need to transform your data as u = x / XMAX and y = y / YMAX where XMAX , YMAX are the maximum coordinates for the image array you are using. This all depends on the image arrays being oriented the same way. Save this answer.

How do you get bounding box coordinates YOLOv3?

So, to predict center coordinates of bounding boxes(bx, by) YOLOv3 passes outputs(tx, ty) through sigmoid function. So, based on the above equations given in figure we get center coordinates and width and height of the bounding boxes. And all the redundant bounding boxes from 10,847 boxes are suppressed using NMS.

How do you normalize bounding box?

To make coordinates normalized, we take pixel values of x and y, which marks the center of the bounding box on the x- and y-axis. Then we divide the value of x by the width of the image and value of y by the height of the image. width and height represent the width and the height of the bounding box.


2 Answers

Here's code snipet in python to convert x,y coordinates to yolo format

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)

Check my sample program to convert from LabelMe annotation tool format to Yolo format https://github.com/ivder/LabelMeYoloConverter

like image 123
gameon67 Avatar answered Oct 14 '22 11:10

gameon67


for those looking for the reverse of the question (yolo format to normal bbox format)

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
like image 44
FarisHijazi Avatar answered Oct 14 '22 11:10

FarisHijazi