import os
import json
from xml.etree.ElementTree import Element, SubElement, tostring, ElementTree
def labelme_to_voc(json_path, output_dir):
with open(json_path, 'r') as f:
labelme_data = json.load(f)
img_filename = labelme_data['imagePath']
img_width = labelme_data['imageWidth']
img_height = labelme_data['imageHeight']
shapes = labelme_data['shapes']
# Create VOC XML structure
root = Element('annotation')
folder = SubElement(root, 'folder')
folder.text = 'VOC' # Customize folder name as needed
filename = SubElement(root, 'filename')
filename.text = os.path.basename(img_filename)
size = SubElement(root, 'size')
width = SubElement(size, 'width')
width.text = str(img_width)
height = SubElement(size, 'height')
height.text = str(img_height)
depth = SubElement(size, 'depth')
depth.text = '3' # Assuming RGB images
for shape in shapes:
label = shape['label']
points = shape['points']
object_elem = SubElement(root, 'object')
name = SubElement(object_elem, 'name')
name.text = label
pose = SubElement(object_elem, 'pose')
pose.text = 'Unspecified'
truncated = SubElement(object_elem, 'truncated')
truncated.text = '0'
difficult = SubElement(object_elem, 'difficult')
difficult.text = '0'
bndbox = SubElement(object_elem, 'bndbox')
xmin = SubElement(bndbox, 'xmin')
xmin.text = str(min(points[0][0], points[1][0]))
ymin = SubElement(bndbox, 'ymin')
ymin.text = str(min(points[0][1], points[1][1]))
xmax = SubElement(bndbox, 'xmax')
xmax.text = str(max(points[0][0], points[1][0]))
ymax = SubElement(bndbox, 'ymax')
ymax.text = str(max(points[0][1], points[1][1]))
# Save the VOC XML file
xml_path = os.path.join(output_dir, os.path.splitext(os.path.basename(img_filename))[0] + '.xml')
tree = ElementTree(root)
tree.write(xml_path)
# Example usage
labelme_json_path = 'path/to/labelme.json'
output_directory = 'path/to/output'
labelme_to_voc(labelme_json_path, output_directory)
这只是一张图片的标签转换,要是一个数据集,则进行listdir遍历目录下的每个json标签即可。