基于YOLO11cls的曲奇饼干缺陷检测:数据集构建与一键训练实战
2026/9/20 20:58:29 网站建设 项目流程

简介:面向食品工业质检中的曲奇饼干外观缺陷识别需求,这份资源提供了一套标注规整、可直接投入算法训练的图像分类数据集。图像采集自真实产线场景,共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_ok=True) 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( task="classify", data="dataset", epochs=80, imgsz=224, batch=32, device=0, # 0表示第一张显卡,-1表示所有可用显卡 patience=15, lr0=0.001, save_period=10, project="runs", name="cookie_cls", pretrained=True, augment=True, ) EOF

这里面的关键参数我说一下,方便以后自己改。epochs=80对于小数据集来说不会太少也不是特别多,配合早停机制到了一定轮次准确率不再上升会自动停。imgsz=224是分类任务的常用输入尺寸,也是YOLO11分类分支预训练权重的常见尺寸,不用加太大,太大不仅慢而且容易过拟合。batch=32在8GB显存左右可以跑,如果显存小降到16或者8。lr0=0.001是初始学习率,YOLO11自己带warmup,这个值基本不用动。patience=15表示15个epoch内验证集指标不提升就提前结束,省时间。

3.3 训练过程中的输出怎么看

脚本跑起来以后,终端会实时打印每一轮的loss、top1 accuracy、top5 accuracy等指标。如果loss在下降、accuracy在上升,说明训练正常。训练结束后,在runs/cookie_cls/目录下会生成weights/best.ptlast.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 task=classify model=runs/cookie_cls/weights/best.pt source=test_image.jpg

输出的预测类别和置信度会直接显示在命令行里,很直观。

5. 常见问题与避坑经验

5.1 训练过程翻车问题速查表

现象可能原因解决办法
训练报错Path contains non-ASCII characters数据集路径里有中文或空格把路径改成纯英文,路径不要有中文
显存不足OOMbatch过大或imgsz过大调小batch到16/8,或降低imgsz到192
训练很慢但GPU占用率低数据加载瓶颈设置workers=4或8,把数据集放SSD上
准确率一直不变学习率过大或标签错乱检查lr0,重新核对文件夹和标签
验证集准确率远低于训练集过拟合增加数据、降低epoch、增强正则化
某些类别准确率特别低样本量太少补图或合并相似类别

5.2 不能忽视的细节

有几个细节值得专门说一下。第一,数据集路径里千万不能有中文,ultralytics在Windows下对中文路径的兼容性一直不太好,我第一次跑就栽在这个地方。第二,如果机器上没有显卡,device=0会直接报错,改成device='cpu'就行,不过训练时间会明显拉长。第三,图片格式统一用jpg或png,混用也可以但没必要,统一格式能少出很多莫名其妙的错误。第四,跑完训练看看confusion_matrix.png,这文件比终端里的无数行日志信息量大得多。

5.3 从训练到落地的最后一脚

模型训练只是第一步,后面部署还有一段路。如果后续要接到产线系统或摄像头流里,可以把best.pt导出成ONNX格式:

yolo export model=runs/cookie_cls/weights/best.pt format=onnx imgsz=224

导出之后在Python侧用onnxruntime做推理,速度比PyTorch更快,部署也灵活一些。分类模型的输入是一张图,输出是各个类别的概率,取最大概率对应的类别作为最终判定结果。调用方只需要做两件事:把摄像头截帧存成图片,拿模型推理,然后根据结果控制剔除机构动作。

回想这次从数据整理到模型训练的全过程,我自己最大的体会是:模型参数不是最值钱的部分,数据集的组织方式才是。把类别想清楚、把文件夹放对、把标签核对一遍,后面所有工作都能顺风顺水。我在这套流程里踩过的坑——中文路径、类别不平衡、标签歧义——每一项都是实际项目里真实出现过的,希望读者能少走一点弯路。整理的代码和目录结构可以直接当成模板用,换一个产品、换一组缺陷类别,稍微改改类别名和路径就能启动新的训练任务。如果训练时遇到什么问题,欢迎对照上面的排查表自己查一遍,大部分问题都能在十分钟内解决。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询