
简介面向工业质检场景与目标检测实训需求这份腰果缺陷检测数据集按YOLOv5标准目录结构整理可直接用于YOLO系列模型训练。标注信息采用相对坐标格式依次记录类别编号、目标中心横坐标、纵坐标、宽度和高度覆盖破损、缺陷、上下裂开及完好五个类别图片与标签txt严格一一对应。压缩包共2000个文件其中1999个为标注文本另附1个Python可视化脚本整体大小约101.94MB训练集包含3186张图片及对应标签验证集304张测试集150张并单独提供类别名称清单txt导入项目后即可开始训练。可视化脚本无需修改参数随机传入一张图片即可自动绘制边界框并保存到当前目录能直观检查标注是否正确。目前已有65人学习适合农产品外观检测、YOLO入门练习以及缺陷数据扩充等场景参考使用。1. 腰果缺陷检测为什么值得用 YOLO 自己训一版做工业质检的人对“腰果缺陷检测”这个标题应该不陌生腰果仁在产线上按整粒、半粒、破碎、斑点、虫眼等标准分选传统做法是振动筛加人工目检一小时几千颗看下来眼睛先扛不住。用 YOLO 做腰果缺陷检测本质上是把质检员的经验固化成一类目标检测模型——给每颗腰果打一个框框上带类别标签模型学会的是“什么样的外观对应什么样的缺陷”。这套方案的直接价值是能把人工抽检变成在线全检漏检率靠模型阈值来兜底。这个数据集方案适合谁两类人。一类是刚接触工业视觉的算法工程师需要一个“类别干净、标注规范、划分现成”的小数据集来跑通 YOLO 全流程另一类是产线设备工程师想评估视觉检测的可行性不想从零开始标数据。标题里“包含划分好的数据集、类别class文件、数据可视化脚本”这三样东西恰好把训练前最琐碎的三步——数据准备、类别映射、样本审查——都替你做了。下面从数据格式拆起逐步讲到训练参数和落地坑点。2. 数据集里有什么从目录结构到类别映射2.1 划分好的数据集怎么看train/val/test 的目录约定YOLO 系列对数据集的目录要求非常固定不管你是 YOLOv5 还是 YOLOv8训练器默认都按images和labels分家每一级目录下图片和标注文件同名同前缀。拿到这份腰果数据集第一件事不是打开图片看而是先摸目录结构。常见做法是cashew_defect/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ ├── classes.txt └── visualize.pylabels/train下每个.txt文件和images/train下的图片一一对应文件名相同扩展名从.jpg换成.txt。标注文件里每一行代表一个目标框格式是class_id x_center y_center width height五个数字全是归一化的范围 0~1。这个约定从 YOLOv5 到 YOLOv9 一直没变所以这份数据可以直接喂给不同版本的训练器。val 和 test 的划分比例通常在 8:1:1 左右腰果这类类别少、样本均衡的工业场景这个比例够用。2.2 类别 class 文件classes.txt 的写法和读取逻辑classes.txt是整个数据集的“字典”。每一行一个类别名行号就是类别 id从 0 开始计数。腰果 5 类的常见顺序是整粒 半粒 破碎 斑点 虫眼这个顺序一旦定下来训练和推理必须保持一致。你在data.yaml里写的names列表、模型输出的类别索引、评估脚本里算 mAP 用的标签名全都以这份classes.txt为唯一事实来源。实际工作中最容易翻车的点就在这里有人手动改过classes.txt的行顺序忘了同步改labels/*.txt里的 class_id结果训练时模型把“斑点”学成了“虫眼”mAP 看着不低拿到产线全是错的。提示拿到数据集先跑一个脚本把所有 labels 文件里的 class_id 最大值打印出来如果大于 4说明标注和 classes.txt 对不上直接排查比训完再发现省一天时间。2.3 数据可视化脚本标注质量审查的第一道防线标题里单独点了“数据可视化脚本”这东西的价值比多数人以为的大。训练前把标注框画到原图上人工扫一遍能发现三类问题框偏移标注时手滑、类别错标把半粒标成破碎、漏标图里有目标但没框。一份能直接跑的脚本通常长这样import cv2 def draw_boxes(image_path, label_path, class_names): img cv2.imread(image_path) h, w img.shape[:2] with open(label_path, r) as f: for line in f.readlines(): parts line.strip().split() cls, xc, yc, bw, bh int(parts[0]), *map(float, parts[1:]) x1 int((xc - bw / 2) * w) y1 int((yc - bh / 2) * h) x2 int((xc bw / 2) * w) y2 int((yc bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, class_names[cls], (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2) return img # 用法传入图片路径、对应标签路径、类别名列表 img draw_boxes(images/train/001.jpg, labels/train/001.txt, [整粒, 半粒, 破碎, 斑点, 虫眼]) cv2.imwrite(check_001.jpg, img)上面这段脚本的核心逻辑是反归一化把 0~1 的坐标乘回图片宽高得到像素坐标再绘制。参数thickness2和fontScale0.8是给 640 分辨率图片用的如果你的训练图是 1280 或更高线宽要加到 3字号加到 1.0否则缩略图上看不清框边界。建议跑完脚本后把每张检查图缩成拼接大图一屏看 50 张效率高得多。3. 用这份数据训练 YOLO 模型从 yaml 配置到命令行参数3.1 写 data.yaml五个类别的数据集配置YOLO 训练器不直接读classes.txt它读的是一个data.yaml文件里面指定训练/验证集路径和类别名。这个 yaml 是训练和推理的“总开关”写错一个路径后面全是白费工夫path: /path/to/cashew_defect train: images/train val: images/val test: images/test nc: 5 names: [整粒, 半粒, 破碎, 斑点, 虫眼]path字段写数据集的绝对路径train和val相对path来写。nc必须和names的列表长度一致类别顺序要和classes.txt保持一致。一个最常见的坑是 Windows 用户把路径写成了反斜杠YAML 解析会报错统一用正斜杠或直接写绝对路径最省事。另外test字段在训练时会忽略只在验证阶段用val才是训练过程中算 mAP 的数据。3.2 训练命令与关键参数imgsz、batch、epochs 怎么定基于这份腰果数据训练常用的是 YOLOv8 或 YOLOv11 系列。启动训练的命令不复杂复杂的是参数怎么定yolo detect train \ modelyolov8n.pt \ datacashew.yaml \ imgsz640 \ batch16 \ epochs100 \ patience20 \ device0参数说明imgsz640是工业质检的默认分辨率腰果这类小目标单颗腰果在 640 下约占几十像素不需要太高强行上 1280 会把训练速度拖慢一倍以上batch16看显存8G 显存用 16 稳12G 以上可以试 32epochs100对 5 分类的小数据集偏多配合patience20——连续 20 轮验证集 mAP 不涨就提前停一般 40~60 轮就能收敛。启动后盯两个指标Box_P精确率和mAP50-95前者掉到 0.8 以下说明类别混淆严重后者如果在 0.5 上下打转先回去查标注。注意yolov8n.pt是 Nano 版本工业现场如果对精度要求高可以先训 Nano 验证数据质量再用yolov8m.pt或yolov8l.pt做最终模型。不要一上来就跑 Large5 类小数据集上 Large 的收益极小训练时间却放大 5 倍。3.3 训练结果怎么读混淆矩阵和验证集指标训练结束后runs/detect/train/目录下会有混淆矩阵图、PR 曲线、验证集预测结果图。腰果 5 类的混淆矩阵要重点看“半粒”和“破碎”这两行——它们在产线上最容易混因为半粒的断面和破碎的边缘在视觉上高度相似。如果混淆矩阵显示这两个类互相串常见做法有两个方向一是回去看标注确认标注时有没有在边界样本上达成一致标准二是考虑在损失函数里给易混类别加权重YOLOv8 里可以在cls损失系数上做调整默认cls0.5可以试 0.7。不要指望改模型结构能解决标注不一致的问题数据问题优先在数据层解决。4. 腰果缺陷检测避坑指南数据与训练中的五个实战问题4.1 现象训练 loss 收敛但 mAP 几乎为 0原因data.yaml里names顺序和labels/*.txt里的 class_id 对不上。比如 classes.txt 里第 0 行是“整粒”但 labels 文件里 class_id0 代表的其实是“半粒”模型学到的是错位映射。解决写个脚本遍历 labels 文件统计每个 class_id 出现的次数对照 classes.txt 人工核对如果确认错位批量替换 class_id 数字而不是重标。4.2 现象验证集 mAP 高但拍一张产线实图检测全是漏检原因训练数据是实验室光照条件下拍的产线环境有反光、震动模糊、角度差异数据分布偏移domain shift导致模型泛化失效。解决从产线采集 200~300 张真实图像用训练好的模型做伪标注人工修正后补进训练集做一轮微调fine-tune。这是工业视觉落地最常用的一招比换模型结构有效得多。4.3 现象一个框里框了两颗腰果模型按一个目标学原因标注时为了赶工把密集相邻的腰果合并成了一个框。YOLO 的 anchor 机制对这种情况学得稀烂因为一个 grid cell 只能预测有限数量的目标框里塞两个目标会让回归头无所适从。解决可视化脚本扫图时重点看密集区域把合并框拆开重新标注。如果标注资源不够至少保证训练集里这类样本不做合并。4.4 现象模型把背景误检成“斑点”原因腰果表面的光影变化被当成了缺陷特征训练集里“斑点”样本的背景多样性不够。解决这属于典型的过拟合最简单的办法是加数据增强。YOLOv8 默认开 HSV 扰动但工业场景还要考虑加高斯噪声和亮度抖动# ultralytics 的增强参数在训练命令里直接传 yolo detect train ... augmentTrue hsv_h0.02 hsv_s0.5 hsv_v0.4参数含义hsv_h0.02是色调扰动幅度工业图色彩一致性高调太大反而失真hsv_s0.5饱和度扰动让模型对浅色和深色腰果都鲁棒hsv_v0.4亮度扰动模拟产线不同时段的曝光差异。这个组合在工业小数据集上属于安全区间。4.5 现象T4 显卡上推理速度达标但 CPU 上跑不起来原因训练用的是 GPU部署如果临时用 CPU 顶YOLOv8 的检测头参数量在 CPU 上跑 640 分辨率大概只有 3~5 FPS产线节拍要求 30 FPS 就卡壳。解决部署侧有两个方向一是换 TensorRT 做 GPU 推理T4 上 yolov8n 跑 640 分辨率能到 500 FPS 级别余量很大二是换更轻的检测头只保留主干做蒸馏但工程量不小。我的建议是产线有 GPU 就直接上 TensorRT没有就先把模型降到yolov8n并接受较低的帧率后续再谈硬件投入。5. 用这份数据集的最后一公里从验证集到产线试跑训练完不等于能用。验证集 mAP 只是离线指标真正要看的是模型在产线视频流上的表现。这里给你一个可复现的试跑脚本骨架用 OpenCV 读摄像头或视频文件把模型输出的检测结果和历史帧叠加显示import cv2 from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) cap cv2.VideoCapture(0) while cap.isOpened(): ret, frame cap.read() if not ret: break results model.predict(frame, conf0.45, iou0.45, verboseFalse) annotated results[0].plot() cv2.imshow(cashew_inspection, annotated) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()这里的conf0.45是置信度阈值产线场景建议先设低一点0.3多看看误检调高到 0.6 以上会漏掉真缺陷这个值需要根据产线缺陷率来平衡。iou0.45是 NMS 的 IoU 阈值腰果目标之间空隙明显0.45 够用不需要动。跑视频流时注意verboseFalse否则每一帧都会往终端刷日志久了会拖垮帧率。我自己的习惯是先用这份数据集的 test 目录跑一遍批量推理统计每一类的 Precision 和 Recall再拿产线录制的 5 分钟视频做模拟在线检测。如果产线视频上“半粒”和“破碎”混得厉害我会回训练集抽那两类的图片按 4.1 的方式核对标注再考虑要不要在 labels 里把边界样本的类别标准统一掉——这通常比调参更解决问题。希望这套流程对你跑通腰果缺陷检测有实际帮助。本文还有配套的精品资源点击获取