将 LabelMe 标签转换为 YOLO 标签
在机器学习工作流程中,数据处理是一个关键步骤。通常我们会使用不同的工具来标注数据,而每种工具都有其特定的格式。在这篇文章中,我们将介绍如何将 LabelMe 标注的数据转换为 YOLO 格式,以便在目标检测模型中使用。
LabelMe 简介
LabelMe 是一个开源的图像标注工具,广泛用于计算机视觉领域。它允许用户通过简单的界面为图像中的对象创建多边形标注。LabelMe 生成的标注数据以 JSON 格式存储,包含图像路径、尺寸、对象标签及其多边形坐标等信息。
YOLO 简介
YOLO(You Only Look Once)是一种流行的实时目标检测模型。YOLO 的标签格式相对简单,每个对象用一行表示,包含类标识符和归一化的边界框坐标。坐标格式为中心点的 (x, y) 位置以及宽度和高度。
代码实现
下面的代码展示了如何将 LabelMe 的 JSON 格式转换为 YOLO 的标签格式。
import os
import jsondef convert_labelme_to_yolo(json_file):with open(json_file, 'r') as f:data = json.load(f)image_path = data['imagePath']image_name = os.path.basename(image_path)image_width = data['imageWidth']image_height = data['imageHeight']yolo_labels = []for shape in data['shapes']:label = shape['label']points = shape['points']# 转换多边形坐标为 YOLO 格式x_min = min(point[0] for point in points)y_min = min(point[1] for point in points)x_max = max(point[0] for point in points)y_max = max(point[1] for point in points)# 计算 YOLO 格式的中心点坐标和宽高x_center = ((x_min + x_max) / 2) / image_widthy_center = ((y_min + y_max) / 2) / image_heightwidth = (x_max - x_min) / image_widthheight = (y_max - y_min) / image_height# 将 label 转换为 class_idif label.isdigit() and 1 <= int(label) <= 20:class_id = int(label) - 1 # YOLO 的 class_id 从 0 开始else:continue # 跳过不符合要求的标签yolo_label = f"{class_id} {x_center} {y_center} {width} {height}"yolo_labels.append(yolo_label)# 保存为 YOLO 格式的文本文件,与源文件在相同路径yolo_file = os.path.splitext(json_file)[0] + '.txt'with open(yolo_file, 'w') as f:f.write('\n'.join(yolo_labels))def process_directory(input_dir):for root, _, files in os.walk(input_dir):for file in files:if file.endswith('.json'):json_file = os.path.join(root, file)convert_labelme_to_yolo(json_file)# 设置输入目录
input_dir = 'path_to_data'# 处理目录
process_directory(input_dir)print("转换完成")
代码解释
-
导入库:我们使用
os
和json
库来处理文件路径和读取 JSON 数据。 -
convert_labelme_to_yolo
函数:- 打开并读取 JSON 文件。
- 提取图像的基本信息,如路径、宽度和高度。
- 遍历每个标注的形状,计算多边形的最小和最大坐标以确定边界框。
- 将边界框转换为 YOLO 格式的中心点坐标和宽高,并归一化。
- 将标签转换为 class_id(假设标签是数字且在 1 到 20 之间)。
- 将转换后的标签写入新的文本文件。
-
process_directory
函数:- 遍历指定目录中的所有 JSON 文件,并调用
convert_labelme_to_yolo
进行转换。
- 遍历指定目录中的所有 JSON 文件,并调用
-
执行转换:指定输入目录并执行转换过程。
通过这段代码,您可以轻松地将 LabelMe 的标注数据转换为 YOLO 格式,以便在目标检测任务中使用。希望这篇文章对您有所帮助!
欢迎关注作者公众号,获取更多技术分享