news 2026/9/8 11:35:06

YOLO抽烟检测数据集构建全攻略:图片标定、训练优化与部署避坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLO抽烟检测数据集构建全攻略:图片标定、训练优化与部署避坑

简介:面向目标检测学习与实战的抽烟行为数据集,适合使用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里,带imagesannotationscategories三段结构,适合用mmdetection或Detectron2训练;
  • LabelMe JSON:多边形标注为主,适合做实例分割,转检测框时需要额外计算外接矩形。

我的建议很直接:如果主要用YOLO系列,直接标成txt;如果团队里有人要同时跑不同类型的模型,就以COCO JSON作为中间交换格式,需要时再转成其他格式。labelme2cocovoc2yolo这类脚本网上很多,但转的时候务必检查两点:类别顺序有没有对错、归一化坐标有没有越界。坐标小于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.5scale=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。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 11:35:00

CRMEB多商户JAVA版实战:从B2B2C架构到宝塔部署与Redis排坑

简介:CRMEB多商户JAVA版B2B2C商家入驻平台系统,是一套基于Java、SpringBoot、Vue和uni-app构建的多商户商城全栈源码。面向有二次开发需求的企业开发团队,可用于快速搭建包含商家入驻、商品管理、订单处理、物流跟踪、财务统计等完整业务闭环…

作者头像 李华
网站建设 2026/9/8 11:34:57

AI如何重塑接口用例设计:从2小时到3分钟

打开接口文档准备设计用例的时候,一种最常见的体验是:刚开始十几分钟还挺清醒,看字段、推类型、枚举正常场景;等到第二十多个接口摆到面前,脑子里已经只剩“这个参数到底要不要传”“那个返回字段在异常时是不是可能缺…

作者头像 李华
网站建设 2026/9/8 11:34:45

前端测试有效性:从行为设计到最佳实践

1. 无效测试的典型症状:你的测试到底在测什么先说结论:很多团队的前端测试,写了跟没写一样。这不是嘲讽,是我看了太多项目代码之后得出的真实感受。一个很有意思的现象,你去面试前端岗位,简历上十个有九个写…

作者头像 李华
网站建设 2026/9/8 11:33:59

FPGA入门必做:HDMI环路输出实验详解

做FPGA视频方向,绕不开的第一个实战题目就是HDMI。我带过的同学里,十个有八个点完灯之后就不知道该干嘛了——其实最该做的,就是“HDMI视频输入与环路输出实验”。这个题目听起来有点专业,拆开看就是:把一路HDMI信号源…

作者头像 李华
网站建设 2026/9/8 11:31:58

2027研究生开题报告一键生成工具完整度与价格横评

2027研究生开题报告一键生成工具完整度与价格横评 在电气工程与智能电网多能互补综合能源系统(IES)低碳优化调度与能量管理策略方向的研究生开题阶段,很多硕博同学都在寻找高效且严谨的开题辅助工具:2027研究生开题报告一键生成工…

作者头像 李华