ARTICLE DETAIL

资讯详情

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

流水线纸箱识别数据集:YOLO与VOC双格式标签开箱即训

流水线纸箱识别数据集:YOLO与VOC双格式标签开箱即训 简介这份流水线纸箱识别数据集面向从事目标检测的深度学习开发者与工业视觉研究者聚焦产线场景下的纸箱分类与定位任务可用于搭建自动化分拣、物流计数等应用的原型验证。资源同时提供YOLO与VOC两种标注格式覆盖GreenCarton、RedCarton两个类别适配YOLOv5至YOLOv10等YOLO系列算法也可直接用于Faster R-CNN、SSD等模型的训练与对比实验。压缩包共2000个文件包含1395个txt标签、604个xml标签以及1个记录类别信息的yaml配置文件整体约72.58MB图片与标签已按训练集、验证集、测试集划分完毕解压后即可投入训练省去格式转换与数据切分的繁琐步骤。目前已有338人学习下载适合希望快速验证检测方案、复现工业纸箱识别效果的中高级开发者参考使用。1. 流水线纸箱识别数据集2 个类别、双格式标签开箱即训流水线分拣场景里纸箱颜色往往直接对应物料批次或去向绿箱、红箱分错一个后面整条线都得返工。这份流水线纸箱识别数据集就是冲着这个痛点来的2 个类别 GreenCarton、RedCarton同时给了 YOLO 的 txt 标签和 VOC 的 xml 标签图片已经按训练集、验证集、测试集切好配了指定类别信息的 yaml 文件。换句话说你拿到手不用自己写划分脚本、不用纠结标签格式转换YOLOv5 到 YOLOv10 这一串目标检测算法都能直接喂进去。适合谁做工业质检、物流分拣、产线视觉的从业者以及想拿一个真实工业场景数据集练手 YOLO 训练流程的人。下面我按「这数据集长什么样 → 怎么接进训练 → 坑在哪 → 怎么验证训没训好」拆开讲。2. 数据集结构与格式txt、xml、yaml 三件套怎么对上2.1 目录长什么样先看清楚再动手这份数据集的核心资产是三类文件图片、YOLO 格式的 txt 标签、VOC 格式的 xml 标签外加一个描述类别信息的 yaml。项目正文里列出的box_1094.txt、box_43.txt、box_46.txt这些就是标注文件按图片名一一对应的命名方式——图片叫box_1094.jpg标签就叫box_1094.txt这种同名对应是 YOLO 训练能跑通的前提一旦名字对不上训练时就会报「找不到标签」或者更隐蔽地当成负样本。常见的目录组织是这样carton_dataset/ ├── images/ │ ├── train/ # 训练集图片 │ ├── val/ # 验证集图片 │ └── test/ # 测试集图片 ├── labels/ │ ├── train/ # 训练集 txt 标签 │ ├── val/ │ └── test/ ├── annotations/ # VOC 格式 xml 标签 └── data.yaml # 类别与路径配置images和labels分开存放是 YOLO 官方推荐的布局Ultralytics 系YOLOv5/v8/v11默认按这个结构去找标签。xml 放在annotations里是给 Faster R-CNN、SSD 这类需要 VOC 格式的框架用的或者你想用 labelImg 重新校对标注时直接读。2.2 txt 标签每一列是什么别数错列YOLO 的 txt 标签每行代表一个目标格式是class_id x_center y_center width height后四个都是归一化到 0~1 的相对值。这份数据集只有 2 类所以 class_id 只会是 0 或 10 0.512 0.634 0.221 0.318 1 0.287 0.401 0.195 0.276第一列0对应 GreenCarton1对应 RedCarton具体谁对应谁以 yaml 里的names为准别自己猜。后面四个值乘上图片宽高才是像素坐标。这里最容易翻车的是有人拿到的标注是像素绝对值直接当归一化值喂进去训练 loss 一开始就炸。判断方法很简单打开 txt 看后四列有没有大于 1 的数有就说明没归一化。2.3 yaml 配置路径和类别名必须和实际一致yaml 是 YOLO 训练的入口配置典型内容path: ./carton_dataset train: images/train val: images/val test: images/test nc: 2 names: 0: GreenCarton 1: RedCartonnc是类别数这里固定 2。names的顺序必须和 txt 里 class_id 的映射一致否则模型学出来的「绿箱」其实是「红箱」。path用相对路径时是相对于你执行训练命令的工作目录不是相对于 yaml 文件本身——这是 Ultralytics 系一个反直觉的点很多人在这里踩坑后面避坑章节细说。2.4 训练/验证/测试已经切好别重复切数据集已经把图片和标签划分成 train/val/test 三份这是省事的地方但也意味着你不能再用train_test_split之类的方法二次划分否则会出现同一张图既在训练集又在验证集的情况验证指标虚高模型实际部署时打脸。如果你确实想调整比例正确做法是从原始完整集重新切而不是在已切好的子集上再切。3. 接进 YOLO 训练从环境到跑通第一条命令3.1 环境准备Ultralytics 一条命令的事现在主流做法是用 Ultralytics 的统一接口YOLOv8/v9/v10/v11 共用一套 API装起来干净# 建议单独建虚拟环境避免和系统里的 torch 打架 python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate # 安装 ultralytics会自动带上匹配的 torch pip install ultralytics # 验证装好了没 yolo checksyolo checks会打印出 torch 版本、CUDA 是否可用、GPU 型号。如果显示 CPU only 而你有显卡多半是 torch 装成了 CPU 版重装对应 CUDA 版本的 torch 即可。这一步别省我见过太多人训练慢得像蜗牛最后发现根本没走 GPU。3.2 用命令行跑第一轮训练环境好了直接拿 yaml 开训yolo detect train \ data./carton_dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ device0逐项说清楚data指向你的 yamlmodelyolov8n.pt是拿官方预训练权重做迁移学习n 是最小的 nano 版本先跑通流程用它最稳后面再换 s/m/lepochs100是训练轮数工业小数据集一般 100~300 够用imgsz640是输入分辨率纸箱目标通常不小640 够batch16看显存调8G 显存跑 640 分辨率大概能到 16device0指定第一块 GPUCPU 训练就写cpu。训练开始后终端会打印每个 epoch 的 box_loss、cls_loss、mAP50、mAP50-95。前几个 epoch loss 下降快是正常的如果 loss 一直不降甚至上升先别怀疑模型去查标签格式。3.3 用 Python 脚本训练方便调参和接后续流程命令行适合快速验证真正做项目我一般写成脚本方便记录参数、接验证和导出from ultralytics import YOLO # 加载预训练模型n 版本先跑通 model YOLO(yolov8n.pt) # 开始训练 results model.train( data./carton_dataset/data.yaml, epochs100, imgsz640, batch16, device0, projectruns/carton, # 结果保存目录 nameexp1, # 本次实验名 patience30, # 30 轮没提升就早停省时间 saveTrue, plotsTrue # 自动画 PR 曲线、混淆矩阵 ) # 训练完在验证集上评估 metrics model.val() print(mAP50:, metrics.box.map50) print(mAP50-95:, metrics.box.map)patience30是早停工业数据集容易过拟合早停能帮你省下大量无效训练时间。plotsTrue会生成混淆矩阵和 PR 曲线这两个图是判断模型到底学没学会的关键比只看一个 mAP 数字有用得多。project和name决定结果存哪建议按实验编号管理不然跑几次就找不到哪次是哪次了。3.4 推理和导出训完怎么用训练完拿测试集图片跑推理确认效果from ultralytics import YOLO model YOLO(runs/carton/exp1/weights/best.pt) # 对单张图推理 results model.predict(test_box_01.jpg, conf0.25, saveTrue) # 批量推理整个测试集 results model.predict( source./carton_dataset/images/test, conf0.25, saveTrue, projectruns/predict )conf0.25是置信度阈值低于它的框不输出。纸箱识别这种目标清晰、背景相对固定的场景0.25 通常够如果误检多就往上调到 0.4~0.5漏检多就往下调。best.pt是验证集上表现最好的权重别用last.pt那是最后一轮的可能已经过拟合了。要部署到产线边缘设备还得导出# 导出 ONNX通用性最好 yolo export modelruns/carton/exp1/weights/best.pt formatonnx # 导出 TensorRTNVIDIA 设备上推理最快 yolo export modelruns/carton/exp1/weights/best.pt formatengine halfTruehalfTrue是 FP16 半精度TensorRT 上能明显提速但精度会掉一点点纸箱这种大目标一般无所谓。4. 避坑与排查标签、路径、显存这几个地方最容易翻车4.1 训练报「No labels found」但标签明明在现象训练启动后警告找不到标签或者 mAP 一直是 0。原因九成是images和labels的目录层级没对上。YOLO 找标签的逻辑是把图片路径里的images替换成labels再换扩展名。如果你的图片在images/train/标签却在labels/少了一层 train它就找不到。解决保证images/train/xxx.jpg对应labels/train/xxx.txt层级完全镜像。改完用一条命令自查# 统计图片和标签数量是否一致 ls carton_dataset/images/train | wc -l ls carton_dataset/labels/train | wc -l两个数不一样就说明有图没标签或者有标签没图都得处理。4.2 训练 loss 是 nan或者一开始就爆现象第一个 epoch 的 box_loss 就是 nan 或者几百上千。原因标签没归一化坐标是像素值。或者 txt 里混进了空行、多余空格、class_id 超出范围比如出现了 2但只有 2 类。解决写个脚本扫一遍所有标签import os label_dir carton_dataset/labels/train for fname in os.listdir(label_dir): with open(os.path.join(label_dir, fname)) as f: for i, line in enumerate(f): parts line.strip().split() if len(parts) ! 5: print(f{fname} 第{i}行 列数不对: {line.strip()}) continue cls, x, y, w, h parts if int(cls) not in (0, 1): print(f{fname} 第{i}行 class_id 越界: {cls}) if any(float(v) 1 for v in (x, y, w, h)): print(f{fname} 第{i}行 坐标未归一化: {line.strip()})跑一遍把报出来的行修掉再训。4.3 yaml 路径写对了还是报找不到文件现象yaml 里path看着没问题训练却报文件不存在。原因Ultralytics 里path是相对于你执行命令时的当前工作目录不是相对于 yaml 文件。你在 A 目录执行命令yaml 在 B 目录path写相对路径就会解析错。解决要么用绝对路径要么保证在数据集根目录执行训练命令。我一般直接写绝对路径省得来回切目录path: /home/user/carton_dataset train: images/train val: images/val4.4 显存不够batch 调小还是 OOM现象CUDA out of memory把 batch 从 16 降到 8 还是报。原因显存占用不只跟 batch 有关还跟 imgsz、模型大小、是否开了 AMP 有关。imgsz 从 640 提到 1280显存占用差不多翻四倍。解决按这个顺序降——先降 batch 到 4再降 imgsz 到 416还不行换更小的模型n 换到 nano 已经最小了那就只能上更小的输入。另外确认开了混合精度Ultralytics 默认开 AMP如果被关了显存会明显吃紧。4.5 验证集 mAP 很高实际用起来一塌糊涂现象训练日志里 mAP50 到 0.95部署到产线却频繁误检漏检。原因训练集和验证集可能来自同一段视频的相邻帧画面高度相似验证集根本代表不了真实场景的多样性。或者数据本身场景太单一模型过拟合到了背景。解决拿测试集如果测试集和训练验证来源不同单独评估或者自己另外采一批真实产线图片测。看混淆矩阵如果 GreenCarton 和 RedCarton 互相误判多说明颜色特征没学好可能是光照变化太大需要补充不同光照的样本。5. 进阶把这份数据集用出上限的几个技巧5.1 先看数据分布再决定要不要增广拿到数据集别急着开训先统计一下两个类别的目标数量和尺寸分布。如果 GreenCarton 的样本数是 RedCarton 的三倍模型会偏向绿箱红箱召回率上不去。这种情况要么补红箱样本要么在训练时用cls权重平衡。Ultralytics 里可以通过调整损失权重或者用 copy-paste 增广来缓解。尺寸分布也重要。如果纸箱在画面里普遍很大占画面 1/3 以上用小 imgsz 反而浪费如果目标偏小imgsz 得往上提或者用带 P2 小目标检测层的模型变体。5.2 用混淆矩阵定位「玄学」误判训练完plotsTrue会生成confusion_matrix.png这张图比 mAP 有用得多。横轴是预测类别纵轴是真实类别对角线是判对的非对角线就是误判。如果 GreenCarton 大量被判成 background说明漏检严重可能是置信度阈值太高或者目标太小如果 GreenCarton 和 RedCarton 互相误判那就是颜色特征区分度不够得从数据源头找问题——是不是有些红箱在阴影下看着发暗和绿箱接近。5.3 换模型和调参的优先级跑通 baseline 之后想提精度按这个顺序试性价比从高到低调整项建议范围说明模型规模n → s → m先换 s通常涨点明显再大就吃显存imgsz640 → 768/896目标偏小时有效显存换精度epochs100 → 300配合 patience 早停不怕多增广mosaic、mixup默认已开场景单一时可关掉 mosaic学习率默认 0.01 → 0.001小数据集降学习率有时更稳我一般先换 s 模型 imgsz 提到 768 跑一轮看 mAP 涨多少再决定要不要继续投入。如果换了大模型精度没动说明瓶颈在数据不在模型回去补样本比调参有用。5.4 导出前的最后一道验证导出 ONNX 或 TensorRT 之前一定用同一批测试图对比一下 PyTorch 和导出模型的输出。常见做法是各跑一遍看检测框数量和类别是否一致。如果导出后精度掉了多半是预处理归一化方式、letterbox 填充没对齐或者halfTrue在半精度下数值溢出。纸箱这种大目标一般没事但养成导出后验证的习惯能省掉部署现场返工的麻烦。从那以后我每次拿到新数据集都强制先跑一遍标签格式自查脚本、再看一眼类别分布确认没问题才开训——这一步花五分钟能省掉后面几小时的无效训练。希望帮到你。本文还有配套的精品资源点击获取
返回列表