Python:VOC 格式数据集转换为 YOLO 数据集格式
要将数据集从 VOC 格式转换为 YOLO 格式,你需要进行几个步骤。VOC(PASCAL Visual Object Classes)格式使用 XML 文件来存储图像的注释信息,而 YOLO(You Only Look Once)格式则采用文本文件存储注释信息。以下是一个简单的转换程序流程:
提取信息:
读取 VOC XML 文件,提取出图像的宽、高及每个边界框(Bounding Box)的类别、xmin、ymin、xmax、ymax。转换为 YOLO 格式:
YOLO 格式使用归一化的坐标,形式为(class_id, x_center, y_center, width, height)
,其中坐标和尺寸都是相对于图像的宽和高进行归一化的。转换公式为:
x_center = (xmin + xmax) / 2 / image_width
y_center = (ymin + ymax) / 2 / image_height
width = (xmax - xmin) / image_width
height = (ymax - ymin) / image_height
保存为文本文件:
对于每个图像,用 YOLO 格式的注释信息创建一个.txt
文件,文件名与对应的图像名相同。
以下是一个示例 Python 代码,用于实现上述转换过程:
import os
import xml.etree.ElementTree as ET
def voc_to_yolo(xml_file, output_dir, image_width, image_height, class_names):
tree = ET.parse(xml_file)
root = tree.getroot()
yolo_annotations = []
for obj in root.findall('object'):
class_name = obj.find('name').text
class_id = class_names.index(class_name) if class_name in class_names else -1
if class_id == -1:
continue
bndbox = obj.find('bndbox')
xmin = int(bndbox.find('xmin').text)
ymin = int(bndbox.find('ymin').text)
xmax = int(bndbox.find('xmax').text)
ymax = int(bndbox.find('ymax').text)
# Convert to YOLO format
x_center = (xmin + xmax) / 2 / image_width
y_center = (ymin + ymax) / 2 / image_height
width = (xmax - xmin) / image_width
height = (ymax - ymin) / image_height
yolo_annotations.append(f"{class_id} {x_center} {y_center} {width} {height}")
base_name = os.path.basename(xml_file).replace('.xml', '.txt')
with open(os.path.join(output_dir, base_name), 'w') as f:
f.write("\n".join(yolo_annotations))
# 示例参数
vocs_dir = '/path/to/voc/xmls'
output_dir = '/path/to/yolo/labels'
image_width = 1920 # 图像宽度
image_height = 1080 # 图像高度
class_names = ['person', 'car', 'bicycle'] # 根据你的数据集调整类别名称
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for xml_file in os.listdir(vocs_dir):
if xml_file.endswith('.xml'):
voc_to_yolo(os.path.join(vocs_dir, xml_file), output_dir, image_width, image_height, class_names)
请确保在运行此脚本之前,根据实际的数据集设置图像的宽度、高度以及类别名称列表 class_names
。此外,确保输入路径和输出路径均正确设置。运行脚本后,你将在 output_dir
指定的目录中找到转换后的 YOLO 格式的注释文件。