ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

YOLO抽烟目标检测数据集全解析:从标注格式到训练调优实战

2026/9/8 11:32:41 拓冰建站 浏览量
YOLO抽烟目标检测数据集全解析:从标注格式到训练调优实战 简介面向目标检测、计算机视觉与深度学习实战人群的YOLO抽烟行为识别数据集适用于行人吸烟检测、工厂/校园安防监控、驾驶舱吸烟识别等场景也可作为目标检测算法入门与模型评估的标注数据。压缩包内共594个文件包含297张jpg原图与297个xml标注文件两者一一对应xml采用VOC格式记录类别标签与边界框坐标整体包体约59.11MB便于下载、解压后直接用于模型训练。已有366人学习下载。数据可直接接入YOLOv5、YOLOv8等主流框架进行训练、验证与推理省去自行采集和标注的时间不同场景下的抽烟图片能有效检验模型泛化能力特别适合用于算法调优、精度对比以及论文实验的数据支撑。无论是课程设计、毕业设计还是实际项目预研均可直接使用降低数据准备门槛。1. 通用目标检测模型为什么在抽烟场景频繁翻车我接过不少做安全生产监管的朋友的咨询问题几乎一模一样直接用开源的通用检测权重去抓吸烟行为效果惨不忍睹。模型要么把手指夹着的白色细条识别成别的东西要么烟头一靠近嘴边就彻底失踪。问题不在模型在数据。通用数据集里的“烟”概念太杂真正监控视角下的细烟、动态手势、远距离小目标覆盖率非常低。这也是我拿到这套“YOLO抽烟目标检测数据集”时最关注的点——图片和标定数据是配套好的能直接进入训练流程而不是扔一麻袋原始素材给你自己折腾。1.1 抽烟检测的真实部署场景比想象中更吃“数据”抽烟检测看起来是个小任务实际落地的场景却非常杂加油站、化工厂、林区入口、仓库、宿舍、医院、车站候车区甚至有些工地在禁止烟火区也会装检测摄像头。这些场景有一个共同特点它属于安全监管漏检的代价远高于误检。你宁可把拿笔的手误判成抽烟多弹一次报警也不能放任真有人在油库边上点烟而毫无反应。这种“漏检不可接受”的业务属性直接决定了数据集不能只追求通用性。我在给客户做方案时发现很多团队直接拿COCO预训练权重部署第一周演示效果还行等到了现场就露馅——为什么COCO里虽然有cigarette类别但样本大多是平面商品图、摆拍广告图人物动作单一背景干净。而实际监控里是俯视镜头、逆光、夜晚红外、运动模糊、人手遮挡模型没见过的分布实在太多了。1.2 抽烟目标本身的检测难点小、细、会变化继续说技术层面。烟这个目标在监控画面上有几个非常棘手的特点。烟支本身细长中等分辨率的摄像头在十米外拍到的烟往往只有十几个像素宽烟头燃烧点虽然亮但面积小和背景里的高光点很容易混淆点燃后的烟雾是半透明的轮廓模糊模型很难稳定提取边界手部的动作又千变万化夹烟、递烟、弹烟灰、衔烟每种动作下目标的形态都不一样。这些特点决定了一件事如果你拿一套给“车辆检测”或“行人检测”设计的数据集策略来搞抽烟检测大概率会翻车。烟的宽高比、尺度分布、颜色分布都太特殊必须用专门的采集和标注规范去喂模型。这也是垂直数据集存在的根本意义——它把“烟”从一个通用概念变成一组在该场景下可学习的视觉特征。2. 数据集内部结构拆解图片与标定文件如何协同拿到这套“YOLO抽烟目标检测数据集”第一件事不是急着训练而是先把文件结构摸清楚。在很多入门教程里大家关注的是模型代码怎么写其实数据集的结构和标定格式才是真正决定训练能不能跑通的前提。2.1 图片部分不同场景与尺度的样本组织方式以这套数据集的常见组织方式为例图片部分通常按场景和尺度做了分层室内近景、室外中远景、逆光、夜间红外、多人同框等。数据集的图片分辨率常见有720p、1080p和部分2K以上大图覆盖不同摄像头型号。这里有一个值得新手注意的点不要觉得图片分辨率越高就一定越好。YOLO训练时会做letterbox缩放把长边统一到imgsz通常是640或更高。如果原图过大缩放比例太狠小目标会被直接“缩没”。我通常的做法是把高分辨率大图单独留一份训练时用中分辨率推理阶段再对高分辨率原图做切块检测。这套数据集的图片组织方式也是这样近景和远景的样本在目录里做了区分方便你按策略挑选。2.2 标定文件一个txt就是一张图的“标准答案”标定数据在目标检测语境下指的就是每张图片对应的标注文件。YOLO格式的标注是纯文本文件名必须和图片名保持一致后缀为txt。例如frame_001.jpg对应的标定文件是frame_001.txt。每个txt文件里有很多行每行表示一个目标框格式是class_id x_center y_center width height注意这四个坐标值全部是归一化后的结果范围在0到1之间不是像素坐标。计算方式是目标框中心点的x像素坐标除以图片宽度y像素坐标除以图片高度框宽除以图片宽度框高除以图片高度。我举个例子一张1920x1080的图片某个烟支目标框左上角是(900, 480)右下角是(1020, 760)。中心点就是(960, 620)宽120高280。归一化之后x_center 960 / 1920 0.5y_center 620 / 1080 ≈ 0.574width 120 / 1920 0.0625height 280 / 1080 ≈ 0.259最终的标注行就是0 0.5 0.574 0.0625 0.259类别ID按实际设计填。新手最容易犯的错就是忘了归一化直接把像素坐标写进去训练时loss爆炸还找不到原因。如果你拿到数据集之后不确定格式对不对我建议先用Python读一两个txt检查坐标范围是否都在0到1之间再做可视化把标注框画回原图上人工核对。2.3 类别设计单类还是多类怎么选这套数据集的类别可以按你的业务目标灵活适配。最常见的做法有两种。方案类别设置优势劣势单类smoking整根烟/手持烟整体作为目标标注快类间混淆少模型容易收敛无法区分“烟”和“烟头”细粒度信息丢失多类cigarette烟支、smoke烟雾、person_smoking吸烟行为信息丰富可支撑更复杂的业务判断标注成本高样本不平衡问题明显对于安监场景我个人的建议是如果只需要判断“有没有人抽烟”用单类就够了稳定且误检少。如果要做智能营销、行为分析或者需要区分“正在吸”和“只是叼着烟”再考虑多类。选多类的话要特别注意类别之间的样本量差距比如smoke这种半透明目标特别难标样本少会导致这一类的recall明显偏低。2.4 训练集、验证集、测试集的划分规范数据集内部通常已经按7:2:1的比例拆好了train/val/test三个子目录images和labels一一对应smoking-dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/这里有一个很多人忽略的细节划分数据集时必须按“视频片段”划分而不是按“单帧”划分。如果同一段连续视频里的帧既出现在train又出现在val验证集的指标会被严重高估因为你等于让模型“背题”了。我拿到任何数据集的第一件事就是检查有没有同一来源画面的泄漏。一旦发现宁可牺牲部分训练数据也要保证验证集干净。3. 从零制作抽烟检测数据集的关键工序复盘你可能不需要从零做数据集但理解数据集是怎么做出来的能帮你判断手里的数据集质量如何也能在你需要扩充样本时知道该往哪个方向使劲。3.1 采集策略覆盖你部署时真实遇到的分布采集是整个流程里最不能偷懒的环节。做抽烟检测数据至少要覆盖这些变量视角平视、俯视、侧视。摄像头如果挂在高处俯视角度下烟支的形态和平视差异很大。距离近景人脸局部特写、中景半身、远景全身及环境。光照白天自然光、室内灯光、逆光、夜间红外。动作正常吸烟、夹烟走动、低头点烟、弹烟灰、叼烟工作。人员不同肤色、体型、是否戴手套、是否戴帽子口罩。采集时不必追求一次性录满我通常的做法是“先覆盖场景、再覆盖动作、最后覆盖硬件差异”。每新增一个摄像头点位它的画面色调、角度、清晰度都可能不一样这些差异最终都会影响模型的泛化能力。如果你手里的这套数据集场景单一建议优先补充“俯视室外逆光”这类实际部署中最常见、也最容易被漏采的样本。3.2 清洗哪些帧必须扔掉数据清洗不是可选项是必选项。我见过不少人图省事把采集到的视频逐帧抽出来直接丢进标注工具结果模型训练出来一堆“记忆噪声”。建议清洗掉这几类帧运动模糊严重的帧。当目标快速移动时烟支会产生拖影边界框无法准确标注。目标过小的帧。如果烟支在画面里不到10个像素标注了会让模型学到错误的纹理模式。画面完全遮挡的帧。手完全挡住烟或者目标在画面中不足0.1秒。重复帧。静止画面的连续帧之间信息量几乎为零按秒钟抽帧即可没必要逐帧抽。清洗完之后还要做一次重复性检查可以用图像的感知哈希pHash算相似度把相似度超过阈值的帧去掉一组避免模型过拟合到那几个画面上。3.3 标注工具与标注规范目前常用的标注工具有三款LabelImg是老牌工具简单直接输出Pascal VOC格式后脚本转YOLOX-AnyLabeling支持辅助自动标注标注速度能提升不少Label Studio适合团队协作有Web界面审核流程清晰。在标注规范上我有几条习惯了很久的约定边界框尽量紧贴烟支边缘但不要完全贴死留1到2个像素的余量否则框的抖动会引入噪声。目标被遮挡超过50%时不标注或者单独建一个occluded类。把这部分样本硬塞进正常类别会让模型对“完整目标”和“残缺目标”的概念产生混淆。多个目标挨得很近时各标各的框允许框与框重叠不要强行合并。标注完成后随机抽10%的图人工复查。重点看近视场景下有没有把烟和手指、滤嘴混淆。这里多说一句标注是个极度依赖“一致标准”的活儿。如果多人协作一定要先跑一套统一的标注文档否则A标得紧、B标得松模型学到的框分布会非常不稳定。3.4 标注格式的自动校验标注完成之后跑一遍脚本校验格式是非常值得的。脚本逻辑很简单检查四件事文件是否每行都是5个数值。class_id是否在类别范围内。坐标是否都在0到1之间。width和height是否大于0以及框面积是否小于整图面积的某个比例通常是0.001太小说明可能是脏标注。如果发现坐标越界常见原因是标注工具导出设置和YOLO要的格式不一致检查一下导出模板里的字段顺序很多时候只是把x和y或者width和height写反了。4. 把数据集喂进YOLO训练配置与评估指标实操4.1 数据集目录与data.yaml数据集拿到手之后用YOLOv5或YOLOv8训练的第一步都是写一个data.yaml。以这套抽烟检测数据集为例data.yaml长这样train: /path/to/smoking-dataset/images/train val: /path/to/smoking-dataset/images/val test: /path/to/smoking-dataset/images/test nc: 1 names: [smoking]这里有一个非常容易踩的坑官网示例里的train路径经常写相对路径一旦你换了工作目录就找不到数据。我建议一律写绝对路径或者在训练命令里用--data指定yaml的完整路径避免路径解析问题影响你对数据集本身的判断。如果你用的是多类方案把names和nc改成对应的类别列表和类别数即可。4.2 环境与硬件AMD RX 580 到底能不能跑很多人问过AMD RX 580这个显卡能不能跑YOLO训练要不要装CUDA。这个问题要拆开看。YOLO的PyTorch版本在官方支持上优先走NVIDIA CUDA生态。RX 580是AMD显卡在Windows上可以通过DirectML后端运行YOLOv8的部分功能在Linux上可以通过ROCm尝试但RX 580属于GCN老架构ROCm的支持并不完善。实测下来即使是相同价位AMD显卡在PyTorch训练场景的学习成本、兼容性问题都明显更多。掉到具体建议如果你手上只有RX 580想快速验证这个数据集跑通流程可以在CPU上用小模型、小batch先跑通或者用云GPU服务如果要做正式训练优先选NVIDIA显卡或者云端租一张Tesla T4、RTX 3060以上的卡。纠结AMD显卡的同学省下折腾环境的时间早点把模型跑起来收益更大。4.3 训练命令与关键超参数YOLOv8的训练命令很简洁yolo detect train datasmoking.yaml modelyolov8s.pt epochs100 imgsz640 batch16YOLOv5的写法稍有不同python train.py --data smoking.yaml --weights yolov5s.pt --img 640 --epochs 100 --batch 16几个关键超参数我给出比较稳的起点值model: 新手建议从yolov8s或yolov5s起步。用ssmall而不是nnano因为烟目标太小nano模型的容量不够。有条件再试m或l。imgsz: 640是通用值。如果你的部署场景中目标普遍偏小可以提到960或1280显存不够就配合降低batch。batch: 白卡显存有限batch设8到16之间。目标检测任务batch太大并不会像分类任务那样带来显著精度提升够用就行。epochs: 100轮起步。看val的mAP曲线是否在最后阶段还在缓慢上升如果还在升就加轮次。加载官方预训练权重很重要不要从零训练。烟、手、人这些通用特征在COCO预训练里已经学好了你要做的只是让模型在垂直数据上做迁移而不是重新发明轮子。4.4 评估指标怎么看训练结束会输出一串指标别只看mAP。对抽烟检测来说我建议至少看三个数mAP0.5: 这个指标表示IoU阈值0.5时的平均精度。如果这个数低于0.85说明模型对烟这个类别的基础检测能力还不够。mAP0.5:0.95: 这个指标是在多个IoU阈值上的平均值更严格。低于0.5的话说明模型虽然能画出框但框的位置精度不行——这在安监场景里可能会触发误报。Recall召回率: 在所有真实烟目标里模型找回了多少。安全监管场景优先保Recall宁可误报不可漏报。训练日志里的train/loss和val/loss曲线也要留意。如果train loss一路下降val loss到某个点开始反弹就是过拟合的信号此时应减少epochs或增强数据正则化。还有一个常见问题val指标看起来不错但实际部署到别的摄像头效果极差。这种“过拟合到特定摄像头风格”的情况多半还是数据多样性不足要从采集侧补样本而不是继续调参数。5. 实测中四种高频翻车现场与我的调优顺序我用类似的数据集做过几次完整的训练和部署以下四种情况几乎是每次都会遇到的提前了解能省不少排查时间。5.1 远距离小目标漏检最典型的问题。摄像头安装在8米高的立柱上画面里的烟可能只有10乘30像素。YOLO下采样到40x40特征图时这个目标就只剩下零点几个像素特征完全消失。我的调优优先级是先提高imgsz到960或1280看看收益如果显存不够改用SAHI这类切图推理方案把原图切块分别检测再合并最后再考虑给YOLOv8加P2小目标检测头。P2层原图的1/4分辨率对小目标的召回率提升很明显但训练显存和耗时也会相应增加需要评估部署端的硬件条件。5.2 把笔、手指、吸管误判成烟这是误报的大头。笔的颜色、形状和烟支高度相似尤其是手指夹着笔这个动作几乎可以以假乱真。网上很多方案教你把置信度阈值调高但这么做会同时压低真实的召回率不太推荐。我更建议走数据侧专门收集一段“手持笔、手持吸管、手指自然弯曲”的负样本视频抽帧后全部放在图片目录里对应的txt文件留空表示无目标。让模型在训练时看到足够多的“看上去像烟但实际不是”的例子它会自然学会区分边缘和纹理差异。这个操作的性价比远高于调参。5.3 白天效果好晚上红外画面完全拉胯监控摄像头在夜间会切红外模式画面变成灰度图对比度变化很大烟支中心和背景的亮度关系与白天相反。如果你手里的数据集几乎没有夜间样本模型在夜间漏检是必然的。解决方案也很直接一是扩充夜间红外样本哪怕只有一两百张效果都会明显改善二是训练时加入灰度化数据增强让模型不依赖颜色特征而是学习形状和纹理特征。Ultralytics的配置里可以开启灰度增强或者自己在预处理里加一步cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)后的合并处理。5.4 我的调优顺序总结我一般按这个顺序来处理现象第一优先做的操作次要方案漏检多、召回率低提升imgsz或切图推理加小目标检测头、增加近景样本误检多、精确率低增加负样本采集难样本、调整conf阈值夜间效果差加红外样本 灰度增强调整预处理归一化参数某些类别效果差检查该类别的样本数量过采样、调整loss权重顺序背后的逻辑很简单数据侧能解决的问题优先在数据侧解决然后再动模型和超参数。很多团队一上来就改网络结构反而把简单问题搞复杂了。6. 最后分享两个最容易被忽略的实战经验第一个经验是关于数据增强的。我曾经为了让模型更“鲁棒”把Mosaic、MixUp、HSV扰动全部拉满结果训练出来的模型检测效果反而不如只用基础增强。后来排查原因发现烟的形态太细Mosaic拼图时目标经常被切到边缘模型学了一堆残缺的烟支特征。从那之后我在细长小目标数据上通常只保留轻度翻转和HSV扰动或者把Mosaic的关闭时机提前保留最后10轮左右的纯净训练让模型在最后阶段稳定收敛。第二个经验是“先用一百张图跑通再考虑全量”。我见过太多人拿到数据集第一步就启动大规模训练等了两天发现目录结构错了、标签格式错了、类别ID对不上白白浪费算力。正确做法是先从train里抽出一百张图小模型、小epochs跑一遍确认loss能下降、验证集能出指标再启动全量训练。这个“冒烟测试”的习惯能帮你把整个流程里的低级错误在半小时内暴露干净而不是在两天后炸在脸上。做目标检测越久越觉得数据集的精细程度比模型结构的选择更决定项目成败。希望这套抽烟检测数据集和这些经验能让你少走几段弯路。本文还有配套的精品资源点击获取