标签拷贝 labelme json格式

label_copy.py

python 复制代码
import glob
import json
import os

from natsort import natsorted


def copy_labels_from_a_to_b(labels_to_copy, a_file='a.json', b_file='b.json'):
    """
    从 a.json 中复制多个标签到 b.json

    参数:
    labels_to_copy: 要复制的标签名称列表
    a_file: 源文件路径
    b_file: 目标文件路径
    """
    try:
        # 读取源文件
        with open(a_file, 'r', encoding='utf-8') as f:
            data_a = json.load(f)

        # 读取目标文件
        with open(b_file, 'r', encoding='utf-8') as f:
            data_b = json.load(f)

        # 确保 b.json 中有 shapes 列表
        if 'shapes' not in data_b:
            data_b['shapes'] = []

        total_copied = 0
        # 查找并复制所有匹配的标签
        for label in labels_to_copy:
            shapes_to_copy = []
            for shape in data_a.get('shapes', []):
                if shape.get('label') == label:
                    shape_copy = shape.copy()
                    shapes_to_copy.append(shape_copy)

            if shapes_to_copy:
                data_b['shapes'].extend(shapes_to_copy)
                total_copied += len(shapes_to_copy)
                print(f"找到并复制 {len(shapes_to_copy)} 个 '{label}' 标签")

        if total_copied > 0:
            # 保存更新后的文件
            with open(b_file, 'w', encoding='utf-8') as f:
                json.dump(data_b, f, indent=4, ensure_ascii=False)

            print(f"总计复制 {total_copied} 个标签到 {b_file}")
        else:
            print(f"在 {a_file} 中未找到指定的任何标签: {labels_to_copy}")

        return total_copied

    except Exception as e:
        print(f"发生错误: {e}")
        return 0

# 使用示例
if __name__ == "__main__":
    # 复制单个标签
    # copy_labels_from_a_to_b(['zhi'])

    to_base=r"D:\data\jiezhi\det_1201\1201"

    dirs=glob.glob(os.path.join(to_base, "*"))
    dirs=[r"D:\data\jiezhi\det_1201\1201\20251201-201937"]

    for to_dir in dirs:

        dir_name=os.path.basename(to_dir)
        from_dir=rf"D:\data\jiezhi\det_1201\zhi_from\{dir_name}"

        json_from=glob.glob(os.path.join(from_dir, "*.json"))

        json_from=natsorted(json_from)


        json_to=glob.glob(os.path.join(to_dir, "*.json"))

        json_to=natsorted(json_to)

        for json_i, json_file in enumerate(json_from[:len(json_to)]):

            json_to_path=json_to[json_i]

            # 复制多个标签
            copy_labels_from_a_to_b(['zhi'],a_file=json_file,b_file=json_to_path)
            print(json_to_path)
相关推荐
淡海水2 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
leobertlan2 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
Tisfy3 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
乐迪信息4 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
木井巳6 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
心抵鹊6 小时前
归并排序之翻转对(hard)
数据结构·算法
白山编程大哥6 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
shehuiyuelaiyuehao6 小时前
算法34,位运算符操作,总结
算法
Navigator_Z6 小时前
LeetCode //C - 1224. Maximum Equal Frequency
c语言·算法·leetcode
Navigator_Z7 小时前
LeetCode //C++ - 1226. The Dining Philosophers
c语言·算法·leetcode