明白了,鱼油。我们会一步步检查问题所在,并尝试找出原因。下面是一个完整的脚本,用于将Labelme生成的JSON文件转换为YOLO格式的TXT文件。请确保你的JSON文件路径和内容都是正确的。
### 核心步骤:
1. 读取JSON文件。
2. 提取标注信息(标签和坐标)。
3. 转换坐标格式为YOLO所需的相对坐标格式。
4. 保存为TXT文件。
### 代码示例
import json
import os
def convert_coordinates(size, box):
dw = 1./size[0]
dh = 1./size[1]
x = (box[0] + box[2])/2.0
y = (box[1] + box[3])/2.0
w = box[2] - box[0]
h = box[3] - box[1]
x = x*dw
w = w*dw
y = y*dh
h = h*dh
return (x, y, w, h)
def json_to_txt(json_file, output_dir, class_map):
with open(json_file, 'r', encoding='utf-8') as f:
data = json.load(f)
image_height = data['imageHeight']
image_width = data['imageWidth']
txt_file = os.path.join(output_dir, os.path.splitext(os.path.basename(json_file))[0] + '.txt')
with open(txt_file, 'w') as f:
for shape in data['shapes']:
label = shape['label']
if label not in class_map:
continue
points = shape['points']
xmin = min(points[0][0], points[1][0])
ymin = min(points[0][1], points[1][1])
xmax = max(points[0][0], points[1][0])
ymax = max(points[0][1], points[1][1])
bbox = (xmin, ymin, xmax, ymax)
yolo_box = convert_coordinates((image_width, image_height), bbox)
class_id = class_map[label]
f.write(f"{class_id} {' '.join(map(str, yolo_box))}\n")
def convert_directory(json_dir, output_dir, class_map):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for filename in os.listdir(json_dir):
if filename.endswith('.json'):
json_file = os.path.join(json_dir, filename)
json_to_txt(json_file, output_dir, class_map)
if __name__ == "__main__":
json_directory = 'path/to/json/files' # JSON文件夹路径
output_directory = 'path/to/output/txt/files' # 输出TXT文件夹路径
class_mapping = {
"class1": 0,
"class2": 1,
"class3": 2,
# 添加更多的类别映射
}
convert_directory(json_directory, output_directory, class_mapping)
### 步骤介绍:
1. **convert_coordinates**:函数用于将绝对坐标转换为YOLO所需的相对坐标。
2. **json_to_txt**:函数读取JSON文件,提取标注信息并写入TXT文件。
3. **convert_directory**:函数遍历给定目录下的所有JSON文件,并将其转换为TXT文件。
4. **class_mapping**:字典定义了标签名称到类别ID的映射。
### 运行上述代码:
1. 将 `json_directory` 设置为你的 JSON 文件夹路径。
2. 将 `output_directory` 设置为输出 TXT 文件的文件夹路径。
3. 根据你的标签修改 `class_mapping` 字典。
运行完代码后,确保在`output_directory`中生成的TXT文件不是空的。如果仍遇到问题,请检查以下几点:
1. 确保JSON文件内容格式正确。
2. 确保标签名称在`class_mapping`中正确映射。
如果仍有问题,请给出更详细的错误信息或样本数据,以便更进一步调试。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |