修改yolo格式的labels类别、删除yolo格式的labels类别

1、项目中,数据集的类别顺序有时会改变,例如a项目类别1是b项目的类别3,,需要用a项目的数据集,只需要改类别就行,就不需要重新标注了,例如a项目的classes是

b项目的classes是

a项目的数据可以用到b项目,得a项目的类别改成b项目一致,这里就需要把1改成3,2改成5

import os


def gai_labels(labels_path, new_labels_path):
    # 获取labels_path文件夹中所有的文件
    labels_files = os.listdir(labels_path)

    # 如果new_labels_path文件夹不存在,则创建
    if not os.path.exists(new_labels_path):
        os.makedirs(new_labels_path)

    # 遍历每个标签文件
    for labels_file in labels_files:
        # 生成标签文件的完整路径
        file_path = os.path.join(labels_path, labels_file)

        # 创建新的文件路径
        new_file_path = os.path.join(new_labels_path, labels_file)

        # 读取标签文件内容并修改类别
        with open(file_path, 'r') as f:
            lines = f.readlines()

        new_lines = []
        for line in lines:
            parts = line.strip().split()
            # 修改类别1为3,类别2为5,类别3改成4
            if parts[0] == '1':
                parts[0] = '3'
            # elif parts[0] == '2':
            #     parts[0] = '5'
            new_lines.append(" ".join(parts) + '\n')

        # 将修改后的内容写入新的文件
        with open(new_file_path, 'w') as f:
            f.writelines(new_lines)


if __name__ == "__main__":
    labels_path = r"E:\project\CODE\labels"
    new_labels_path = r"E:\project\CODE\gaihou"
    gai_labels(labels_path, new_labels_path)
0 0.070312 0.476042 0.137500 0.164583
1 0.518750 0.760417 0.103125 0.116667
2 0.200781 0.643750 0.139063 0.170833
0 0.307812 0.527083 0.106250 0.145833
1 0.392969 0.240625 0.085938 0.110417
2 0.328906 0.075000 0.117188 0.145833

改后
0 0.070312 0.476042 0.137500 0.164583
3 0.518750 0.760417 0.103125 0.116667
5 0.200781 0.643750 0.139063 0.170833
0 0.307812 0.527083 0.106250 0.145833
3 0.392969 0.240625 0.085938 0.110417
5 0.328906 0.075000 0.117188 0.145833


2、删除类别0,类别1,类别2,类别4,类别5,只留下类别3的标签,代码如下:
import os

def del_labels(labels_path, new_labels_path):
    # 获取labels_path文件夹中所有的文件
    labels_files = os.listdir(labels_path)

    # 如果new_labels_path文件夹不存在,则创建
    if not os.path.exists(new_labels_path):
        os.makedirs(new_labels_path)

    # 遍历每个标签文件
    for labels_file in labels_files:
        # 生成标签文件的完整路径
        file_path = os.path.join(labels_path, labels_file)

        # 创建新的文件路径
        new_file_path = os.path.join(new_labels_path, labels_file)

        # 读取标签文件内容并过滤指定类别
        with open(file_path, 'r') as f:
            lines = f.readlines()

        new_lines = []
        for line in lines:
            parts = line.strip().split()
            # 跳过类别为0、1、2、4、5的行
            if parts[0] in {'0', '1', '2', '4', '5'}:
                continue
            new_lines.append(" ".join(parts) + '\n')

        # 将过滤后的内容写入新的文件
        with open(new_file_path, 'w') as f:
            f.writelines(new_lines)

if __name__ == "__main__":
    labels_path = r"E:\project\CODE\labels"
    new_labels_path = r"E:\project\CODE\del_hou"
    del_labels(labels_path, new_labels_path)

删除后

3、删除txt文件里的最后一个值,例如0 0.400756 0.912185 0.0254859 0.0332222 1(class_id x_center y_center width height track_id)删除后是0 0.400756 0.912185 0.0254859 0.0332222

import os

# 输入和输出文件夹
input_folder = r"E:\project\datasets\label\detect\track\labels"
output_folder = r"E:\project\datasets\label\detect\track\2"

os.makedirs(output_folder, exist_ok=True)

for file_name in os.listdir(input_folder):
    if file_name.endswith(".txt"):
        input_path = os.path.join(input_folder, file_name)
        output_path = os.path.join(output_folder, file_name)

        with open(input_path, "r") as f_in, open(output_path, "w") as f_out:
            for line in f_in:
                values = line.strip().split()
                if len(values) == 6:  # 确保有6个值
                    f_out.write(" ".join(values[:-1]) + "\n")  # 删除最后一个值并写入

print("处理完成,修改后的文件保存在:", output_folder)
<think>好的,用户之前问了HaGRID数据集的标签格式,现在又转向YOLO训练中的labels格式,我需要弄清楚他们当前的需求。用户可能正在准备自己的数据集,或者在进行目标检测项目,需要了解如何正确格式标签以使用YOLO模型。 首先,回顾HaGRID的回答,用户已经对YOLO兼容的格式有基础了解,但可能需要更详细的YOLO标签规范。用户可能想知道每个标签文件的具体结构,参数如何计算,以及实际应用的例子。 接下来,我需要确保覆盖YOLO标签的关键点:每个图像对应的txt文件,每行一个对象,类别ID,归一化的中心坐标宽高。需要详细解释归一化的计算方法,可能用户需要确认他们的数据是否正确处理了这些数值。 同时,用户可能关心多类别的情况,或者如何处理不同的标注工具导出的数据是否需要转换。需要提到常见的标注工具如LabelImg或CVAT,以及转换脚本的存在,这可能帮助用户解决实际中的格式转换问题。 还要注意YOLO不同版本是否对标签格式有特殊要求,比如YOLOv5是否支持其他格式,但一般来说,核心格式是统一的。需要强调正确归一化的重要性,避免用户犯错,比如坐标超出[0,1]范围导致训练错误。 此外,用户可能对实际示例感兴趣,给出具体例子有助于他们对照自己的数据。比如图像尺寸边界框的计算过程,这样用户可以自行验证他们的标注是否正确。 最后,可能用户需要知道标签文件的结构存放位置,是否需要与图像文件在同一目录或特定结构,以及如何组织训练集、验证集测试集。需要提到数据集划分文件(如train.txt),但可能用户已经了解这部分,所以可以简要带过。 总结回答结构:文件结构、标签内容、归一化计算、示例、多类别处理、标注工具、常见错误。确保信息清晰,步骤明确,帮助用户正确配置YOLO训练所需的标签格式。</think>以下是YOLO(You Only Look Once)目标检测模型训练中标签labels格式的详细说明,适用于YOLOv3/v5/v7/v8等版本: --- ### **1. 标签文件基本规则** - **文件对应关系**:每张图像(如 `image.jpg`)对应一个同名的 `.txt` 标签文件(如 `image.txt`)。 - **文件存储路径**:标签文件通常与图像文件分开存放,例如: ``` images/train/image1.jpg --> labels/train/image1.txt ``` --- ### **2. 标签内容格式** 每个 `.txt` 文件包含多行(每行对应一个目标实例),每行格式为: $$class\_id \quad x\_center \quad y\_center \quad width \quad height$$ #### **参数定义**: | 参数 | 说明 | 数值范围 | |------------|----------------------------------------------------------------------|----------------| | `class_id` | 目标类别的整数编号(从0开始) | 例如 `0,1,2…` | | `x_center` | 边界框中心点的x坐标(**归一化值**) | `[0, 1]` | | `y_center` | 边界框中心点的y坐标(**归一化值**) | `[0, 1]` | | `width` | 边界框宽度(**归一化值**) | `[0, 1]` | | `height` | 边界框高度(**归一化值**) | `[0, 1]` | --- ### **3. 归一化坐标计算** 假设图像尺寸为 `W×H`(宽度×高度),原始边界框左上角坐标为 `(x1, y1)`,右下角坐标为 `(x2, y2)`: 1. **计算中心点**: $$x\_center = \frac{x1 + x2}{2 \times W}, \quad y\_center = \frac{y1 + y2}{2 \times H}$$ 2. **计算宽高**: $$width = \frac{x2 - x1}{W}, \quad height = \frac{y2 - y1}{H}$$ #### **示例**: - 图像尺寸:`640x480` - 原始边界框:左上角 `(100, 50)`,右下角 `(300, 250)` - 计算结果: $$x\_center = \frac{100+300}{2×640} = 0.3125$$ $$y\_center = \frac{50+250}{2×480} ≈ 0.3125$$ $$width = \frac{300-100}{640} ≈ 0.3125$$ $$height = \frac{250-50}{480} ≈ 0.4167$$ - 标签行:`0 0.3125 0.3125 0.3125 0.4167` --- ### **4. 标签文件示例** 假设图像中有两个目标: - **类别1**(`class_id=0`):中心点 `(0.3, 0.4)`,宽 `0.2`,高 `0.3` - **类别2**(`class_id=1`):中心点 `(0.7, 0.6)`,宽 `0.1`,高 `0.15` 则对应的 `.txt` 文件内容为: ``` 0 0.3 0.4 0.2 0.3 1 0.7 0.6 0.1 0.15 ``` --- ### **5. 关键注意事项** 1. **严格归一化**:所有坐标必须在 `[0,1]` 范围内,否则训练会报错。 2. **多目标支持**:一张图像可包含多个目标,每行对应一个目标。 3. **类别编号连续性**:类别ID必须从0开始连续编号(例如0,1,2,不能跳过数字)。 4. **与图像文件匹配**:标签文件需与图像文件**同名**且**一一对应**。 --- ### **6. 与其他标注格式的对比** | 格式 | 特点 | 示例 | |-------------|----------------------------------------------------------------------|---------------------------------| | **YOLO** | 中心坐标 + 归一化宽高 | `0 0.3 0.4 0.2 0.3` | | **COCO** | 使用绝对坐标(非归一化)图像尺寸元数据 | `[x1, y1, width, height]` | | **PASCAL VOC** | XML格式,存储绝对坐标类别名称 | `<xmin>100</xmin>` | --- ### **7. 生成标签的工具** - **标注工具**: - LabelImg(支持直接导出YOLO格式) - CVAT(计算机视觉标注工具) - Roboflow(在线数据标注与转换) - **格式转换脚本**: 若已有其他格式(如COCO或VOC),需编写脚本将坐标转换为YOLO格式。 --- ### **8. 常见错误** 1. **坐标未归一化**:直接使用原始像素值(如 `320` 而非 `0.5`)。 2. **边界框超出图像范围**:计算错误导致数值超过 `[0,1]`。 3. **类别ID不连续**:例如跳过某个数字(如 `0, 2, 3`)。 --- 掌握YOLO标签格式是训练自定义数据集的关键步骤。如果需要具体代码实现(如格式转换脚本),可以进一步补充说明!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值