尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

鸡蛋品质分级:YOLO训练与评估实战指南

发布时间:2026/9/12 22:17:20

资讯中心
01
ARTICLE

鸡蛋品质分级:YOLO训练与评估实战指南

鸡蛋品质分级:YOLO训练与评估实战指南
简介这份鸡蛋品质分级数据集面向YOLO系列目标检测开发者和农业智能化学习者定位在蛋品外观质检场景涵盖血染鸡蛋、棕色鸡蛋、脏兮兮的鸡蛋、白鸡蛋、钙沉积蛋等典型类别样本覆盖常见缺陷类型可直接用于模型训练与验证测试。压缩包共1846个文件包含615张jpg原图、615个txt格式YOLO标签、615个xml格式VOC标签及1个data.yaml配置文件两种标签格式均与图像一一对应YOLO标签使用class、归一化中心点坐标和宽高表示目标框VOC标签则便于XML工具链处理免去格式转换的额外工作。数据集已经划分好并内置data.yaml兼容yolov5、yolov7、yolov8、yolov9、yolov10、yolo11等主流算法打开即可配置路径开始训练。资源整体仅25.41MB已有104人学习体量轻、门槛低适合快速搭建蛋品分拣或农业视觉检测实验项目也方便学习者用同一数据集对比不同YOLO版本的性能差异。1. 鸡蛋品质分级数据集喂给 YOLO 算法前要过三道坎拿到这个 zip 时里面是 615 张已经标注好的鸡蛋图像类别覆盖血染蛋、棕色鸡蛋、脏鸡蛋、白鸡蛋和钙沉积蛋。这类数据集的典型使用场景是产线蛋品分选摄像头拍下输送带上的鸡蛋YOLO 算法实时给出类别并触发剔除机构把带血渍、带污垢、表面有钙沉积凸起的鸡蛋从正常蛋里分出来。看起来是“解压即训练”但 615 张这个规模恰好卡在一个尴尬区间比几十张的 demo 数据多又远少于工业落地上千甚至上万张的合格线。问题不在于能不能训练而在于训练出来的模型上线后能不能扛住产线光照变化、不同批次鸡蛋的底色差异和高速输送时的运动模糊。这篇只讲一件事——用这套鸡蛋品质数据跑通 YOLO 训练与评估的真实流程把标注校验、小样本训练、五类混淆这三个最常翻车的点逐个解决。适合正在做工业视觉质检落地、手里只有少量标注数据但急需出模型验证效果的算法工程师和产线 IT 技术人员。2. 鸡蛋品质数据集的标签结构与类别平衡检查2.1 解开 zip 后先确认 YOLO 标注格式这个数据集的名字里明确写了“带标签”但标签到底是什么格式、坐标原点在左上角还是中心点、类别 id 是否连续直接决定你后续能不能把它喂进 YOLO。我习惯的做法是解压后先不急着开训练而是把目录结构完整列出来。unzip -q YOLO算法-鸡蛋品质分级数据集-615张图像带标签-*.zip -d egg_dataset find egg_dataset -type f | awk -F. {print $NF} | sort | uniq -c解压后先统计文件扩展名正常情况下会出现 jpg 或 png 与 txt 两类文件。若发现某张图片缺 txt或者某个 txt 里没有任何标注说明该样本是空背景需要单独处理。当前数据集命名为“615 张图像带标签”按惯例每张图对应一个同名的 txt 标签文件。打开任意一个 txt 文件能看到类似下面这样的一行2 0.501953 0.437500 0.089844 0.152344这一行就是 YOLO 标注的标准格式第一个数字是类别 id后面四个数字依次是归一化后的中心点 x、中心点 y、框宽 w、框高 h。注意四个坐标值全部在 0 到 1 之间单位是相对图像宽高的比例不是像素值。中心点坐标和宽高都来自原图尺寸的归一化训练时模型会把标签还原到输入尺寸的 feature map 上计算损失。明确了标注结构之后才谈得上校验标签质量——文本文件格式上没问题不代表框的位置和尺寸没有错误。2.2 五种鸡蛋类别的标注形态与标签语义划分从标题里的类别名能明确区分出五类血染蛋、棕色鸡蛋、脏兮兮的鸡蛋、白鸡蛋、钙沉积蛋。这里要注意棕色鸡蛋和白鸡蛋是正常品血染蛋、脏蛋、钙沉积蛋是缺陷品。如果产线分选的最终目标是“合格/不合格”两类完全可以把后三类合并但这个数据集保留了完整类别说明设计者希望算法能区分缺陷类型便于后续追溯污染来源。类别视觉特征标注难度最容易被混淆的类别血染蛋蛋壳表面有暗红色血渍或血点中小面积血点易漏标脏兮兮的鸡蛋棕色鸡蛋均匀褐色或土黄色蛋壳低轮廓清晰血染蛋若底色偏红脏兮兮的鸡蛋泥污、粪便或灰尘附着中形状不规则钙沉积蛋、血染蛋白鸡蛋白色或淡黄色蛋壳低轮廓清晰钙沉积蛋浅色凸起钙沉积蛋蛋壳表面有水垢状或砂砾状凸起中凸起与蛋壳同色系脏兮兮的鸡蛋五类中棕色蛋和白蛋是“底色类”缺陷蛋是“纹理叠加类”。检测器区分底色容易区分不规则附着物难。血染蛋与脏蛋在图像上都是暗色斑块附着在蛋壳表面钙沉积蛋与脏蛋同样是浅色不规则覆盖物。615 张图中若某类样本不足 60 张很容易出现训练充分但验证不稳定的现象。按 615 张做 82 划分训练集约 492 张每类平均不到 100 张必须做类别均衡分析后才能决定后续要不要做重采样。2.3 用 OpenCV 批量绘制标注框排查五点以上标注错位文本标签合法不代表标签正确。最直接的校验是把每个标注框画回原图生成网格图肉眼检查。我写了一个小脚本一次性把 615 张全部输出再按类别筛选看问题样本。import cv2 import glob import numpy as np class_names [blood_stained, brown, dirty, white, calcium_deposit] colors [(0, 0, 255), (0, 165, 255), (0, 255, 0), (255, 255, 255), (255, 0, 255)] image_paths glob.glob(egg_dataset/images/*.jpg) random_sample np.random.choice(image_paths, 24, replaceFalse) grid [] for idx, path in enumerate(random_sample): img cv2.imread(path) h, w img.shape[:2] label_path path.replace(.jpg, .txt).replace(images, labels) if not os.path.exists(label_path): print(missing label:, path) continue with open(label_path) as f: for line in f: cls, cx, cy, bw, bh line.split() x1 int((float(cx) - float(bw) / 2) * w) y1 int((float(cy) - float(bh) / 2) * h) x2 int((float(cx) float(bw) / 2) * w) y2 int((float(cy) float(bh) / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), colors[int(cls)], 2) cv2.putText(img, class_names[int(cls)], (x1, max(0, y1 - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, colors[int(cls)], 1) grid.append(img) grid_img np.hstack(grid.reshape(6, 4).map(lambda row: np.hstack(row)).tolist()) cv2.imwrite(annotation_check.png, grid_img)这段脚本的要点是把标注框从归一化坐标还原成像素坐标时中心点减半宽、减半高得到左上角加半宽、加半高得到右下角顺序颠倒会导致框画在蛋的旁边。运行 opencv 的 putText 时如果 y1 减去 5 后小于 0文字会被裁掉所以需要 max 处理。检查 24 张图的网格一眼就能看出三个典型问题血染蛋的小块血渍是否漏标、脏蛋的标注框是否只框了蛋体而没包含污渍区域、钙沉积蛋的框是否过大把背景也包了进来。3. 用 YOLO 训练自己的鸡蛋分级模型前必须做好的数据划分3.1 生成 images 和 labels 目录并配置 egg.yaml校验完标注接下来要把数据集组织成 YOLO 项目能够直接识别的结构。无论是 YOLOv5 还是 YOLOv8 及其后续版本训练时读取数据的方式都是通过一个 yaml 文件指定训练集、验证集路径和类别名列表。这里的路径可以是绝对路径也可以是相对于项目根目录的相对路径注意 windows 下反斜杠需要转义我一般直接转换成 Unix 风格斜杠。mkdir -p egg_yolo/images/train egg_yolo/images/val mkdir -p egg_yolo/labels/train egg_yolo/labels/val划分方式用常见做法每类按 82 采样保证验证集里五类都存在。不要直接shuf整份文件——如果某一类在全部数据里只出现 30 次随机整体划分后验证集可能只剩 3 张这一类的样本评估指标波动会非常大。我通常写个小循环按类别划分子集确保每一类的训练验证比例一致。完成划分后创建egg.yamlpath: ./egg_yolo train: images/train val: images/val nc: 5 names: 0: blood_stained 1: brown 2: dirty 3: white 4: calcium_depositpath字段是数据集根目录train和val是相对path的图片目录。训练阶段 YOLO 会根据 label 与 image 的同名性自动查找同路径下的 txt 文件目录结构稍有偏差就会报found no labels警告。看到这个警告时优先检查 labels 目录是否存在同名 txt而不是急着调模型结构。3.2 小样本数据集上的训练超参数与 YOLO 损失函数侧重点615 张图像属于典型的小样本工业检测场景训练配置不能直接抄 COCO 的默认参数。以下是我在这个规模数据集上常用的启动配置以及每个参数设置的依据。参数建议值原因modelone of YOLO 系列的 n/s 版本样本量不支持大模型n 版参数量小训练速度快用于验证基线imgsz640与预训练权重输入尺寸一致避免从 0 开始适配batch16显存允许范围内尽量大小数据集上大 batch 让梯度更稳定epochs200小数据集收敛慢配合早停防止过拟合optimizerSGD 或 AdamWSGD 泛化性好AdamW 收敛快两者都试一次再定patience50验证集指标连续 50 个 epoch 不提升即停止在迁移学习的思路下加载预训练权重并从冻结 backbone 开始训练是稳妥的做法。先用前置库的预训练权重初始化模型然后把 backbone 参数冻结只训练检测头让模型先记住蛋体的通用特征。完成 50 个 epoch 后解冻全部层使用较小的学习率 0.001 进行微调。注意这里的冻结训练不是必须的如果类别特征与 COCO 差异极大冻结太久反而限制了特征提取的表达能力。鸡蛋的纹理与 COCO 中动物类别的表面特征差异不大冻结 backbone 有利于稳定 loss。执行训练命令yolo detect train dataegg.yaml modelyolo11n.pt epochs200 imgsz640 batch16 optimizerSGD lr00.01 freeze10 patience50训练过程中建议盯着命令输出的三个损失值变化box_loss 负责回归框位置cls_loss 负责任类别判断dfl_loss在 YOLOv8 及后续版本中负责边框分布。鸡蛋数据集中钙沉积蛋与白鸡蛋的框都紧贴蛋体轮廓框的边界没有本质区别所以 box_loss 通常能较快收敛真正决定模型可用性的是 cls_loss——脏蛋和血染蛋之间、钙沉积蛋和白鸡蛋之间分类边界都很模糊。如果 cls_loss 在训练后期反复震荡优先怀疑是样本量不足导致的类别间特征重叠而不是换更大的模型。3.3 针对 615 张样本的类别不平衡缓解重采样与权重设置训练前先统计每个类别的实例数量我一般用一段快速脚本完成。from collections import Counter counter Counter() import glob for label_file in glob.glob(egg_yolo/labels/train/*.txt): with open(label_file) as f: for line in f: cls int(line.split()[0]) counter[cls] 1 print(counter)如果血染蛋的实例数只有白鸡蛋的一半模型会对血染蛋的记忆不充分推理时倾向于把血染蛋预测成其他类。此时两种处理方式可选一是把样本数少于中位数的类在训练时重复采样两次或三次直接复制对应 txt 与图片注意要修改文件名以避免覆盖二是开启 YOLO 内置的类别权重参数在 loss 计算时对少样本类别加大惩罚。重复采样更直接效果可预期适合一次性快速验证类别权重则适合训练流程自动化之后反复调整。我推荐先用重复采样把各类拉到同一数量级跑一遍基线再说。另外一个小技巧是在训练命令中加cacheTrue。615 张图片的体量非常小完整加载到内存或者显存中能大幅缩短每个 epoch 的磁盘 I/O 时间。cpu 环境下基本可以忽略这个参数但如果用 GPU 训练预处理环节的时间占比会显著高于大数据集cacheTrue能让整体训练时间缩短三分之一左右。4. 评估鸡蛋分级结果从 mAP 到混淆矩阵定位五类特征的边界4.1 在验证集上计算 YOLO 检测指标训练完成后最直接的评估方式是对保留的验证集执行验证命令。注意数据划分阶段要保证验证集不能参与训练评价才有意义。YOLO 命令指定模型权重文件和验证数据配置即可。yolo detect val dataegg.yaml modelruns/detect/train/weights/best.pt输出指标是四个核心值precision精确率、recall召回率、mAP50IoU 阈值为 0.5 时的平均精度、mAP50-95IoU 阈值从 0.5 到 0.95 的平均精度。鸡蛋分选场景里最该关心的是 mAP50 和召回率。产线逻辑是尽量不让血染蛋漏检而流入合格品漏检的代价远高于误杀——把合格白鸡蛋当成脏蛋导致剔除只是浪费一颗蛋血染蛋被放过则整批出货都受影响。所以在观察指标时宁可精确率低一些也要保证召回率足够高。mAP50-95 对这个场景只是参考鸡蛋的框标注没有特别高的边界精度要求不必要过分追求高 IoU 下的表现。指标合格线参考说明mAP500.85 以上主要门槛低于该值说明类别区分度不够recall0.9 以上漏检率直接对应产线剔除遗漏率precision0.9 以上过高的误杀率影响产线良品率mAP50-95不作硬性要求该指标对框精度更敏感蛋类检测不依赖像素级边缘如果 mAP50 明显低于 0.8需要回到数据层面检查而不是继续调参——因为 615 张图的体量决定了模型上限。此时优先步骤是回到第 2 章的标注可视化重新看框是否贴合、脏蛋与钙沉积蛋的实例是否足够区分。4.2 用混淆矩阵找出血染蛋与脏蛋的区分障碍YOLO 在验证结束后会在输出目录自动生成混淆矩阵图片路径通常是runs/detect/val/confusion_matrix.png。这张图是后续所有改进工作的核心依据。对鸡蛋数据集而言我需要重点观察两种最容易误判的配对图片背景预测为脏蛋、钙沉积蛋预测为白鸡蛋。背景被预测成某类缺陷蛋通常出现在光照反光的边缘区域褐色的木质输送带更会加剧这种情况。另一种常见现象是血染蛋和脏鸡蛋在混淆矩阵上出现高比例的互相错认。这说明两个类别的特征空间高度重叠模型只能学到“有暗色斑块”这一共性学不到“斑块颜色偏红的是血偏灰绿的是脏”的细粒度差异。615 张图不足以让模型学会这种细微差别补充采样优于盲目调参。若无法补充数据可以把五类检测改为两阶段第一阶段只检测所有鸡蛋五个类别统一成一个前景类第二阶段对检测框区域做细粒度分类。这样模型第一阶段只学“有没有蛋”避免了类别混淆带来的漏检第二阶段的分类可以在 100 个 epoch 内快速验证是否可分。常见落地项目中这种方案成功率高很多。识别到特定两类的混淆后还可以在推理阶段做人工后处理当模型输出脏蛋与血染蛋的置信度同时在阈值附近时保留置信度高的一类把另一类抑制或者直接在代码里合并且标记为“缺陷蛋”交给下游机构处理。5. 提升鸡蛋分级数据集的训练效率数据增强取舍与训练策略调整5.1 旋转、翻转与 mosaic 参数的选择依据YOLO 默认开启 mosaic 和 mixup 等数据增强策略但在 615 张且类别间距较小的工业数据集上无脑照抄默认参数是有风险的。Mosaic 把四张图拼在一起训练模型可以看到更丰富的背景与光照组合这对小目标检测场景的帮助显著——鸡蛋占画面比例若小于 5%mosaic 拼图后的目标更小反而能提升特定场景下的特征提取能力。但代价是若原始标注框不够精确拼图后边界处的框错位会被放大。针对鸡蛋类别本身的对称性我一般这样调整增强参数增强项建议值说明fliplr0.5鸡蛋左右对称水平翻转不破坏语义flipud0.0若产线有输送带方向约束保留蛋壳上污渍的上下位置有助于分类rotate30输送姿态任意时可用蛋托固定方向时改为 0scale0.5允许近大远小的比例变化但不要过分压缩导致小目标漏检mosaic1.0小样本场景建议保留增加背景多样性mixup0.2设置为低值过高的 mixup 会让脏蛋与血蛋的纹理混叠flipud 是我特别强调的参数。如果产线图像中鸡蛋统一由左向右运动蛋壳上的血渍或钙沉着位置有方向属性垂直翻转会把“蛋底部污渍”变成“蛋顶部污渍”导致特征理解不一致如果是散放姿态完全随机的采集环境翻转则无影响。训练前看一眼采集现场图像或这批图片的原生姿态就知道该不该开。命令示例YOLO 命令行也可以直接透传增强参数yolo detect train dataegg.yaml modelyolo11n.pt epochs200 \ hsv_h0.0 hsv_s0.5 hsv_v0.4 \ degrees30 fliplr0.5 flipud0.0 \ scale0.5 translate0.1色域增强里把色相偏移设为 0 是刻意为之——血染蛋与脏蛋的区分依赖颜色差异色相抖动会直接抹掉这种差别。饱和度和明度的轻微抖动可以保留用来模拟不同光照下的拍摄条件。5.2 五个类别合并成“蛋与缺陷”的检测思路在第 4 章提到过二阶段方案这里展开说它的实现路径。把五个类别合并成一个前景类标签文件里所有类别 id 写 0得到的模型只有一个输出维度再训练一个轻量分类器比如 ResNet18 或 EfficientNet 系列输入检测框裁剪后的图像输出五分类结果。这么做的好处有两个其一检测阶段不再被类别混淆干扰模型专注学“蛋体轮廓”其二分类阶段输入图像只包含蛋体本身没有背景干扰类内特征的区分压力变小。对于 615 张图合并后检测模型的训练时间从多类别变成单类别收敛速度会明显提升。在 YOLO 系列环境中执行合并时只需要把 labels 目录下所有 txt 每行的第一个字段改写为 0然后重新生成一份数据集目录。也可以直接复制一份保留原始五类别版本以便对比报告效果。这个方案特别适合模型在产线开发中的早期阶段——先用二阶段跑通流程、摸清数据质量再回到五类端到端训练往往比一上来就死磕端到端更快。6. 导出 ONNX 后的鸡蛋分级推理与轻量二次判断把训练好的 best.pt 部署到产线边缘设备上时常见的做法是先导出为 ONNX 格式再用 ONNX Runtime 做推理避免在目标设备上搭完整的 PyTorch 环境。导出命令如下yolo export modelruns/detect/train/weights/best.pt formatonnx opset12 simplifyTrue导出后写一个极简推理脚本验证单张鸡蛋图的输出是否与训练时的预期一致import cv2 import numpy as np import onnxruntime as ort session ort.InferenceSession(best.onnx, providers[CUDAExecutionProvider, CPUExecutionProvider]) input_name session.get_inputs()[0].name img cv2.imread(test_egg.jpg) img_resized cv2.resize(img, (640, 640)) input_tensor img_resized[:, :, ::-1].transpose(2, 0, 1).astype(np.float32) / 255.0 input_tensor np.expand_dims(input_tensor, axis0) outputs session.run(None, {input_name: input_tensor})ONNX 输出的原始张量需要经过后处理——解码预测框、过滤低置信度、执行 NMS。若不想自己重写这些逻辑可以用 YOLO 内置的predict方法直接加载 ONNX 文件完成推理它会在底层自动完成解码与 NMS适合快速验证yolo predict modelbest.onnx sourcetest_egg.jpg部署到产线时模型输出的置信度不等于最终判定结果。我通常会在检出结果后加一个二次过滤设定类别专属置信度阈值对不同类别实施不同的剔除逻辑。比如血染蛋的 recall 要求高置信度阈值设置 0.25白鸡蛋是正常品只有置信度大于 0.7 才判定为白蛋低于阈值又未命中其他类别时统一归入“待人工复检”。这种多阈值策略比全局阈值更贴近真实质检规则。若出现两三个检测框落在同一颗蛋上的重叠输出则用框的 IoU 直接合并保留置信度最高的框。最后把每一帧的类别、框坐标和置信度输出为 JSON供产线 PLC 系统读取再驱动剔除机构动作。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。