
简介这份玉米黄曲霉素识别数据集面向从事农业病害检测、食品安全筛查的算法工程师与深度学习学习者用于训练和验证玉米穗腐病等霉变目标的检测模型。数据均基于原始田间图片采用YOLOv8格式人工标注验证准确率可达93.8%以上可直接用于目标检测模型的训练、微调与性能对比。压缩包共865个文件包含432张jpg原始图像、432个同名txt标注文件以及1个yaml数据集配置文件整体约27.58MB标注与图像一一对应yaml文件便于快速接入YOLO系列训练流程。内容覆盖镰刀菌穗腐、赤霉穗腐等多种病害类别样本命名规范适合作为分类与检测任务的基准数据。目前已有372人学习下载可为玉米黄曲霉素识别相关课程设计、科研实验或竞赛项目提供开箱即用的数据支撑帮助读者省去繁琐的采集与标注环节把精力集中在模型调优与效果验证上。1. 玉米黄曲霉素识别数据集从原始图片到 93.8% 验证准确率的落地路径玉米黄曲霉素识别数据集均使用原始图片进行 yolov8 人工标注验证准确率可以达到 93.8以上——这个标题里其实藏着三个关键信息数据来源是原始图片而非网络爬取的二手图标注方式是 yolov8 格式的人工标注验证准确率有明确数字。做过农业视觉检测的人都知道玉米霉变识别最头疼的不是模型选型而是数据本身光照不均、籽粒遮挡、霉变早期与健康籽粒色差极小这些都会让模型在验证集上虚高、在产线翻车。这个方案适合两类人一是手里有玉米图像但不知道怎么标、怎么训的农业质检从业者二是想用 yolov8 跑通一个完整数据集闭环的算法工程师。接下来我会按数据准备、标注规范、训练配置、避坑排查、进阶验证的顺序把这条路径拆开讲清楚。2. 原始图片采集与黄曲霉素标注规范为什么不能直接拿网图开训2.1 原始图片的采集条件与设备参数黄曲霉素本身是霉菌代谢产物肉眼看不到但霉变籽粒在视觉上有可辨识特征表面发暗、有黄绿色或灰绿色粉状物、籽粒皱缩。采集原始图片时我一般会固定几个变量否则后面标注和训练全是玄学。首先是光源。常见做法是用环形 LED 白光色温 5500K 左右避免暖光把黄绿色霉斑照成土黄色。光源角度建议 45 度侧照这样霉斑的粉状纹理会有阴影比正面平光更容易区分。其次是拍摄距离和分辨率。玉米籽粒直径大约 8 到 12 毫米如果单张图要覆盖 20 到 30 粒建议相机离台面 25 到 35 厘米分辨率至少 1920×1080。低于这个分辨率早期霉斑在缩放后基本糊成一团标注框会画不准。背景用纯色哑光板深灰或黑色都行不要用白色——白色背景会让霉斑边缘过曝标注时容易把健康籽粒的亮边也框进去。每张图里籽粒不要堆叠单层平铺粒与粒之间留 2 到 3 毫米间隙。这个间隙在标注时能减少框重叠训练时也能降低 NMS 的误抑制。提示采集时同步记录环境温湿度。黄曲霉素在 28 到 32 摄氏度、湿度 85% 以上繁殖最快如果采集环境本身高温高湿健康籽粒表面也可能有轻微霉变标注时容易误判。2.2 yolov8 人工标注的类别定义与边界规则yolov8 的标注格式是每张图对应一个 txt 文件每行一个目标class_id x_center y_center width height坐标全部归一化到 0 到 1。这个数据集标题里强调“人工标注”说明类别边界不是自动生成的需要人工判断。我一般把类别定为两类0表示健康玉米籽粒1表示黄曲霉素污染籽粒。不要设第三类“疑似”因为疑似样本在训练时会让模型学到一个模糊边界验证准确率反而下降。标注时按以下规则执行健康籽粒表面光滑、颜色均匀、无粉状物框紧贴籽粒外轮廓留 1 到 2 像素余量。污染籽粒只要出现黄绿色或灰绿色粉状霉斑无论面积大小整粒框住。如果霉斑只占籽粒十分之一也按污染标注因为产线分选时宁可错杀不可放过。遮挡处理如果两粒玉米紧挨着框可以重叠但每个框的中心点必须落在各自籽粒内部。重叠率超过 30% 的框训练时会被 NMS 过滤掉一个所以标注时尽量让框中心分开。标注工具用 LabelImg 或 CVAT 都行导出时选 YOLO 格式。标注完成后写一个脚本检查坐标是否越界、类别是否只有 0 和 1、每张图的框数量是否合理。import os import glob def check_yolo_labels(label_dir): issues [] for txt_path in glob.glob(os.path.join(label_dir, *.txt)): with open(txt_path, r) as f: lines f.readlines() for i, line in enumerate(lines): parts line.strip().split() if len(parts) ! 5: issues.append(f{txt_path} 第{i1}行字段数不对: {len(parts)}) continue cls_id int(parts[0]) if cls_id not in [0, 1]: issues.append(f{txt_path} 第{i1}行类别越界: {cls_id}) coords [float(x) for x in parts[1:]] for c in coords: if c 0 or c 1: issues.append(f{txt_path} 第{i1}行坐标越界: {c}) return issues if __name__ __main__: problems check_yolo_labels(./labels/train) for p in problems[:20]: print(p) print(f共发现 {len(problems)} 个问题)这段脚本做三件事检查每行是否五个字段、类别是否在 0 和 1 之间、归一化坐标是否越界。参数上label_dir指向你的标注文件夹训练集和验证集要分别跑一遍。如果问题数超过总标注行数的 1%建议重新过一遍标注不要带着脏数据开训。2.3 数据集划分与防泄漏检查原始图片标注完后按 8:1:1 划分训练、验证、测试。这里有个血泪经验如果同一粒玉米在不同角度拍了多张图必须把这几张图分到同一个子集里否则验证集里出现训练集同粒玉米的另一角度准确率会虚高好几个点。我一般用感知哈希做去重检查。把每张图缩到 8×8 灰度算均值哈希汉明距离小于 5 的视为同一粒玉米的变体归到同一组再划分。import cv2 import numpy as np from collections import defaultdict def phash(img_path): img cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) img cv2.resize(img, (8, 8)) avg img.mean() return .join(1 if p avg else 0 for p in img.flatten()) def hamming(h1, h2): return sum(c1 ! c2 for c1, c2 in zip(h1, h2)) def group_images(img_dir, threshold5): groups [] hashes {} for p in glob.glob(os.path.join(img_dir, *.jpg)): h phash(p) hashes[p] h visited set() for p1, h1 in hashes.items(): if p1 in visited: continue group [p1] visited.add(p1) for p2, h2 in hashes.items(): if p2 not in visited and hamming(h1, h2) threshold: group.append(p2) visited.add(p2) groups.append(group) return groupsthreshold设 5 是经验值设太小同粒玉米的不同角度分不到一组设太大不同粒玉米会被误合并。跑完分组后按组划分保证同一组只出现在一个子集里。3. yolov8 训练配置从环境搭建到 93.8% 验证准确率的参数调法3.1 环境配置与数据 yaml 文件写法yolov8 的环境配置现在很成熟Python 3.8 到 3.10 都行PyTorch 选 1.13 以上。显卡方面GTX 1660 Ti 跑 yolov8n 或 yolov8s 足够显存 6GB 能撑住 batch size 8 到 16。如果要用 yolov8m 以上建议 8GB 显存起步。安装命令pip install ultralytics pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118数据配置文件corn_mold.yaml写法path: ./corn_dataset train: images/train val: images/val test: images/test nc: 2 names: 0: healthy 1: aflatoxinpath是数据集根目录train、val、test是相对路径。nc是类别数这里 2 类。names的顺序必须和标注时的 class_id 一致否则训练出来的模型会把健康粒识别成污染粒。注意yaml 里的路径不要用中文不要有空格。我见过有人把数据集放在“玉米数据集”文件夹下训练时直接报路径找不到排查半天。3.2 训练命令与关键参数设置最小训练命令yolo detect train datacorn_mold.yaml modelyolov8s.pt epochs200 imgsz640 batch16 lr00.01 lrf0.01 patience50参数逐个说modelyolov8s.pts 版本在精度和速度之间比较平衡。如果验证准确率卡在 90% 上不去可以换yolov8m.pt但训练时间会翻倍。epochs200玉米霉变数据集通常 500 到 2000 张图200 轮足够收敛。如果 loss 曲线在 150 轮后还在降可以加到 300。imgsz640输入分辨率。如果原始图片里籽粒占画面比例很小可以提到 1280但显存占用会翻四倍。batch16GTX 1660 Ti 上 16 比较稳显存不够就降到 8。lr00.01初始学习率。如果训练前期 loss 震荡厉害降到 0.005。lrf0.01最终学习率是初始的 1%这个默认值一般不用改。patience5050 轮验证指标不提升就早停防止过拟合。训练过程中用 TensorBoard 看 loss 曲线tensorboard --logdir runs/detect/train重点看val/box_loss和metrics/mAP50。如果train/box_loss一直降但val/box_loss在 30 轮后开始升说明过拟合了要么加数据增强要么减模型复杂度。3.3 数据增强参数与验证准确率的关系yolov8 默认开启 mosaic、HSV 抖动、随机翻转。对玉米霉变识别我一般会调这几个# 在训练命令里追加 hsv_h0.015 hsv_s0.7 hsv_v0.4 degrees10 translate0.1 scale0.5 mosaic1.0hsv_s0.7是饱和度抖动幅度调大是为了让模型适应不同光照下的霉斑颜色变化。degrees10允许小角度旋转因为采集时玉米摆放角度不可能完全一致。mosaic1.0是默认开启但如果你发现验证集里小目标漏检多可以降到 0.5让模型多看完整单粒图。验证准确率 93.8% 这个数字通常是在验证集上metrics/accuracy_top1或者自定义的分类准确率。yolov8 检测任务没有直接的 top1 准确率需要自己写脚本统计对每个验证图预测框和真实框 IoU 大于 0.5 且类别一致算正确否则算错。from ultralytics import YOLO import os model YOLO(runs/detect/train/weights/best.pt) correct 0 total 0 for img_path in glob.glob(./corn_dataset/images/val/*.jpg): results model(img_path, conf0.25, iou0.5) pred_classes results[0].boxes.cls.tolist() label_path img_path.replace(images, labels).replace(.jpg, .txt) with open(label_path) as f: true_classes [int(line.split()[0]) for line in f.readlines()] total 1 if sorted(pred_classes) sorted(true_classes): correct 1 print(f验证准确率: {correct/total:.4f})conf0.25是置信度阈值iou0.5是 NMS 的 IoU 阈值。这两个参数直接影响准确率数字conf 调低召回高但误检多conf 调高误检少但漏检多。93.8% 通常是在 conf0.25、iou0.5 下测出来的。4. 玉米黄曲霉素识别训练避坑5 个让准确率虚高或翻车的典型问题4.1 验证准确率 93.8% 但产线漏检严重现象验证集上准确率 93.8%但把模型部署到分选机上霉变粒漏检率超过 20%。原因验证集和产线环境的光照、背景、拍摄距离不一致。验证集是实验室环形光下拍的产线是传送带上方条形光霉斑颜色在两种光源下差异很大。解决从产线现场采集 200 到 300 张图人工标注后加入训练集重新训练。如果产线图不好标至少做一次颜色校正把产线图的白平衡对齐到验证集。4.2 标注框把健康粒和污染粒框在一起现象训练 loss 正常下降但模型预测时经常把一粒健康玉米标成污染。原因标注时两粒玉米紧挨着标注人员图省事用一个框把两粒都框了类别标成污染。模型学到的是“两粒挨着就是污染”。解决重新检查标注凡是框内包含两粒以上玉米的拆成多个框。用前面的检查脚本加一条如果框的宽高比超过 2:1大概率是框了多粒需要人工复核。4.3 训练到 50 轮后验证 loss 反弹现象val/box_loss在前 50 轮下降之后开始上升train/box_loss还在降。原因过拟合。数据集太小或者模型太大。玉米霉变数据集如果只有 500 张图用 yolov8m 很容易过拟合。解决换 yolov8n 或 yolov8s把patience降到 30加dropout0.1或者用更强的数据增强。如果还不行只能加数据。4.4 验证准确率卡在 89% 上不去现象训练 200 轮验证准确率一直在 89% 到 90% 之间波动。原因早期霉变样本太少。健康粒和明显霉变粒容易分但早期霉变霉斑面积小于籽粒 5%样本少模型学不到边界。解决专门采集早期霉变样本至少 100 到 200 张单独标注后加入训练集。如果采不到用 CutMix 把霉斑区域裁剪后粘贴到健康粒上生成合成样本但合成样本比例不要超过总数据的 20%。4.5 换显卡后训练结果不一致现象同一份数据、同一份配置在 GTX 1660 Ti 上验证准确率 93.8%换到 RTX 4090 后变成 91%。原因不同显卡的 cuDNN 版本和随机种子行为不同数据增强的随机顺序也会变。解决在训练命令里固定seed42并且把deterministicTrue打开。这样换显卡后结果基本可复现但训练速度会慢一点。5. 进阶验证用混淆矩阵和热力图确认模型真的学到了霉斑5.1 混淆矩阵看类别边界yolov8 训练完会自动生成混淆矩阵在runs/detect/train/confusion_matrix.png。重点看两个数健康粒被预测成污染粒的比例假阳性污染粒被预测成健康粒的比例假阴性。产线分选通常更在意假阴性因为漏掉一粒霉变玉米可能污染整批。如果假阴性高把conf从 0.25 降到 0.15牺牲一点假阳性换召回。如果假阳性高把conf提到 0.35。5.2 热力图确认模型关注区域用 yolov8 的model.predict加 Grad-CAM 可以看模型关注哪里。如果热力图高亮区域在籽粒边缘而不是霉斑位置说明模型学的是形状而不是霉斑纹理换到新批次玉米上容易翻车。from ultralytics import YOLO import cv2 import numpy as np model YOLO(best.pt) img cv2.imread(test.jpg) results model(img) # 取第一个预测框 box results[0].boxes[0] x1, y1, x2, y2 box.xyxy[0].tolist() crop img[int(y1):int(y2), int(x1):int(x2)] # 对crop做Grad-CAM这里省略具体实现核心是看高亮区域是否落在霉斑上如果热力图不对说明标注框可能把背景也框进去了回去检查标注。5.3 跨批次验证换一批玉米再测一次实验室验证准确率 93.8% 只能说明模型在实验室数据上表现好。真正靠谱的做法是换一批不同产地、不同收获年份的玉米重新采集 100 张图人工标注后测一次。如果准确率还在 90% 以上这个模型才值得部署。我自己的习惯是任何农业视觉模型实验室准确率减 5 个点才是产线预期准确率。93.8% 减 5 个点产线大概 88% 到 89%这个数字对分选机来说已经可用但需要配合人工复检。希望帮到你。本文还有配套的精品资源点击获取