从零构建吸烟检测数据集:YOLOv8训练与工程实践全解析
发布时间:2026/9/4 7:44:27 锦皓数字建站

简介本资源是面向人工智能与计算机视觉初学者及算法工程师的吸烟行为识别专用标注数据集适用于目标检测、图像分类等监督学习任务助力构建吸烟场景下的健康风险评估模型。压缩包共1567个文件含783张JPG格式吸烟场景实拍图像与对应783份XML标注文件遵循PASCAL VOC格式含边界框与类别标签另附1份说明文本整体体积31.71MB结构清晰、开箱即用。已有158人下载学习适合作为课程实验、毕业设计或轻量级AI项目的数据基础。用户可直接加载图像与标注进行数据增强、模型训练与评估无需额外清洗XML文件支持主流框架如TensorFlow Object Detection、YOLOv5快速接入配套结构便于批量解析与可视化验证。1. 项目概述从“吸烟数据集”看计算机视觉的落地挑战最近在做一个关于公共安全与健康监测的视觉项目核心需求是识别特定场景下的吸烟行为。团队一开始的想法很直接找个现成的“吸烟数据集”来训练模型。但当我们真正开始寻找和构建时才发现事情远没有“下载-标注-训练”那么简单。一个高质量的“吸烟数据集带标注”其背后涉及的需求定义、数据采集伦理、标注规范制定、乃至模型适配性都是一连串需要深入思考和解决的工程问题。这不仅仅是标注几个边界框Bounding Box那么简单它直接关系到最终模型在真实场景中的表现是否可靠、是否可用。这个数据集的核心价值在于它旨在为基于计算机视觉的吸烟行为自动识别提供训练和验证基础。适用的场景非常广泛例如智慧园区/楼宇的消防安全监控、高铁站/机场等公共场所的文明行为督导、以及特定禁烟区域的自动化巡检。对于算法工程师、安防产品经理、甚至是公共卫生领域的研究者来说一个定义清晰、标注精准的数据集能极大地降低项目启动门槛避免在数据准备阶段重复“造轮子”。然而市面上公开的、可直接使用的吸烟数据集寥寥无几且质量参差不齐。这促使我们不得不从头开始系统地规划并构建自己的数据集。在这个过程中我们踩了不少坑也积累了一些关于如何构建一个“能用、好用”的专用视觉数据集的经验。接下来我将详细拆解从需求分析到数据标注的完整流程并分享其中的关键决策点和实操技巧。2. 核心需求解析与场景定义在动手收集第一张图片之前明确数据集的“使命”至关重要。一个模糊的需求会导致后续所有工作偏离方向。2.1 识别目标的精确定义“吸烟”这个行为在视觉上如何界定这是一个必须首先回答的问题。我们最初的定义是“人手持点燃的香烟”但这个定义在实操中遇到了挑战手持状态多样香烟可能在嘴边、手中、或夹在指间。手持的精确部位是否需要区分点燃状态判断在白天、夜晚、室内、室外香烟前端的“红点”是否可见烟雾是否作为辅助判断特征目标尺度变化远景中的人可能只占几十个像素手中的香烟更是细微目标近景中香烟可能清晰可见。数据集是否需要覆盖这种多尺度变化遮挡与干扰手可能部分遮挡香烟或者当事人正在使用手机、喝水其手持物与香烟形状相似。经过与业务方多次讨论我们将识别目标最终定义为“可见的、被手持的、呈细长圆柱状的物体其一端常伴有但不必须明显的亮斑模拟燃烧点或少量上升的烟雾纹理”。这个定义放宽了对“绝对确认点燃”的要求因为在实际监控视频中确认点燃极其困难。我们将“亮斑”和“烟雾”作为强化的正样本特征但并非必要特征这样能保证模型在多种光照和天气下的鲁棒性。2.2 应用场景与数据分布规划数据集必须服务于最终的应用场景。我们的主要应用是城市公共区域的固定摄像头监控。因此数据分布需要模拟真实监控条件视角以平视和轻微俯视为主模拟摄像头安装高度尽量避免极端仰视或俯视。光照必须覆盖白天、夜晚、黄昏、逆光、室内灯光、阴影交错等复杂光照条件。夜晚的数据尤其关键因为此时香烟的亮点是重要特征。背景场景应多样化包括办公室、楼道、公园、车站广场、餐厅门口等避免背景过于单一导致模型过拟合。人物状态包括行走中站立、坐着、交谈等多种姿态且人物可能部分出画。我们决定不追求海量数据例如数十万张而是采用“小规模、高质量、高覆盖度”的策略。初步目标设定为5000-8000张精心标注的图像确保每一张都在上述某个或多个维度上具有代表性。2.3 标注类型的确定基于YOLOv8等主流目标检测框架的需求我们选择矩形框Bounding Box标注作为主要标注类型。同时为了未来可能升级到关键点检测例如不仅识别香烟还想定位手部或嘴部以分析行为我们决定同步进行关键点标注。具体为目标框Bounding Box标注整个香烟物体。关键点Keypoints标注两个点分别是香烟的“过滤嘴端”和“燃烧端”如果可见。这为后续分析香烟朝向、手持方向提供了可能性。标注工具选择上我们对比了LabelImg、CVAT、以及热词中提到的labelme和makesense。最终选择了CVAT原因是其支持多人协同标注、关键点标注、属性标注如“是否有亮斑”、“是否有烟雾”并且具有完善的审核流程适合团队化作业。3. 数据采集策略与合规性考量数据采集是数据集构建的基石也是最容易涉及法律与伦理风险的环节。3.1 采集来源与方法我们采用了多源混合的采集策略以确保数据的多样性和合法性公开数据集筛选与重组从已有的公开人体动作、手持物数据集中如COCO的一部分人工筛选出包含类似香烟的棒状物体如笔、手机、冰淇淋的图片作为负样本或困难样本。绝对禁止直接使用未明确授权的人物肖像图片。模拟拍摄在可控的室内外环境邀请志愿者已签署知情同意书进行摆拍。这是获取高质量、精准标注数据的主要来源。我们会设计各种场景、姿势和光照条件。影视剧与广告素材从公开的影视作品、广告片中截取含有吸烟镜头的画面。这部分数据通常画质较高、场景丰富。这里有一个关键点必须确保使用的素材是已公开播出的并且其使用目的为“非商业性的学术研究”这通常在某些国家的著作权法“合理使用”条款范围内。但为稳妥起见我们仅将这部分数据用于内部模型测试不放入最终公开的数据集中。合成数据Synthetic Data使用Blender等3D建模软件生成虚拟人物和香烟模型在虚拟环境中渲染不同场景的图片。这种方法可以完美解决隐私和标注问题生成无限量的、标注绝对精确的数据。缺点是存在“仿真鸿沟”虚拟图像与真实图像的分布差异可能影响模型泛化能力。我们将其作为数据增强的补充比例控制在20%以内。注意隐私与伦理是红线。所有包含可识别自然人面孔的图像都必须进行去标识化处理如模糊化打码并获得当事人的明确授权对于摆拍。我们的原则是宁可数据量少也绝不使用来源不明、未授权的人物图像。3.2 数据预处理与清洗流程采集到的原始图像不能直接使用必须经过严格的预处理流水线去重使用感知哈希pHash或特征向量相似度计算剔除高度相似或重复的图片提高数据集的多样性。质量过滤自动过滤掉分辨率过低如宽度640像素、严重模糊、过度曝光或欠曝的图片。标准化将图像统一缩放到一个标准尺寸如640x640同时记录原始尺寸和缩放比例用于标注框的坐标转换。这一步通常在送入标注工具前完成以提升标注效率。初步分类根据场景室内/室外、光照白天/夜晚、人物数量等进行粗略分类便于后续均衡采样。4. 标注规范制定与质量控制标注质量直接决定模型性能上限。一份详尽、无歧义的标注规范文档是团队协作的基石。4.1 详尽的标注手册我们编写的标注手册核心内容包括目标框标注细则框体应紧密贴合香烟的可见部分边界与香烟边缘留有约1-2像素的间隙即可。对于被手指部分遮挡的香烟根据可见部分推测完整形状进行标注。对于与水平线有夹角的香烟使用水平矩形框而非旋转矩形框以兼容YOLO等标准检测框架。关键点标注细则“过滤嘴端”定位在香烟过滤嘴的末端中心。“燃烧端”定位在香烟烟草部分的最外端中心。如果燃烧的亮斑可见则标注在亮斑中心。如果某一端不可见如被完全遮挡则将该关键点标记为“不可见”在CVAT中设置为(0,0)并勾选occluded属性。属性标注has_glow: 布尔值。香烟前端是否有明显亮斑has_smoke: 布尔值。香烟上方是否有可见的上升烟雾occlusion_level: 枚举值无遮挡、轻微遮挡、严重遮挡。描述香烟被遮挡的程度。困难样本与负样本处理对于形状、颜色类似香烟但不是香烟的物体如笔、筷子、白色小棒糖不进行标注让其作为背景中的困难负样本帮助模型学习区分。明确界定“不确定”的情况如果标注员无法确信是否为香烟则标记为“存疑”由审核员最终裁定。4.2 多人标注与一致性校验即使有手册不同标注员的理解仍有差异。我们采用以下流程保证一致性培训与考核标注员必须通过标注测试在一组标准测试图片上的标注与“黄金标准”的IoU交并比平均值需大于0.85。重叠标注随机抽取20%的图片由两名不同的标注员独立完成。计算这两组标注之间对于同一目标的IoU。一致性计算与仲裁如果双人标注的IoU均值低于0.75说明规范存在歧义或标注员理解有偏差。需要召集标注员和审核员对有争议的图片进行讨论更新标注规范或提供更清晰的示例然后重新标注。定期校准每周进行一次校准会议回顾常见错误案例。4.3 审核与修正流程所有标注数据必须经过审核环节一审自动审核脚本检查标注文件格式是否正确、是否存在空标注、坐标值是否超出图像范围等基础错误。二审人工审核审核员逐张检查标注质量重点关注框体是否准确、关键点位置是否正确、属性标注是否合理。审核员有权直接修正轻微错误或将问题图片打回给原标注员修改。三审抽样审计项目负责人随机抽取5%的已审核数据进行检查评估整体标注质量。如果抽样错误率超过2%则该批次数据需要重新审核。5. 数据集构建与格式转换标注完成后需要将数据组织成模型训练所需的格式。5.1 目录结构设计一个清晰的结构有利于数据管理和版本控制。Smoking_Dataset_V1.0/ ├── images/ │ ├── train/ # 训练集图片 │ ├── val/ # 验证集图片 │ └── test/ # 测试集图片可隐藏标签 ├── labels/ │ ├── train/ # 对应训练集的标注文件 │ ├── val/ # 对应验证集的标注文件 │ └── test/ # 测试集标注如果有 ├── annotations/ # 可存放COCO格式的整合标注文件 ├── dataset.yaml # YOLO格式的数据集配置文件 └── README.md # 数据集说明文档5.2 标注格式转换CVAT导出的标注可能是XMLCVAT格式或JSONCOCO格式。我们需要将其转换为目标框架所需的格式。以最流行的YOLO格式为例YOLO格式的标签文件.txt每行代表一个目标格式为class_id x_center y_center width height其中坐标和宽高都是相对于图片宽度和高度的归一化值范围0-1。我们编写了转换脚本主要处理以下逻辑解析CVAT XML获取每个目标的box信息和points信息。将绝对像素坐标转换为归一化坐标。将关键点坐标也按相同规则归一化并按顺序排列。YOLOv8-Pose的格式通常为class_id x_center y_center width height px1 py1 visibility1 px2 py2 visibility2 ...其中visibility为0不可见、1可见但被遮挡、2完全可见。将属性信息如has_glow可以写入一个额外的JSON文件或通过修改类别ID来体现例如定义class 0为“普通香烟”class 1为“带亮斑香烟”具体取决于训练时的需求。5.3 数据集划分与配置文件我们按70%训练、15%验证、15%测试的比例随机划分数据集并确保每个子集中场景和光照的分布与整体分布大致相同。关键的dataset.yaml配置文件内容如下# dataset.yaml path: /path/to/Smoking_Dataset_V1.0 # 数据集根目录 train: images/train # 训练集图片相对路径 val: images/val # 验证集图片相对路径 test: images/test # 测试集图片相对路径可选 # 类别信息 nc: 2 # 类别数量例如0: cigarette, 1: cigarette_with_glow names: [cigarette, cigarette_with_glow] # 关键点信息如果做姿态估计 kpt_shape: [2, 2] # 2个关键点每个点2个坐标 (x, y) flip_idx: [] # 如果关键点对称需要定义翻转映射香烟不对称所以为空这个YAML文件是连接数据和YOLOv8训练脚本的桥梁。6. 基于YOLOv8的模型训练与验证实操有了高质量的数据集模型训练就成了水到渠成的事情但其中仍有大量细节影响最终效果。6.1 环境配置与数据准备我们使用Ultralytics YOLOv8框架因为它平衡了易用性、速度和精度。# 安装 pip install ultralytics # 检查数据集配置 # 确保dataset.yaml路径正确并且images和labels目录结构符合要求将准备好的dataset.yaml放在项目目录下。6.2 训练策略与超参数调优直接使用默认参数训练往往不是最优解。我们针对“小目标”香烟和数据集特点进行了调整from ultralytics import YOLO # 加载预训练模型使用YOLOv8n纳米型作为起点兼顾速度与精度 model YOLO(yolov8n.pt) # 开始训练 results model.train( datadataset.yaml, epochs150, # 增加迭代轮次因为我们的数据集是自定义的 imgsz640, # 图像尺寸与预处理尺寸一致 batch16, # 根据GPU显存调整 workers4, # 数据加载线程数 device0, # 使用GPU 0 patience30, # 早停耐心值如果验证集指标30轮无提升则停止 # 针对小目标的优化 cos_lrTrue, # 使用余弦退火学习率调度 lr00.01, # 初始学习率稍高因为是从头微调特征 lrf0.01, # 最终学习率为初始的1% # 数据增强强化对小目标尤其重要 mosaic1.0, # 使用马赛克增强的概率 mixup0.2, # 使用MixUp增强的概率 copy_paste0.1, # 使用复制粘贴增强的概率模拟遮挡 fliplr0.5, # 水平翻转概率 # 重点修改损失函数权重提升对小目标的关注 box7.5, # 框损失权重默认7.5 cls0.5, # 分类损失权重可以适当降低我们分类简单 dfl1.5, # 分布焦点损失权重默认1.5 )关键调整解析mosaic,mixup,copy_paste这些增强技术能极大地增加小目标在训练中的上下文多样性特别是copy_paste可以人工制造部分遮挡提升模型鲁棒性。box损失权重保持或略微调整确保定位准确。cls损失权重因为我们的类别数少且区分度相对明显可以适当降低让模型更专注于定位。学习率策略使用cos_lr并设置较高的lr0和较低的lrf让模型在初期快速收敛后期精细调整。6.3 训练过程监控与评估训练启动后利用Ultralytics内置的TensorBoard或本地日志进行监控损失曲线观察train/box_loss,train/cls_loss,val/box_loss,val/cls_loss。理想情况是训练损失平稳下降验证损失在后期波动不大。如果验证损失很早就开始上升可能是过拟合。性能指标重点关注metrics/mAP50-95(B)即IoU阈值从0.5到0.95步长0.05的平均平均精度。这是衡量模型综合性能的核心指标。对于吸烟检测我们同样关心metrics/mAP50(B)因为实际应用中IoU0.5的检出通常就可接受。验证集可视化定期查看模型在验证集上的预测结果直观感受模型在哪里犯了错漏检、误检、定位不准。这是调整数据增强和模型参数最直接的依据。6.4 模型导出与部署前测试训练完成后选择验证集上mAP50-95最高的权重进行导出和测试。# 导出为ONNX格式用于跨平台部署 yolo export modelpath/to/best.pt formatonnx # 使用测试集进行最终评估测试集标签不参与任何训练和调参 yolo val modelpath/to/best.pt datadataset.yaml splittest测试集的评估报告是模型性能的最终答卷。除了看mAP还要分析混淆矩阵和F1置信度曲线混淆矩阵看是否有将香烟误检为其他类似物体如笔或者将背景误检为香烟。F1置信度曲线帮助我们选择最优的置信度阈值。平衡查准率Precision和查全率Recall。在安防场景下我们可能更倾向于较高的查准率以减少误报警。7. 常见问题、避坑指南与效果优化在整个数据集构建和模型训练过程中我们遇到了许多典型问题以下是总结和解决方案。7.1 数据层面问题问题1模型对夜晚场景或背光场景泛化能力差。原因数据集中此类场景样本不足或标注时未突出香烟亮斑特征。解决数据层面针对性补充大量夜晚、低光照、高对比度场景的数据。在标注时确保将“亮斑”属性准确标注。训练层面使用更激进的颜色增强如hsv_h,hsv_s,hsv_v参数调整模拟不同光照和色偏。或者在模型输入前加入自适应直方图均衡化CLAHE等预处理模块增强低照度下的细节。问题2对小尺寸香烟漏检严重。原因YOLO默认锚框Anchor可能对极端小目标匹配不佳下采样倍数太高小目标特征在深层网络丢失。解决数据增强务必使用mosaic和mixup它们能将小目标“拼接”成更大的目标进行学习。模型结构考虑使用更浅的Backbone如YOLOv8n或修改Neck部分保留更多浅层特征图。YOLOv8的P2层下采样4倍对检测小目标很重要确保其有效参与检测头计算。锚框重聚类使用k-means算法在自己的数据集上重新聚类生成锚框尺寸使其更贴合香烟目标的大小分布。# 使用Ultralytics工具近似实现需自行计算数据集中所有目标的宽高 # 假设wh是包含所有目标宽高的numpy数组 from scipy.cluster.vq import kmeans anchor_boxes kmeans(wh, n9, iter300)[0] # n为锚框数量损失函数可以尝试使用WIoU或EIoU等更先进的回归损失它们对小目标定位更友好。问题3将手指、细长手机等误检为香烟。原因负样本不足模型没有学会有效区分。解决困难负样本挖掘将模型在验证集上的误检False Positive样本收集起来加入训练集并标注为背景不画框。让模型在下一轮训练中“记住”这些容易混淆的负样本。属性分类如前所述引入“带亮斑”和“不带亮斑”的子类让模型学习更细粒度的特征。7.2 训练与调参问题问题4训练早期验证损失震荡剧烈。原因学习率可能设置过高批次大小Batch Size可能太小导致梯度估计噪声大。解决降低lr0例如从0.01降到0.001并增加warmup_epochs热身轮数让学习率从一个小值逐步上升到设定值稳定训练初期。在显存允许范围内尽量增大batch大小。问题5模型过拟合训练集指标很好验证集指标停滞或下降。原因模型复杂度相对数据量过高数据增强不够训练轮次过多。解决增加数据增强的强度和多样性如随机旋转、裁剪、色彩抖动。使用标签平滑Label Smoothing在model.train()参数中设置label_smoothing0.1。引入权重衰减Weight Decay在优化器中设置。果断启用早停patience参数并减少总训练轮次epochs。7.3 部署与推理优化问题6模型在部署设备上速度不达标。解决模型轻量化尝试更小的模型变体如YOLOv8n甚至YOLOv8n-seg。或者使用模型剪枝和量化技术。Ultralytics支持导出为INT8量化的ONNX或TensorRT引擎能大幅提升推理速度。推理优化from ultralytics import YOLO model YOLO(path/to/best.pt) # 使用半精度推理并设置更低的置信度阈值以加速NMS results model.predict(sourceimage.jpg, halfTrue, conf0.25, iou0.45, imgsz320)降低imgsz如从640降到320能成倍提升速度但会牺牲精度需要权衡。问题7如何处理视频流中的连续误报解决在模型输出后端加入时间域滤波。简单投票法连续N帧中至少有M帧检测到目标才判定为该目标出现。轨迹关联使用卡尔曼滤波或SORT/DeepSORT等多目标跟踪算法将单帧检测结果关联成轨迹。只有稳定持续存在的轨迹才被认为是有效目标。这能有效过滤掉一闪而过的误检。构建“吸烟数据集”并训练一个鲁棒的检测模型是一个典型的从业务需求到算法落地的全链路工程。它考验的不仅是算法调参能力更是对问题的定义能力、数据的处理能力和工程化的实现能力。其中最深的体会是数据质量的决定性作用远大于模型结构的精妙。在资源有限的情况下将更多精力投入到数据采集、清洗和标注规范的打磨上其回报率通常比无止境地尝试更复杂的模型要高得多。这个数据集虽然聚焦于“吸烟”但其构建方法论——从场景分析、合规采集、精细标注到针对性训练——可以复用到绝大多数自定义的视觉识别任务中。最后在模型达到基本可用后建立一个持续的数据闭环从实际应用场景中收集困难样本不断迭代优化数据集和模型才是保持系统生命力的关键。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。