ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

深度学习实战第二篇:模型训练 80% 的时间在搞数据,你准备好了吗?

深度学习实战第二篇:模型训练 80% 的时间在搞数据,你准备好了吗? 从标注到裁图到增强AOI 项目的数据流水线全拆解开头模型不准90% 是数据问题你有没有过这种经历花了一周训练模型精度只有 70%。你调了半天超参数换了更大的模型精度还是上不去。然后你仔细看了一眼数据集——发现标注文件里有一半的框标错了。模型不准90% 是数据问题不是模型问题。深度学习有一句名言「Garbage in, garbage out。」你喂给模型什么数据模型就学到什么特征。数据质量差模型再好也没用。AOI 项目的数据流水线花了三个月才跑通。中间踩了无数坑标注格式不对、裁图角度算错、训练集和验证集有重叠……不是因为数据准备有多难——而是因为没人告诉你数据准备的「标准流程」。一、数据集的三大要素1. 图片┌─────────────────────────────────────────┐ │ 图片质量要求 │ ├─────────────────────────────────────────┤ │ 分辨率足够大目标清晰可见 │ │ 格式PNG / JPG推荐 PNG无损 │ │ 色彩空间RGB不要 BGR │ │ 曝光均匀不要过曝/欠曝 │ │ 噪声尽量少必要时做降噪 │ └─────────────────────────────────────────┘2. 标注标注格式对照表 ┌──────────────┬──────────────────────────────────┐ │ 任务类型 │ 标注格式 │ ├──────────────┼──────────────────────────────────┤ │ 目标检测 │ class x_center y_center w h │ │ 旋转检测 │ class x_center y_center w h angle│ │ 图像分类 │ 目录结构train/class1/ │ │ 实例分割 │ class x1 y1 x2 y2 ... xn yn │ └──────────────┴──────────────────────────────────┘3. 划分数据集划分 ┌─────────────────────────────────────────────────┐ │ 全部数据 │ │ ├── 训练集70-80%→ 模型学习用 │ │ ├── 验证集10-15%→ 训练时评估用 │ │ └── 测试集10-15%→ 最终评估用 │ │ │ │ ⚠️ 训练集和验证集不能有重叠 │ └─────────────────────────────────────────────────┘二、YOLO 数据集格式详解检测任务格式# data.yamltrain:/path/to/train/imagesval:/path/to/val/imagesnc:3# 类别数names:[class1,class2,class3]# 类别名# 标注文件格式每行一个目标# class x_center y_center width height归一化到 0-10 0.5 0.5 0.2 0.3 1 0.3 0.7 0.1 0.2分类任务格式dataset/ ├── train/ │ ├── class1/ │ │ ├── img001.jpg │ │ └── img002.jpg │ ├── class2/ │ │ ├── img003.jpg │ │ └── img004.jpg │ └── class3/ │ ├── img005.jpg │ └── img006.jpg └── val/ ├── class1/ ├── class2/ └── class3/OBB 旋转检测格式# 标注文件格式每行一个目标# class x_center y_center width height angle角度为弧度0 0.5 0.5 0.2 0.1 0.785 1 0.3 0.7 0.15 0.08 1.234三、AOI 项目的数据流水线完整流水线整板图像4000x3000 ↓ ① group_detect 标注X-AnyLabeling ↓ ② train group_detect灯组检测模型 ↓ ③ rotate_crop旋转裁剪灯组 ROI ↓ ④ chip_detect 标注OBB 标注芯片 ↓ ⑤ train chip_detect芯片检测模型 ↓ ⑥ cpp_crop按 C 对齐方式裁芯片图 ↓ ⑦ polar_classify 标注极性分类标签 ↓ ⑧ train polar_classify极性分类模型裁图策略# AOI 项目的裁图策略# 正方形裁图max(w, h) 4 → 224defcrop_chip(image,bbox,angle): 裁出芯片图正方形224x224 x,y,w,hbbox sizemax(w,h)4# 留 4 像素边距# 裁剪cropimage[y:ysize,x:xsize]# 缩放到 224x224cropcv2.resize(crop,(224,224))returncrop标签约定芯片颜色OK 极性180° 极性红色 Rr-polar-r-polar绿色 Gg-polar-crescent-g-polar-crescent蓝色 Bb-polar-crescent-b-polar-crescent四、数据增强实战YOLO 内置增强# YOLO 训练时自动应用的增强model.train(datadataset/,# 增强参数flipud0.0,# 上下翻转概率0禁用fliplr0.0,# 左右翻转概率0禁用degrees0.0,# 旋转角度0禁用translate0.0,# 平移0禁用scale0.0,# 缩放0禁用shear0.0,# 剪切0禁用perspective0.0,# 透视0禁用mosaic0.0,# Mosaic 增强0禁用)什么时候禁用增强# ❌ 错误极性分类用了翻转model.train(fliplr0.5)# 翻转后极性变反# ✅ 正确极性分类禁用所有增强model.train(flipud0.0,fliplr0.0,degrees0.0,scale0.0,shear0.0,perspective0.0,bgr0.0,erasing0.0,)原因极性是语义敏感任务翻转后极性变反模型学到的是错误特征。五、避坑指南坑1训练集和验证集有重叠现象训练集上 99%产线上 80%。原因同一张图既在训练集又在验证集模型「背答案」了。解法严格划分训练集和验证集不能有重叠。# ❌ 错误随机划分时没有去重train_imgsall_imgs[:800]val_imgsall_imgs[800:]# 可能有重叠# ✅ 正确按文件名去重后划分train_imgsset(all_imgs[:800])val_imgsset(all_imgs[800:])-train_imgs# 确保无重叠坑2类别不平衡现象某些类别的样本很少模型完全不检。原因训练数据中类别分布不均匀。解法过采样少数类或使用加权采样。# 查看类别分布fromcollectionsimportCounter labelsCounter()forlabel_fileinglob(labels/*.txt):withopen(label_file)asf:forlineinf:clsint(line.split()[0])labels[cls]1print(labels)# {0: 1000, 1: 50, 2: 20} ← 类别2太少坑3标注质量差现象模型学不到正确特征精度很低。原因标注框不准、类别标错、漏标。解法人工抽查标注质量修正错误标注。坑4数据增强不当现象增强后模型反而变差。原因增强强度太大引入了噪声。解法从弱增强开始逐步增强观察验证集精度。坑5数据路径写错现象训练时报错File not found。原因data.yaml里的路径写错了。解法用绝对路径或确保相对路径正确。AOI 项目优秀实践完整的数据流水线脚本从裁图到标注到合并一键执行版本化数据集管理v4、v5、cpp224_v2每个版本有独立目录废弃数据归档错误产物放在_bad_rot90_20260718/不会误用AOI 项目可改进之处缺少数据质量检查工具没有自动化的标注质量验证缺少标注一致性验证不同人标注的标准可能不一致缺少数据统计报告不知道各类别样本数量分布结尾说回那个「模型不准」的故事。后来我发现与其花时间调模型不如花时间清理数据。数据质量提升 10%模型精度可能提升 20%。不是因为数据准备有多难——而是因为「数据质量」决定了模型的上限。翻翻你的项目你的数据集有多少张图超过 1000 张才值得训练。你的标注质量怎么样抽查 100 张看看。你的训练集和验证集有重叠吗评论区说说你在数据准备上踩过最深的坑。觉得有用收藏这篇下次数据准备时翻出来对照。转发给你团队里那个天天被数据折磨的同事。下期预告YOLO 版本太多不知道选哪个nano/small/medium/large 到底差多少检测、分类、OBB 到底用哪个任务类型下一篇我们聊模型选择——YOLO 家族的「选型指南」。本文是《深度学习基础知识与实战技术栈》系列第二篇。
返回列表