
简介这份增强版黄瓜好坏检测数据集面向计算机视觉学习者与农产品分拣方向的算法开发者用于训练和验证黄瓜新鲜度二分类检测模型。数据采用Pascal VOC与YOLO双格式标注jpg图片与对应的xml、txt标注文件一一配对可直接接入YOLO系列或Faster R-CNN等主流检测框架省去格式转换环节。压缩包共2000个文件以1981个xml标注文件和19个txt说明文件为主整体约88.86MB标注工具为labelImg按矩形框方式对fresh cucumber与rotten cucumber两类目标进行框选两类框数分别为2933和1344合计4277个标注框。需要说明的是该数据集经过增强处理部分图片存在重复或角度变换后的标注对数据多样性要求较高的用户需谨慎评估。目前已有180人学习下载适合希望快速搭建黄瓜品质检测基线、验证模型可行性并积累农业视觉项目经验的中初级开发者参考使用。1. 黄瓜好坏检测数据集1980 张 VOCYOLO 双格式到底能干什么拿到一个标注好的黄瓜好坏检测数据集第一反应不该是「有多少张」而是「这批标注能不能直接喂进 YOLOv8 训练mAP 能不能撑住产线分拣的节拍」。这个数据集 1980 张、同时提供 VOC 和 YOLO 两种格式意味着它既能走 TensorFlow Object Detection 那条老路也能直接对接 ultralytics 生态。对做农产品分拣、果蔬质检、边缘盒子部署的人来说它省掉的不是标注钱而是「标注一致性」这个最大的玄学——同一批图里好坏边界如果标得忽松忽紧训练出来的模型在产线上就是随机翻车。这个数据集适合三类人一是想跑通 YOLO 训练全流程但手头没有干净标注数据的新手二是要给分拣设备做视觉原型、需要快速验证可行性的工程师三是做课程设计或论文实验、需要 VOC 格式做对比基线的同学。不适合指望它直接上产线的人——1980 张的体量做 demo 够做鲁棒产线模型还得自己补数据。下面从格式转换、训练配置、参数调优到踩坑排查把这条路走一遍。2. VOC 与 YOLO 双格式先搞清标注差异再动手2.1 两种格式的坐标体系差在哪VOC 格式每张图对应一个 XML 文件里面用bndbox存xmin, ymin, xmax, ymax是绝对像素坐标原点在左上角。YOLO 格式每张图对应一个 txt 文件每行class_id x_center y_center width height全部是归一化到 0~1 的相对值原点同样在左上角。差异看着小但转换时最容易翻车的就是「归一化用错宽高」和「类别名到类别 id 的映射顺序不一致」。VOC 的类别写在 XML 的name标签里是字符串YOLO 只认从 0 开始的整数 id。如果转换脚本里类别顺序和训练时data.yaml的names列表对不上模型会把「好瓜」学成「坏瓜」而且 loss 曲线看起来还挺正常这就是最坑的地方。2.2 用脚本把 VOC 转成 YOLO 并校验常见做法是写一个转换脚本遍历Annotations目录读 XML写 txt。下面这段是我一般会用的最小实现import os import xml.etree.ElementTree as ET # 类别映射必须和 data.yaml 的 names 顺序完全一致 CLASS_MAP {good: 0, bad: 1} def voc_to_yolo(xml_path, img_w, img_h, out_txt): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): name obj.find(name).text.strip() if name not in CLASS_MAP: continue # 跳过未定义类别避免脏标注污染训练 bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 归一化中心点 宽高全部除以图像尺寸 x_c (xmin xmax) / 2.0 / img_w y_c (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h # 裁剪到 [0,1]防止标注越界导致训练报错 x_c, y_c min(max(x_c, 0), 1), min(max(y_c, 0), 1) w, h min(max(w, 0), 1), min(max(h, 0), 1) lines.append(f{CLASS_MAP[name]} {x_c:.6f} {y_c:.6f} {w:.6f} {h:.6f}) with open(out_txt, w) as f: f.write(\n.join(lines))逻辑说明CLASS_MAP是整条链路里最不能出错的地方建议单独写在一个classes.py里训练脚本和转换脚本都 import 它避免两处手写不一致。img_w, img_h必须从对应图片读取不能硬编码因为数据集里图片尺寸可能不统一。裁剪到[0,1]是后悔药标注人员手抖画出边界时不裁剪会让 YOLO 直接抛异常中断训练。参数说明x_c, y_c是框中心归一化坐标w, h是归一化宽高保留 6 位小数足够再多没必要。如果数据集里出现宽或高为 0 的框说明标注是废的转换阶段就该过滤掉别留到训练时才发现。2.3 转换后必须做的三项校验转完不是就完事了至少跑三个检查。第一统计每类框数量好坏两类如果比例超过 1:5训练时要做类别加权或重采样。第二随机抽 20 张用可视化脚本画框肉眼看边界是否贴合。第三检查有没有图片没有对应 txt、或 txt 为空文件这两种情况在 YOLO 训练里会被静默跳过你以为用了 1980 张实际可能只用了 1700 张。# 统计每类目标数快速看类别均衡 cat labels/*.txt | awk {print $1} | sort | uniq -c # 找出空标签文件 find labels -name *.txt -empty这两条命令跑完数据集的底子基本就摸清了。类别严重不均衡时别急着上 focal loss先把data.yaml里的names和实际类别对齐很多「训练不收敛」其实是标签和配置对不上导致的。3. 用 YOLOv8 训练黄瓜好坏检测配置与参数怎么设3.1 目录结构与 data.yaml 写法YOLO 训练对目录结构有约定常见做法是cucumber/ images/ train/ val/ labels/ train/ val/ data.yamldata.yaml内容path: ./cucumber train: images/train val: images/val nc: 2 names: [good, bad]nc是类别数names顺序必须和转换脚本里的CLASS_MAP完全一致。path用相对路径时训练命令要在data.yaml同级目录执行否则 YOLO 找不到图。这个细节新手最容易踩报错信息还特别含糊只说找不到文件。3.2 训练命令与关键参数yolo detect train \ data./cucumber/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/cucumber \ nameexp1参数说明modelyolov8n.pt是 nano 版本1980 张的小数据集用 n 或 s 就够上 l 或 x 只会过拟合。imgsz640是默认值如果原图分辨率远大于 640黄瓜表面纹理细节会丢可以试 800 或 960但显存要跟上。batch16在 8G 显存上跑 640 尺寸基本稳显存不够就降到 8。lr00.01是初始学习率小数据集建议降到 0.005 甚至 0.001否则前期 loss 震荡大。patience20是早停验证集 20 轮不提升就停省时间。训练过程中重点看三个指标box_loss是否稳定下降、mAP50是否在 50 轮后还在涨、cls_loss有没有突然飙升。cls_loss飙升通常意味着类别标签有问题回去查data.yaml和 txt 里的 class_id。3.3 数据增强参数怎么调YOLO 默认开了 mosaic、HSV 增强、随机翻转。黄瓜检测场景里HSV 增强很有用因为不同批次黄瓜颜色深浅差异大。但随机翻转要小心如果「好瓜」和「坏瓜」的区分依赖某个固定方向的特征比如坏斑总在某一侧翻转会破坏这个规律。常见做法是保留hsv_h0.015, hsv_s0.7, hsv_v0.4把flipud0.0关掉fliplr0.5保留。yolo detect train data./cucumber/data.yaml modelyolov8n.pt \ epochs100 imgsz640 batch16 lr00.005 \ hsv_h0.015 hsv_s0.7 hsv_v0.4 \ fliplr0.5 flipud0.0 mosaic1.0mosaic1.0是默认全开小数据集靠它扩充样本多样性但如果发现验证集 mAP 波动特别大可以降到 0.5 试试。这些参数没有万能值1980 张的体量建议先跑一版默认参数做基线再逐项调。4. 训练完怎么验证混淆矩阵与误检分析4.1 混淆矩阵告诉你模型到底在错哪训练结束runs/cucumber/exp1/下会生成confusion_matrix.png。看这个图不是看对角线多高而是看非对角线如果「好瓜」被大量预测成「坏瓜」说明模型对好坏边界学得模糊可能是标注里边界样本本身就不清晰。如果「坏瓜」被预测成背景漏检说明坏瓜的特征不够显著需要补更多坏瓜样本。yolo detect val命令可以单独跑验证yolo detect val modelruns/cucumber/exp1/weights/best.pt data./cucumber/data.yaml输出里重点看mAP50和mAP50-95。黄瓜好坏这种二分类任务mAP50上 0.9 不算难但如果mAP50-95只有 0.5 左右说明框的定位精度不够产线上分拣机械臂可能抓偏。4.2 用单张图推理看实际效果yolo detect predict modelruns/cucumber/exp1/weights/best.pt \ source./test_images saveTrue conf0.25conf0.25是置信度阈值产线场景建议先设 0.25 看召回再根据误检率往上调。如果发现同一根黄瓜被检出多个框调iou0.5做 NMS 抑制。推理结果图会存到runs/detect/predict/肉眼过一遍比看指标更直接。5. 避坑与排查1980 张数据集训练时最容易翻车的 5 个点5.1 现象训练 loss 一直不降mAP 卡在 0.1 以下原因data.yaml的names顺序和 txt 里的 class_id 对不上或者nc写错。模型在学一个自相矛盾的映射。解决用cat labels/train/*.txt | awk {print $1} | sort -u看实际出现的 class_id和data.yaml逐一对齐。改完重新训练别在旧权重上续。5.2 现象验证集 mAP 比训练集高很多原因验证集太小或和训练集分布差异大。1980 张如果按 8:2 分验证集不到 400 张指标波动大是正常的。解决用 K 折交叉验证或者把验证集扩到 20% 以上。别因为验证集 mAP 高就以为模型好产线上跑一批新图才是真考验。5.3 现象训练中途报NaN或 loss 突然变 inf原因学习率太大或者标注里有宽高为 0 的废框。归一化后 w 或 h 为 0计算 loss 时除零。解决转换阶段就过滤掉 w 或 h 小于 0.001 的框。学习率从 0.01 降到 0.001 再试。如果还炸检查图片有没有损坏。5.4 现象推理时好瓜坏瓜框都检出来了但类别全反原因训练时names列表顺序和推理时读取的data.yaml不一致或者用了别人预训练权重但类别数不同。解决确认best.pt对应的data.yaml就是训练时那份。类别数不同时预训练权重的分类头会被重置这是正常的但顺序必须一致。5.5 现象模型在验证集上很好换一批新图就崩原因过拟合。1980 张对 YOLO 来说偏少模型可能记住了背景而不是黄瓜特征。解决加强数据增强加背景图做负样本或者用更大的验证集做早停。产线部署前一定用现场采集的新图做一次盲测别只看验证集指标。6. 把 1980 张用出 5000 张的效果小数据集进阶技巧小数据集训练 YOLO核心思路不是堆模型复杂度而是把每一张图的价值榨干。第一个技巧是「复制粘贴增强」把好瓜和坏瓜的标注框抠出来随机贴到不同背景上生成新样本。这个在黄瓜检测里特别有效因为背景桌面、传送带、筐子变化比黄瓜本身大得多。用albumentations的CopyPaste或者自己写脚本都能做注意粘贴后要重新计算框坐标。第二个技巧是「预训练权重选对」。yolov8n.pt是在 COCO 上训的COCO 里没有黄瓜但底层边缘和纹理特征可迁移。如果手头有果蔬类数据集训过的权重拿来微调比 COCO 权重收敛快得多。没有的话至少用yolov8s.pt试一版小模型容量有限1980 张可能欠拟合。第三个技巧是「分阶段训练」。先冻结 backbone 训 20 轮让分类头适应黄瓜类别再解冻全网络训 80 轮。这样前期不会因为随机初始化的分类头把预训练特征带偏。# 第一阶段冻结 backbone yolo detect train data./cucumber/data.yaml modelyolov8n.pt \ epochs20 freeze10 lr00.001 # 第二阶段解冻微调 yolo detect train data./cucumber/data.yaml modelruns/cucumber/exp_freeze/weights/best.pt \ epochs80 lr00.0005freeze10表示冻结前 10 层具体层数看模型结构n 版本冻结 10 层差不多是 backbone 主体。第二阶段学习率要更低因为此时模型已经接近一个好的局部最优大步长容易跳出去。最后一个习惯每次训练完把data.yaml、转换脚本、训练命令、best.pt的 mAP 记在一个experiment_log.md里。1980 张的数据集你可能要跑十几版参数没有记录就是黑匣子两周后自己都忘了哪版是怎么配的。我踩过最深的坑就是改了一版增强参数效果很好但没记后来复现不出来只能重跑。希望帮到你。本文还有配套的精品资源点击获取