拓冰建站拓冰建站
首页 / 资讯中心 / 正文

香烟破损检测数据集实战:YOLOV5 6类缺陷训练与调参指南

简介这份资源面向从事目标检测算法学习与工业质检应用开发的读者提供一套按YOLOv5目录格式整理的香烟破损检测数据集可直接投入训练省去格式转换与标注清洗环节。数据聚焦香烟表面缺陷识别共划分6个类别涵盖头部破损、滤嘴破损等典型瑕疵适合作为缺陷检测练手项目或算法对比实验的基准数据。压缩包共803个文件以401个txt标注文件、401张jpeg图像和1个可视化py脚本为主整体约388MB其中训练集含320张图片及对应标签验证集含80张图片及对应标签图像为3024×4032大尺度RGB实拍图细节丰富。配套脚本随机传入一张图片即可绘制边界框并保存到当前目录无需修改即可运行便于快速核验标注质量。目前已有139人学习下载适合需要现成香烟破损检测数据、希望快速验证模型效果的目标检测学习者与工程人员。1. 香烟破损检测数据集6 类缺陷、YOLOV5 目录格式拿到手怎么用香烟包装表面的破损检测在产线质检里是个很典型的细粒度目标检测问题。烟盒在高速传送带上跑表面可能出现拉线断裂、盒角压溃、烫金磨损、透明膜褶皱、条码污损、内衬纸外露这几类缺陷每一类的尺度、对比度、纹理都不一样。你如果打算用 YOLOV5 训练自己的数据集做这件事第一个卡点往往不是模型结构而是数据标注格式对不对、类别定义清不清楚、训练集和验证集怎么切、目录结构能不能直接被train.py吃进去。这个数据集标题里给的信息很明确——YOLOV5 目录格式、6 类别、包含训练集和验证集。它解决的是「从零标注一批香烟破损图片」这个最耗时的环节让你把精力放在超参调优和部署上。适合两类人一是做工业质检落地、需要快速验证 YOLOV5 在自己场景可行性的工程师二是刚接触目标检测、想拿一个真实缺陷数据集跑通完整训练流程的人。下面我按「目录长什么样 → 怎么接进训练 → 参数怎么设 → 哪里会翻车」的顺序讲清楚。2. YOLOV5 目录格式拆解6 类香烟缺陷的标注文件到底长什么样2.1 目录树与 images/labels 的对应关系YOLOV5 官方推荐的目录结构是images和labels平行放置训练集和验证集各自成对。香烟破损检测数据集如果按标准组织展开后大致是这样cigarette_defect/ ├── images/ │ ├── train/ # 训练集图片jpg/png │ │ ├── 0001.jpg │ │ └── ... │ └── val/ # 验证集图片 │ ├── 1001.jpg │ └── ... ├── labels/ │ ├── train/ # 与 train 图片同名的 txt │ │ ├── 0001.txt │ │ └── ... │ └── val/ │ ├── 1001.txt │ └── ... └── data.yaml # 数据集配置文件关键约束只有一条labels/train/0001.txt必须和images/train/0001.jpg同名只换扩展名。YOLOV5 的dataset.py在加载时会用图片路径反推标签路径名字对不上就直接跳过这张图而且默认不报错——这是新手最容易踩的静默失败。我一般拿到数据集先跑一遍文件名比对确认没有孤儿图片或孤儿标签。2.2 标注行格式class x_center y_center width height每个 txt 文件里一行代表一个目标框6 类别对应 class id 0 到 5。格式是归一化后的中心点坐标和宽高2 0.512 0.437 0.186 0.224 5 0.301 0.688 0.092 0.115第一列是类别索引后四列全部除以图片的宽和高落在 0 到 1 之间。这里有两个高频错误一是有人直接写像素坐标训练时 loss 会异常大甚至 NaN二是 x_center 和 y_center 写反模型学出来的框会整体偏移。香烟破损这类缺陷框通常偏小宽高归一化后常在 0.05 到 0.3 之间如果发现某类框普遍大于 0.5基本可以判定标注时框选范围出了问题。2.3 data.yaml 的六个类别名与路径配置data.yaml是训练入口的配置核心内容大致如下# 香烟破损检测数据集配置 path: ./cigarette_defect # 数据集根目录 train: images/train # 相对 path 的训练图片目录 val: images/val # 相对 path 的验证图片目录 nc: 6 # 类别数量必须与 names 长度一致 names: 0: tear # 拉线断裂 1: corner_crush # 盒角压溃 2: gold_wear # 烫金磨损 3: film_wrinkle # 透明膜褶皱 4: barcode_stain # 条码污损 5: liner_expose # 内衬纸外露nc和names长度不一致时YOLOV5 会在构建检测头时报维度错误。类别名建议用英文小写下划线避免中文和空格否则在部分版本的日志输出和可视化里会乱码。类别顺序一旦确定就不要改因为标注文件里的 class id 是按这个顺序写的改了顺序等于把所有标签打乱。2.4 用脚本校验数据集完整性拿到数据集后我习惯先跑一段校验脚本把类别分布、框尺寸分布、文件名匹配情况一次性看清楚import os from pathlib import Path from collections import Counter root Path(./cigarette_defect) for split in [train, val]: img_dir root / images / split lbl_dir root / labels / split imgs {p.stem for p in img_dir.glob(*) if p.suffix.lower() in (.jpg, .png)} lbls {p.stem for p in lbl_dir.glob(*.txt)} # 找出有图无标签、有标签无图的情况 print(f[{split}] 图片 {len(imgs)} 张, 标签 {len(lbls)} 个) print(f 缺标签的图片: {len(imgs - lbls)}) print(f 缺图片的标签: {len(lbls - imgs)}) cls_counter Counter() box_areas [] for lbl in lbl_dir.glob(*.txt): for line in lbl.read_text().strip().splitlines(): parts line.split() if len(parts) ! 5: print(f 格式异常: {lbl.name} - {line}) continue c, x, y, w, h int(parts[0]), *map(float, parts[1:]) cls_counter[c] 1 box_areas.append(w * h) print(f 类别分布: {dict(sorted(cls_counter.items()))}) if box_areas: print(f 框面积 min/mean/max: {min(box_areas):.4f}/ f{sum(box_areas)/len(box_areas):.4f}/{max(box_areas):.4f})这段脚本做三件事比对图片和标签的文件名集合暴露孤儿文件统计每个类别的框数量判断是否存在严重类别不平衡统计归一化框面积判断标注尺度是否合理。参数上root指向数据集根目录split列表按实际存在的划分调整。如果某个类别在训练集里只有个位数样本训练时几乎学不到需要补样本或做增强。3. 把数据集接进 YOLOV5 训练从环境到首轮跑通的完整命令3.1 环境配置与依赖版本选择YOLOV5 对 PyTorch 和 CUDA 版本比较敏感我一般用 conda 建独立环境避免和系统里的其他项目打架conda create -n yolo5 python3.9 -y conda activate yolo5 # 按本机 CUDA 版本装 PyTorch这里以 CUDA 11.8 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 克隆 YOLOV5 仓库后安装依赖 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txtPython 选 3.9 是因为它在 YOLOV5 各版本上兼容性最稳。PyTorch 版本要和显卡驱动匹配装完用python -c import torch; print(torch.cuda.is_available())验证返回 True 才算通。requirements 里的依赖不要随意升级尤其是 numpy 和 opencv版本跳太多容易在数据加载阶段报奇怪的错。3.2 用 train.py 跑通第一轮训练数据集和代码就位后第一轮训练不要急着调参先用小 epoch 确认整条链路能跑通python train.py \ --data ./cigarette_defect/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0 \ --project runs/train \ --name cigarette_v1--data指向刚才的 yaml--weights用官方预训练权重做迁移学习香烟缺陷样本通常几千张以内从头训收敛慢且容易过拟合--img 640是输入分辨率缺陷框偏小时可以提到 960 或 1280但显存占用会明显上升--batch 16在 8G 显存上跑 640 分辨率比较稳显存不够就降到 8 并配合--accumulate做梯度累积。第一轮建议--epochs 10先看 loss 曲线和验证指标是否正常下降确认没问题再拉长。3.3 训练日志里该盯哪几个指标训练启动后控制台和runs/train/cigarette_v1/下会输出大量信息重点看四个指标含义异常信号box_loss边界框回归损失持续不降检查标注坐标是否归一化cls_loss分类损失震荡剧烈可能学习率偏高或类别不平衡mAP0.5IoU 0.5 下的平均精度长期低于 0.3数据或标注有问题precision/recall查准率/查全率recall 极低模型漏检严重香烟破损检测里烫金磨损和透明膜褶皱这两类对比度低、边界模糊mAP 通常比其他类低一截这是数据本身的难度不一定是训练出问题。如果所有类别 mAP 都上不去优先回头查标注而不是加 epoch。3.4 验证集评估与推理可视化训练结束后用val.py做一次完整评估再用detect.py看实际效果# 在验证集上评估输出每类 AP python val.py --data ./cigarette_defect/data.yaml \ --weights runs/train/cigarette_v1/weights/best.pt \ --img 640 --task val # 对单张图或整个目录做推理保存可视化结果 python detect.py --weights runs/train/cigarette_v1/weights/best.pt \ --source ./cigarette_defect/images/val \ --img 640 --conf 0.25 --save-txt--conf 0.25是置信度阈值产线场景如果漏检代价高可以降到 0.15 换更高 recall代价是误检增多。--save-txt会把预测框按 YOLO 格式存下来方便和真值做对比分析。我一般会挑几张误检和漏检的图单独看判断是标注问题还是模型能力问题。4. 香烟破损检测的调参与增强6 类小目标怎么提 mAP4.1 针对小缺陷框的输入分辨率与 anchor 调整香烟破损的缺陷框普遍偏小640 分辨率下有些框只有十几个像素特征图到 P3 层已经很难保留细节。两个方向一是把--img提到 960 或 1280让缺陷占据更多像素二是检查 anchor 是否匹配。YOLOV5 默认 anchor 是基于 COCO 聚类的对香烟这种小框未必最优可以用train.py里的--noautoanchor关闭自动锚框再手动跑 k-means 聚类# 用数据集真值框重新聚类 anchor输出 9 组建议值 python utils/autoanchor.py --data ./cigarette_defect/data.yaml --img 960聚类结果里偏小的那几组 anchor 如果和默认值差距大就手动写进模型配置。分辨率提升后 batch 要相应减小否则显存直接爆。4.2 数据增强参数的取舍mosaic 与 mixup 的边界YOLOV5 默认开启 mosaic 增强把四张图拼成一张对小目标检测帮助明显。但香烟破损场景有个坑mosaic 拼接后不同烟盒的缺陷可能被拼到同一张图里模型会学到一些不真实的上下文关系。如果验证集 mAP 波动大可以调低 mosaic 概率# 在 hyp 配置文件里调整增强强度 mosaic: 0.5 # 默认 1.0降到 0.5 减少拼接 mixup: 0.0 # 香烟缺陷不建议开 mixup容易产生不合理叠加 copy_paste: 0.1 # 小目标复制粘贴增强适度开启 degrees: 5.0 # 旋转角度产线烟盒方向固定可调小 hsv_h: 0.015 # 色调扰动烫金类缺陷对颜色敏感别调太大hsv_h对烫金磨损这类靠颜色区分的缺陷影响很大调太大会让模型把正常烫金误判成磨损。我一般把色调扰动控制在 0.015 以内饱和度和亮度扰动可以稍大。4.3 类别不平衡时的损失权重与采样策略6 类缺陷在真实数据里分布往往不均拉线断裂可能几百个框内衬纸外露只有几十个。直接训练会让模型偏向多数类。处理方式有三种一是对少数类做离线过采样复制图片并配合增强二是在hyp里调cls损失权重三是用--balance类的采样策略部分 YOLOV5 分支支持。最稳妥的还是补数据过采样容易让少数类过拟合。判断是否不平衡看第 2 章校验脚本输出的类别分布如果最多和最少差 10 倍以上就得处理。4.4 学习率与 warmup 的设置经验YOLOV5 默认用余弦退火加 warmup--lr0是初始学习率--lrf是最终学习率比例。香烟破损数据集规模通常不大lr0设 0.01 容易震荡我一般降到 0.005 到 0.008。warmup 的 epoch 数保持默认 3 即可太少会让前期 loss 爆掉。如果训练曲线前期剧烈抖动先降lr0再考虑加--warmup_epochs。5. 避坑与排查香烟破损数据集训练中最容易翻车的 5 个点5.1 现象训练启动即报「No labels found」原因data.yaml里的train/val路径写错或者 labels 目录名不是labels。YOLOV5 会按images替换成labels去找路径里带多余层级就找不到。解决用绝对路径先排除相对路径歧义确认images/train同级存在labels/train且 txt 文件名和图片名完全一致包括大小写。5.2 现象loss 正常下降但 mAP 始终接近 0原因标注坐标没归一化或者 x_center/y_center 写反。loss 能降是因为模型在拟合错误的坐标分布但预测框和真值框 IoU 极低。解决抽查几个 txt确认后四列都在 0 到 1 之间用第 2 章的校验脚本看框面积分布如果普遍大于 1 就是没归一化。5.3 现象某一类缺陷完全检测不到原因该类样本太少或者该类标注的 class id 和data.yaml里的 names 顺序对不上。解决先看类别分布统计确认该类框数量再核对标注文件里该类的 id 是否和 yaml 一致。顺序错位是高频问题尤其是多人协作标注时。5.4 现象验证集 mAP 高但实际推理漏检严重原因训练集和验证集图片来自同一批次、同一光照条件验证集不能代表真实分布。或者验证集里缺陷样本和训练集高度相似存在数据泄漏。解决按时间、批次或光照条件划分训练验证集确保验证集覆盖真实场景的多样性。如果数据集本身划分固定至少人工检查验证集图片是否和训练集有明显重复。5.5 现象显存溢出CUDA out of memory原因--img或--batch设太大或者 mosaic 增强在内存里拼图时占用翻倍。解决优先降 batch再考虑降 img也可以用--accumulate用小 batch 模拟大 batch。如果只是偶尔溢出检查是否有其他进程占用显存。6. 从能跑到好用香烟破损检测的推理阈值与部署前验证技巧训练出 best.pt 只是第一步真正上线前还有几件事要做。第一是确定推理阈值。产线质检对漏检和误检的容忍度不同如果漏检一个破损烟盒的代价远高于误检就把--conf降到 0.15 甚至 0.1同时用--iou控制 NMS 的合并强度避免同一缺陷出多个框。我一般会在验证集上画一条 precision-recall 曲线找到 recall 0.95 对应的 conf 值作为上线阈值而不是拍脑袋定 0.25。第二是验证模型对输入尺寸的鲁棒性。训练用 640推理如果也用 640 最稳但产线相机分辨率可能更高。直接放大输入会让小缺陷变大、可能提 recall但也可能因为尺度不匹配掉点。稳妥做法是训练和推理用同一 img 尺寸或者用--img多尺度测试看哪个尺寸在验证集上综合指标最好。第三是导出和速度验证。YOLOV5 支持导出 ONNX、TensorRT 等格式导出后用val.py再跑一遍确认精度没有明显掉点。香烟产线节拍快推理延迟要卡在预算内TensorRT FP16 通常能比 PyTorch 快 2 到 3 倍但要注意 FP16 对烫金磨损这类低对比度缺陷可能有精度损失导出后必须重新评估。# 导出 ONNX 并做一次精度复核 python export.py --weights runs/train/cigarette_v1/weights/best.pt \ --include onnx --img 640 --dynamic # 用导出的模型在验证集上复核 mAP python val.py --data ./cigarette_defect/data.yaml \ --weights runs/train/cigarette_v1/weights/best.onnx \ --img 640 --task val最后说个我自己的习惯每次换数据集版本或改标注都重新跑一遍第 2 章的校验脚本把类别分布和框尺寸分布存成快照。香烟破损检测这类项目模型结构基本不用动真正决定效果的是数据质量和标注一致性。我踩过最深的坑就是改了一批标注后没重新校验训练了两天才发现某类 id 整体错位白跑。希望帮到你。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门