用python代码将labelme标注的数据标注集转换成yolo可识别的数据标注集
时间: 2024-08-30 14:03:15 浏览: 118
基于python的将labelme数据标注格式转换为YoloV8语义分割数据集,并可自动划分训练集和验证集
5星 · 资源好评率100%
在Python中,将LabelMe标注的数据转换为YOLO所需的格式,通常需要几个步骤。LabelMe是一个图像标注工具,而YOLO是一种目标检测算法,它们的数据结构有所不同。这里提供一个简化版的示例,假设你已经有一个包含LabelMe JSON文件的目录:
```python
import os
import json
from PIL import Image
from pascal_voc_writer import Writer
def labelme_to_yolo(labelme_json_dir, output_yolo_dir):
# 创建YOLO所需的文件结构
if not os.path.exists(output_yolo_dir):
os.makedirs(output_yolo_dir)
for filename in os.listdir(labelme_json_dir):
if filename.endswith(".json"):
with open(os.path.join(labelme_json_dir, filename), "r") as f:
data = json.load(f)
img_path = os.path.join(labelme_json_dir, data["imagePath"])
im = Image.open(img_path)
width, height = im.size
annotations = []
for shape in data["shapes"]:
label = shape["label"]
points = [(x, y) for x, y, w, h in shape["points"]]
x_min, y_min = min(points, key=lambda xy: xy[0])[0], min(points, key=lambda xy: xy[1])[1]
x_max, y_max = max(points, key=lambda xy: xy[0])[0] + w, max(points, key=lambda xy: xy[1])[1] + h
box_w, box_h = x_max - x_min, y_max - y_min
object_name = f"{label}_box"
annotations.append({
"class": object_name,
"xmin": x_min,
"ymin": y_min,
"xmax": x_max,
"ymax": y_max,
"obj": 1
})
# 写入YOLO所需的txt文件
txt_file = os.path.join(output_yolo_dir, filename[:-5] + ".txt")
with open(txt_file, "w") as txt_f:
Writer(txt_file).write(annotations, names=[f"{i}_box" for i in range(len(annotations))],
image_size=(width, height))
# 使用函数转换数据
labelme_to_yolo("path/to/labelme/json", "path/to/output/yolo")
```
这个脚本读取每个LabelMe JSON,提取出边界框信息并转换为YOLO所需的格式(每行一个对象,包含类别名、坐标)。注意实际使用时可能需要根据LabelMe JSON的具体结构进行调整。
阅读全文