将 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 模型,则还需要执行几个步骤:您需要在特定文件夹结构中设置图像和注释。但这应该可以帮助您转换注释。
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 模型,则还需要执行几个步骤:您需要在特定文件夹结构中设置图像和注释。但这应该可以帮助您转换注释。