Python 如何将二维边界框像素坐标(x、y、w、h)转换为相对坐标(Yolo格式)?

Python 如何将二维边界框像素坐标(x、y、w、h)转换为相对坐标(Yolo格式)?,python,computer-vision,conv-neural-network,yolo,Python,Computer Vision,Conv Neural Network,Yolo,嘿!我通过一个在线平台对图像数据进行注释,该平台生成如下输出坐标:bbox:{“top”:634,“left”:523,“height”:103,“width”:145}但是,我想使用此注释来训练Yolo。因此,我必须将其转换为Yolo格式:40.838021 0.60556 0.177083 0.237037 在这方面,我需要有关如何转换它的帮助。这里, 对于需要传递的大小(w,h),对于需要传递的长方体(x,x+w,y,y+h) 或者,您可以使用下面的 def convert(x,y,w,

嘿!我通过一个在线平台对图像数据进行注释,该平台生成如下输出坐标:bbox:{“top”:634,“left”:523,“height”:103,“width”:145}但是,我想使用此注释来训练Yolo。因此,我必须将其转换为Yolo格式:40.838021 0.60556 0.177083 0.237037

在这方面,我需要有关如何转换它的帮助。

这里, 对于需要传递的大小(w,h),对于需要传递的长方体(x,x+w,y,y+h)

或者,您可以使用下面的

def convert(x,y,w,h):
 dw = 1.0/w
 dh = 1.0/h
 x = (2*x+w)/2.0
 y = (2*y+w)/2.0
 x = x*dw
 y = y*dh
 w = w*dw
 h = h*dh
 return (x,y,w,h)
每个网格单元预测B类边界框以及C类概率。边界框预测有5个组件:(x,y,w,h,置信度)。相对于网格单元位置,(x,y)坐标表示框的中心(请记住,如果长方体的中心不在网格单元内,则该单元不负责)。这些坐标被归一化为介于0和1之间。相对于图像大小,(w,h)长方体尺寸也被归一化为[0,1]。让我们看一个示例:

将bbox字典转换为具有相对坐标的列表 如果要使用键
top
left
widt
height
转换python词典 以[
x1
y1
x2
y2
]格式放入列表中

其中,
x1
y1
是边界框的
左上角
的相对坐标,
x2
y2
是边界框的
右下角
的相对坐标。您可以使用以下功能:

def bbox_dict_to_list(bbox_dict, image_size):
  h = bbox_dict.get('height')
  l = bbox_dict.get('left')
  t = bbox_dict.get('top')
  w = bbox_dict.get('width')

  img_w, img_h = image_size

  x1 = l/img_w
  y1 = t/img_h
  x2 = (l+w)/img_w
  y2 = (t+h)/img_h
  return [x1, y1, x2, y2]
必须将bbox字典作为参数传递,图像大小作为元组->(图像宽度、图像高度)

范例

bbox = {"top":634,"left":523,"height":103,"width":145} 
bbox_dict_to_list(bbox, (1280, 720))
>> [0.40859375, 0.8805555555, 0.521875, 1.02361111111]

您可以更改退货顺序以满足您的需要

谢谢亲爱的@rcvaram的回复。请解释一下参数,即w,h。它是指图像的宽度和高度,还是边界框?是的,x和y是边界框的中心,而w,h是边界框的宽度和高度。我得到了它。但是,我对ut以下几点。让我解释一下。我有一个1920x1080的图像,我用以下信息画了一个边界框。x,y坐标是1167537px(边界框左上角的坐标)高度:224px宽度:320px有了这些信息,我想对它进行规范化。
bbox = {"top":634,"left":523,"height":103,"width":145} 
bbox_dict_to_list(bbox, (1280, 720))
>> [0.40859375, 0.8805555555, 0.521875, 1.02361111111]