使用python,将文件夹中所有的labelme标注生成的json文件转换为可以用于labelimg标注的yolo格式的xml文件,且文件名与原文件名一致,且json文件中存在shape_type为circle的情况,这种情况下的shape中包含两个点,第一个点为圆心,第一个点到第二个点的距离为半径,据此推算出该圆的外切矩形坐标,并将该矩形生成的在相应的xml文件中,最后将生成的xml文件放在新文件夹里
时间: 2024-02-15 12:05:42 浏览: 53
好的,我理解了你的问题。这个任务可以通过以下步骤完成:
1. 遍历文件夹中所有的json文件;
2. 对于每个json文件,读取其中的shape信息,将其转换为yolo格式的xml文件;
3. 如果json文件中存在shape_type为circle的情况,将其转换为外切矩形坐标,并在xml文件中添加该矩形信息;
4. 将生成的xml文件放在新文件夹中。
下面是一个实现这个任务的Python代码:
```python
import os
import json
import xml.etree.ElementTree as ET
# 定义类别名称列表
class_names = ['circle', 'rectangle', 'triangle']
# 定义json文件夹和xml文件夹的路径
json_folder = 'path/to/json/folder'
xml_folder = 'path/to/xml/folder'
# 遍历json文件夹中所有的json文件
for json_file in os.listdir(json_folder):
if json_file.endswith('.json'):
# 读取json文件内容
with open(os.path.join(json_folder, json_file), 'r') as f:
data = json.load(f)
# 获取文件名和文件夹路径
filename = os.path.splitext(json_file)[0]
folder = os.path.basename(json_folder)
# 创建XML根节点
root = ET.Element('annotation')
# 添加文件夹、文件名和路径信息
ET.SubElement(root, 'folder').text = folder
ET.SubElement(root, 'filename').text = filename + '.jpg'
ET.SubElement(root, 'path').text = os.path.join(xml_folder, filename + '.jpg')
# 添加源信息
source = ET.SubElement(root, 'source')
ET.SubElement(source, 'database').text = 'Unknown'
# 添加图像尺寸信息
size = ET.SubElement(root, 'size')
ET.SubElement(size, 'width').text = str(data['imageWidth'])
ET.SubElement(size, 'height').text = str(data['imageHeight'])
ET.SubElement(size, 'depth').text = '3'
# 添加类别和边界框信息
for shape in data['shapes']:
# 获取类别名称和边界框坐标
label = shape['label']
points = shape['points']
x_min = min([p[0] for p in points])
y_min = min([p[1] for p in points])
x_max = max([p[0] for p in points])
y_max = max([p[1] for p in points])
# 如果类别是圆形,将其转换为外切矩形坐标
if shape['shape_type'] == 'circle':
x_c, y_c = points[0]
r = int(((points[1][0]-x_c)**2 + (points[1][1]-y_c)**2)**0.5)
x_min = x_c - r
y_min = y_c - r
x_max = x_c + r
y_max = y_c + r
# 创建对象节点
obj = ET.SubElement(root, 'object')
ET.SubElement(obj, 'name').text = label
ET.SubElement(obj, 'pose').text = 'Unspecified'
ET.SubElement(obj, 'truncated').text = '0'
ET.SubElement(obj, 'difficult').text = '0'
# 添加边界框节点
bndbox = ET.SubElement(obj, 'bndbox')
ET.SubElement(bndbox, 'xmin').text = str(x_min)
ET.SubElement(bndbox, 'ymin').text = str(y_min)
ET.SubElement(bndbox, 'xmax').text = str(x_max)
ET.SubElement(bndbox, 'ymax').text = str(y_max)
# 生成XML文件
tree = ET.ElementTree(root)
tree.write(os.path.join(xml_folder, filename + '.xml'))
```
这个代码会将json文件夹中的所有json文件转换为yolo格式的xml文件,并将这些文件保存在xml文件夹中。如果json文件中存在shape_type为circle的情况,会将其转换为外切矩形坐标,并在xml文件中添加该矩形信息。
阅读全文