资讯动态

YOLO抽烟检测数据集实战:从标注格式到训练推理全流程拆解

发布时间:2026/10/19 12:18:07 来源:尧图企业网站定制
简介这份YOLO抽烟目标检测数据集面向计算机视觉初学者与目标检测实践者用于训练和验证吸烟行为识别模型可应用于公共场所禁烟监控、工地安全巡检等场景。资源包共594个文件由297张jpg图片与297个xml标注文件一一对应组成压缩包约59.11MBxml采用Pascal VOC格式记录目标类别与边界框坐标可直接转换为YOLO训练所需的txt标签省去自行标注的时间成本。目前已有376人学习下载具备一定的参考热度。数据集覆盖多种人物姿态与拍摄角度图片命名规范、标注与图像严格配对便于按比例划分训练集、验证集与测试集快速搭建数据加载与增强流程。读者可基于此完成模型训练、精度评估与推理部署的完整链路也可用于对比不同检测算法的性能差异是入门目标检测与行为识别任务的实用素材。1. 从一次翻车现场说起这套 YOLO 抽烟检测数据集到底能干什么去年帮一个做智慧工地安全巡检的朋友调模型他手里有一批现场摄像头截图想自动识别工人有没有在禁烟区抽烟。想法很直接但卡在了第一步——没有标注数据。网上找的开源数据集要么类别对不上要么标注格式是 VOC XML跟他用的 YOLO 训练脚本对不上号。折腾了三天最后发现真正缺的不是模型结构而是一份拿来就能用的抽烟目标检测数据集。这次要拆的这份资源就是冲着这个场景来的一批已经标好的抽烟行为图片标注文件直接适配 YOLO 系列训练流程。它解决的不是“模型怎么设计”的问题而是“数据从哪来、格式怎么对齐、训练脚本怎么接”的问题。适合两类人一是刚接触目标检测、想拿一个真实场景数据集跑通训练和推理全流程的新手二是手头有类似安防、巡检需求需要快速验证方案可行性的开发者。数据集本身不复杂但“能直接跑起来”这件事比想象中省事得多。2. 数据集结构与标注格式先搞清楚手里拿的是什么2.1 目录组织与文件命名习惯拿到一份目标检测数据集第一件事不是急着写训练脚本而是把目录结构摸清楚。这份抽烟检测数据集的组织方式比较典型常见做法是分成 images 和 labels 两个平行目录各自下面再按 train、val 甚至 test 划分。图片格式一般是 jpg 或 png标注文件是同名的 txt放在 labels 对应子目录里。一个典型的目录长这样smoking_dataset/ ├── images/ │ ├── train/ │ │ ├── 0001.jpg │ │ ├── 0002.jpg │ │ └── ... │ └── val/ │ ├── 0101.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── 0001.txt │ │ ├── 0002.txt │ │ └── ... │ └── val/ │ ├── 0101.txt │ └── ... └── data.yaml这里有个容易翻车的点图片和标注文件的文件名必须严格对应包括大小写。有些数据集从不同来源拼凑会出现图片叫IMG_001.JPG、标注叫img_001.txt的情况训练时找不到标签loss 直接不降。我一般会先跑一段脚本做文件名一致性校验确认没问题再往下走。2.2 YOLO 标注格式逐字段拆解YOLO 用的标注格式是每张图一个 txt每行代表一个目标框格式为class_id x_center y_center width height这五个字段都是归一化到 0 到 1 之间的浮点数。class_id从 0 开始编号这份数据集如果只检测“抽烟”一个类别那所有行的 class_id 都是 0。x_center和y_center是框中心点相对于图片宽高的比例width和height是框的宽高相对于图片宽高的比例。举个例子一张 640x480 的图某个人手部夹烟的区域框在像素坐标 (320, 240) 为中心宽 80 像素、高 60 像素那标注行就是0 0.5 0.5 0.125 0.125计算方式x_center 320/640 0.5y_center 240/480 0.5width 80/640 0.125height 60/480 0.125。注意如果标注文件里出现大于 1 的数值说明标注时没有做归一化直接用了像素坐标。这种情况需要自己写脚本转换否则训练时框会跑到图片外面去。2.3 data.yaml 配置文件的写法YOLO 训练时需要一个 yaml 文件告诉它数据在哪、有几个类别、类别名是什么。这份数据集的 data.yaml 常见写法如下path: ./smoking_dataset train: images/train val: images/val nc: 1 names: 0: smokingpath是数据集根目录train和val是相对于根目录的图片路径。nc是类别数量这里只有抽烟一个类所以是 1。names是类别索引到名称的映射推理时输出的类别名就来自这里。如果后续想扩展成“抽烟”和“打电话”两个类只需要把 nc 改成 2names 里加一行1: calling然后确保标注文件里对应类别的 class_id 正确即可。这个配置文件看着简单但路径写错、缩进用 tab 而不是空格都会导致训练启动时报错。我习惯用python -c import yaml; yaml.safe_load(open(data.yaml))先验证一下 yaml 能不能正常解析。3. 从零跑通训练环境、命令与参数调优3.1 环境准备与依赖安装这份数据集适配的是 Ultralytics 版本的 YOLO也就是常说的 YOLOv5 或 YOLOv8 那一套。环境准备不复杂但版本对齐很重要。我一般用 conda 建一个干净环境避免和系统里的包打架conda create -n yolo_smoke python3.9 -y conda activate yolo_smoke # 安装 PyTorch根据自己显卡的 CUDA 版本选对应命令 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 ultralytics pip install ultralytics装完之后用yolo checks看一眼环境确认 PyTorch 能识别到 GPU。如果显示 CPU only训练会慢到怀疑人生。显卡驱动和 CUDA 版本对不上是新手最常见的翻车点表现是torch.cuda.is_available()返回 False这时候别急着换代码先查驱动版本和 CUDA 版本是否匹配。3.2 训练命令与关键参数说明环境没问题之后训练命令其实就一行yolo detect train \ data./smoking_dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ project./runs/smoke \ nameexp1逐项说一下这几个参数。data指向刚才的 yaml 文件。model是预训练权重yolov8n 是最小的 nano 版本速度快、精度够用适合先跑通流程如果显存充足可以换 yolov8s 或 yolov8m。epochs是训练轮数100 轮对这个小数据集通常够收敛但要看 loss 曲线决定要不要加。imgsz是输入图片尺寸640 是默认值如果原始图片分辨率很高可以调到 1280但显存占用会明显上升。batch是批大小16 在 8G 显存上比较稳爆显存就降到 8 或 4。lr0是初始学习率0.01 是 YOLO 系列的常用值数据集小的时候可以降到 0.001 防止过拟合。训练过程中会在runs/smoke/exp1下生成权重文件、loss 曲线和验证结果。重点看results.png里的 box_loss 和 cls_loss 是否稳定下降如果震荡剧烈多半是学习率太大或者 batch 太小。3.3 推理验证与结果解读训练完之后拿验证集或自己的图片跑推理yolo detect predict \ model./runs/smoke/exp1/weights/best.pt \ source./smoking_dataset/images/val \ conf0.25 \ saveTrueconf是置信度阈值低于这个值的框会被过滤掉。0.25 是常用起点如果发现漏检多就降到 0.1误检多就升到 0.5。推理结果默认保存在runs/detect/predict下每张图会画出检测框和类别置信度。看结果的时候别只看画框的图要对照原始标注看有没有漏标或错标。数据集质量比模型结构更影响最终效果如果标注本身把烟头、手指、打火机混在一起标成 smoking模型学出来的框会很不稳定。我一般会随机抽 20 张训练图把标注框画出来和原图叠在一起看确认标注区域确实是抽烟行为本身而不是周围无关物体。4. 避坑与排查训练不收敛、显存爆炸、标注错位怎么处理4.1 现象loss 不下降或震荡剧烈原因最常见的是学习率过大、batch 太小导致梯度噪声大或者标注文件里有大量越界框坐标大于 1 或小于 0。另外如果 data.yaml 里 nc 写错比如实际有 2 类但 nc 写了 1模型会把第二类当成背景loss 也会异常。解决先把 lr0 降到 0.001 试 10 个 epoch看 loss 是否开始下降。同时写脚本扫描所有标注文件检查每行是否有超出 [0,1] 范围的数值。如果 nc 写错修正后重新训练。我习惯在训练前跑一遍数据校验脚本把越界框、空标注文件、图片损坏这些问题提前暴露出来。4.2 现象CUDA out of memory原因batch 太大、imgsz 太高或者显卡被其他进程占用。YOLO 训练时显存占用和 batch * imgsz 基本成正比。解决先把 batch 减半如果还爆就把 imgsz 从 640 降到 416。另外用nvidia-smi看一下是不是有残留进程占着显存有的话 kill 掉再跑。如果显卡本身显存小于 6G建议直接用 yolov8n 加 imgsz416别硬上大模型。4.3 现象推理时框的位置明显偏移原因标注时用的归一化基准和推理时不一致。比如标注时按图片原始尺寸归一化但推理时 YOLO 会把图片 resize 到 imgsz如果 resize 时没有保持宽高比框就会偏。另一种可能是标注文件里的坐标是像素值而不是归一化值训练时被当成归一化值用了。解决检查标注文件里是否有大于 1 的数值有的话说明没归一化。另外确认推理时的 imgsz 和训练时一致YOLO 默认会做 letterbox 保持宽高比一般不会偏但如果自己改了预处理逻辑就要注意。4.4 现象验证集指标很好但实际场景漏检严重原因训练集和验证集分布太接近或者数据量太少导致过拟合。这份数据集如果场景单一比如都是同一个摄像头角度模型学到的是背景特征而不是抽烟行为本身。解决尽量在验证集里放不同角度、不同光照的图片。如果数据量确实少可以用 YOLO 自带的增强参数比如degrees10、hsv_h0.015、flipud0.5在训练时随机旋转、调色、翻转增加样本多样性。但增强不是万能的如果原始数据里抽烟行为本身就不清晰增强也救不回来。4.5 现象训练完模型文件很大推理速度慢原因用了较大的模型如 yolov8l 或 yolov8x或者没有做模型导出优化。解决如果只是验证方案yolov8n 足够。如果要部署到边缘设备可以把训练好的 pt 文件导出成 ONNX 或 TensorRTyolo export model./runs/smoke/exp1/weights/best.pt formatonnx导出后推理速度通常能提升 20% 到 50%具体取决于硬件。导出时注意 opset 版本和推理引擎的兼容性ONNX Runtime 一般用 opset 12 或 13 比较稳。5. 二次开发与改造从单类检测到多场景适配的实用技巧5.1 扩展类别加一个“打电话”检测如果业务场景里还需要检测打电话行为最直接的做法是在现有数据集基础上补充打电话的标注图片然后把 data.yaml 改成nc: 2 names: 0: smoking 1: calling标注文件里打电话的框 class_id 写 1。重新训练时建议用之前训练好的权重做初始化而不是从 COCO 预训练权重开始这样收敛更快。命令里把model换成./runs/smoke/exp1/weights/best.pt即可。5.2 替换主干网络换更轻量的 backbone如果部署设备算力有限可以把 YOLOv8 的 backbone 换成 MobileNet 或 ShuffleNet。Ultralytics 支持通过 yaml 配置文件自定义模型结构常见做法是复制一份 yolov8n.yaml把 backbone 部分的 Conv 模块替换成轻量卷积。改完之后用yolo detect train model./custom_yolov8n.yaml从头训练。这个操作对新手不太友好建议先把默认模型跑通再折腾。5.3 数据增强策略调整针对抽烟场景的定制抽烟检测有个特殊点烟头很小如果增强时缩放太狠烟头可能直接消失。我一般会把scale参数控制在 0.5 以内避免过度缩小。另外mosaic增强默认开启它会把四张图拼成一张对小目标检测有帮助但如果图片里抽烟区域本来就小mosaic 后可能更小这时候可以适当降低 mosaic 概率。5.4 模型导出与部署验证训练完的模型最终要落到实际业务里。如果部署在服务器上可以用 ONNX Runtime 或 TensorRT如果部署在边缘设备可以用 NCNN 或 OpenVINO。导出命令前面提过这里补充一个验证导出模型是否正确的技巧用同样的验证集分别跑 pt 和 onnx 模型对比检测框数量和置信度如果差异超过 5%说明导出过程有问题重点检查输入尺寸和归一化参数是否一致。5.5 一个我踩过的坑别在训练集上调参刚开始做这个项目的时候我习惯在训练集上看 loss 和指标觉得降得不错就收工。结果上线后发现实际场景漏检严重。后来才意识到训练集上的指标只能说明模型“记住”了这些图不能说明它“学会”了抽烟行为。从那以后我每次训练都强制留出一部分完全没参与训练的图片做最终验证哪怕数据量少也要留 10% 出来。这个习惯帮我省了很多次返工。希望这份拆解能帮你把这份抽烟检测数据集顺利跑起来少走点我当年走过的弯路。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑