使用python遍历获取文件夹labelme标注生成的json文件中含有shape下label为miss标签的文件
时间: 2024-05-12 13:18:26 浏览: 113
可以使用以下代码来遍历获取文件夹中含有特定标签的JSON文件:
```python
import os
import json
# 文件夹路径
folder_path = "path/to/folder"
# 目标标签
target_label = "miss"
# 遍历文件夹
for filename in os.listdir(folder_path):
# 如果是JSON文件
if filename.endswith(".json"):
# 读取JSON文件
with open(os.path.join(folder_path, filename), "r") as f:
data = json.load(f)
# 如果JSON文件中包含目标标签
if any(target_label == shape["label"] for shape in data["shapes"]):
# 处理该文件
print("找到目标文件:" + filename)
```
这段代码首先遍历指定文件夹中的所有文件,如果文件是JSON文件,则读取其中的数据。然后判断该文件中是否包含目标标签,如果是,则输出该文件名。注意,代码中的`target_label`变量需要替换为实际的目标标签。
相关问题
使用python,将文件夹中所有的labelme标注生成的json文件转换为可以用于labelimg标注的yolo格式的xml文件,且文件名与原文件名一致,且json文件中存在shape_type为circle的情况,生成的yaml中的标签需为circle的外切矩形,最后将生成的xml文件放在新文件夹里
好的,您可以使用以下代码实现:
```python
import os
import json
import xml.etree.ElementTree as ET
# 定义标签和颜色
LABELS = {'circle': 0}
COLORS = {'circle': '0,255,0'}
# 定义json文件路径和xml文件路径
json_dir = '/path/to/json/dir'
xml_dir = '/path/to/xml/dir'
# 遍历json文件夹中的所有文件
for json_file in os.listdir(json_dir):
# 如果不是json文件,则跳过
if not json_file.endswith('.json'):
continue
# 读取json文件内容
with open(os.path.join(json_dir, json_file), 'r') as f:
data = json.load(f)
# 获取文件名(去掉扩展名)
filename = os.path.splitext(json_file)[0]
# 创建xml文件
root = ET.Element('annotation')
# 添加filename元素
ET.SubElement(root, 'filename').text = filename + '.jpg'
# 添加size元素
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'
# 遍历shapes
for shape in data['shapes']:
label = shape['label']
if label not in LABELS:
continue
# 添加object元素
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元素
bndbox = ET.SubElement(obj, 'bndbox')
if shape['shape_type'] == 'circle':
# 如果是圆形,获取外切矩形
x, y = shape['points'][0]
r = shape['points'][1][0] - x
ET.SubElement(bndbox, 'xmin').text = str(round(x - r))
ET.SubElement(bndbox, 'ymin').text = str(round(y - r))
ET.SubElement(bndbox, 'xmax').text = str(round(x + r))
ET.SubElement(bndbox, 'ymax').text = str(round(y + r))
else:
# 否则,获取矩形
x1, y1 = shape['points'][0]
x2, y2 = shape['points'][1]
ET.SubElement(bndbox, 'xmin').text = str(round(min(x1, x2)))
ET.SubElement(bndbox, 'ymin').text = str(round(min(y1, y2)))
ET.SubElement(bndbox, 'xmax').text = str(round(max(x1, x2)))
ET.SubElement(bndbox, 'ymax').text = str(round(max(y1, y2)))
# 添加difficult元素
ET.SubElement(obj, 'difficult').text = '0'
# 添加bndbox颜色
ET.SubElement(obj, 'color').text = COLORS[label]
# 保存xml文件
xml_file = os.path.join(xml_dir, filename + '.xml')
tree = ET.ElementTree(root)
tree.write(xml_file)
```
这段代码会将指定文件夹中的所有json文件转换为xml文件,并将xml文件保存到指定文件夹中。处理圆形标注时,会将圆形转换为外切矩形。同时,会为每个标注添加颜色信息,以便在标注时更加直观。
使用python,将labelme标注生成的json文件转换为可以用于labelimg标注的yolo格式的txt文件
好的,您需要用到以下几个模块:`json`、`os`、`cv2`。
首先,读取json文件中的信息:
```python
import json
with open('example.json', 'r') as f:
data = json.load(f)
```
接着,遍历每个object,将其坐标转换为yolo格式的坐标,并将结果写入txt文件中:
```python
with open('example.txt', 'w') as f:
for obj in data['shapes']:
label = obj['label'] # 获取标签
x1, y1 = obj['points'][0] # 获取左上角坐标
x2, y2 = obj['points'][1] # 获取右下角坐标
img_width, img_height = data['imageWidth'], data['imageHeight'] # 获取图片尺寸
x_center, y_center = (x1 + x2) / 2 / img_width, (y1 + y2) / 2 / img_height # 计算中心点坐标
w, h = (x2 - x1) / img_width, (y2 - y1) / img_height # 计算宽高
f.write(f"{label} {x_center} {y_center} {w} {h}\n") # 写入txt文件
```
注意:这里的坐标是相对于图片尺寸的比例,即在0-1之间。
最后,得到的txt文件格式如下:
```
label1 x_center1 y_center1 w1 h1
label2 x_center2 y_center2 w2 h2
...
```
其中,每一行表示一个object,由空格隔开,依次为标签、中心点x坐标、中心点y坐标、宽度、高度。
希望可以帮到您!
阅读全文