找回密码
 立即注册
首页 业界区 业界 如何用labelimg标注yolo数据集,并利用工具自动划分数据 ...

如何用labelimg标注yolo数据集,并利用工具自动划分数据集

绂染 4 小时前
视频演示

如何用labelimg标注yolo数据集,并利用工具自动划分数据集_哔哩哔哩_bilibili
1 labelimg标注数据集

1.1 labelimg工具介绍

LabelImg是一款开源的图像标注工具,专门用于为目标检测任务创建数据集。它支持矩形框标注,可导出PASCAL VOC、YOLO、CreateML等多种格式。
通过简单的点击和拖拽操作,用户即可快速为图像中的对象添加标注框和类别标签。
该工具界面简洁直观,支持快捷键操作,大幅提升标注效率,是计算机视觉领域数据准备的常用工具之一。
1.png

1.2 labelimg标注数据集

点击界面左侧的“Open Dir”按钮,选择数据集所存放的文件夹,选择后文件夹中存放的图片信息会展示到界面上
2.png

左下角的File List会显示读取进来的数据集列表
点击左侧的Create \nRectBox 按钮,长按鼠标左键可以对图像中的目标物体绘制矩形框
绘制完成之后,弹出来的命名对话框中,写上当前绘制的类别的名字,这里绘制的这个手势是剪刀,我们命名为“Scissors”
3.png

依次对剩下的图像数据集进行绘制标注。
查看存放图片的文件夹,会发现每一个图片的旁边,都生成了一个同名的txt文档,这个文档就是我们标注数据后产生的标注文件。

4.png

这里可以打开标注文件,查看下标注文件中的内容:
  1. 0 0.560937 0.768750 0.625000 0.425000
复制代码
标注文件中的内容按照行排列,每一行有5个数字,第1个数字是一个整数,后面4个数字是0到1之间的小数,这里以上图举例,说明下数字的含义:
第1个数字“0”:表示当前目标物体的类别编号,0表示第0号目标物体,同理如果是2的话,表明第2号目标物体,具体的编号根据标注时编写目标物体的名称的先后顺序而来。
第2、3个数字“0.560937 0.768750”:表示的是标注物体的坐标信息,分别是x轴和y轴的坐标,坐标为目标检测物体的中心区域,坐标原点是图像的左上角,这里不一样的地方是,坐标轴长不是按照图像的实际尺寸来标注的,而是做了归一化处理,即左下角的y轴坐标是1,右上角的x轴坐标是1,所以x轴和y轴的坐标的阈值是0到1之间。
第4、5数字"0.625000 0.425000":表示的是标注物体的尺寸,分别表示宽度和高度,数值同样是归一化处理,例如0.625表示尺寸为宽度的62.5%
最后还有一个classes.txt文件,打开后是标注的名字信息
  1. scissors
  2. rock
  3. paper
复制代码
2 划分数据集

当标注完数据之后,yolo模型训练的时候,数据集需要区分训练集和验证集,最后为了检测模型的有效性,我们还需要测试集
所以这里又写了一个python脚本可以将我们标注好的数据集一次性随机性的按照设定的划分比例进行自动化数据集划分
[code]# YOLO 数据集划分工具# 功能:将包含图片和对应标注文件的数据集按比例随机划分为训练集、验证集和测试集# 同时生成YOLO训练所需的dataset.yaml配置文件import osimport shutilimport randomimport yaml# ============ 配置参数 ============SOURCE_DIR = "data"                 # 源数据目录,图片及其标注 .txt 文件应在此目录OUTPUT_DIR = "data_split_output2"    # 输出根目录,将生成 train/val/test 及其 images/labelsTRAIN_RATIO = 0.7                   # 训练集比例VAL_RATIO = 0.2                     # 验证集比例TEST_RATIO = 0.1                    # 测试集比例SEED = 42                           # 随机种子,确保每次划分结果一致REQUIRE_LABEL = True                # 仅包含存在对应 .txt 标注的图片IMG_EXTS = {'.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff'}  # 支持的图片格式# ==========================================def ensure_dir(path: str):    """确保目录存在,不存在则创建"""    os.makedirs(path, exist_ok=True)def main():    # 检查源目录是否存在    if not os.path.isdir(SOURCE_DIR):        print(f"源目录不存在: {SOURCE_DIR}")        return    # 收集图片及对应标注信息    candidates = []    for fname in os.listdir(SOURCE_DIR):        fpath = os.path.join(SOURCE_DIR, fname)        # 跳过非文件项        if not os.path.isfile(fpath):            continue                # 检查文件是否为图片格式        ext = os.path.splitext(fname)[1].lower()        if ext in IMG_EXTS:            base = os.path.splitext(fname)[0]  # 获取文件名(不含扩展名)            label_name = base + ".txt"         # 对应的标注文件名            label_path = os.path.join(SOURCE_DIR, label_name)            # 如果需要标注文件且不存在,则跳过此图片            if REQUIRE_LABEL and not os.path.exists(label_path):                continue            # 记录图片文件名和对应的标注文件名(如果有)            has_label = os.path.exists(label_path)            candidates.append((fname, label_name if has_label else None))    n = len(candidates)    if n == 0:        print("未找到符合条件的图片及标注对。")        return    # 检查比例设置是否有效    ratio_sum = TRAIN_RATIO + VAL_RATIO + TEST_RATIO    if ratio_sum
您需要登录后才可以回帖 登录 | 立即注册