ARTICLE DETAIL

资讯详情

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

苹果检测数据集1600张标注图:YOLOv8训练与VOC转YOLO格式实战

苹果检测数据集1600张标注图:YOLOv8训练与VOC转YOLO格式实战 简介本资源为苹果检测数据集从COCO2017数据集中提取并整理而成面向从事目标检测算法学习与实验的研究者、学生及工程人员可用于YOLO等检测模型的训练与验证。数据集目标类别为apple共包含1662张标注图像标签同时提供txt与xml两种格式便于适配YOLO系列与VOC风格框架。压缩包内文件总数为4987个其中1663个txt标签文件、1662个xml标签文件与1662个jpg图像文件整体约265.75MB图像与标注一一对应目录结构清晰方便直接划分训练集与验证集。目前已有775人学习下载适合用于苹果检测任务的模型训练、算法对比与课程实验也可作为目标检测入门者熟悉数据标注格式与训练流程的实践素材。1. 苹果检测数据集与1600张标注图从拿到手到跑通第一版模型果园里最让人头疼的不是摘苹果而是判断哪颗该摘、哪颗还有伤。人工分拣一天下来眼睛发花漏检的坏果混进好果箱到了收购站被压价这个损失是实打实的。苹果检测数据集要解决的就是这件事让模型学会在图像里框出每一颗苹果并区分正常果和瑕疵果。1600张这个量级说大不大说小也够跑出一个能用的基线模型。它适合两类人一是做农业视觉方向、需要快速验证检测方案可行性的工程师二是手里有果园或分拣线场景、想先跑通再考虑扩充数据的开发者。这一章先把数据集的结构、标注格式和适用边界讲清楚后面几章再落到具体训练和调参。2. 苹果检测数据集的结构拆解与格式转换2.1 1600张数据里到底有什么拿到一个目标检测数据集第一件事不是急着写训练脚本而是把目录结构和标注文件翻一遍。苹果检测数据集通常包含三个部分图像文件夹、标注文件夹、以及一份类别说明。1600张图如果按常见划分大概是训练集1120张、验证集240张、测试集240张比例接近7:1.5:1.5。图像分辨率常见的有640×640和1280×720两种前者适合直接喂给YOLO系列后者保留更多细节但需要缩放。标注格式决定了你后面要不要写转换脚本。常见的有三种Pascal VOC的XML、COCO的JSON、YOLO的TXT。苹果检测数据集如果来自公开渠道VOC和YOLO格式居多。VOC格式每张图对应一个XML文件里面记录了每个目标的边界框坐标和类别名YOLO格式则是每张图对应一个TXT每行是类别索引 中心x 中心y 宽 高坐标都归一化到0到1之间。类别方面苹果检测通常分两类正常苹果和瑕疵苹果。有些数据集会细分到疤痕、碰伤、虫眼但1600张这个量级如果类别太多每类样本会不够分。我一般建议先用二分类跑通再考虑要不要加细分类别。提示拿到数据集先统计每类目标数量如果某一类少于总目标的10%训练时要么过采样要么在损失函数里加类别权重。2.2 把VOC转成YOLO格式的脚本与四个边界坑如果你拿到的标注是VOC格式而你想用YOLO训练转换这一步绕不开。下面这个脚本是我常用的版本处理1600张图大概十几秒跑完。import xml.etree.ElementTree as ET import os import glob # 类别映射根据你的数据集类别说明修改 class_map {normal_apple: 0, defect_apple: 1} def voc_to_yolo(xml_path, img_w, img_h): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): cls_name obj.find(name).text if cls_name not in class_map: continue cls_id class_map[cls_name] 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) # 归一化并转为中心点宽高 cx (xmin xmax) / 2.0 / img_w cy (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h # 边界裁剪防止坐标越界 cx max(0, min(1, cx)) cy max(0, min(1, cy)) w max(0, min(1, w)) h max(0, min(1, h)) lines.append(f{cls_id} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) return lines # 假设图像尺寸统一为640x640如果不是需要从图像读取 IMG_W, IMG_H 640, 640 xml_files glob.glob(annotations/*.xml) for xml_file in xml_files: lines voc_to_yolo(xml_file, IMG_W, IMG_H) txt_name os.path.basename(xml_file).replace(.xml, .txt) with open(flabels/{txt_name}, w) as f: f.write(\n.join(lines))这段代码的逻辑很直接解析XML提取每个目标的类别和边界框把绝对坐标转成归一化的中心点加宽高。但有几个坑我踩过不止一次。第一个坑是图像尺寸不统一。脚本里写死了640×640如果你的数据集里混了不同分辨率的图转换出来的坐标全是错的。解决办法是用PIL或OpenCV逐张读取实际尺寸或者提前把所有图resize到统一尺寸。第二个坑是坐标越界。有些标注框会超出图像边界比如xmax大于图像宽度。归一化之后值大于1YOLO训练时虽然不会报错但会影响回归精度。上面代码里加了裁剪把值限制在0到1之间。第三个坑是类别名不一致。XML里可能写的是apple、Apple、normal apple多种变体class_map里只写了一种结果大量目标被跳过。转换前先用脚本统计所有出现的name值统一映射。第四个坑是空标注文件。有些图可能没有目标对应的TXT是空的。YOLO训练时空文件是合法的表示这张图是负样本但如果你用某些数据加载库空文件可能导致报错。我一般会保留空文件但在数据加载时加个判断。转换完成后建议随机抽10张图用可视化脚本画框检查一遍。我见过太多转换完直接开训、结果mAP只有0.1的情况回头查发现是坐标没归一化对。3. 用YOLOv8在苹果检测数据集上跑通训练3.1 环境配置与数据配置文件YOLOv8是目前苹果检测这类任务里上手最快的选择安装干净配置文件简单。环境方面Python 3.8以上PyTorch 1.8以上有GPU最好没有的话1600张图用CPU训练也能跑就是慢。pip install ultralytics安装完之后需要准备一个数据配置文件YOLOv8用YAML格式描述数据集路径和类别。# apple_dataset.yaml path: /data/apple_detection # 数据集根目录 train: images/train # 训练集图像相对路径 val: images/val # 验证集图像相对路径 test: images/test # 测试集图像相对路径 nc: 2 # 类别数 names: [normal_apple, defect_apple] # 类别名顺序要和标注里的索引一致这个文件里path是根目录train、val、test是相对于根目录的路径。YOLOv8会自动在图像同级目录下找同名的TXT标注文件所以目录结构应该是这样的apple_detection/ images/ train/ (1120张jpg) val/ (240张jpg) test/ (240张jpg) labels/ train/ (1120个txt) val/ (240个txt) test/ (240个txt)注意images和labels必须同级且文件名一一对应。如果标注文件和图像不在同一级YOLOv8会找不到标签训练时loss直接为0。3.2 训练命令与关键参数怎么设配置文件准备好之后训练命令就一行yolo detect train dataapple_dataset.yaml modelyolov8n.pt epochs100 imgsz640 batch16 lr00.01这行命令里每个参数都值得说清楚。modelyolov8n.pt用的是nano版本参数量最小1600张图用这个足够。如果你有GPU且追求更高精度可以换成yolov8s.pt或yolov8m.pt但训练时间会成倍增加。epochs100是训练轮数1600张图一般50到100轮就能收敛我习惯设100轮然后看验证集mAP什么时候不再上升。imgsz640是输入图像尺寸要和你的图像实际尺寸匹配如果原图是1280×720设640会缩放小目标可能丢失细节。batch16是批大小显存不够就降到8或4。lr00.01是初始学习率YOLOv8默认是0.01如果训练loss震荡厉害可以降到0.001。训练过程中重点关注三个指标box_loss、cls_loss和mAP50。box_loss是边界框回归损失cls_loss是分类损失两个都应该随着训练下降。mAP50是IoU阈值为0.5时的平均精度苹果检测任务里正常果的mAP50一般能到0.9以上瑕疵果因为特征不明显可能只有0.7到0.8。如果训练到30轮左右mAP就不动了可以试试这几个操作把学习率降一半继续训、加数据增强YOLOv8默认开了mosaic和翻转可以再加亮度对比度扰动、或者检查标注里有没有大量漏标。3.3 推理验证与结果解读训练完成后模型权重保存在runs/detect/train/weights/best.pt。用这个权重跑推理yolo detect predict modelruns/detect/train/weights/best.pt sourcetest_images/ conf0.25 saveTrueconf0.25是置信度阈值低于这个值的检测框会被过滤掉。苹果检测里如果漏检多就降低阈值到0.1如果误检多就提高到0.5。saveTrue会把画了框的结果图保存下来方便肉眼检查。推理结果里有两个数字要会看Precision和Recall。Precision是检出的目标里有多少是真的Recall是所有真实目标里检出了多少。苹果分拣场景下Recall比Precision更重要因为漏掉一个坏果的代价比误判一个好果大。如果Recall偏低优先检查标注质量其次考虑降低置信度阈值或增加训练轮数。我一般会在测试集上跑完推理后随机抽20张结果图看一遍。重点看三类问题小苹果有没有被漏掉、密集堆叠的苹果有没有被合并成一个框、瑕疵区域有没有被正确分类。这三类问题基本覆盖了苹果检测里80%的翻车场景。4. 苹果检测训练中的避坑与排查4.1 现象训练loss正常下降但mAP始终为0原因通常是标注格式不对。YOLOv8要求TXT里每行是类别索引 中心x 中心y 宽 高且坐标归一化到0到1。如果坐标没归一化或者类别索引从1开始而不是0模型学到的就是错误映射。另一个可能是图像和标注文件名不匹配比如图像是IMG_001.jpg标注是IMG_001.txt但中间多了个空格或大小写不一致。解决写个脚本随机抽几张图把标注框画到图上肉眼确认框的位置和类别是否正确。如果框的位置明显偏移就是坐标转换有问题如果框的位置对但类别全错就是类别索引映射错了。4.2 现象瑕疵苹果的召回率明显低于正常苹果原因是瑕疵特征不明显且1600张图里瑕疵样本可能只有几百个类别不平衡导致模型偏向多数类。另外瑕疵区域往往只占苹果表面一小块标注时如果框的是整个苹果模型学到的特征里瑕疵信号被稀释。解决一是在损失函数里给瑕疵类加权重YOLOv8支持通过cls参数调整分类损失的权重系数二是对瑕疵样本做过采样在数据配置文件里用fraction参数控制每类采样比例三是如果瑕疵区域很小考虑把标注框缩小到瑕疵区域本身而不是整个苹果。4.3 现象验证集mAP比训练集低很多这是过拟合的典型表现。1600张图对于检测任务来说不算多如果模型参数量大比如用了yolov8m或l很容易记住训练集。另一个原因是训练集和验证集的分布不一致比如训练集都是晴天拍的验证集里有阴天或逆光的图。解决换小模型yolov8n或yolov8s加数据增强YOLOv8默认开了mosaic可以再加随机裁剪和色彩抖动早停设patience2020轮mAP不升就停。如果分布不一致尽量让训练集覆盖各种光照和角度或者用域适应方法但那个复杂度就高了。4.4 现象推理时密集苹果被合并成一个框原因是NMS非极大值抑制的IoU阈值设得太高或者苹果之间重叠严重模型学到的框本身就偏大。苹果在树上或筐里经常挤在一起边界框重叠是常态。解决降低NMS的IoU阈值YOLOv8里通过iou参数控制默认0.7可以降到0.5。另外检查标注如果两个苹果挨得很近标注时框要尽量贴合各自边缘不要为了省事画一个大框把两个都包进去。4.5 现象训练到一半loss突然变成NaN原因可能是学习率太大导致梯度爆炸或者某张图的标注里有非法值比如宽高为0或负数。1600张图里如果混了一张坏标注训练到那个batch时就可能崩。解决先把学习率降到0.001再试。如果还是NaN用脚本遍历所有标注文件检查有没有宽高小于等于0的行或者坐标值超出0到1范围的行。找到之后修正或删除那张图的标注。5. 从1600张到可落地数据增强与模型微调的进阶技巧1600张图跑出一个能用的基线不难但要让模型在真实果园或分拣线上稳定工作还需要做两件事一是用数据增强把有效样本量撑大二是用微调策略让模型适应你的具体场景。数据增强方面YOLOv8内置了mosaic、mixup、随机翻转、色彩抖动等。对于苹果检测我建议额外关注三个增强随机旋转苹果在树上角度各异、随机遮挡模拟枝叶遮挡、亮度对比度扰动模拟不同光照。这三个增强可以在训练配置里通过degrees、erasing、hsv_v参数控制。degrees10表示随机旋转正负10度erasing0.4表示随机遮挡40%面积hsv_v0.4表示亮度扰动幅度。不要设太大否则模型学到的特征会失真。微调策略上如果你有一个在COCO上预训练过的YOLOv8权重直接拿来在苹果数据集上微调比从头训练收敛快得多。具体做法是modelyolov8n.pt这个权重已经在大规模数据上学过通用特征你只需要让它适应苹果这个特定类别。微调时学习率可以设小一点0.001到0.005之间训练轮数30到50轮就够。另一个技巧是分阶段训练。第一阶段冻结骨干网络只训练检测头让模型先学会定位苹果第二阶段解冻全部参数用更小的学习率微调让模型学会区分正常果和瑕疵果。YOLOv8里可以通过freeze参数控制冻结层数freeze10表示冻结前10层。验证模型是否真的可用不能只看mAP。我习惯做两个额外测试一是拿手机在果园里拍一段视频抽帧后跑推理看实际场景下的漏检和误检二是把模型导出成ONNX用ONNX Runtime跑一遍确认推理速度和精度没有明显下降。导出命令是yolo export modelbest.pt formatonnx导出后用onnxruntime加载测试。最后说一个我自己的习惯每次训练完不管mAP多高我都会把测试集里所有漏检和误检的图单独挑出来一张一张看。漏检的图里往往藏着标注问题或场景盲区误检的图里往往能看到模型学到的错误特征。这个过程比调参更花时间但收益也最大。1600张图的数据集认真过一遍错误样本下一版模型的提升往往比换模型结构更明显。希望帮到你。本文还有配套的精品资源点击获取
返回列表