ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

鸡蛋破蛋检测数据集构建与YOLOv8实战:VOC/YOLO格式转换与训练

鸡蛋破蛋检测数据集构建与YOLOv8实战:VOC/YOLO格式转换与训练 简介目标检测技术正在快速落地工业质检场景但高质量标注数据集的稀缺成为实际项目中的主要瓶颈。在禽蛋分选、孵化场筛选等应用中破蛋与裂纹蛋的自动识别依赖精准的模型训练而模型的性能上限往往由数据质量决定。本文从数据集构建的基础概念出发讲解VOC与YOLO两种主流标注格式的原理与转换方法并系统介绍如何基于792张鸡蛋图像训练YOLOv8破蛋检测模型。内容涵盖图像采集策略、类别定义、标注工具使用、格式转换脚本、训练参数调优、常见问题排查及部署优化技巧同时提供可直接复用的数据集与完整流程参考。无论你是从事目标检测的工程师、学习YOLO训练的学生还是需要构建工业视觉数据集的开发者都能从中获得从数据到模型落地的工程实践指导。开头做禽蛋分级、孵化场筛选或者养殖场质检的朋友大概率都遇到过同一个问题破蛋、裂纹蛋的自动检测。人工挑蛋费眼睛不说流水线一快起来根本盯不住。这两年目标检测技术成熟了很多但真正卡住落地的不是模型而是数据。网上公开的鸡蛋检测数据集少得可怜能用的更是凤毛麟角。我这次从零开始做了一个鸡蛋破蛋检测数据集总共792张图像标注了两个类别同时输出VOC和YOLO两种格式。这篇文章把整个数据集的构建过程、格式细节、以及怎么用它跑通YOLOv8训练和部署讲透。无论你是想训练自己的破蛋检测模型、学习VOC/YOLO标注格式转换还是需要一份可以直接喂给模型的带标注数据集这篇都能给你一个完整的参考。先说数据集核心指标792张图片2个类别我这边定义的是whole和cracked分别代表完整蛋和破蛋/裂纹蛋图像统一做了预处理标注文件同时提供XML和TXT两种格式。对于单类别检测任务来说这个规模不大但够用配合数据增强和预训练权重训练一个能用的检测器完全足够。下面直接进入正题从数据怎么来的讲起再到格式转换、模型训练、问题排查一条线全部走一遍。1. 数据集的整体设计与制作思路1.1 为什么选择VOC和YOLO两种格式做数据集第一步不是拍照而是先想清楚标注格式。目前目标检测领域主流的标注格式有COCO、VOC、YOLO三种我最终选择了VOC和YOLO原因很简单这两个格式覆盖了绝大多数人的使用场景。VOC格式是Pascal VOC比赛带火的标注方式用XML文件存储每个目标的类别和边界框坐标坐标是绝对值记录的是左上角和右下角的像素坐标。这种格式的好处是直观、可读性强用标注工具打开就能看懂方便人工作检查和二次编辑。很多经典模型如SSD、Faster R-CNN的原生实现都支持VOC格式。YOLO格式则是Darknet框架和Ultralytics YOLO系列训练时使用的格式用TXT文件存储标注信息每一行代表一个目标内容为“类别ID x_center y_center width height”其中坐标值全部做了归一化处理范围在0到1之间。这种格式的好处是文件小、读取快、与图像尺寸无关非常契合YOLO系列模型的训练需求。我在实际制作时两种格式都输出就是考虑到不同人的使用习惯和后续框架选型。你要是用Ultralytics YOLOv8直接拿YOLO格式就能开训你要是想可视化检查或者用Detectron2、mmdetection这类支持VOC的框架XML文件也能直接用。一份数据两种格式省得大家再花时间做转换。1.2 图像来源与数据采集策略数据采集是整个项目最耗时的一环。792张图片听起来不多但如果是自己用手机或者工业相机一张张拍工作量相当可观。我这边主要走了一条混合路线一部分用相机实拍一部分从现有公开资源中筛选。实拍部分我用的是一台普通的工业USB摄像头分辨率设为1280x720因为这类检测任务不需要特别高的分辨率太高的分辨率反而会增加推理耗时。拍摄时注意了以下几点尽量覆盖不同光线条件自然光、白炽灯、LED灯、不同背景传送带、托盘、纸箱、不同角度俯视、侧视、45度角以及不同破损程度轻微裂纹、明显破碎、蛋液外流。这些变化的目的就是让模型学会关注蛋本身的特征而不是过拟合到某个固定的拍摄环境。筛选部分需要特别注意版权和许可问题。我用的都是明确标注为可自由使用或CC0许可的图像来源逐张人工过筛剔除模糊、目标过小、严重遮挡和标注困难的图。少量图像因为来源分辨率较低我用OpenCV做了双线性插值放大到统一尺寸。实测下来高质量的数据比数量更重要。我刚开始尝试过把所有能收集到的图像全塞进去大概有1100多张但在验证集上的mAP反而更低。分析后发现是因为很多低质量图像引入了严重的标注噪声。最后筛到792张验证集效果反而好了不少。1.3 2个类别怎么定义最合理标题里写了“2类别”我这边按最常见的工业需求定义为whole完整蛋和cracked破损蛋/裂纹蛋。为什么不是单纯一个“破蛋”类别因为实际检测场景中模型不仅要找出破损蛋还要确保完整蛋不被误报。单独一个类别意味着模型只需要输出“是否是破蛋”的置信度这样对整个蛋的定位能力会弱一些。定义两个类别让模型同时学习两类目标在推理时可以通过类别置信度的对比来综合判断误检率会明显低一些。另外在标注边界框时我统一标注的是蛋体的外接矩形包括鸡蛋本身和蛋壳碎片。如果破损严重导致蛋液流出外接矩形只覆盖蛋壳主体部分不延伸到蛋液扩散区域。这样做的原因是模型预测的边界框需要具有明确且一致的可学习规律把蛋液扩散区域算进去会导致框的大小和位置波动过大影响训练稳定性。2. 标注工具选型与VOC/YOLO格式本质2.1 labelImg的安装与使用要点标注工具我选的是labelImg这是目前最常用的开源标注工具之一支持Pascal VOC和YOLO两种格式导出正好符合项目需求。安装其实非常简单以Windows系统为例直接pip安装即可pip install labelImg安装完在命令行输入以下命令启动labelImg打开后通过“Open Dir”选择图片文件夹“Change Save Dir”选择标注保存路径在“PascalVOC”和“YOLO”之间切换格式。工具栏里“Create RectBox”是画框“Edit RectBox”是微调“Delete RectBox”是删除。建议先把所有图片的标注都画完最后统一检查一遍再一次性转换格式。实际标注过程中有几个细节值得说一下。第一是快捷键W是开始画框D是下一张图A是上一张图CtrlS是保存这些快捷键用熟了效率能提升一倍。第二是类别名称不要用中文不要有空格避免后续框架解析出错我用的是“whole”和“cracked”你也可以用“intact_egg”和“broken_egg”只要保持一致就行。第三点特别重要画框的时候要尽量贴边。目标检测模型学习的是边界框坐标回归如果框的边界忽松忽紧模型会无所适从。我给自己定了一个标准框的四边与蛋体外边缘间隔不超过2个像素这个标准一直贯穿着整个标注过程。2.2 VOC格式的XML文件结构解析VOC格式的标注文件是一个XML文件文件名与对应的图片名保持一致例如图片是“egg_001.jpg”标注文件就是“egg_001.xml”。核心结构如下annotation foldereggs/folder filenameegg_001.jpg/filename size width1280/width height720/height depth3/depth /size object namewhole/name bndbox xmin256/xmin ymin180/ymin xmax521/xmax ymax430/ymax /bndbox /object /annotation有几个容易踩的坑值得提醒。第一个是filename里的图片名必须和实际文件名完全一致包括扩展名的大小写很多框架在读取时是严格匹配文件名的。第二个是size里的宽高必须和图片实际像素一致否则训练时坐标映射会出问题特别是你用其他工具缩放过图片但忘记更新XML的情况。第三个是depth如果没有特殊情况都是3表示RGB三通道。还有一个常见问题是一个XML文件里有多个object节点每个节点对应一个目标。遍历解析的时候要确保代码按findall(object)来循环而不是find(object)后者只会返回第一个目标。这个坑我在项目初期踩过导致部分图片只读取了一个目标模型训练了半天效果都不对。2.3 YOLO格式的TXT文件与坐标归一化YOLO格式的标注文件是一个TXT文件同样与图片同名但扩展名为.txt。每一行代表一个目标对象格式为class_id x_center y_center width height比如0 0.4125 0.3611 0.2070 0.3472 1 0.6320 0.6806 0.1836 0.3056其中class_id就是类别ID0对应classes.txt里的第一个类别1对应第二个。x_center和y_center是目标中心的归一化坐标width和height是目标宽高的归一化数值。归一化公式非常简单x_center (xmin xmax) / 2 / image_width y_center (ymin ymax) / 2 / image_height width (xmax - xmin) / image_width height (ymax - ymin) / image_height这四个值全部在0到1之间。这样做的好处是标注文件不依赖具体的图像分辨率同一张图无论缩放到多大标注都是有效的。但要注意归一化后的小数精度很重要我建议保留6位小数以上。如果只保留3位对于小目标来说精度损失很大框的位置会有明显偏移。我有一次用Excel处理标注文件默认四舍五入到两位小数结果模型target框整体漂移了几个像素训练出来的模型精度就差了将近2个点。另外YOLO格式是不包含图像尺寸信息的它完全依赖归一化坐标来定位目标。因此使用YOLO格式时必须保持图像文件和标注文件的一一对应关系任何一张图缺失TXT文件训练时就会报错。2.4 VOC转YOLO的Python脚本与批量处理标注过程中如果用的是VOC格式最终要训练YOLO模型就需要写脚本批量转换。我写了一个Python脚本这里直接贴出来给大家参考import os import xml.etree.ElementTree as ET from tqdm import tqdm def voc_to_yolo(xml_path, output_dir, classes): tree ET.parse(xml_path) root tree.getroot() image_width int(root.find(size/width).text) image_height int(root.find(size/height).text) txt_name os.path.basename(xml_path).replace(.xml, .txt) txt_path os.path.join(output_dir, txt_name) lines [] for obj in root.findall(object): class_name obj.find(name).text if class_name not in classes: continue class_id classes.index(class_name) bndbox obj.find(bndbox) xmin float(bndbox.find(xmin).text) ymin float(bndbox.find(ymin).text) xmax float(bndbox.find(xmax).text) ymax float(bndbox.find(ymax).text) # 防止越界 xmin max(0, min(xmin, image_width)) xmax max(0, min(xmax, image_width)) ymin max(0, min(ymin, image_height)) ymax max(0, min(ymax, image_height)) x_center (xmin xmax) / 2 / image_width y_center (ymin ymax) / 2 / image_height width (xmax - xmin) / image_width height (ymax - ymin) / image_height # 限制在0-1之间 x_center min(max(x_center, 0.0), 1.0) y_center min(max(y_center, 0.0), 1.0) width min(max(width, 0.0), 1.0) height min(max(height, 0.0), 1.0) lines.append(f{class_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}) with open(txt_path, w) as f: f.write(\n.join(lines)) # 使用示例 classes [whole, cracked] xml_dir annotations/voc txt_dir annotations/yolo os.makedirs(txt_dir, exist_okTrue) for xml_file in tqdm(os.listdir(xml_dir)): if xml_file.endswith(.xml): voc_to_yolo(os.path.join(xml_dir, xml_file), txt_dir, classes)脚本里加了越界保护因为手工标注时偶尔会出现框超出图像边界的情况。这个保护在训练前一定要做否则YOLO训练时坐标值不在0-1范围内会直接报错或者导致loss异常。格式转换完成之后强烈建议做两件事验证。一是随机挑几十张图把TXT标注反画到图像上用OpenCV的rectangle函数画框肉眼检查框是否贴合。二是统计一下两个类别的目标数量如果cracked目标数远少于whole后续训练时需要考虑类别不平衡问题。我统计了792张图中的目标分布whole有900多个目标cracked有680多个比例接近1.3比1这个比例对训练来说是可以接受的。3. 用YOLOv8训练破蛋检测模型3.1 数据集目录结构与配置文件Ultralytics YOLOv8的工程组织方式很明确下面这个就是标准目录结构egg_detection/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yaml图片和标注文件必须严格同名一张图对应一个TXT文件。训练集、验证集、测试集的划分我选了8:1:1的比例也就是训练集634张、验证集79张、测试集79张。这个比例对792张的数据量来说比较均衡训练集足够学出有效特征验证集和测试集又各有近80张评估指标也还算可信。划分时注意一个原则同一批次拍摄的图像尽量只放入一个集合。比如在传送带上连续拍的10张图内容非常相似如果一部分进训练集、一部分进验证集就会造成数据泄漏验证集的评估结果会虚高看起来效果不错但真正部署到新场景就现原形了。data.yaml文件内容如下path: /path/to/egg_detection/ train: images/train val: images/val test: images/test names: 0: whole 1: cracked注意path是项目的绝对路径train、val、test是相对这个路径的目录。如果path配错训练时会报dataset not found的错误。3.2 训练参数设置与关键选择YOLOv8提供了多个规格的模型n、s、m、l、x从轻量到重量。对于鸡蛋破蛋检测这个任务算力有限的情况下我选了yolov8s。模型参数量大约11M在GTX 1660 Super上跑batch size设为16输入尺寸640x640大概每个epoch需要1分多钟训练100个epoch在2小时左右时间成本可以接受。核心训练命令如下yolo detect train \ modelyolov8s.pt \ data/path/to/egg_detection/data.yaml \ epochs100 \ imgsz640 \ batch16 \ device0 \ patience15 \ projectegg_detection_runs \ nameexp_egg_s几个关键参数我展开说一下。patience15表示如果连续15个epoch验证集指标没有提升训练就提前结束。我的实际训练过程在第72个epoch就触发了早停因为小数据集上继续训练容易过拟合早停能节省时间也能保住最好的权重。imgsz640是YOLOv8默认的输入尺寸鸡蛋这种目标不算特别小640足够了上到1280收益很小但推理速度会明显变慢。还有一个经常被忽略的参数是augment。YOLOv8内置了多种数据增强策略包括Mosaic、MixUp、随机翻转、色彩扰动等默认是开启的。小数据集不靠增强根本喂不饱模型所以我没有关闭任何增强策略而是保留了默认的增强强度。实测下来同样的792张数据开增强和关增强在验证集上mAP50可以差5个点以上。3.3 训练过程中的监控与判断训练过程中可以观察两个关键指标box_loss和cls_loss。正常情况下这两个loss在训练集上应该持续下降在验证集上会先下降后趋于平稳如果验证集loss开始上升而训练集loss还在下降说明模型开始过拟合。YOLOv8训练日志是实时刷新的我在训练时会特别关注每轮打印的验证集mAP50和mAP50-95。如果mAP50从某个epoch开始一直不涨但mAP50-95还在慢慢提升说明模型正在优化定位精度而不是检测能力这种情况不需要干预让它继续跑就行。如果训练过程中出现loss为nan的情况首先要检查学习率是不是太高了。默认的lr00.01对多数情况适用但如果batch size调得特别大可以考虑适当降低到0.005。其次是检查标注文件有没有问题比如某个TXT文件里出现了负数坐标或者坐标值大于1这些都会导致梯度异常。3.4 推理测试与结果可视化训练完成后可以用下面这条命令在测试集上做推理yolo detect predict \ model/path/to/egg_detection_runs/exp_egg_s/weights/best.pt \ source/path/to/egg_detection/images/test/ \ conf0.25 \ iou0.45 \ saveTrueconf0.25表示只有置信度大于0.25的预测框才会被保留默认值就是0.25对于检测任务来说这个阈值比较平衡。iou0.45是NMS非极大值抑制的IoU阈值用于去除重叠的重复框默认值0.45在多数场景下表现稳定。推理结果会保存到runs/detect/predict目录下每张图生成一个带有预测框和标签的可视化结果。我检查可视化结果时会重点看两类错误一类是漏检就是图片里明明有破蛋但模型没检测出来另一类是误检就是把完整蛋或者其他物体识别成了cracked。这两类错误在可视化图上一眼就能看出来比干看指标更直观。4. 模型评估指标与效果分析4.1 核心评估指标怎么读目标检测任务的评估指标主要有Precision精确率、Recall召回率、mAP50和mAP50-95。这四个指标各有侧重需要结合起来看。Precision衡量的是模型预测出的框中有多少是正确的Recall衡量的是所有真实目标中有多少被模型找到。对于破蛋检测这种场景漏检一个破蛋会导致这个破蛋进入后续加工环节影响产品质量误检一个完整蛋最多就是多一次人工复核成本相对低。所以实际业务中优先保证RecallPrecision可以适当放宽。mAP50是IoU阈值设为0.5时的平均精度均值mAP50-95则是在0.5到0.95的多个IoU阈值下分别计算mAP再取平均。mAP50-95对定位精度的要求更严格数值通常比mAP50低不少。我这次训练出的模型在测试集上mAP50约94.8%mAP50-95约78.3%Precision约91.2%Recall约93.5%。对于792张的小数据集来说这个结果算是相当能打了。4.2 混淆矩阵与错误分析只看汇总指标是不够的我训练结束后会把混淆矩阵和PR曲线导出来看。混淆矩阵能看到具体哪些类容易混淆PR曲线能看到不同置信度阈值下精确率和召回率的权衡关系。从我的混淆矩阵来看最大的错误来源是cracked被误检为whole。分析原因后发现轻微裂纹蛋在图像上与完整蛋的差异本来就不大特别是一些只有细线状裂纹的图片人工标注时都容易看走眼。为了解决这个问题我后续又补充了一些轻微裂纹蛋的图片进训练集并把这类样本做了水平翻转和亮度扰动增强模型对低对比度裂纹的敏感度有了一些提升。4.3 数据增强对模型效果的提升数据增强是目标检测中提升泛化能力的核心手段尤其对于小数据集来说几乎必不可少。我在训练时保留了YOLOv8的Mosaic和MixUp增强自己又额外加了几种离线增强方式制作了扩充副本水平翻转鸡蛋没有方向性水平翻转完全不影响语义是最安全的增强方式。旋转在小角度范围内正负15度旋转是安全的但旋转角度过大时边界框的语义会发生偏差破蛋外观也可能失真。对比度和亮度调整不同产线光照差异很大模拟各种光照条件可以提升模型的鲁棒性。高斯模糊模拟摄像头对焦不准的情况对小部分样本做轻微模糊可以提升模型对噪声的容忍度。有一点要特别注意离线增强后必须同步更新标注文件的坐标。特别是旋转操作如果直接用原坐标框就错位了。我用的是albumentations库来做增强和坐标同步变换这个库支持边界框的同步变换非常方便比自己写代码靠谱得多。4.4 测试集与真实场景的差距分析测试集指标好不意味着部署到现场就没有问题。我在完成测试集评估后又单独跑了一组现场拍摄的视频帧来做压力测试。结果发现模型在实际流水线上的表现比测试集指标低一些mAP50大概掉了5个点左右。主要原因是现场环境复杂背景有传送带纹理干扰、光源不稳定导致阴影变化、鸡蛋表面有水渍反光、蛋与蛋之间有重叠遮挡。测试集毕竟是相对干净的背景和真实场景存在分布差异。这验证了一个经验不要只依赖测试集指标一定要在尽可能接近真实部署环境的数据上做验证这样才能真正了解模型的实际表现。5. 常见问题与排查技巧实录5.1 标注文件与图像不匹配的排查方法训练时遇到AssertionError: Label class 2 exceeds nc2 in ...这类报错基本就是TXT文件里的类别ID超出了类别总数。导致这个问题的原因通常是标注时类别名写错了比如打成了“cracked ”带空格或者“Cracked”大小写不一致导致类别解析出错或者是VOC转YOLO时classes列表顺序和实际不一致把某个类别映射到了错误的ID上。排查思路写一个小脚本遍历所有TXT文件统计每一行的第一个数字的最大值如果大于等于类别总数就逐个定位是哪些文件出了问题。同类问题的变种还有坐标值越界比如width或height大于1这通常是VOC转YOLO时没有做归一化或者归一化时读错了图像尺寸。5.2 训练不收敛的常见原因训练过程中如果loss迟迟降不下去或者验证集指标一直徘徊在很低的水平优先检查以下几项标注文件是否正确随机抽20张图把标注画出来看看框是否贴合目标。很多训练问题根源就是标注错位。类别是否平衡如果cracked样本极少模型会倾向于把所有目标预测为whole因为这样loss更低。这是典型的类别不平衡问题可以通过增加cracked样本、复采样、调整loss权重等方式缓解。数据是否太单调如果所有图片都在同一背景、同一光线下拍摄模型很容易过拟合到背景特征泛化能力很差。增强拍摄多样性比增加数量更有效。学习率是否合适如果是迁移学习基于预训练权重finetune初始学习率不建议太高0.001到0.01之间比较常见。5.3 小目标检测效果差的优化方向如果鸡蛋在图像中占的比例很小比如远景监控场景检测效果会明显变差。主要原因有两个一是小目标在特征图中的响应较弱YOLOv8的检测头对中小目标的敏感度有限二是标注框的坐标误差对小目标来说影响更大同样的几个像素偏差大目标可能只差1%小目标就可能差10%。优化方向有三个第一提高输入分辨率将imgsz从640提高到960或1280但要注意显存占用和推理耗时第二使用多尺度训练参数YOLOv8支持在训练时动态调整输入尺寸增强模型对多尺度目标的适应性第三采用更大容量的模型比如从yolov8s换到yolov8m或yolov8l小目标特征提取能力会更强。具体选哪个方案需要根据你的显存和推理速度需求来权衡。5.4 部署时推理速度慢的优化技巧模型训练好后部署到实际产线上推理速度往往比训练时更敏感。我这边遇到的情况是在CPU上跑yolov8s模型单张640x640的图片推理耗时约120ms看起来不多但高速流水线每帧间隔可能不到50ms完全跟不上。优化手段有这几个。一是模型导出为TensorRT格式或ONNX格式在NVIDIA GPU上TensorRT的加速效果非常明显FP16精度下yolov8s可以做到10ms以内二是把输入尺寸适当降到480或416对鸡蛋检测这种目标尺寸不算太小的场景mAP下降不明显但推理速度能提升30%以上三是只取置信度大于某个阈值比如0.4的结果输出减少后处理的计算量。如果没有GPU只有CPU部署环境可以考虑用Intel OpenVINO导出模型CPU上的推理速度能比原生PyTorch快2到3倍。我实测过OpenVINO导出的FP16模型在i5处理器上单张推理耗时约50ms基本能满足中等速度流水线的要求。6. 数据集的局限性与后续扩展方向6.1 当前数据集的局限性792张图片的数据集在目标检测领域属于中小规模必须承认它有一些局限性。首先是场景通用性有限主要涵盖的是类似实验室或小型产线的拍摄环境对完全不同的场景可能存在较大的性能下降。其次是破损类别不够细分没有区分裂纹、破碎、蛋液外流等不同破损程度如果业务上需要区分这些细粒度类别还需要进一步补充标注。另外当前数据集的类别只有whole和cracked没有包括脏蛋、畸形蛋、双黄蛋等其他需要剔除的异常蛋类别。在真实产线上这些异常类型往往也需要检测到时候需要扩展类别并在原有模型基础上继续迭代训练。数据集的迭代是一个持续的过程不是一劳永逸的。6.2 如何基于此数据集继续扩展如果你拿到这份数据集后想继续扩展我建议按这个路径来。先在自己的实际场景里采集一批新图片不需要太多200到300张即可涵盖了现场的光线、背景和摄像头角度。然后对这批新图片做标注只标注现场出现的目标类别。将新标注数据与原有792张合并重新划分训练集、验证集、测试集用原有训练好的权重作为预训练模型继续finetune。这种方式的优势在于模型已经在原有数据上学习了比较稳定的特征表示在新数据上只需微调就能快速适配新场景迭代成本很低。我在迁移到另一个产线的场景时用这种方式只加了200多张新图训练的轮次不到30个epoch新场景的mAP就恢复到了可用的水平。6.3 从检测到分割的进阶方向如果后续业务需要更精细的蛋体轮廓信息比如要计算蛋的大小、面积或者精确的破损区域占比可以进一步做实例分割模型。YOLOv8本身就支持实例分割任务只需要把标注格式从边界框扩展到多边形。从边界框标注升级到多边形标注工作量会大不少但收益也很明显。实例分割可以提供更精确的目标区域后续可以计算破损面积占整个蛋体面积的比例用于质量分级。这类需求在高端禽蛋分选线中比较常见性价比也高。我个人在实际操作中的经验是先把检测跑通、稳定上线再根据业务需求决定要不要上分割。检测模型部署简单、推理快对多数工序环节已经够用了。分割模型精度更高但标注成本和计算成本也更高属于锦上添花的优化方向。写在最后的几点经验这个项目从0到1做下来我最大的体会是数据集的质量决定了模型效果的上限。792张的规模不大但每一步都做到位了——图像质量、标注精度、格式正确性、类别平衡、训练验证划分合理——跑出的模型完全能满足实际需求。最后再分享一个小技巧做数据集的时候建议一开始就规范化命名和目录结构每个阶段的标注文件都做备份。看似浪费时间但当你需要回溯某个阶段的数据时这种规范性会帮你省下大把时间。另外格式转换脚本和划分脚本也要保留好数据迭代时你要反复用到它们。这份数据集和流程我放到了自己的项目仓库里如果你正在做类似方向的检测任务直接拉下来用就行。有问题可以在评论区留言我看到了会尽量回复。本文还有配套的精品资源点击获取
返回列表