YOLOv8 绘图标签问题,卫星图像数据

问题描述 投票:0回答:1

我对 YOLOv8 训练输出(来自 ultralytics)有疑问,特别是标签的绘制(不是预测)。我确实有一个卫星图像数据集,其中建筑物屋顶上有(分割)多边形,我们希望模型能够预测建筑物屋顶的分割。问题是 YOLOv8 输出的标签绘制看起来很奇怪。我确实有 json 中的 polygons 数据,并且从多边形中提取/创建了 bbox (因为 YOLO 需要标签中的 bbox 坐标),然后将标签放入 YOLO 结构中。我担心如果我在数据处理过程中遗漏了一些东西,但是我自己的可视化是正确的并且完美地显示了标签。

我的可视化:

https://i2.paste.pics/QVOMT.png?trs=34b121c874955a5f596553548b231034c39f8b8d551235cecc2ff5cd0ae61711&rand=sQfTxn57Xc

YOLO 可视化(不同图像,但所有图像上都有相同的问题):

https://i2.paste.pics/QVON6.png?trs=34b121c874955a5f596553548b231034c39f8b8d551235cecc2ff5cd0ae61711&rand=uRbqAVPmSc

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的正确格式

deep-learning drawing image-segmentation yolo yolov8
1个回答
0
投票

对于对象分割任务,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 坐标作为段的一部分,并绘制此扭曲的结果。

© www.soinside.com 2019 - 2024. All rights reserved.