
保姆级教程零基础训练你的第一个 YOLOv8 缺陷检测模型附 5 个产线真实踩坑目标读者会基本 Python、没训过模型的工程师。目标跟着本文一步步走训出第一个可用的工业缺陷检测模型。全文以木料缺齿检测为例每一步都附上我们项目中真实踩过的坑帮你绕开。0. 先看全貌整个流程五步别被术语吓住拍图 → 标注 → 训练 → 验证 → 导出 (攒几十张) (画框) (一条命令) (看指标) (一条命令)训练不需要 GPU百张级数据集 yolov8n纯 CPU 训 200 轮约 40 分钟。1. 环境准备以 Ubuntu 22.04 为例Windows 的区别见代码块下方说明。先装 Python 虚拟环境支持再建环境# Ubuntu安装 venv 支持sudoaptupdatesudoaptinstallpython3-venv python3-pip# 创建并激活虚拟环境python3-mvenv yolo_envsourceyolo_env/bin/activate# 安装 ultralytics国内加 -i 镜像源加速pipinstallultralytics-ihttps://pypi.tuna.tsinghua.edu.cn/simpleWindows 用户跳过apt那两行直接用python -m venv yolo_env创建环境激活命令换成yolo_env\Scripts\activate其余相同。验证安装yolo version# 能打印版本号就 OK有 N 卡想 GPU 训练的再装对应 CUDA 版的 PyTorch没有就跳过CPU 完全够用。2. 准备图片拍多少、怎么拍数量单类缺陷 50 张能跑通150 张左右能谈上线。先拍 50 张把流程跑通NG 图是主角每种缺陷至少 20~30 张OK 图也要拍 10~20 张正常产品图不用标注让模型见过好的是什么样子这是压误检的关键拍照条件尽量和现场一致同一相机、同一光照、同一角度。实验室摆拍的光线和产线不一样训出来上线就翻车。图片放到dataset/images_all/目录格式 jpg/png 都行。坑 1用实验室摆拍图代替现场图。我们早期在实验室补光摆拍光线均匀背景干净指标很好上线后现场光照变化大、背景杂乱误检明显偏多只能按现场条件全部重拍。实验室摆拍可以用来验证流程跑通但不要进训练集——模型学的是数据分布训练图和现场图差多少上线效果就差多少。3. 标注给缺陷画框标注工具任选国内网络都能正常使用工具形态适合谁labelImg本地客户端pip 安装首选输出直接是 YOLO 格式精灵标注助手国产客户端官网直接下载不想碰命令行makesense.ai在线网页免安装临时标几十张注意图片需上传CVAT自部署网页版多人协作再用新手不必以 labelImg 为例走清华镜像安装不依赖 GitHubpipinstalllabelImg-ihttps://pypi.tuna.tsinghua.edu.cn/simple labelImg dataset/images_all/操作要点打开后把保存格式切到YOLO默认是 PascalVOC 的 XML一定要切W键画框D键下一张类别先只建一个比如missing_tooth第一版不要贪多类别。每张图标完生成同名.txt每行一个框0 0.512 0.384 0.062 0.105 # ↑类别编号(从0开始) 中心x 中心y 宽 高均为0~1归一化值4. 整理目录 划分训练/验证集YOLO 要求的目录结构dataset/ ├── train/images/ ← 训练图 ├── train/labels/ ← 训练标注 txt ├── val/images/ ← 验证图 └── val/labels/自动划分脚本8:2# split_dataset.py — 用法: python split_dataset.py dataset/images_all datasetimportrandom,shutil,sysfrompathlibimportPath src,dstPath(sys.argv[1]),Path(sys.argv[2])images[pforpinsrc.iterdir()ifp.suffix.lower()in(.jpg,.png,.bmp)]random.seed(42)random.shuffle(images)n_valmax(1,int(len(images)*0.2))val_setset(images[:n_val])forsubin(train,val):(dst/sub/images).mkdir(parentsTrue,exist_okTrue)(dst/sub/labels).mkdir(parentsTrue,exist_okTrue)forimginimages:subvalifimginval_setelsetrainshutil.copy(img,dst/sub/images/img.name)labelimg.with_suffix(.txt)iflabel.exists():shutil.copy(label,dst/sub/labels/label.name)# 没有 txt 的是 OK 图只复制图片即可print(ftrain:{len(images)-n_val}张, val:{n_val}张)坑 2train/val 随手按张划分。同一根木料连拍的多张图高度相似随机划分会把亲兄弟图分到训练集和验证集两边验证等于开卷考试指标虚高上线后对不上。正确做法是按根划分同一根木料的所有图整体进一边。上面的脚本是随机划分有连拍场景的话分完务必手动检查 val 目录。再写dataset.yamlpath:/绝对路径/datasettrain:train/imagesval:val/imagesnc:1names:[missing_tooth]5. 训练一条命令yolo trainmodelyolov8n.ptdatadataset.yaml\imgsz512epochs200patience100batch8devicecpu逐参数说明参数含义建议modelyolov8n.pt从官方预训练权重起步必须用.pt见坑 3imgsz512输入尺寸和部署端保持一致见坑 4epochs200最多训练轮数往大设配合 patience 早停patience100100 轮无提升则停止不用改batch8每批图片数内存不够改 4devicecpu训练设备有显卡改0坑 3从头训练不用预训练权重。几十张图从头训训练 loss 降得很漂亮但模型实际是把训练图的背景纹理背下来了验证集上误检大量出现。换成yolov8n.pt预训练权重后立刻正常——预训练权重已经学过边缘、纹理、角点等通用底层特征小数据集只需学习缺陷本身的特征。注意modelyolov8n.pt迁移学习和modelyolov8n.yaml随机初始化从头训只差后缀效果天壤之别。坑 4训练用 640、部署用 512。我们早期版本训练用 640部署端为了压节拍改成 512 后小缺陷置信度整体下滑、开始漏检——模型按 640 的特征尺度学习输入突然变小就匹配不上了。后续版本全部统一为 512 训练后恢复。原则训练输入尺寸跟着部署走。训练产物在runs/detect/train/weights/best.pt。6. 看结果三个文件就够打开runs/detect/train/results.png损失曲线。train loss 持续下降而 val loss 走平或回升说明开始过拟合下次可减少 epochsval_batch0_pred.jpg验证集预测可视化肉眼检查框的位置是否准确results.csv最后几行指标metrics/recall最重要漏检率 1 − 召回率产线优先看这个metrics/precision对应误检率metrics/mAP50综合指标0.9 以上较好。坑 5只盯 mAP不数误检/漏检个数。mAP 是综合指标涨两个点不代表产线关心的问题有改善。我们后来建了固定的 OK/NG 测试集22 张 OK 标准样 留存的 NG 图每版模型跑一遍只数两个数误检几个、漏检几个。这两个数和客户验收口径一致比曲线直观。置信度阈值的调整也在这套测试集上做不再凭感觉定。7. 拿新图验证找几张没参与训练的现场图跑一遍yolo predictmodelruns/detect/train/weights/best.ptsource你的测试图目录结果在runs/detect/predict/。逐张检查漏检和误检不理想的图标注后补进数据集重训——这就是数据迭代循环。8. 导出部署yoloexportmodelruns/detect/train/weights/best.ptformatonnximgsz512得到best.onnx交给部署程序OpenVINO 加载推理的完整过程见本系列部署篇。常见问题yolo命令找不到虚拟环境没激活标注了但训练提示没有标签labelImg 保存格式没切成 YOLO或 txt 未与图片同名类别编号错乱txt 第一列从 0 开始顺序对应dataset.yaml的names路径报错Windows 路径避免中文和空格CPU 训练看似卡住CPU 跑满即在正常训练200 轮约 40 分钟。小结五个坑其实是同一条原则的不同体现训练的每个环节都要对齐最终部署和验收的真实条件——预训练权重 → 对齐真实数据量几十张不是几万张按根划分 → 对齐真实的样本独立性训练尺寸 部署尺寸 → 对齐真实输入现场实拍 → 对齐真实图像分布数误检/漏检 → 对齐真实验收口径系列文章《YOLOv8 工业缺陷检测实战上48 张缺陷图起步8 个版本迭代到上线的完整记录》《YOLOv8 工业缺陷检测实战下小样本训练怎么把误检/漏检率压到产线标准》《YOLOv8 部署到无 GPU 工控机实战ONNX 导出 OpenVINO 推理 手写后处理》