ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【YOLO实战系列 5/17】从0到1制作YOLO数据集:LabelImg标注→格式转换→增强

2026/8/5 13:31:21 拓冰建站 浏览量
【YOLO实战系列 5/17】从0到1制作YOLO数据集:LabelImg标注→格式转换→增强

# 从0到1制作YOLO数据集:LabelImg标注→格式转换→增强(附脚本)

训练一个自定义YOLO模型,80%的时间都花在数据上。
今天手把手带你走完完整流程:标注 → 格式转换 → 数据增强 → 一键划分
跟着做,你也能做出“喂给YOLO吃”的高质量数据集!

哈喽,这里是【YOLO模型仓库】。

这周开始真正动手:做一个属于你自己的数据集

不管你是想做安全帽检测车辆识别还是水果分类,流程都一样。
我直接把标注工具 + 转换脚本 + 增强脚本全打包给你,文末免费领👇

🧭 今天你将学会

1️⃣ 用LabelImg打标签(附操作动图)
2️⃣ YOLO标签格式长什么样(一看就懂)
3️⃣ 数据集目录结构 & 自动划分脚本
4️⃣ 数据增强:让模型更鲁棒(附代码)
5️⃣ 生成data.yaml,直接喂给YOLO训练

🏷️ 一、LabelImg:图形化标注工具

安装(一行命令)

pipinstalllabelimg

启动

labelimg

界面操作(超简单)

  1. 点击Open Dir打开你的图片文件夹
  2. 点击Change Save Dir选择标签保存位置
  3. 重要:在菜单栏选择YOLO格式(默认是PascalVOC)
  4. W开始画框 → 框住物体 → 输入类别 → 按Ctrl+S保存
  5. D下一张,重复以上步骤

🖼️(此处插入LabelImg界面截图,标注一个安全帽)

💡 小技巧:按A上一张,Ctrl+Z撤销,效率翻倍。

YOLO标签长这样(.txt文件)

0 0.523 0.412 0.156 0.083
  • 0= 类别ID(从0开始)
  • 0.523= 框中心x坐标(归一化,0~1)
  • 0.412= 框中心y坐标
  • 0.156= 框宽度(相对原图比例)
  • 0.083= 框高度

别怕,LabelImg自动帮你算好了,你只管画框。

📁 二、标准数据集目录结构

YOLO要求固定的文件夹组织:

my_dataset/ ├── images/ │ ├── train/ │ │ ├── img1.jpg │ │ └── img2.jpg │ └── val/ │ ├── img3.jpg │ └── img4.jpg └── labels/ ├── train/ │ ├── img1.txt │ └── img2.txt └── val/ ├── img3.txt └── img4.txt

⚠️ 注意:图片和标签一一对应,文件名相同,后缀不同。

一键划分训练/验证集(Python脚本)

把下面脚本保存为split_dataset.py,放在图片和标签同级目录运行:

importosimportrandomimportshutil# 设置路径img_dir="images"# 所有原始图片label_dir="labels"# 所有原始标签train_ratio=0.8# 80%训练,20%验证# 获取所有图片名(无后缀)names=[f.split('.')[0]forfinos.listdir(img_dir)iff.endswith('.jpg')]random.shuffle(names)split_idx=int(len(names)*train_ratio)train_names=names[:split_idx]val_names=names[split_idx:]# 创建目标文件夹fordin["images/train","images/val","labels/train","labels/val"]:os.makedirs(d,exist_ok=True)# 拷贝文件fornameintrain_names:shutil.copy(f"{img_dir}/{name}.jpg",f"images/train/{name}.jpg")shutil.copy(f"{label_dir}/{name}.txt",f"labels/train/{name}.txt")fornameinval_names:shutil.copy(f"{img_dir}/{name}.jpg",f"images/val/{name}.jpg")shutil.copy(f"{label_dir}/{name}.txt",f"labels/val/{name}.txt")print(f"Done! Train:{len(train_names)}, Val:{len(val_names)}")

运行后自动划分好,省时省力。

🔄 三、数据增强:让模型见过更多“世面”

为什么要增强?
因为真实世界光线、角度千变万化,增强后的模型更鲁棒,mAP能涨2~5个点。

安装albumentations库

pipinstallalbumentations

增强脚本(对图片和标签同步处理)

importalbumentationsasAimportcv2# 定义增强流水线transform=A.Compose([A.HorizontalFlip(p=0.5),# 水平翻转A.RandomBrightnessContrast(p=0.2),# 随机亮度对比度A.Rotate(limit=10,p=0.3),# 小角度旋转A.Blur(blur_limit=3,p=0.1),# 轻微模糊],bbox_params=A.BboxParams(format='yolo'))# 读取图片和对应标签(yolo格式)image=cv2.imread("img1.jpg")withopen("img1.txt")asf:bboxes=[list(map(float,line.strip().split()))forlineinf]# 应用增强augmented=transform(image=image,bboxes=bboxes)aug_img=augmented['image']aug_bboxes=augmented['bboxes']# 保存增强后的图片和标签cv2.imwrite("img1_aug.jpg",aug_img)withopen("img1_aug.txt",'w')asf:forbinaug_bboxes:f.write(f"{int(b[4])}{b[0]:.6f}{b[1]:.6f}{b[2]:.6f}{b[3]:.6f}\n")

🖼️(此处插入原图 vs 增强后对比图)

你可以运行多次,把数据集扩大2~3倍。

📄 四、生成data.yaml(YOLO训练配置文件)

在数据集根目录创建data.yaml

# 训练集和验证集路径(相对于data.yaml的位置)train:images/trainval:images/val# 类别数nc:2# 类别名称(顺序必须与标注时的ID一致)names:['helmet','head']

搞定!现在这个文件夹可以直接丢给YOLO训练了。


配套资源:本文涉及的完整代码、数据集和配置文件已整理归档,感兴趣的朋友可以在我的 CSDN 主页简介中找到获取方式。

如果觉得有帮助,欢迎点赞收藏,有问题欢迎评论区交流!