Python 如何将二维边界框像素坐标(x、y、w、h)转换为相对坐标(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) 或者,您可以使用下面的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,
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]