简介:面向目标检测学习与实战的抽烟行为数据集,适合使用YOLO系列模型训练吸烟识别任务的开发者,也适合作为课程设计、毕业设计或算法对比实验的素材。压缩包共594个文件,包含297张JPEG原图与297个XML标注文件,每张图片均有对应的标定数据,XML中保存目标框信息,可直接用于模型训练、验证,也能通过脚本转换为YOLO所需的txt格式。资源整体约59.11MB,图像与标注一一对应,规模适中,便于快速完成抽烟检测Demo的训练与效果验证。目前已有366人学习浏览,说明该数据集在同类素材中具备一定参考价值。拿到压缩包后可按文件名快速配对图像与标注,结合现成脚本即可接入YOLOv5、YOLOv8等训练流程,省去自行采集、清洗与标注的大量时间,让读者更聚焦模型调参与应用落地。 先聊点实际的。这几年做目标检测项目,抽烟行为识别绝对是工业界落地最多、需求最稳定的方向之一,尤其是工地安全、加油站禁烟、工厂消防这些场所。而任何一个能跑的抽烟检测模型,背后都离不开一套靠谱的数据集——我这里说的就是标题里那种“YOLO抽烟目标检测数据集,包含图片和标定数据”。说白了,它就是一批标注好“烟”“烟头”“打火机”或者“正在抽烟的人”的图片文件夹,外加对应的标签文件。标签文件里写的是每个目标在图像里的位置和类别,YOLO算法就是靠这些数据学会“看”的。
这篇文章我不打算讲空泛的概念,而是完完整整拆解这种数据集的构建逻辑、格式选型、训练评测和常见坑。不论你手头已经有一套现成数据集,还是打算从零开始攒一套,都能在这里找到可复用的方案。
1. 先搞清楚:抽烟检测数据集到底长什么样
1.1 图片文件和标定数据缺一不可
很多人刚接触目标检测时有个误区,以为“数据集”就是一堆图片。图片只是原材料,真正让模型学会识别的,是每张图片里那些标注框(bounding box)和类别标签。
以YOLO训练为例,一张图片通常对应一个同名但后缀为.txt的文本文件。文件里每一行代表一个目标,格式固定为:
- 左边第1个数字是类别编号:抽烟烟头烟盒打火机。编号按你写配置文件时的顺序来定;
- 后面4个数字分别是归一化后的中心点x坐标、中心点y坐标、框宽、框高。所有数字都在0到1之间,用图片的宽高做归一化。
举个例子,某张1280x720的图中,一个香烟目标位于坐标(640, 360)附近,宽80像素、高240像素,那么标签文件里对应的行就是:
0 0.5 0.5 0.0625 0.333因为640/1280=0.5,360/720=0.5,80/1280=0.0625,240/720=0.333。这个归一化过程不是可选项,而是必须项。如果直接把像素坐标喂给YOLO,模型对不同分辨率的图片会无所适从。
1.2 两类标注模式:目标框检测 vs 行为识别
我见过不少团队在“抽烟检测”这个需求上绕进死胡同,卡在最顶层的问题上:到底应该标“烟”,还是标“正在抽烟的人”?
- 如果标注目标是“香烟/烟头”,模型学到的是局部特征,适合近距离特写,比如桌面烟灰缸、车窗内抽烟的抓拍;
- 如果标注目标是“正在抽烟的人”(通常包括手部到嘴部的动作区域),模型学到的是行为特征,适合监控画面的中远距离视角。
这两者没有绝对优劣,完全取决于你的摄像头位置和业务目标。工业现场往往会混合标注:远距离时框人、近距离时框烟。我遇到一个做工地安全帽+抽烟双检测的项目,就是在大范围监控里以人为检测主体,同时单独训练一个模型专门框烟头,两路结果做逻辑融合。这种做法比单模型硬扛要稳得多。
2. 标定数据怎么来:从标注工具到格式转换
2.1 工具选型与标注流程
拿到了原始图片,下一步就是做标定。开源工具里我用得最多的是 LabelImg 和 X-AnyLabeling,这两个足够应付99%的场景。
- LabelImg:老牌工具,支持Pascal VOC和YOLO格式直接输出,快捷键顺手,适合团队批量作业,缺点是对旋转框、多边形等复杂标注支持较弱;
- X-AnyLabeling:带自动预标注功能,可以先用一个已训练的模型帮你生成初版框,人工再修正,效率提升非常明显,特别适合几千张起步的中型数据集。
标注流程上我建议按“先粗后细”来走:第一轮把所有明显目标快速框完,第二轮专门做审查修正,把遗漏的补上、把框大的缩小。不要指望一次标完就完美。实际项目里,一份2万张图的抽烟数据集,光两轮标定加交叉审核,就花掉了3个人两周时间。这个时间成本很难压缩,只能靠好的工具链减少返工。
2.2 四种常见格式,到底选哪种
做检测的人绕不开格式转换。常见的有四种:
- YOLO txt:每张图一个txt,前面已经说过,训练效率最高,也是YOLO系列的默认输入;
- VOC XML:Pascal VOC标准,一个XML对应一张图,信息冗余大,主要为了兼容老框架;
- COCO JSON:所有标注写在一个大JSON里,带
images、annotations、categories三段结构,适合用mmdetection或Detectron2训练; - LabelMe JSON:多边形标注为主,适合做实例分割,转检测框时需要额外计算外接矩形。
我的建议很直接:如果主要用YOLO系列,直接标成txt;如果团队里有人要同时跑不同类型的模型,就以COCO JSON作为中间交换格式,需要时再转成其他格式。labelme2coco和voc2yolo这类脚本网上很多,但转的时候务必检查两点:类别顺序有没有对错、归一化坐标有没有越界。坐标小于0或大于1的情况,训练时会直接报错,排查起来相当花时间。
3. 构建一个能用好用的抽烟数据集,细节决定成败
3.1 数据划分不能偷懒
业内标准划分是训练集:验证集:测试集 = 8:1:1。但重点不在比例,而在划分方式。
我的建议是按场景划分,而不是按文件简单随机切。什么意思?假设你摄像头A拍的是白天的工厂车间,摄像头B拍的是傍晚的加油站,摄像头C拍的是夜间停车场。如果随机划分,很可能同一场景的画面同时出现在训练集和测试集里,模型看似精度很高,一旦部署到新场景就立刻掉点。
按场景划分的做法是:把来自同一摄像头、同一时间段、同一光线条件的图片归到同一个大组里,再把大组整体按比例划分。这样才能真实检验模型的泛化能力。
3.2 图像质量与背景多样性
我踩过最大的坑,是为了凑数量把大量模糊图和重复截图塞进数据集。模型训练起来loss降得很漂亮,一到真实摄像头画面就“失明”。后来我总结出一个筛选标准:
- 分辨率低于640x640的图片直接丢弃,宁可要少量高清,不要大量模糊;
- 同一视频流里抽帧,间隔至少20帧以上,避免连续帧高度相似;
- 每张图里除了抽烟目标,最好保留对应的正常背景,比如空手打电话、手拿饮料的负样本,否则模型容易把手部动作误判为抽烟。
负样本这个点很多人会漏掉。我有一次接手一个数据集,正样本画面上几乎人人的手都举在嘴附近,模型学出来之后误报率奇高,后来专门补了三千多张“手拿矿泉水”“手摸下巴”的图片做负样本,误报才压下来。抽烟检测本质上是“找差异”,没有足够的正常行为做对比,模型根本不知道什么算异常。
3.3 数据增强:别把增强当万能药
YOLOv8自带的增强已经很强,包括Mosaic、随机仿射、HSV扰动、翻转等。训练抽烟检测时,我一般只改几个关键开关:
- Mosaic开启,但把它出现概率调到0.5左右。Mosaic对提升小目标检测很有帮助,但概率过高会让模型看到太多拼接图,反而干扰行为动作的完整性;
- 上下翻转在监控场景里必须关掉。摄像头是固定的,地面不可能突然跑到天上去。开了这个增强,等于主动教模型学错误空间关系;
- 亮度、对比度扰动可以开到较大范围,抽烟场景经常有逆光、夜视、强灯光变化,这一项非常管用。
补充一点,外部增强脚本(比如用Albumentations)适合在数据量真的不足时使用。如果图片本身就超过两万张,靠内置增强就足够了,额外引入外部增强只会拖慢训练速度,收益很有限。
4. 训练前必须理清的评价指标与配置逻辑
4.1 用mAP说话,别只盯着loss
很多新手训练目标检测模型,看完loss曲线就发朋友圈说“收敛了”。但loss低不等于检测准,真正要盯的是验证集上的几个指标:
- Precision:预测出来的框中,真正是目标的占比;
- Recall:所有真实目标中,被模型找回来的占比;
- mAP@0.5:IoU阈值取0.5时的平均精度,是目标检测最经典的参考值;
- mAP@0.5:0.95:对不同IoU阈值(从0.5到0.95,步长0.05)求平均,更严苛,反映模型框的定位精度。
实际项目中,我只认一个原则:先看Recall是否达标。抽烟检测漏报一个,比误报一个严重得多。误报顶多多一条日志,漏报可能直接出安全事故。所以调参时优先提高Recall,再去通过提高置信度阈值把Precision拉回来。
4.2 YOLO版本选择与训练参数参考
YOLO系列现在可选版本非常多,v5、v8、v9、v10甚至2024年出的YOLO11,各有侧重。我的经验是:
- 如果是边缘设备部署,比如树莓派或Jetson Nano,用YOLOv5s或YOLOv8n,体量小、推理快;
- 如果服务器上有独立显卡,追求精度,直接上YOLOv8m甚至YOLOv8l;
- 如果是研究性质而非工程落地,可以试试YOLO11,但工程上我还是v8最顺手,社区资料最全,遇到问题最好搜到方案。
一组参考训练参数(以YOLOv8为例,显卡用RTX 3090):
- batch size:16到32,视显存定;
- epochs:120到200,不要设300以上,容易过拟合;
- img-size:640x640,这是一个精度和速度的均衡点;
- patience:默认50,用于早停,防止后续epoch白跑;
- workers:4到8,Windows上不要设太高,否则可能报DataLoader多进程错误。
训练过程里,我习惯每10个epoch存一次权重,并且把best.pt和last.pt都保留。best.pt是验证集mAP最高的那一次,last.pt是最后一次epoch的结果,两者用途不同。实际部署时绝大多数情况用best.pt就够了。
4.3 损失函数与调参心得
很多初学者会在训练前纠结要不要改造损失函数。我的观点是:先跑通基线,再谈自定义。YOLOv8默认包含分类损失、定位损失、置信度损失三者加权求和,模型自己会平衡,一般不需要动。
真正影响效果的三件事,优先级从高到低依次是:数据质量、锚框或Anchor策略、训练时长。
数据质量前面已经展开。锚框方面,YOLO系列会自动根据训练集统计出合适的先验尺寸,但你可以在ultralytics的yaml里用anchors字段手动指定。比如你的检测目标多数是从远处看的整根香烟,比例细长,那么锚框宽高比可以多设一些细长型。不确定怎么设的话,直接跑一次auto anchor会帮你算。
5. 训练过程中的常见问题与排查技巧
5.1 常见问题速查表
这里整理了一份我在多个项目中沉淀下来的问题排查表,直接对照参考:
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 验证集mAP迟迟不涨 | 标注框质量差,中心点偏移 | 抽检200个标注框可视化修正 |
| 训练loss下降快、mAP差 | 过拟合,数据多样性不足 | 补数据、增加增强、降低epoch |
| 推理时漏检小目标 | 原图分辨率低或下采样过大 | 提高训练分辨率到960x960,或加小目标检测头 |
| 误报高,把打火机当烟 | 类别特征不够明显 | 增加打火机样本量,或合并为“疑似吸烟物”类别 |
| 同一张图反复闪框 | NMS阈值过低 | 把IoU阈值从默认0.5提高到0.6左右 |
| GPU显存占用异常高 | batch size太大 | 减小batch size或用梯度累积步数 |
| 模型在夜间效果断崖下跌 | 训练数据缺少夜间样本 | 单独补充红外/低光照增强数据 |
5.2 关于小目标检检测的优化心得
抽烟场景里最头疼的小目标,是远处监控画面中那个只有几十像素大小的烟头或者手上那根细烟。说实话,YOLOv5n和YOLOv8n在小目标上效果偏弱,因为网络下采样倍数大,细节在深层特征图里已经丢了。
三种有效手段:
- 提高输入分辨率到960或1280,这是最直接不过的,代价是推理速度下降;
- 在YOLOv8里开启多尺度训练,设置
scale=0.5和scale=1.5,让模型见过不同尺寸的目标; - 使用添加P2检测头的改进版本,也就是常说的“小目标检测头”。网络上有很多针对YOLOv8加入P2层的改进代码,复现时注意训练脚本的配套修改。
如果以上都试过还是不理想,回头检查数据分布。一张1280x720的图上,烟头目标只有20x20像素,那么它对模型的学习贡献是很低的。这时候可以剪裁原图,把包含小目标的区域裁出来单独作为训练样本,等于让小目标在画面里放大。这种方法在无人机视角的小目标检测中非常常见,同样适用于抽烟检测的远处镜头。
6. 部署与落地:让模型真正跑起来
6.1 模型导出与推理
训练完成后,一般需要把PyTorch权重导出为部署格式。最常用的是:
- ONNX:通用格式,配合ONNX Runtime或OpenVINO跨平台部署;
- TensorRT:英伟达显卡上推理速度最快,适合有实时要求的监控系统;
- OpenVINO:Intel CPU/核显上表现抢眼;
- NCNN/MNN:手机端和边缘盒子的选项。
导出时,输入尺寸要和训练时保持一致。如果训练时用的是640,导出也设640。我见过有人训练960、导出640,模型精度直接崩掉,因为感受野完全对不上。
6.2 后处理逻辑不能省
单靠模型输出的框来报警,误报会很多。工业级落地要加一道业务过滤逻辑。我自己常用的一套规则是:
- 连续N帧(比如3帧)都检测到目标才触发报警,避免偶然误检;
- 目标置信度阈值设0.45以上,现场误报严重的可以压到0.6;
- 同一检测目标在相邻帧的IoU大于0.5时,视为同一目标,避免重复计数;
- 与业务联动:比如只有人员在特定区域(如加油站卸油区、工地动火区)内抽烟才报警,区域外视为可忽略。
这些规则写在推理后处理的脚本里,用Python或者C++都能实现。别看它简单,能把误报率再降低一半以上。
7. 数据集的后续维护与扩展
数据集不是一次性资产。模型上线后,现场不断产生新的场景数据,一定要定期收集反馈样本,回灌到数据集里做增量训练。我建议团队做两件事:
- 每周导出一批现场误检和漏检样本,人工标注后并入训练集。不用等积累很多才训练,500到1000张就能做一次微调;
- 把模型版本和数据集版本对应管理起来,每次训练留好配置文件和训练日志。否则三个月后你想复现当时的精度,会发现数据变了、代码变了,什么都对不上。
积累三个月后,这套抽烟检测系统的精度一般都比刚上线时高出不少,因为现场数据才是最有价值的训练来源。
最后分享一个个人习惯:每次拿到新数据集,我先做一次快速可视化,把标注框画在图片上,随机看个二三十张。这一步不能跳过。很多标注工具导出的顺序、类别对不上号,都会在可视化时原形毕露。等图片和标注确认无误,再动手训练,省下的时间远比这一步花掉的多。
这个抽烟检测数据集本身不难,难的是把每个环节的细节都做扎实。按上面这套流程走下来,你手里就会有一套真正能训练出高精度模型的资产,而不是一堆躺在硬盘里“看着像能用”的图片加txt。
本文还有配套的精品资源,点击获取