• 基于yolov8的半自动标注


    一、前言介绍

    在深度学习领域中,标注是一项非常重要的工作,因为许多深度学习模型都依赖于有标注的数据进行训练。然而,标注数据是一个费时费力的工作,因此人们希望有一种方式来对标注过程进行自动化。这就是“半自动标注”的来源。半自动标注是一种折中的方式,它结合了人类的判断能力和计算机的自动化能力。

    在一个半自动标注的系统中,步骤如下:
    1、初始的标注工作通常由人类来做;
    2、这些被标注的数据被用来训练一个深度学习模型,使模型能做出预测并自动标注新的数据。
    3、但模型预测出的标注可能会有误,所以仍然需要人类进行审核和校正。

    二、功能实现

    1.数据集拆分

    考虑到初始标注的数据集能有效兼顾,需要对全部数据集随机拆分,这样有助于有助于确保初始的标注数据集能代表整体数据集的特性。
    例如:如果有1万个数据样本,可以使用的一种策略是使用10-20%的数据作为初始标注数据,也就是1000-2000个样本。这样可以得到一个相当大的初始标注数据集,可以提供足够的信息来训练模型。

    import os
    import shutil
    import random
    
    # 指定源文件夹路径
    source_folder = "your_source_folder"  # 替换为你的源文件夹路径
    
    # 指定目标文件夹路径
    dest_folders = ["your_dest_folder1", "your_dest_folder2", "your_dest_folder3", "your_dest_folder4", "your_dest_folder5"]  # 替换为你的目标文件夹路径列表
    
    # 如果目标文件夹不存在,创建它们
    for folder in dest_folders:
        if not os.path.exists(folder):
            os.makedirs(folder)
    
    # 获取源文件夹中的所有jpg文件
    jpg_files = [f for f in os.listdir(source_folder) if f.endswith(".jpg")]
    
    # 随机打乱jpg文件列表
    random.shuffle(jpg_files)
    
    # 均分文件到五个文件夹
    split_files = [jpg_files[i::5] for i in range(5)]
    
    # 将文件复制到对应的目标文件夹
    for i in range(5):
        for file in split_files[i]:
            shutil.copy2(os.path.join(source_folder, file), dest_folders[i])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    2.标注初始数据集

    从第一部分拆分的五个子数据集中,选择第一个进行数据集标注。
    标注软件labelImg

    labelImg 图像文件路径 标注的类别txt文件路径
    
    • 1

    label的文件夹要放classes.txt(存放标注的类别)

    3.yolov8训练,预测并自动标注新的数据

    强调点:

    • 要去掉无标签值的image[初始数据集中要删除无label的image,免得影响模型的效果(也会将无标签的图片作为训练图片)]

    3.1 标注文件的整理

    对第二部分标注的初始数据集,txt文件和image文件是放在一起,删除内容为空的txt文件。再删除无txt文件的image文件

    import os
    
    # 指定目录
    directory = '/path/to/directory'
    
    txt_files = [f for f in os.listdir(directory) if f.endswith('.txt')]
    jpg_files = [f for f in os.listdir(directory) if f.endswith('.jpg')]
    
    # 检查文本文件,如果文件为空就删除
    for filename in txt_files:
        filepath = os.path.join(directory, filename)
        
        # 判断文件是否为空
        if os.path.getsize(filepath) == 0:
            os.remove(filepath)
            print(f'{filename} is empty and has been removed.')
            txt_files.remove(filename)  # 从文本文件列表中移除已删除的文件
    
    # 基于存在的文本文件,如果对应的jpg文件存在,但txt文件不存在,则删除jpg文件
    for filename in jpg_files:
        txt_filename = filename.replace('.jpg', '.txt')
        
        if txt_filename not in txt_files:    # 在此判断txt文件是否存在
            jpg_filepath = os.path.join(directory, filename)
            
            os.remove(jpg_filepath)
            print(f'{filename} has been removed because its corresponding txt file does not exist.')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    3.2 将原图和标签按照yolo的数据集路径格式进行存放

    dataset
           ├─ images
           │    ├─ test # 存放测试集数据(可无)
           │    ├─ train # 存放训练集数据
           │    └─ val # 存放验证集数据
           └─ labels
                  ├─ test # 存放测试集标签(可无)
                  ├─ train # 存放训练集标签
                  ├─ val # 存放验证集标签
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.3 训练与预测的代码

    from ultralytics import YOLO
    # 目标检测
    # # 加载模型
    model = YOLO("yolov8n.pt")  # 加载预训练权重
    # model = YOLO("ultralytics/cfg/models/v8/yolov8n.yaml")  # 配置文件
    
    # 模型训练
    model.train(data="yolov8n/data_detect.yaml", epochs=100,imgsz = 640,batch=64)  # 训练模型
    
    # 预测标签 source:是待标注的数据集文件夹
    Model.predict(source="/home/sta/datasets/images1",save_txt=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.校正预测的label

    用labelImg标注软件,微调第二个数据集的label

    4.依次处理第二、第三、第四和第五数据集

    完成第二个子数据集,将第一个和第二个合在一起,再重新训练一个新的模型;预测第三个子数据集;依次处理

  • 相关阅读:
    教师节限定!10场数据科学校内赛与10场数据科学数据科学教学实训工作坊,充实实践教学
    【毕业设计】13-基于单片机的锂电池管理系统(原理图+源码+仿真工程+论文)
    python图片预标注
    【信号调理】精密检波电路和PCB示例
    机器学习强基计划9-2:图解字典学习KSVD算法(附Python实战)
    DDoS攻击的工具介绍
    数组多项时最后一项不要逗号
    mysql主从,高可用复制原理(I)
    Codeforces Round #818 (Div. 2) D - Madoka and The Corruption Scheme
    服务器代码上云过程
  • 原文地址:https://blog.csdn.net/qq_42178122/article/details/136322698