
简介这份资源面向从事目标检测算法实践与工业质检方向的开发者提供一套按YOLOv5目录格式整理的香烟破损检测数据集可直接投入训练省去格式转换与标注清洗环节。数据聚焦香烟表面缺陷识别共划分6个类别涵盖头部破损、滤嘴破损等典型瑕疵适合作为缺陷检测模型的训练与验证素材。压缩包共803个文件以401个txt标注文件、401张jpeg图像和1个可视化py脚本为主整体约388MB其中训练集含320张图片及对应标签验证集含80张图片及对应标签图像为3024×4032的大尺度RGB图片细节丰富。附带的可视化脚本随机传入一张图片即可绘制边界框并保存到当前目录无需修改即可运行便于快速核验标注质量。目前已有139人学习下载适合需要现成数据集验证YOLOv5训练流程或开展香烟缺陷检测实验的读者参考使用。1. 香烟破损检测数据集6 类缺陷、400 张原图为什么它值得先跑一遍拿到一份标注好的目标检测数据集最怕两件事一是类别定义含糊标了半天不知道边界在哪二是目录结构不按主流框架来光整理数据就耗掉半天。这份香烟破损检测数据集在这两点上都比较省心——6 个类别直接对应烟支不同部位的破损形态目录按 YOLOV5 的标准结构组织训练集 320 张图配 320 个 txt 标签验证集 80 张图配 80 个 txt 标签解压完改一下 data.yaml 里的路径就能开训。图像本身是 3024×4032 的大尺度 RGB 照片手机实拍风格背景以手持或台面为主。这个分辨率对目标检测来说偏高直接送进网络会拖慢训练速度但好处是烟支上的细小破损比如滤嘴接缝处的裂口保留得比较完整缩放到 640 或 1280 之后仍然能看清缺陷轮廓。数据集总大小 388MB包含训练集、验证集和一份可视化脚本适合做香烟质检方向的缺陷检测验证也适合拿来做 YOLOV5 自定义数据集训练的练手项目。需要说清楚的是这不是一个工业级产线数据集400 张图的规模决定了它更适合做原型验证和流程跑通而不是直接上产线。但正因为规模小、类别清晰、格式规范它反而是那种“两小时内能跑出第一版结果”的数据集对刚接触目标检测缺陷检测的人来说反馈来得快踩坑成本低。2. 目录结构与标注格式YOLOV5 标准布局拆解2.1 文件夹层级与文件对应关系这份数据集解压后的目录结构遵循 YOLOV5 的常见组织方式核心是 images 和 labels 两个平行目录各自再分 train 和 val。具体层级如下datasets/ ├── images/ │ ├── train/ # 320 张 jpg 图片 │ └── val/ # 80 张 jpg 图片 ├── labels/ │ ├── train/ # 320 个 txt 标签 │ └── val/ # 80 个 txt 标签 └── classes.txt # 6 类别名称图片和标签是一一对应的images/train 里有一张 IMG_8363.jpeglabels/train 里就有一个 IMG_8363.txt。YOLOV5 在训练时靠文件名匹配所以图片和标签的主文件名必须一致扩展名不同没关系。如果出现图片有、标签没有的情况训练时会被跳过或报 warning建议在训练前用脚本核对一遍。classes.txt 里存的是 6 个类别的名称顺序对应标签文件里的 class_id。常见做法是头部破损、滤嘴破损、烟身破损、接缝开裂、端面缺损、其他破损。具体名称以你拿到的 classes.txt 为准不要自己改顺序否则标签和类别会对不上。2.2 YOLO txt 标签的字段含义每个 txt 文件里存的是该图片中所有目标的标注每行一个目标格式为class_id x_center y_center width height这五个值都是归一化到 0~1 的浮点数。x_center、y_center 是边界框中心点相对于图片宽高的比例width、height 是框宽高相对于图片宽高的比例。举个例子一张 3024×4032 的图里某个破损区域在像素坐标下是 (1200, 2000) 到 (1500, 2300)那么x_center (12001500)/2/3024 ≈ 0.4464y_center (20002300)/2/4032 ≈ 0.5332width (1500-1200)/3024 ≈ 0.0992height (2300-2000)/4032 ≈ 0.0744对应的一行就是0 0.4464 0.5332 0.0992 0.0744。这里 class_id 从 0 开始计数0 对应 classes.txt 里的第一个类别。注意YOLO 格式的坐标是归一化值不是像素值。如果你用 LabelImg 或其他工具重新标注导出时选 YOLO 格式不要选 VOC 的 xml否则还得转一道。2.3 用可视化脚本先验一遍标注质量数据集里带了一个可视化 py 文件随机传入一张图片就能画出边界框并保存到当前目录。这个脚本不用改直接跑就行。它的作用是让你在训练前肉眼确认标注有没有明显偏移、漏标或类别错乱。常见做法是随机抽 10~20 张图跑一遍重点看小目标比如滤嘴接缝处的细长破损有没有被框住。如果你拿到的脚本需要指定图片路径可以按下面这种方式调用python visualize.py --image datasets/images/train/IMG_8363.jpeg跑完之后当前目录会生成一张带框的图框的颜色按类别区分。如果发现某个类别的框普遍偏大或偏小可能是标注时用了整图比例而不是目标比例这种情况在手机实拍图上偶尔会出现需要回头核对原始标注。2.4 训练前必须核对的三个点第一确认 images 和 labels 的文件名一一对应数量一致。第二打开 classes.txt 确认类别数和顺序6 个类别对应 class_id 0~5如果训练时 nc 设错模型会直接报维度不匹配。第三随机抽几张图跑可视化脚本确认框的位置和类别标签合理。这三步做完再动训练脚本能省掉后面很多排查时间。3. 从零跑通 YOLOV5 训练环境、配置与启动命令3.1 环境准备与依赖安装YOLOV5 对环境的容忍度比较高Python 3.8~3.10 都能跑PyTorch 选 1.8 以上版本即可。如果你用 conda可以按下面这套来conda create -n yolo_cig python3.9 conda activate yolo_cig pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install -r requirements.txtrequirements.txt 在 YOLOV5 仓库根目录下主要包含 opencv-python、numpy、tqdm、matplotlib、pyyaml、requests 等。如果你没有 GPU把 torch 的安装命令换成 CPU 版本即可但训练 400 张图在 CPU 上大概要跑几个小时建议至少用一张 6GB 显存以上的卡。提示安装完 torch 后用python -c import torch; print(torch.cuda.is_available())确认 GPU 是否可用。返回 False 的话检查 CUDA 版本和 torch 版本是否匹配。3.2 data.yaml 的写法与路径陷阱YOLOV5 训练时靠一个 yaml 文件告诉它数据在哪、有几类、类别名是什么。这份数据集对应的 data.yaml 可以这样写path: ./datasets train: images/train val: images/val nc: 6 names: [头部破损, 滤嘴破损, 烟身破损, 接缝开裂, 端面缺损, 其他破损]path 是数据集根目录train 和 val 是相对于 path 的图片路径。YOLOV5 会自动把 images 替换成 labels 去找标签所以 labels 目录不用写进 yaml。nc 是类别数必须和 classes.txt 里的行数一致。names 的顺序必须和 classes.txt 一致否则训练出来的模型会把类别名张冠李戴。常见翻车点path 用了绝对路径但换机器后路径变了或者 train 写成了datasets/images/train而 path 又设了./datasets导致实际找的是./datasets/datasets/images/train。建议 path 用相对路径且从 YOLOV5 根目录运行训练命令。3.3 训练命令与关键参数YOLOV5 的训练入口是 train.py最简命令如下python train.py --data data/cigarette.yaml --weights yolov5s.pt --img 640 --batch 16 --epochs 100 --name cig_v1逐项说明--data指向你写好的 data.yaml。--weights预训练权重yolov5s.pt 是最小的模型速度快适合先跑通流程如果显存够、想要更高精度可以换 yolov5m.pt 或 yolov5l.pt。--img输入图像尺寸。原图是 3024×4032YOLOV5 会先缩放到 img 指定的尺寸再送进网络。640 是默认值训练快但小目标可能丢1280 对小破损更友好但显存占用翻倍。--batch批大小。6GB 显存下 640 分辨率用 16 一般没问题1280 的话降到 8 或 4。--epochs训练轮数。400 张图的数据集100 轮通常能看到收敛趋势但别指望它像大数据集那样平滑。--name输出目录名结果会存在 runs/train/cig_v1 下。如果你想把训练和验证的图片路径写死在命令行里也可以用--train和--val参数覆盖 yaml 里的设置但不如 yaml 清晰。3.4 训练过程看什么指标启动后终端会打印每一轮的 box_loss、obj_loss、cls_loss 和 mAP0.5。box_loss 衡量边界框回归误差obj_loss 衡量目标置信度cls_loss 衡量分类误差。三个 loss 整体下降说明模型在学东西如果某个 loss 震荡不降可能是学习率偏大或标注有问题。mAP0.5 是验证集上的平均精度0.5 表示 IoU 阈值取 0.5。400 张图、6 类缺陷第一版跑出来 mAP0.5 在 0.4~0.6 之间算正常具体取决于类别平衡和标注质量。如果某一类的 AP 明显低于其他类大概率是那一类的样本太少或标注不一致。训练完成后runs/train/cig_v1/weights 下会有 best.pt 和 last.pt。best.pt 是验证集上表现最好的权重拿它做推理就行。4. 推理、验证与可视化确认模型真的学到了破损4.1 用 detect.py 跑单张和批量推理训练完之后最直接的验证方式是用 detect.py 跑几张验证集图片python detect.py --weights runs/train/cig_v1/weights/best.pt --source datasets/images/val --img 640 --conf 0.25 --save-txt参数含义--source可以是单张图、文件夹或视频。指向 val 文件夹就会批量跑完 80 张验证图。--conf置信度阈值低于这个值的框不输出。0.25 是常用起点漏检多就降到 0.1误检多就升到 0.4。--save-txt把检测结果按 YOLO 格式存成 txt方便和原始标签对比。跑完后结果默认存在 runs/detect/exp 下图片上会画出检测框和类别标签。重点看两类情况一是漏检即原图有明显破损但模型没框出来二是误检即把正常纹理或背景杂物框成了破损。漏检多通常是训练轮数不够或 img 尺寸太小误检多则可能是负样本不足或 conf 设太低。4.2 用验证集指标判断是否过拟合YOLOV5 训练结束后会自动在验证集上算 mAP你也可以单独跑 val.pypython val.py --weights runs/train/cig_v1/weights/best.pt --data data/cigarette.yaml --img 640 --task val输出里会按类别列出 precision、recall、mAP0.5 和 mAP0.5:0.95。如果训练集 loss 一直降但验证集 mAP 不升甚至下降说明过拟合了。400 张图的数据集很容易过拟合常见做法是加数据增强YOLOV5 默认开了 mosaic、翻转、HSV 扰动或者减少模型参数量用 yolov5s 而不是 yolov5l。注意验证集只有 80 张图指标波动会比较大。某一轮 mAP 突然掉 0.1 不一定是模型崩了可能只是那批验证图里难样本集中。看趋势比看单点更靠谱。4.3 可视化脚本与检测结果对照数据集自带的那个可视化脚本除了看标注也可以用来对照检测结果。做法是先用 detect.py 跑一张图把输出图存下来再用可视化脚本画一遍原始标注两张图并排看就能直观判断模型框和人工框的差异。如果模型框普遍比人工框小一圈可能是训练时 img 尺寸压得太狠小目标回归不准如果模型框位置对但类别错多半是类别样本不均衡。4.4 导出 ONNX 做跨平台验证如果你打算把模型部署到其他环境可以导出 ONNXpython export.py --weights runs/train/cig_v1/weights/best.pt --include onnx --img 640导出的 onnx 文件可以用 onnxruntime 加载推理确认输出维度和类别数对得上。这一步不是必须的但如果你后面要往 C 或边缘设备上搬提前验一遍能省掉部署时的格式坑。5. 避坑与排查6 个真实翻车记录5.1 训练报 “No labels found”现象启动训练后终端提示 No labels found或者 mAP 一直是 0。原因YOLOV5 找标签的逻辑是把图片路径里的/images/替换成/labels/再把扩展名换成.txt。如果你的目录结构不是 images/labels 平行或者 path 设错导致替换后路径不存在就会找不到标签。解决确认 datasets 下同时有 images 和 labels 两个目录且 train/val 子目录对应。用ls datasets/labels/train | head确认 txt 文件存在。如果目录名是imgs而不是images要么改目录名要么在 yaml 里用绝对路径分别指定 train 和 val 的图片位置但标签路径仍然依赖 images 替换规则所以改目录名更省事。5.2 类别数对不上导致维度报错现象训练启动时报RuntimeError: shape [16, 3, 6, 7, 7] is invalid或类似维度错误。原因data.yaml 里的 nc 和实际标签里的最大 class_id 不一致。比如 nc 写了 6但某个 txt 里出现了 class_id 6从 0 开始算就是第 7 类模型输出维度就对不上。解决用脚本扫一遍所有标签文件找出最大 class_id。如果确实有超出 0~5 的值要么是标注时类别选错了要么是 classes.txt 和实际标注不同步。修正标注或调整 nc确保 nc 最大 class_id 1。5.3 显存爆了但 batch 已经调到 1现象CUDA out of memory即使 batch 降到 1 仍然报错。原因YOLOV5 在训练前会做一次前向传播来推断锚框这一步的显存占用和 img 尺寸强相关。3024×4032 的原图如果 img 设成 1280 甚至更高即使 batch1 也可能爆。解决先把 img 降到 640 跑通确认流程没问题后再逐步升到 896 或 1024。另外可以加--rect参数用矩形训练减少 padding 带来的显存浪费。如果还是爆换更小的模型yolov5n.pt或减少 workers。5.4 验证集 mAP 高但实际推理漏检严重现象val.py 跑出来 mAP0.5 有 0.7但拿新图片推理时漏检很多。原因验证集和训练集来自同一批拍摄条件分布太接近模型记住了背景特征而不是缺陷特征。400 张图里如果训练集和验证集的拍摄角度、光照、背景高度相似验证指标会虚高。解决从验证集里挑几张背景差异大的图单独跑推理看漏检情况。如果确实漏检多说明数据多样性不够需要补充不同角度、不同光照的图片。在现有数据下可以调低 conf 阈值比如 0.1来减少漏检但会引入更多误检需要权衡。5.5 标签文件里有空行或格式错误现象训练时提示IndexError: list index out of range或某张图被跳过。原因txt 标签里有空行、多余空格或者某行只有 4 个值而不是 5 个。手工标注或转换过程中偶尔会引入这类问题。解决写个脚本扫一遍所有 txt检查每行是否恰好 5 个字段、值是否在 0~1 之间。发现异常行直接打印文件名和行号手动修正。下面这段脚本可以快速排查import os label_dir datasets/labels/train for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue path os.path.join(label_dir, fname) with open(path) as f: for i, line in enumerate(f, 1): parts line.strip().split() if len(parts) ! 5: print(f{fname} 第{i}行字段数{len(parts)}) continue vals [float(x) for x in parts[1:]] if any(v 0 or v 1 for v in vals): print(f{fname} 第{i}行坐标越界: {vals})跑完如果没有任何输出说明标签格式没问题。5.6 中文类别名在 yaml 里乱码现象data.yaml 里写了中文类别名训练时终端打印乱码或报编码错误。原因YOLOV5 读 yaml 时默认用 UTF-8但某些编辑器保存 yaml 时用了 GBK 编码导致读取时解码失败。解决用 VS Code 或 Notepad 把 data.yaml 另存为 UTF-8 无 BOM 格式。如果还是有问题可以先把 names 写成英文占位训练跑通后再改回中文确认是编码问题而不是其他配置问题。6. 小数据集提效技巧从 400 张图里榨出更多信息400 张图、6 个类别平均每类不到 70 个样本这个规模下模型很容易偏向样本多的类别。我一般会从三个方向压榨数据价值增强、采样和推理后处理。先说增强。YOLOV5 默认开了 mosaic、随机翻转、HSV 扰动和缩放但对香烟破损这种细长目标mosaic 有时会把目标切得太碎反而不利于学习。我的习惯是先把 mosaic 关掉跑一版基线再打开 mosaic 跑一版对比验证集 mAP。如果 mosaic 版本明显低就保持关闭用--hyp指定自定义超参数文件把mosaic: 0.0写进去。另外可以手动加一些旋转增强因为烟支在实拍图里角度变化不大旋转 15~30 度能增加角度多样性。再说采样。如果某一类比如端面缺损样本特别少可以在 data.yaml 里用--weights做类别加权或者在训练时用--balance参数让采样器偏向少样本类。更直接的办法是把少样本类的图片复制几份到训练集里但要注意验证集不能复制否则指标会虚高。复制时改一下文件名避免和原图重名。最后是推理后处理。YOLOV5 默认用 NMS 去重但对细长破损两个相邻的框可能被 NMS 误删。可以在 detect.py 里调--iou-thres默认 0.45降到 0.3 会让 NMS 更激进地删框升到 0.6 则保留更多重叠框。如果发现漏检集中在相邻目标上试着把 iou-thres 升到 0.55 看看。还有一个容易被忽略的点验证集的选择。80 张验证图如果全是同一批次拍摄的指标参考价值有限。我的习惯是从验证集里再切出 20 张作为“测试集”训练时完全不碰最后只用这 20 张做最终评估。虽然样本更少但至少能看出模型在未见数据上的真实表现。从那以后我每次拿到小规模数据集都强制先跑一遍标签格式检查、再跑一遍可视化抽检、最后切一个独立测试集这三步走完才动训练脚本。希望帮到你。本文还有配套的精品资源点击获取