ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

辣椒缺陷检测数据集:VOC+YOLO双格式698张工业级小样本

辣椒缺陷检测数据集:VOC+YOLO双格式698张工业级小样本 简介本资源是一个面向计算机视觉初学者与农业AI应用开发者的辣椒缺陷检测专用数据集聚焦农产品质量分级与病害识别任务适用于YOLO系列、Faster R-CNN等目标检测模型的训练与验证。压缩包共2000个文件包含698张高质量辣椒单体图像jpg、698份Pascal VOC格式标注xml及698份YOLO格式标签txt完整覆盖5类细粒度标注Defect缺陷、Fly-bites蝇咬痕、Grade-A/B优级/良级、striped条纹变异总标注框达1219个均由labelImg规范标注可直接用于多类别检测模型的数据准备与性能评估。资源包仅11.74MB轻量易下载已获253人学习关注。用户下载后即可获得双格式兼容的即用型数据集无需额外转换预览图显示样本清晰、背景简洁、目标居中显著降低数据清洗与预处理成本特别适合课程实验、毕业设计及轻量化部署场景下的快速建模验证。1. 辣椒缺陷检测数据集VOCYOLO格式695张5类别不是“拿来就能训”的玩具数据而是能直接喂进YOLOv8训练管道、跑通全流程的工业级小样本基线资源你手头正缺一个能验证「辣椒表面缺陷识别」算法落地可行性的数据集别再用网上搜到的30张模糊图凑数了——这个698张实拍图、5类细粒度标注、VOCYOLO双格式齐备的数据集是真正从产线采样、人工精标、工具链校验过的闭环产物。它不解决“万类万物”但专治三件事一是让YOLOv8在农业质检场景下快速过拟合验证698张足够跑通warmupfinetune二是提供Fly-bites飞虫咬痕、striped条纹病斑这类易混淆缺陷的真实分布Fly-bites框数488 vs striped仅103长尾明显三是规避labelImg导出YOLO时路径错位、归一化溢出、类别ID错序等玄学翻车点——所有txt/xml已人工核对坐标合法性与ID映射一致性。适合刚跑通YOLOv5/v8训练流程、需要真实农业图像练手的工程师也适合高校课题组做轻量级模型对比实验。注意每张图仅含单个辣椒主体无遮挡/重叠非多目标密集场景勿误用于拥挤采摘机器人定位。2. 数据结构解析与双格式一致性验证为什么698张图必须同时配698个xml和698个txt2.1 VOC格式核心字段与农业缺陷标注特殊性Pascal VOC的object块在此数据集中有明确农业语义约束name严格对应五类之一Defect泛指机械损伤/腐烂、Fly-bites微小孔洞群、Grade-A完品、Grade-B轻微瑕疵、striped纵向条纹病斑bndbox坐标系以左上角为原点xmin/ymin最小值为1非0xmax/xmin差值≥15像素排除标注噪声difficult全为0无难例过滤truncated全为0无截断目标——这意味着所有缺陷均完整可见符合产线拍摄规范。提示VOC格式的filename字段值如firc_pepper_370.jpg与实际文件名完全一致无大小写或空格差异。曾有用户因Windows默认隐藏扩展名误将firc_pepper_370.jpg.xml当成firc_pepper_370.xml导致读取失败。2.2 YOLO格式txt文件的坐标归一化逻辑与陷阱每个.txt文件按行存储单个目标格式为class_id center_x center_y width height归一化到0~1。关键验证点center_x (xmin xmax) / (2 * img_width)width (xmax - xmin) / img_width—— 此处img_width取自对应JPG的EXIF宽度非XML中硬编码值所有center_x、center_y、width、height均保留6位小数如0.428571避免浮点精度丢失class_id映射严格按顺序Defect0,Fly-bites1,Grade-A2,Grade-B3,striped4——此顺序与YOLOv8的names列表强绑定不可调换。2.3 双格式一致性自动校验脚本Python以下脚本可批量验证VOC与YOLO标注是否对齐建议下载后立即运行import os import xml.etree.ElementTree as ET from PIL import Image def validate_pair(img_path, xml_path, txt_path): # 读取图像尺寸 with Image.open(img_path) as img: w, h img.size # 解析XML获取bbox tree ET.parse(xml_path) root tree.getroot() xml_boxes [] for obj in root.findall(object): name obj.find(name).text bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) ymin int(bbox.find(ymin).text) xmax int(bbox.find(xmax).text) ymax int(bbox.find(ymax).text) # 转换为YOLO格式中心点宽高归一化 cx (xmin xmax) / (2 * w) cy (ymin ymax) / (2 * h) bw (xmax - xmin) / w bh (ymax - ymin) / h xml_boxes.append((name, round(cx, 6), round(cy, 6), round(bw, 6), round(bh, 6))) # 读取TXT文件 with open(txt_path, r) as f: txt_lines [line.strip().split() for line in f if line.strip()] # 类别映射字典 class_map {Defect: 0, Fly-bites: 1, Grade-A: 2, Grade-B: 3, striped: 4} # 比对每行 for i, (cls_id, cx_txt, cy_txt, bw_txt, bh_txt) in enumerate(txt_lines): cls_name [k for k,v in class_map.items() if v int(cls_id)][0] cx_txt, cy_txt, bw_txt, bh_txt map(float, [cx_txt, cy_txt, bw_txt, bh_txt]) # 允许1e-5浮点误差 if not (abs(cx_txt - xml_boxes[i][1]) 1e-5 and abs(cy_txt - xml_boxes[i][2]) 1e-5 and abs(bw_txt - xml_boxes[i][3]) 1e-5 and abs(bh_txt - xml_boxes[i][4]) 1e-5): print(f❌ 不一致: {os.path.basename(img_path)} 第{i1}个框) return False return True # 批量校验 data_dir ./pepper_dataset # 替换为你的解压路径 for img_file in os.listdir(os.path.join(data_dir, JPEGImages)): if img_file.endswith(.jpg): base_name img_file[:-4] xml_path os.path.join(data_dir, Annotations, f{base_name}.xml) txt_path os.path.join(data_dir, labels, f{base_name}.txt) img_path os.path.join(data_dir, JPEGImages, img_file) if not validate_pair(img_path, xml_path, txt_path): print(f校验失败: {base_name})参数说明data_dir需指向解压后的根目录结构必须为JPEGImages/、Annotations/、labels/三级子目录脚本会逐图比对每个bbox的归一化坐标输出首个不一致项并终止若全部通过终端仅显示校验完成——这是工业数据集交付前的必要工序我每次拿到新数据集必跑此脚本。2.4 文件数量与类别分布的物理意义解读698张图≠698个缺陷样本而是698个独立采样单元单个辣椒果实。总框数1219意味着Grade-A237框与Grade-B243框数量接近反映分级标准中“临界品”占比高Fly-bites488框远超其他类说明该产区虫害为最主要缺陷类型模型需对此类小目标敏感striped仅103框属长尾类别在YOLOv8训练中需启用loss.cls_pw2.0提升分类权重后文详述。注意Defect作为泛缺陷类148框与Fly-bites/striped存在语义重叠可能但标注规则明确——仅当无法归入后三类时才标为Defect故其实际为“兜底类”不可删除。3. YOLOv8训练全流程适配从数据集准备到mAP0.5收敛的6步实操3.1 目录结构标准化YOLOv8官方要求YOLOv8强制要求train/val/test三级划分而本数据集原始结构为扁平化所有文件同级。需重建如下结构pepper_yolo/ ├── train/ │ ├── images/ │ └── labels/ ├── val/ │ ├── images/ │ └── labels/ └── test/ ├── images/ └── labels/分割比例建议698张图按7:2:1划分489/139/70因样本量小禁止随机打乱——按文件名数字升序切分确保firc_pepper_001.jpg~firc_pepper_489.jpg进train避免时间序列偏差如不同批次辣椒光照差异。3.2 YAML配置文件编写pepper.yaml创建pepper.yaml内容必须包含绝对路径相对路径在分布式训练中易失效train: /absolute/path/to/pepper_yolo/train/images val: /absolute/path/to/pepper_yolo/val/images test: /absolute/path/to/pepper_yolo/test/images nc: 5 names: [Defect, Fly-bites, Grade-A, Grade-B, striped]提示ncnumber of classes必须为5若误写为4会导致训练崩溃names顺序必须与labelImg导出时的类别顺序完全一致否则Fly-bites会被识别为Defect。3.3 YOLOv8训练命令与关键参数调优使用ultralytics库v8.2.0执行训练yolo detect train \ datapepper.yaml \ modelyolov8n.pt \ epochs100 \ batch16 \ imgsz640 \ namepepper_v8n \ patience15 \ lr00.01 \ lrf0.01 \ cos_lrTrue \ hsv_h0.015 \ hsv_s0.7 \ hsv_v0.4 \ degrees0 \ translate0.1 \ scale0.5 \ shear0 \ perspective0.0001 \ flipud0.0 \ fliplr0.5 \ mosaic1.0 \ mixup0.0 \ copy_paste0.0参数详解batch16698张图在2080Ti上最大安全batch超限会OOMhsv_s0.7大幅提升饱和度扰动强度因辣椒表皮反光强需增强颜色鲁棒性fliplr0.5水平翻转概率设为0.5非默认0.0因辣椒左右对称翻转不破坏语义mosaic1.0强制启用mosaic增强小样本下显著提升泛化能力实测mAP0.5提升3.2%patience15早停轮次设为15防止过拟合验证集loss连续15轮不降则停止。3.4 验证阶段mAP0.5阈值选择依据YOLOv8默认计算mAP0.5:0.95IoU从0.5到0.95步长0.05但农业质检场景更关注漏检率mAP0.5IoU≥0.5即算检测成功适合宽松验收mAP0.7IoU≥0.7才计分对定位精度要求严苛Fly-bites小目标易掉点实测该数据集在mAP0.5达0.823mAP0.7仅0.516说明模型对小目标定位仍有优化空间。注意val集评估时务必关闭augmentFalse默认否则测试时增强会干扰真实性能判断。4. 常见问题排查labelImg导出YOLO后5个必踩的坑与血泪修复方案4.1 现象训练报错IndexError: list index out of range原因labelImg导出YOLO时若图片未标注任何目标会生成空.txt文件0字节YOLOv8读取时解析失败。解决运行以下脚本清理空文件find ./labels -name *.txt -size 0c -delete4.2 现象训练loss正常下降但验证mAP始终为0原因names顺序与class_id映射错位例如XML中Fly-bites被标为nameFly-bites/name但labelImg里类别列表顺序是[Defect,Grade-A,Fly-bites,...]导致Fly-bites被分配class_id2而非1。解决用grep -r Fly-bites Annotations/ | head -5确认XML中标签名拼写打开labelImg的predefined_classes.txt检查顺序重新导出YOLO格式并用2.3节脚本校验。4.3 现象推理结果框全部偏右上角原因YOLO格式txt中center_x/center_y值1.0因labelImg导出时未正确读取图像宽度/高度。解决用identify -format %w %h\n JPEGImages/*.jpg | head -5验证所有图尺寸是否一致本数据集均为1024×768若存在异常尺寸图用mogrify -resize 1024x768! JPEGImages/*.jpg强制统一重新生成所有txt文件。4.4 现象Grade-A类别检测召回率极低30%原因Grade-A为完品常无明显纹理特征模型将其判为背景。解决在pepper.yaml中添加class_weights: [1.0, 1.2, 0.8, 0.8, 1.0]降低Grade-A/B权重提升Fly-bites权重或修改损失函数在ultralytics/utils/loss.py中将self.bce nn.BCEWithLogitsLoss(reductionnone)改为self.bce nn.BCEWithLogitsLoss(reductionnone, pos_weighttorch.tensor([1.0,1.2,0.8,0.8,1.0]))。4.5 现象训练卡在epoch 0GPU显存占用100%但无进度原因imgsz640时batch16需约10GB显存若GPU显存不足如12GB卡被其他进程占用PyTorch会静默等待。解决运行nvidia-smi查看显存占用用export CUDA_VISIBLE_DEVICES0指定空闲GPU降batch至8或改用imgsz320牺牲精度换速度。5. 工业部署前的关键验证如何用3张图快速判断模型是否可用5.1 构建最小验证集3图法则从test/中手动挑选3张典型图图A基准图firc_pepper_650.jpg含Grade-AFly-bites各1个尺寸清晰图B挑战图firc_pepper_692.jpgstriped病斑呈细长条状易被YOLO的anchor匹配忽略图C干扰图firc_pepper_678.jpg背景有相似色斑非缺陷检验模型抗干扰能力。5.2 推理命令与置信度门限调试yolo detect predict \ modelruns/detect/pepper_v8n/weights/best.pt \ sourcetest/images/firc_pepper_650.jpg \ conf0.25 \ iou0.45 \ saveTrue \ save_txtTrueconf0.25是农业场景黄金阈值conf0.5漏检Fly-bites小目标置信度普遍0.3~0.45conf0.1误检背景噪点辣椒表皮反光点被误判为Defectconf0.25在Fly-bites召回率82%与误检率3.7%间取得平衡。5.3 输出结果人工复核清单对每张图的predictions.txtYOLO格式执行以下检查检查项合格标准不合格示例坐标合法性center_x∈[0.01,0.99]width0.050.001 0.5 0.01 0.01width过小类别ID有效性class_id∈{0,1,2,3,4}5越界IoU合理性同一图内多框IoU0.3无冗余框两个Fly-bites框IoU0.8重复检测语义一致性striped框必须沿辣椒长轴方向长宽比3striped框呈方形误标5.4 模型轻量化部署技巧TensorRT加速若需嵌入边缘设备如Jetson AGX Orin必须进行INT8量化# 安装tensorrt8.6 yolo export \ modelruns/detect/pepper_v8n/weights/best.pt \ formattensorrt \ halfTrue \ int8True \ device0关键参数int8True启用INT8量化推理速度提升2.3倍Orin实测halfTrueFP16精度平衡速度与精度device0指定GPU ID避免多卡冲突。从那以后我每次交付农业视觉模型前都强制用这3张图跑一遍conf0.25推理再对照XML人工核对——哪怕客户说“先上线试试”我也坚持把这三关走完。因为辣椒缺陷检测不是学术竞赛漏检一个Fly-bites下游就可能发一批带虫害的货出去。希望帮到你。本文还有配套的精品资源点击获取
返回列表