将 boundingPoly 转换为 yolo 格式

convert boundingPoly to yolo format

Yolov5不支持分割标签,我需要把它转换成正确的格式。

如何将其转换为 yolo 格式?

        "boundingPoly": {
            "normalizedVertices": [{
                "x": 0.026169369
            }, {
                "x": 0.99525446
            }, {
                "x": 0.99525446,
                "y": 0.688811
            }, {
                "x": 0.026169369,
                "y": 0.688811
            }]
        }

yolo 格式是这样的

0 0.588196 0.474138 0.823607 0.441645
<object-class> <x> <y> <width> <height>

经过我们在评论中的反复讨论,我有了足够的信息来回答您的问题。这是 Google 愿景 API 的输出。 normalizedVertices 类似于 YOLO 格式,因为它们是“标准化”的,这意味着坐标在 0 和 1 之间缩放,而不是从 1 到 n 的像素。尽管如此,您仍需要进行一些转换才能放入 YOLO 格式。在 YOLO 格式中,第 2 列和第 3 列中的 X 和 Y 值指的是边界框的中心,而不是其中一个角。

这是一个代码片段,它将在 https://ghostbin.com/hOoaz/raw 采样到 YOLO 格式的后续字符串 '0 0.5080664305 0.5624289849999999 0.9786587390000001 0.56914843'

#Sample annotation output 
json_annotation = """
      [
        {
          "mid": "/m/01bjv",
          "name": "Bus",
          "score": 0.9459266,
          "boundingPoly": {
            "normalizedVertices": [
              {
                "x": 0.018737061,
                "y": 0.27785477
              },
              {
                "x": 0.9973958,
                "y": 0.27785477
              },
              {
                "x": 0.9973958,
                "y": 0.8470032
              },
              {
                "x": 0.018737061,
                "y": 0.8470032
              }
            ]
          }
        }
      ]
"""

import json
json_object = json.loads(json_annotation, strict=False)

#Map all class names to class id
class_dict = {"Bus": 0}
#Get class id for this record
class_id = class_dict[json_object[0]["name"]]

#Get the max and min values from segmented polygon points 
normalizedVertices = json_object[0]["boundingPoly"]["normalizedVertices"]
max_x = max([v['x'] for v in normalizedVertices])
max_y = max([v['y'] for v in normalizedVertices])
min_x = min([v['x'] for v in normalizedVertices])
min_y = min([v['y'] for v in normalizedVertices])

width = max_x - min_x
height = max_y - min_y 
center_x = min_x + (width/2)
center_y = min_y + (height/2)

yolo_row = str(f"{class_id} {center_x} {center_y} {width} {height}")
print(yolo_row)

如果您尝试训练 YOLO 模型,则还需要执行几个步骤:您需要在特定文件夹结构中设置图像和注释。但这应该可以帮助您转换注释。