如何将Yolov5归一化边界框转换为Pascal-VOC格式坐标
Yolov5归一化边界框转Pascal VOC坐标实现
前置说明
Yolov5的归一化边界框是基于原图实际宽高做的归一化处理,如果要转换为Pascal VOC标准的像素坐标,必须传入原图的宽度和高度作为参数。
核心转换逻辑
- 先将归一化的中心点、宽高还原为像素级数值
- 基于中心点和宽高计算左上角、右下角坐标
- 可选做边界截断,避免坐标超出原图范围
- 可选将结果转为整数,符合Pascal VOC的整数像素坐标要求
完整代码实现
def yolo2pascal(yolo_box, img_width, img_height, to_int=True, clip=True): x_center, y_center, w, h = yolo_box # 还原为像素级数值 x_center = x_center * img_width y_center = y_center * img_height w = w * img_width h = h * img_height # 计算Pascal VOC格式坐标 xmin = x_center - w / 2 ymin = y_center - h / 2 xmax = x_center + w / 2 ymax = y_center + h / 2 # 边界截断,避免坐标超出原图范围 if clip: xmin = max(0, xmin) ymin = max(0, ymin) xmax = min(img_width, xmax) ymax = min(img_height, ymax) # 转整数像素坐标 if to_int: xmin = int(round(xmin)) ymin = int(round(ymin)) xmax = int(round(xmax)) ymax = int(round(ymax)) return [xmin, ymin, xmax, ymax]
调用示例
以你提供的测试数据为例,假设原图尺寸为1024*1024:
test = [0.436523, 0.535156, 0.587891, 0.484375] pascal_coords = yolo2pascal(test, 1024, 1024) print(pascal_coords) # 输出:[147, 301, 749, 797]
如果仅需要归一化格式的Pascal VOC坐标(不需要实际像素值),可以使用简化版本:
def yolo2pascal_norm(yolo_box): x_center, y_center, w, h = yolo_box xmin = x_center - w / 2 ymin = y_center - h / 2 xmax = x_center + w / 2 ymax = y_center + h / 2 return [xmin, ymin, xmax, ymax]
内容的提问来源于stack exchange,提问作者neel g
相关产品推荐
相关产品推荐

