数据集,批量更新分类数值OR批量删除分类行数据

数据集批量更新分类OR删除分类行数据

python 复制代码
import os


def remove_class_from_file(file_path, class_to_remove):
    """
    从YOLO格式的标注文件中删除指定类别的行记录,并去除空行。

    :param file_path: YOLO标注文件路径
    :param class_to_remove: 需要删除的类别ID
    :return: 删除的行数
    """
    deleted_lines = 0

    # 读取原始数据
    with open(file_path, 'r') as file:
        lines = file.readlines()

    # 过滤掉指定类别的行
    filtered_lines = [line for line in lines if not line.startswith(f"{class_to_remove} ")]

    # 去除空行
    cleaned_lines = [line for line in filtered_lines if line.strip()]

    # 计算删除的行数
    deleted_lines = len(lines) - len(cleaned_lines)

    # 将清理后的数据写回文件
    with open(file_path, 'w') as file:
        file.writelines(cleaned_lines)

    return deleted_lines


def update_class_in_file(file_path, old_class, new_class):
    """
    将YOLO格式的标注文件中指定类别的数字更新为新的类别ID。

    :param file_path: YOLO标注文件路径
    :param old_class: 需要更新的旧类别ID
    :param new_class: 更新后的新类别ID
    :return: 更新的行数
    """
    updated_lines = 0

    # 读取原始数据
    with open(file_path, 'r') as file:
        lines = file.readlines()

    # 更新类别ID
    updated_lines = 0
    new_lines = []
    for line in lines:
        if line.startswith(f"{old_class} "):
            new_lines.append(line.replace(f"{old_class} ", f"{new_class} ", 1))
            updated_lines += 1
        else:
            new_lines.append(line)

    # 将更新后的数据写回文件
    with open(file_path, 'w') as file:
        file.writelines(new_lines)

    return updated_lines


def process_directory(directory_path, class_to_remove=None, old_class=None, new_class=None):
    """
    处理指定目录下的所有YOLO标注文件,可以选择删除指定类别的记录或更新分类数字。

    :param directory_path: 目录路径
    :param class_to_remove: 需要删除的类别ID(如果需要删除指定类别的记录)
    :param old_class: 需要更新的旧类别ID(如果需要更新分类数字)
    :param new_class: 更新后的新类别ID(如果需要更新分类数字)
    """
    total_deleted_lines = 0
    total_updated_lines = 0

    # 遍历目录中的文件
    for filename in os.listdir(directory_path):
        if filename.endswith('.txt'):  # 假设标注文件都是以 .txt 结尾的
            file_path = os.path.join(directory_path, filename)

            if class_to_remove is not None:
                deleted_lines = remove_class_from_file(file_path, class_to_remove)
                print(f"已从文件 {filename} 中删除类别 {class_to_remove} 的记录,共删除 {deleted_lines} 行。")
                total_deleted_lines += deleted_lines

            if old_class is not None and new_class is not None:
                updated_lines = update_class_in_file(file_path, old_class, new_class)
                print(f"已从文件 {filename} 中将类别 {old_class} 更新为 {new_class},共更新 {updated_lines} 行。")
                total_updated_lines += updated_lines

    if class_to_remove is not None:
        print(f"总共删除了 {total_deleted_lines} 行记录。")

    if old_class is not None and new_class is not None:
        print(f"总共更新了 {total_updated_lines} 行记录。")


# 使用示例
directory_path = 'C:\\Users\\合格的牛马\\Desktop\\datasets\\test-delete\\labels'  # 替换为你的目录路径

# 删除指定类别的记录
class_to_remove = 5  # 替换为你要删除的类别ID
process_directory(directory_path, class_to_remove=class_to_remove)

# 更新指定类别的分类数字
old_class = 1  # 替换为旧类别ID
new_class = 100  # 替换为新类别ID
process_directory(directory_path, old_class=old_class, new_class=new_class)
相关推荐
RoboWizard33 分钟前
三星和金士顿内存条哪个更适合游戏超频
大数据·人工智能
深圳市恒星物联科技有限公司39 分钟前
轻量MCU设备通过OpenHarmony兼容性测评的全流程关键要点与实战踩坑经验
大数据·人工智能·物联网·鸿蒙
AI闲人1 小时前
企业 AI 最大的问题,不是数据不足,而是数据没有业务语义
人工智能·数字化·企业ai落地
米小虾1 小时前
一周 AI 观察(9.14–9.18):Anthropic 自曝"AI 写了我四分之一的研发",于是这一周所有人都在买同一样东西
人工智能
米小虾2 小时前
加了 20 条示例反而变差:你的 few-shot 提升,可能只是 prompt 变长的功劳
人工智能·llm
东方-教育技术博主2 小时前
自进化智能体编码软件用法
人工智能
jimmyleeee2 小时前
大模型安全之十八:AI常见漏洞类别与缓解策略
人工智能·安全
火山引擎开发者社区2 小时前
多行业专家招募|参与线上访谈拿 2000元/h 现金报酬!
人工智能
4SAPI2 小时前
企业大模型API服务商推荐:从多模型接入到AI API Gateway的技术选型分析
人工智能·php