我对 YOLOv8 训练输出(来自 ultralytics)有疑问,特别是标签的绘制(不是预测)。我确实有一个卫星图像数据集,其中建筑物屋顶上有(分割)多边形,我们希望模型能够预测建筑物屋顶的分割。问题是 YOLOv8 输出的标签绘制看起来很奇怪。我确实有 json 中的 polygons 数据,并且从多边形中提取/创建了 bbox (因为 YOLO 需要标签中的 bbox 坐标),然后将标签放入 YOLO 结构中。我担心如果我在数据处理过程中遗漏了一些东西,但是我自己的可视化是正确的并且完美地显示了标签。
我的可视化:
YOLO 可视化(不同图像,但所有图像上都有相同的问题):
json 文件中的原始多边形看起来像这样:
"polygon": [[0.6005, 0.0844], [0.432, 0.3742], [0.2131, 0.2514], [0.3691, 0.0], [0.4462, 0.0]]
YOLO 标签 txt 文件如下所示:
{label_clss}{x_center}{y_center}{bbox_width}{bbox_height}{polygon_coord}
3 0.4068 0.1871 0.3874 0.3742 0.6005 0.0844 0.4320 0.3742 0.2131 0.2514 0.3691 0.0000 0.4462 0.0000
1 0.2420 0.2840 0.0817 0.0602 0.2161 0.2539 0.2012 0.2784 0.2693 0.3141 0.2829 0.2921
3 0.4968 0.5071 0.3422 0.3051 0.4035 0.3587 0.3257 0.4908 0.4726 0.5833 0.4476 0.6200 0.5621 0.6597 0.6679 0.4923 0.4484 0.3546 0.4329 0.3777
我用来从多边形获取 bbox 的函数:
def get_bounding_box(polygon):
# Extract x and y coordinates separately
x_coords = [point[0] for point in polygon]
y_coords = [point[1] for point in polygon]
# Determine the bounding box corners
min_x, max_x = min(x_coords), max(x_coords)
min_y, max_y = min(y_coords), max(y_coords)
# Calculate center, width, and height
x_center = (min_x + max_x) / 2
y_center = (min_y + max_y) / 2
width = max_x - min_x
height = max_y - min_y
return x_center, y_center, width, height
这是我用来生成YOLO txt文件的方法:
def export_yolo_labels(json_data, folder_path="yolo_labels"):
os.makedirs(folder_path, exist_ok=True)
for anno in json_data:
img_size = (anno["image_size"]["width"],anno["image_size"]["height"])
img_name = anno["image_name"]
label_name = f"{img_name.replace('.png', '.txt')}"
file = open(os.path.join(folder_path,label_name), "a")
for label in anno["labels"]:
label_class = label["label_class"]
polygon = label["polygon"]
x_center, y_center, bbox_width, bbox_height = get_bounding_box(polygon)
flat_polygon = flatten_polygon(polygon)
yolo_text_format = f"{label_class} {x_center:.4f} {y_center:.4f} {bbox_width:.4f} {bbox_height:.4f} {flat_polygon}"
file.write(yolo_text_format + '\n')
file.close()
我错过了什么吗?可能是什么问题?怎么解决呢?谢谢!
标签采用YOLOv8的正确格式
对于对象分割任务,Yolov8所需的标签格式如下(https://docs.ultralytics.com/datasets/segment/#ultralytics-yolo-format):
<class-index> <x1> <y1> <x2> <y2> ... <xn> <yn>
您需要保留标准化的段坐标
{label_clss}{polygon_coord}
并去掉多余的 bbox 部分 {x_center}{y_center}{bbox_width}{bbox_height}
,因为它仅在对象检测任务中需要。在对象分割的情况下,yolov8 程序代码将轻松地从提供的分割坐标中计算出 bbox 坐标。
因此,在您的情况下,我怀疑模型接受标签中的 bbox 坐标作为段的一部分,并绘制此扭曲的结果。