
【YOLO 入门到精通 05】数据集准备与标注训练成功的 80% 在这里标签YOLO数据集数据标注LabelImgdata.yaml迁移学习难度⭐⭐ |阅读时长约 70 分钟 |系列第 05/12 集前置04 任务与模型 |下一集06 训练写在前面业界有句老话「数据决定了模型的上限算法决定了下限。」标注格式错一个空格训练就可能 silently fail。本集是训练前的关键一步教你按 Ultralytics 规范组织数据、标注、验证——这是从 Demo 到能用的模型的分水岭。本集学习目标按规范组织 YOLO 数据集目录理解并编写标签文件与 data.yaml使用 LabelImg 等工具标注划分训练/验证集并验证完整性文章目录【YOLO 入门到精通 05】数据集准备与标注训练成功的 80% 在这里写在前面本集学习目标5.1 数据质量决定上限数据量参考5.2 标准目录结构5.3 标签文件格式坐标换算多目标示例 img001.txt5.4 data.yaml 配置路径写法官方小数据集 coco8练手用5.5 标注工具实战工具对比LabelImg 工作流5.6 数据集划分5.7 格式转换COCO → YOLOVOC XML → YOLO5.8 数据验证脚本5.9 踩坑指南5.10 常见问题 FAQ5.11 本集小结5.1 数据质量决定上限要素说明建议数量每类样本数最少 100推荐 500多样性角度/光照/背景覆盖真实场景准确性框贴合目标避免漏标、错标平衡性各类数量避免某类过少数据量参考场景每类最少推荐简单单一背景100500中等3001000复杂遮挡/多尺度5003000工业级1000100005.2 标准目录结构my_dataset/ ├── images/ │ ├── train/ # 训练图片 │ │ ├── img001.jpg │ │ └── img002.jpg │ └── val/ # 验证图片 │ └── img101.jpg ├── labels/ │ ├── train/ # 训练标签与图片同名 .txt │ │ ├── img001.txt │ │ └── img002.txt │ └── val/ │ └── img101.txt └── data.yaml # 数据集配置 ⭐铁律images/train/img001.jpg↔labels/train/img001.txt必须同名对应5.3 标签文件格式每行一个目标class_id x_center y_center width height全部归一化 0~1坐标换算像素框: (x1,y1)-(x2,y2), 图宽 W, 图高 H x_center (x1x2)/2/W y_center (y1y2)/2/H width (x2-x1)/W height (y2-y1)/Hdefpixel_to_yolo(x1,y1,x2,y2,W,H):return(x1x2)/2/W,(y1y2)/2/H,(x2-x1)/W,(y2-y1)/H# 800×600 图, 框 (200,150)-(400,350), 类别 0# → 0 0.375 0.417 0.250 0.333多目标示例img001.txt0 0.5 0.3 0.2 0.4 # person 2 0.7 0.6 0.15 0.25 # car 0 0.2 0.5 0.1 0.3 # person特殊情况处理无目标不建 txt 或空文件目标超出边界裁剪到图内极小目标建议 ≥10×10 像素5.4 data.yaml 配置# my_dataset/data.yamlpath:D:/datasets/my_dataset# 根目录建议绝对路径train:images/trainval:images/val# test: images/test # 可选nc:3# 类别数names:0:cat1:dog2:bird路径写法方式示例相对 pathtrain: images/train绝对路径train: /data/train文件列表train: train.txt每行一个图片路径官方小数据集 coco8练手用# 自动下载仅 8 张图适合验证流程# yolo train datacoco8.yaml epochs3path:coco8train:images/trainval:images/valnames:{0:person,1:bicycle,...}# 80 类download:https://github.com/ultralytics/assets/releases/download/v0.0.0/coco8.zip5.5 标注工具实战工具对比工具类型YOLO导出推荐LabelImg桌面✅原生⭐⭐⭐⭐⭐Roboflow在线✅⭐⭐⭐⭐⭐CVATWeb✅⭐⭐⭐⭐Label StudioWeb✅⭐⭐⭐⭐LabelImg 工作流pipinstalllabelImg labelImgOpen Dir→ 选images/trainChange Save Dir→ 选labels/train左下角切换PascalVOC → YOLOW画框 → 选类别 →CtrlS保存 →D下一张5.6 数据集划分集合比例用途train70~80%学习val10~20%调参/早停test10%最终评估可选importrandom,shutilfrompathlibimportPathdefsplit_dataset(img_dir,lbl_dir,out_dir,ratio0.8):imageslist(Path(img_dir).glob(*.jpg))random.shuffle(images)nint(len(images)*ratio)forsplit,imgsin[(train,images[:n]),(val,images[n:])]:fordin[images,labels]:(Path(out_dir)/d/split).mkdir(parentsTrue,exist_okTrue)forimginimgs:shutil.copy(img,Path(out_dir)/images/split/img.name)lblPath(lbl_dir)/f{img.stem}.txtiflbl.exists():shutil.copy(lbl,Path(out_dir)/labels/split/lbl.name)print(ftrain:{n}, val:{len(images)-n})split_dataset(raw/images,raw/labels,my_dataset)5.7 格式转换COCO → YOLOfromultralytics.data.converterimportconvert_coco convert_coco(labels_dircoco/annotations/,save_diryolo_labels/)VOC XML → YOLOimportxml.etree.ElementTreeasETdefvoc_to_yolo(xml_path,out_path,class_names):rootET.parse(xml_path).getroot()wint(root.find(size/width).text)hint(root.find(size/height).text)withopen(out_path,w)asf:forobjinroot.findall(object):cidclass_names.index(obj.find(name).text)bobj.find(bndbox)x1,y1,x2,y2map(float,[b.find(t).textfortinxmin ymin xmax ymax.split()])xc,yc,bw,bh(x1x2)/2/w,(y1y2)/2/h,(x2-x1)/w,(y2-y1)/h f.write(f{cid}{xc:.6f}{yc:.6f}{bw:.6f}{bh:.6f}\n)5.8 数据验证脚本importyamlfrompathlibimportPathdefvalidate_dataset(yaml_path):withopen(yaml_path)asf:datayaml.safe_load(f)basePath(data[path])issues[]forsplitin[train,val]:img_dirbase/data[split]lbl_dirbase/labels/split imgslist(img_dir.glob(*.jpg))list(img_dir.glob(*.png))print(f✅{split}:{len(imgs)}张)missingsum(1foriinimgsifnot(lbl_dir/f{i.stem}.txt).exists())ifmissing:issues.append(f⚠️{split}:{missing}张缺标签)print(f类别:{data[nc]}个 →{list(data[names].values())})print( 验证通过ifnotissueselse\n.join(issues))validate_dataset(my_dataset/data.yaml)5.9 踩坑指南坑正确做法标签用像素坐标必须归一化 0~1类别从 1 开始从0开始images 和 labels 不同名严格同名对应path 写错建议用绝对路径训练/验证有重叠同一图不能同时出现在 train 和 val中文路径建议英文路径避免编码问题5.10 常见问题 FAQQ1没有标注工具能手动写吗A可以按格式手写.txt适合极少样本验证。Q2验证集必须有吗A必须有。没有 val 无法判断过拟合和选 best.pt。Q3一张图多个同类目标怎么标A每行一个框同类可多行。5.11 本集小结原始图片 → 标注工具 → YOLO标签 → 目录组织 → data.yaml → 验证 → 训练检查清单目录结构 ✅ | 标签归一化 ✅ | data.yaml ✅ | train/val 划分 ✅ | 验证脚本通过 ✅← 第04集第06集训练 →