使用python,将文件夹中所有的labelme标注生成的json文件转换为可以用于labelimg标注的yolo格式的xml文件,且文件名与原文件名一致,且json文件中存在shape_type为circle的情况,这种情况下的shape中包含两个点,第一个点为圆心,第一个点到第二个点的距离为半径,生成的yaml中的标签需为circle的外切矩形,最后将生成的xml文件放在新文件夹里
时间: 2024-02-15 14:05:36 浏览: 135
以下是一个实现将labelme标注的json文件转换为yolo格式的xml文件的Python代码。该代码会遍历指定的文件夹中的所有json文件,并将其转换为与原文件名相同的xml文件,并将xml文件保存在指定的新文件夹中。对于shape_type为circle的标注,本代码会将其转换为外切矩形。
```python
import os
import json
import math
from xml.etree.ElementTree import Element, SubElement, tostring
from xml.dom.minidom import parseString
def json_to_xml(json_path, xml_path):
with open(json_path, 'r') as f:
data = json.load(f)
# 获取图像的尺寸
image_width = data['imageWidth']
image_height = data['imageHeight']
# 创建XML根节点
root = Element('annotation')
# 创建XML子节点并填充图像信息
SubElement(root, 'folder').text = os.path.dirname(json_path)
SubElement(root, 'filename').text = os.path.basename(json_path).split('.')[0] + '.jpg'
SubElement(root, 'path').text = json_path
size_node = SubElement(root, 'size')
SubElement(size_node, 'width').text = str(image_width)
SubElement(size_node, 'height').text = str(image_height)
SubElement(size_node, 'depth').text = '3'
# 处理每个标注
for shape in data['shapes']:
label = shape['label']
if shape['shape_type'] == 'circle':
# 获取圆的外切矩形
x1 = shape['points'][0][0] - shape['points'][1][1]
y1 = shape['points'][0][1] - shape['points'][1][1]
x2 = shape['points'][0][0] + shape['points'][1][1]
y2 = shape['points'][0][1] + shape['points'][1][1]
else:
# 获取多边形的外切矩形
x1 = min(point[0] for point in shape['points'])
y1 = min(point[1] for point in shape['points'])
x2 = max(point[0] for point in shape['points'])
y2 = max(point[1] for point in shape['points'])
# 将标注信息写入XML文件
object_node = SubElement(root, 'object')
SubElement(object_node, 'name').text = label
bndbox_node = SubElement(object_node, 'bndbox')
SubElement(bndbox_node, 'xmin').text = str(x1)
SubElement(bndbox_node, 'ymin').text = str(y1)
SubElement(bndbox_node, 'xmax').text = str(x2)
SubElement(bndbox_node, 'ymax').text = str(y2)
# 保存XML文件
with open(xml_path, 'w') as f:
xml_string = parseString(tostring(root)).toprettyxml()
f.write(xml_string)
# 指定原标注文件夹和新标注文件夹
json_folder = 'path/to/json/folder'
xml_folder = 'path/to/xml/folder'
# 遍历原标注文件夹中的所有json文件
for json_file in os.listdir(json_folder):
if json_file.endswith('.json'):
json_path = os.path.join(json_folder, json_file)
xml_path = os.path.join(xml_folder, os.path.splitext(json_file)[0] + '.xml')
json_to_xml(json_path, xml_path)
```
请注意,在本代码中处理shape_type为circle的标注时,是将其转换为外切矩形,而不是真正的矩形。如果需要将其转换为真正的矩形,可以根据圆的半径计算出其左上角和右下角的坐标。
阅读全文