基于YOLO11cls的曲奇饼干缺陷检测:数据集构建与一键训练实战 📅 发布时间:2026/9/20 20:58:35 👁 浏览次数: 简介面向食品工业质检中的曲奇饼干外观缺陷识别需求这份资源提供了一套标注规整、可直接投入算法训练的图像分类数据集。图像采集自真实产线场景共1000张按Defect_Color色差缺陷、Defect_No合格品、Defect_Object异物附着、Defect_Shape形状异常四类以文件夹方式区分存放类别边界清晰、标注质量高可直接适配YOLO11cls等图像分类模型的训练与验证。资源包共1个文件为5.87MB的PDF文档由于原始图像数据体量较大完整数据集托管于百度网盘PDF内附数据集基本情况介绍与获取方式。除数据外还提供YOLO11cls一键训练脚本和博主训练结果日志能帮助初学者快速跑通完整训练流程并结合收敛曲线评估模型表现。目前已有28人学习适合食品工业智能质检、通用缺陷检测方向的学生与算法工程师参考使用。 做食品质检的朋友应该都有体会饼干这类大批量连续生产的食品缺陷品混入正常品的问题特别头疼。我最近正在整理一套曲奇饼干缺陷检测的图像分类数据集一共1000张图已经按类别分好文件夹配套一个YOLO11cls一键训练脚本专门用于目标分类场景下的缺陷品筛选。这套东西落地以后效果很直接不用自己写模型结构数据丢进去脚本跑完就能拿到可用的分类模型。适合刚入门图像分类的工程师也适合食品行业里想快速验证视觉方案的技术人员。今天把数据整理、目录结构、脚本参数和踩过的坑完整说一遍照着操作基本都能复现。1. 方案选型为什么是YOLO11cls而不是传统视觉1.1 传统图像处理为什么干不了这活儿以前做缺陷检测很多人第一反应是OpenCV那套灰度化、二值化、找边缘、算面积。对规则零件、固定光照下的场景这套确实能用。但曲奇饼干表面纹理本身就复杂有糖粒、坚果碎、巧克力豆正常品和部分缺陷在灰度直方图上差别很小。裂纹可能是极细的一条线烤焦可能只是局部颜色变深传统算法很难用一个固定阈值把它们稳定分开。更麻烦的是实际产线光照会有波动同一个饼干在不同的光线下灰度差比缺陷本身的差异还大传统视觉方案一不小心就陷入调参地狱。1.2 图像分类和缺陷检测的边界如何取舍这里有一个关键选择为什么用分类而不是目标检测曲奇缺陷检测里缺角和变形确实有点像检测任务的定位需求但实际落地中我们往往只需要知道“这块饼干是否合格”至于缺陷具体在哪个像素位置对后续剔除动作来说意义不大。分类任务只需要给每个图片一个类别标签模型也更轻、更快训练数据需求也小得多。1000张图对检测任务来说有点紧但对分类任务来说配合预训练模型和合理的数据增强已经可以训练出不错的基线模型。1.3 YOLO11cls有什么优势YOLO11是Ultralytics在YOLOv8之后推出的版本延续了YOLO系列“一套代码打天下”的设计思想。cls是分类任务分支用的不是坐标框而是对整张图做类别预测。选它有几个很实在的理由第一代码接口统一训练、验证、导出一条命令搞定第二官方提供了yolo11n-cls.pt、yolo11s-cls.pt这些预训练权重1000张图也能玩转第三底层是PyTorch生态成熟有问题找资料很容易。整个流程不需要自己写网络结构也不用手写训练循环对非算法出身的工程人员相当友好。2. 数据集构建1000张图怎么分、怎么放2.1 类别设计直接决定模型上限数据集整理的第一步不是建文件夹而是先想清楚要分几个类。我建议结合实际产线最容易出现的缺陷来定常见的曲奇缺陷大概有这么几类正常normal、裂纹cracked、烤焦burnt、缺角broken、变形deformed、夹生undercooked。每类图片数量最好尽量均衡。1000张图如果分5到6个类每类也就160到200张已经接近小样本训练的极限了。如果硬塞十几类很多类只有几十张图模型基本学不到有效特征准确率会很难看。我这次项目把类别控制在5个normal、cracked、burnt、broken、deformed保证每类都有充足样本。2.2 图片采集和清洗的一个核心原则图片来源可以是工业相机拍摄、手机补拍、网络收集也可以是产线上截取视频帧。采集阶段的重点是“同一场景下多角度、多光照、多摆放姿态”。如果所有正常品都在同一个角度拍摄模型学到的很可能只是拍摄环境而不是饼干本身。清洗阶段一定要把模糊、抖动、严重反光、含其他物体的图片删掉否则会污染标签。清洗数据我常用的办法是先按类别分好文件夹随机抽100张人工看一眼发现问题图的类别再做二次清理这套流程不复杂但很重要。2.3 YOLO分类数据集的目录结构标准YOLO分类数据集不认单独的标注文件它认文件夹路径。目录结构是下面这个样子dataset/ ├── train/ │ ├── normal/ │ │ ├── normal_0001.jpg │ │ ├── normal_0002.jpg │ ├── cracked/ │ ├── burnt/ │ ├── broken/ │ └── deformed/ └── val/ ├── normal/ ├── cracked/ ├── burnt/ ├── broken/ └── deformed/train和val里面各自保持相同的类别文件夹名文件夹名字就是类别名脚本会自动扫描出来。图片命名建议用“类别名_编号.jpg”的方式方便回溯。划分比例我用8:2训练集800张、验证集200张。验证集的口诀是“验证集里必须包含每个类别”否则评估指标就是虚的。划分的时候用脚本做随机打乱不要手工挑避免人为偏好。2.4 用一个小脚本自动划分并校验手动复制几百张图太痛苦我直接写了个划分脚本放这里供参考import os import random import shutil data_root raw_images # 原始按类别分好的图片目录 dst_root dataset # 目标数据集目录 val_ratio 0.2 random.seed(42) categories [d for d in os.listdir(data_root) if os.path.isdir(os.path.join(data_root, d))] for c in categories: imgs [f for f in os.listdir(os.path.join(data_root, c)) if f.lower().endswith((.jpg, .jpeg, .png))] random.shuffle(imgs) split int(len(imgs) * (1 - val_ratio)) for split_name, part in zip([train, val], [imgs[:split], imgs[split:]]): out_dir os.path.join(dst_root, split_name, c) os.makedirs(out_dir, exist_okTrue) for f in part: shutil.copy(os.path.join(data_root, c, f), os.path.join(out_dir, f)) print(f{c}: train{split}, val{len(imgs) - split})跑完以后检查一下每个类别的数量是否合理如果某个类在验证集里数量少于10张建议回头补图。数据集的整理到这一步就算完成了。3. 一键训练脚本从环境到训练3.1 先说环境准备训练之前先装ultralytics依赖Python版本3.8以上PyTorch建议2.0以上。GPU不是必须的有N卡最好CPU也能跑就是慢。安装命令很简单pip install ultralytics装完后在命令行直接输入yolo能看到帮助信息就说明环境没问题。如果有GPU提前确认一下nvidia-smi能看到显卡并把PyTorch装成CUDA版本不然后面训练会悄悄用CPU跑速度差很多。3.2 训练脚本解析所谓一键训练脚本其实就是把参数都定好跑一个命令的事情。我写的脚本大概是这样的#!/bin/bash # train.sh DATA$1 if [ -z $DATA ]; then DATA./dataset fi python - EOF from ultralytics import YOLO model YOLO(yolo11s-cls.pt) # 加载预训练权重 model.train( taskclassify, datadataset, epochs80, imgsz224, batch32, device0, # 0表示第一张显卡-1表示所有可用显卡 patience15, lr00.001, save_period10, projectruns, namecookie_cls, pretrainedTrue, augmentTrue, ) EOF这里面的关键参数我说一下方便以后自己改。epochs80对于小数据集来说不会太少也不是特别多配合早停机制到了一定轮次准确率不再上升会自动停。imgsz224是分类任务的常用输入尺寸也是YOLO11分类分支预训练权重的常见尺寸不用加太大太大不仅慢而且容易过拟合。batch32在8GB显存左右可以跑如果显存小降到16或者8。lr00.001是初始学习率YOLO11自己带warmup这个值基本不用动。patience15表示15个epoch内验证集指标不提升就提前结束省时间。3.3 训练过程中的输出怎么看脚本跑起来以后终端会实时打印每一轮的loss、top1 accuracy、top5 accuracy等指标。如果loss在下降、accuracy在上升说明训练正常。训练结束后在runs/cookie_cls/目录下会生成weights/best.pt和last.pt两个权重文件best.pt是验证集准确率最高的那个后面预测、部署都用它。还自动生成了混淆矩阵图、曲线图等结果文件可以直接打开看。4. 模型评估与关键调参思路4.1 混淆矩阵比准确率更值得看训练结束打开混淆矩阵图能看到每个类别的真实标签和预测标签的关系。最理想的状态是对角线全部是深色块非对角线基本是浅色。实际项目中我遇到最多的混淆情况是cracked和broken分不清原因是很多裂纹严重一点的饼干被标成了broken标签本身就有歧义。解决这类问题不是急着调参而是回到数据集把边界样本重新梳理一遍。分类任务的标签一致性比数量更重要这一点很多人会忽略。4.2 从评估结果反推问题如果normal类的准确率很高但缺陷类recall偏低一般是类别不平衡导致的。应对办法有两个方向一是给缺陷类多补图二是给loss加类别权重让少数类的错误惩罚更大一点。YOLO11没有直接暴露class weight参数可以通过weights参数传字典或者在训练脚本里设置model.loss_weights。如果所有类别准确率都上不来先不要怀疑模型结构回头看看图片是不是有过曝、虚焦、类别标错。图像的分类任务数据质量永远是第一优先级模型结构在数据面前反而没那么敏感。4.3 数据增强参数怎么调YOLO11分类训练默认会做随机裁剪、旋转、翻转等增强。小数据集上我的经验是不要关掉增强但也不要开得太猛。太强的增强会把正常品扭曲成和缺陷品很像的形态模型反而是被训练集带歪了。如果验证集准确率和训练集准确率差距大于8%说明有过拟合迹象优先增加数据量或降低epoch数不要盲目堆增强。跑完训练后用best.pt对几个验证集图片做预测测试一下yolo predict taskclassify modelruns/cookie_cls/weights/best.pt sourcetest_image.jpg输出的预测类别和置信度会直接显示在命令行里很直观。5. 常见问题与避坑经验5.1 训练过程翻车问题速查表现象可能原因解决办法训练报错Path contains non-ASCII characters数据集路径里有中文或空格把路径改成纯英文路径不要有中文显存不足OOMbatch过大或imgsz过大调小batch到16/8或降低imgsz到192训练很慢但GPU占用率低数据加载瓶颈设置workers4或8把数据集放SSD上准确率一直不变学习率过大或标签错乱检查lr0重新核对文件夹和标签验证集准确率远低于训练集过拟合增加数据、降低epoch、增强正则化某些类别准确率特别低样本量太少补图或合并相似类别5.2 不能忽视的细节有几个细节值得专门说一下。第一数据集路径里千万不能有中文ultralytics在Windows下对中文路径的兼容性一直不太好我第一次跑就栽在这个地方。第二如果机器上没有显卡device0会直接报错改成devicecpu就行不过训练时间会明显拉长。第三图片格式统一用jpg或png混用也可以但没必要统一格式能少出很多莫名其妙的错误。第四跑完训练看看confusion_matrix.png这文件比终端里的无数行日志信息量大得多。5.3 从训练到落地的最后一脚模型训练只是第一步后面部署还有一段路。如果后续要接到产线系统或摄像头流里可以把best.pt导出成ONNX格式yolo export modelruns/cookie_cls/weights/best.pt formatonnx imgsz224导出之后在Python侧用onnxruntime做推理速度比PyTorch更快部署也灵活一些。分类模型的输入是一张图输出是各个类别的概率取最大概率对应的类别作为最终判定结果。调用方只需要做两件事把摄像头截帧存成图片拿模型推理然后根据结果控制剔除机构动作。回想这次从数据整理到模型训练的全过程我自己最大的体会是模型参数不是最值钱的部分数据集的组织方式才是。把类别想清楚、把文件夹放对、把标签核对一遍后面所有工作都能顺风顺水。我在这套流程里踩过的坑——中文路径、类别不平衡、标签歧义——每一项都是实际项目里真实出现过的希望读者能少走一点弯路。整理的代码和目录结构可以直接当成模板用换一个产品、换一组缺陷类别稍微改改类别名和路径就能启动新的训练任务。如果训练时遇到什么问题欢迎对照上面的排查表自己查一遍大部分问题都能在十分钟内解决。本文还有配套的精品资源点击获取