ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从零构建吸烟检测数据集:标注规范、YOLOv8训练与问题调优全流程

从零构建吸烟检测数据集:标注规范、YOLOv8训练与问题调优全流程 简介本资源是面向人工智能与计算机视觉初学者及算法工程师的吸烟行为识别专用标注数据集适用于图像分类、目标检测模型训练与健康行为分析等AI项目开发。数据集共1567个文件包含783张JPG格式吸烟场景实拍图像、783份对应XML标注文件含边界框与类别标签以及1份说明文档TXT总大小31.71MB图像命名统一规范如smoke_a273.jpg便于批量加载与路径解析XML标注结构清晰支持Pascal VOC格式直接导入主流框架。目前已有158人学习下载体现了该数据集在轻量级健康AI应用中的实际需求。用户可直接用于构建吸烟/非吸烟二分类模型或扩展为多任务学习配套标注信息完整覆盖人物姿态、手持动作及环境上下文显著降低数据预处理门槛同时兼顾隐私合规性设计适合教学实验、课程设计及科研原型验证。1. 项目概述从“吸烟数据集带标注”说起最近在做一个关于公共安全或者健康监测相关的项目需要训练一个能识别吸烟行为的模型。找了一圈公开数据集发现直接可用的、标注质量高的“吸烟行为”数据集并不多。很多朋友可能也遇到过类似的问题想做一个特定的视觉识别任务但第一步——找数据——就卡住了。要么数据量不够要么标注不规范要么场景太单一。所以我决定自己动手整理和构建一个专注于“吸烟”行为的图像/视频数据集并完成高质量的标注。这不仅仅是一个数据包的集合更涉及到数据采集的策略、标注规范的制定、工具的选择以及质量控制的完整流程。如果你正在研究行为识别、异常检测或者单纯想学习如何从零开始构建一个定制化的数据集那么我踩过的这些坑和总结的经验或许能给你省下不少时间。2. 数据集构建的核心思路与设计考量2.1 明确任务定义与数据需求构建数据集的第一步绝不是马上开始收集图片而是想清楚你的模型最终要解决什么问题。对于“吸烟识别”这个任务我们需要进一步细化识别目标是什么是识别“香烟”这个物体还是识别“人正在吸烟”这个动作这两者有本质区别。前者是静态目标检测后者是动态行为识别可能涉及时序信息。更复杂的可能是要识别“在禁烟区域吸烟”的违规行为这就需要同时检测“人”、“香烟”和“场景标识”。应用场景是什么是室内监控摄像头下的实时检测还是对网络图片的离线审核不同的场景对数据的多样性要求不同。监控场景可能光线多变、角度固定、人物较小网络图片则背景复杂、姿态多样、图片质量不一。需要怎样的标注基于任务定义我们确定标注类型。常见的有边界框Bounding Box标注香烟、手持香烟的手部或者吸烟者的头部/上半身。这是最常用的适用于YOLO、Faster R-CNN等目标检测模型。关键点Keypoints标注手部关节、香烟末端、嘴部等关键点。这对于精确判断“手持”和“靠近嘴部”的动作关联很有用常用于姿态估计结合行为识别。实例分割Instance Segmentation精确勾勒出香烟和手部的轮廓。标注成本高但精度也更高。行为标签Action Label为一段视频或一系列图片打上“吸烟/非吸烟”的标签。这通常用于视频分类或时序动作检测模型。我的核心需求是做一个通用的、可用于训练高性能目标检测模型如YOLOv8的数据集因此选择边界框标注作为主要形式标注对象为“香烟”包括被手持的、放在桌上的、嘴里的和“吸烟者”当香烟与人体关联度很高时标注人可能有助于上下文判断。同时为每张图片附加一个“是否包含吸烟行为”的分类标签。2.2 数据采集策略与来源规划高质量的数据集需要多样性和代表性。我规划了以下几个数据来源以覆盖尽可能多的场景公开数据集挖掘与筛选这是起点。我会搜索包含“吸烟”、“smoking”、“cigarette”等标签的现有数据集例如某些大型通用物体检测数据集中的相关子集或者安全监控、零售行为分析数据集。但需要仔细清洗确保标注准确。网络爬虫合规前提下在遵守版权和隐私法规的前提下从一些公开的图片分享平台、视频网站截取关键帧获取数据。关键词需要精心设计如“man smoking”、“woman with cigarette”、“smoking at table”、“smoking outdoors night”等以覆盖不同性别、场景、光照和时间。模拟场景拍摄这是保证数据质量和特定场景覆盖的关键。在获得授权和确保安全的情况下可以邀请志愿者在多种背景办公室、楼梯间、公园、车内下模拟各种吸烟姿态手持、口含、点火、弹烟灰进行拍摄。这能有效补充网络数据中难以找到的清晰、多角度的正面样本。合成数据生成作为补充可以使用3D渲染或图像合成技术如将香烟的3D模型合成到不同背景和手持姿态的图片中。这在数据稀缺的初期或需要极端视角时非常有用但要注意“模拟到真实”的域适应问题。注意无论哪种来源都必须高度重视隐私和伦理。对所有人脸、车牌等敏感信息进行模糊化处理。模拟拍摄需获得参与者知情同意。合成数据则避免了隐私问题。2.3 标注规范制定统一标准是质量的基石这是最容易被忽视却至关重要的一步。如果标注标准模糊后期模型训练会混乱不堪。我制定的规范如下“香烟”物体标注边界框紧密度框体应紧密贴合香烟的可见部分包括滤嘴和烟体但不必包含烟雾。对于被手指部分遮挡的香烟按可见部分标注。遮挡处理香烟被完全遮挡超过50%则不予标注视为不可识别。部分遮挡时标注可见部分。角度与形态无论是侧面、端头视角还是弯曲、折断状态只要可辨识为香烟均需标注。相似物区分特别注意与笔、棍状糖果、温度计等细长物体的区分。仅标注确认为香烟的物体。“吸烟者”标注可选当香烟明显与人的手部或嘴部接触构成吸烟动作时建议同时标注该人物通常用一个较大的框框住上半身或全身。这有助于模型学习“吸烟”这个行为的上下文而不仅仅是孤立地识别香烟。图像级标签smoking图片中包含正在进行的吸烟行为香烟与口/手接触。cigarette_present图片中包含香烟但可能未被使用如放在桌上。non_smoking图片中无任何香烟或吸烟行为。标注格式选择与未来训练框架兼容的格式。我选择YOLO格式因为它简单且被广泛支持。每张图片对应一个.txt文件每行内容为class_id x_center y_center width height坐标均为归一化后的值0-1之间。3. 数据标注实操工具、流程与质量控制3.1 标注工具选型与配置工欲善其事必先利其器。我对比了几款主流开源标注工具LabelImg老牌经典支持矩形框标注输出PASCAL VOC或YOLO格式。界面简单但对于大规模数据集效率较低。Labelme由麻省理工开发功能强大支持多边形、矩形、圆形、线段、点等多种标注输出JSON格式。非常适合需要分割或关键点标注的任务但处理纯矩形框标注时操作略显繁琐。CVAT英特尔开发的在线视频/图像标注工具功能极其强大支持团队协作、自动标注、视频插帧、多种任务类型。是工业级项目的首选但部署和上手有一定复杂度。Makesense.ai一个免费的在线标注工具无需安装支持拖拽上传、自动标注建议集成YOLO等模型进行预标注、团队协作。对于个人或小团队快速启动项目非常友好。我的选择与理由考虑到项目初期需要快速迭代和验证且以矩形框标注为主我最终选择了Makesense.ai。它的优势在于零安装打开浏览器就能用避免了环境配置问题。预标注功能可以上传一个预训练的权重哪怕是通用模型如YOLOv8s让它先跑一遍人工只需修正和补充能极大提升效率尤其是在标注“香烟”这种特征相对明显的物体时。格式支持全直接导出YOLO、PASCAL VOC、COCO等多种格式。协作方便可以生成项目链接邀请他人共同标注。对于需要更复杂标注如关键点或处理视频流的后期阶段CVAT是更专业的选择。3.2 标准化标注流程SOP为了确保多人协作时质量一致我制定了详细的标注操作流程数据预处理与导入将所有收集到的图片统一缩放至一个标准尺寸如1333x800保持长宽比多余部分填充灰边以减少后续模型输入尺寸不一带来的影响。按8:1:1的比例随机划分训练集、验证集和测试集并在项目开始时就固定下来。将划分好的图片文件夹上传至Makesense.ai创建新项目。标注任务分配与界面熟悉定义标签类别cigarette,smoker。为标注人员提供详细的标注规范文档和带示例的图解。让每位标注员先标注同一批如20张校准图片由负责人检查并统一反馈确保所有人理解一致。核心标注操作使用矩形框工具紧密框选目标。对于模糊、存疑的样本标记为“困难样本”或放入待讨论队列而不是随意标注或忽略。充分利用快捷键如Makesense中按Ctrl键可吸附边缘提升速度。利用预标注加速在标注一部分数据如200张后训练一个初版的YOLOv8模型。将这个模型权重用于后续批次的预标注。标注员的工作从“从零开始画框”变为“审核和修正模型预测的框”效率可提升50%以上。定期导出与备份每完成一个批次如500张立即导出YOLO格式的标注文件并与原图一起备份。备份时保持图片和标注文件的目录结构一致。3.3 质量控制与迭代优化标注质量直接决定模型天花板。我建立了三层质检机制标注员自检标注完成后强制要求回看一遍自己标注的所有框检查是否有漏标、错标、框体质量差的问题。交叉互检标注员之间随机交换一部分已标注数据进行检查。不同的人更容易发现对方习惯性忽略的错误。负责人抽检与仲裁项目负责人随机抽取至少10%的数据进行详细检查。对于交叉互检中争议的样本由负责人根据规范最终裁定。常见的质量问题及处理框体过松或过紧通过校准图片和示例反复强调“紧密贴合”的原则。类别混淆明确“香烟”与“类似物”的区分标准制作对比图例。遮挡与截断处理不一致统一规则被遮挡超过50%不标截断的如图片边缘标注可见部分。微小目标漏标远处的、像素很小的香烟是难点。要求标注员放大图片仔细查看对于实在难以确认的标记为“疑似”由负责人用更高分辨率原图判断。质检发现的问题要记录到“错误类型统计表”中定期回顾并更新标注规范或对标注员进行再培训。这是一个持续迭代的过程。4. 数据集整理与YOLOv8训练准备4.1 数据格式整理与增强标注完成后我们得到的是图片文件和对应的.txt标注文件。为了适配YOLOv8的训练需要整理成固定的结构Smoking_Dataset/ ├── images/ │ ├── train/ │ │ ├── image_001.jpg │ │ └── ... │ ├── val/ │ │ ├── image_101.jpg │ │ └── ... │ └── test/ │ ├── image_201.jpg │ └── ... └── labels/ ├── train/ │ ├── image_001.txt │ └── ... ├── val/ │ ├── image_101.txt │ └── ... └── test/ ├── image_201.txt └── ...接下来分析数据集的基本情况这对于后续训练策略调整至关重要。可以使用Python脚本快速统计图像数量与分辨率分布训练集、验证集、测试集各多少张图片大多是高分辨率还是低分辨率目标数量与尺寸分布统计每个类别cigarette,smoker的实例总数。更重要的是分析目标边界框的宽度和高度归一化后的分布。这能告诉你数据集中目标大多是“小目标”、“中目标”还是“大目标”。吸烟数据集里香烟往往是“小目标”这会影响模型anchor的设计或训练时的关注度。类别平衡性检查cigarette和smoker的实例数是否悬殊过大。如果严重不平衡需要考虑过采样、欠采样或给不同类别分配不同的损失权重。基于分析结果进行数据增强以增加多样性并缓解过拟合。YOLOv8内置了强大的增强管道但理解其原理有助于我们自定义。对于吸烟数据集我重点应用以下增强几何变换旋转小角度如±15度因为香烟通常不会大角度倾斜、平移、缩放、剪切。模拟拍摄时的视角变化。色彩变换亮度、对比度、饱和度、色调的随机调整。模拟不同光照条件室内昏暗、室外强光。混合类增强Mosaic四图拼接和MixUp能极大地丰富背景并让模型学习在不同上下文和尺度中识别目标对于小目标检测尤其有效。针对小目标的增强随机将训练集中的小目标如香烟复制粘贴到图像的其他位置需确保合理性如不会贴到天空增加小目标的出现频率。4.2 配置YOLOv8训练环境与参数解析环境配置相对简单使用Conda创建虚拟环境安装PyTorch和Ultralytics的YOLOv8包即可。conda create -n yolo_smoke python3.8 conda activate yolo_smoke pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 根据CUDA版本选择 pip install ultralytics关键的一步是准备数据集配置文件dataset.yaml。这个文件告诉YOLOv8你的数据在哪、有哪些类别。# dataset.yaml path: /path/to/Smoking_Dataset # 数据集根目录 train: images/train # 训练集图片相对路径 val: images/val # 验证集图片相对路径 test: images/test # 测试集图片相对路径可选 # 类别列表 names: 0: cigarette 1: smoker接下来是理解并调整训练参数。直接使用默认参数可能有效但针对我们的数据集进行微调能获得更好效果。以下是一些核心参数解析model: 选择模型尺寸如yolov8n.pt纳米、yolov8s.pt小、yolov8m.pt中。对于初步实验从yolov8s开始是个好选择在精度和速度间取得平衡。data: 指向上面创建的dataset.yaml。epochs: 训练轮数。对于中等规模数据集几千张图片100-300轮是常见的起点。可以通过观察验证集损失曲线提前停止。imgsz: 输入图像尺寸。默认640。如果原始图像中目标香烟非常小可以尝试增大到832甚至1024但这会显著增加显存消耗和训练时间。batch: 批次大小。取决于你的GPU显存。在显存允许的情况下尽可能设大如16, 32这有助于训练稳定。workers: 数据加载的进程数。通常设为CPU核心数可以加快数据读取。lr0和lrf: 初始学习率和最终学习率因子。学习率是训练中最关键的参数之一。对于小数据集初始学习率lr0可以设小一点如0.01避免震荡。lrf是最终学习率衰减到的比例。weight_decay: 权重衰减防止过拟合的正则化项。默认值通常可行。box: 边界框回归损失的权重。对于检测任务这是主要损失。cls: 分类损失的权重。如果分类任务困难如区分不同香烟品牌但我们不需要可以调整。我们只有两个简单类别默认即可。dfl: Distribution Focal Loss的权重用于优化边界框分布。YOLOv8的新特性通常保持默认。我的经验是对于自定义数据集最需要关注的参数是imgsz、batch、lr0和epochs。可以先使用默认参数跑一个基线然后根据验证集的表现如mAP曲线、损失曲线进行针对性调整。5. 模型训练、评估与常见问题排错5.1 启动训练与监控指标使用一行命令即可开始训练yolo taskdetect modetrain modelyolov8s.pt datadataset.yaml epochs150 imgsz640 batch16 workers8训练开始后Ultralytics会启动一个本地Web服务器通常是在http://localhost:3000提供实时监控仪表盘。这是观察训练进程的窗口。需要重点关注的指标有损失曲线Loss Curvestrain/box_loss,train/cls_loss,train/dfl_loss训练集上的各项损失。理想情况下它们应该随着训练轮数平稳下降。val/box_loss,val/cls_loss,val/dfl_loss验证集上的损失。这是判断模型是否过拟合的关键。如果训练损失持续下降但验证损失在某个点后开始上升或停滞很可能发生了过拟合。性能指标Performance Metricsmetrics/mAP50(B)在IoU阈值为0.5时的平均精度均值。这是最核心的指标直接反映了模型检测的准确度。它会逐步上升并趋于平稳。metrics/mAP50-95(B)在IoU阈值从0.5到0.95步长0.05区间内的平均mAP。这是一个更严格的指标要求边界框定位更精确。metrics/precision(B),metrics/recall(B)精确率和召回率。我们希望两者都高。高精度低召回说明模型保守漏检多低精度高召回说明模型激进误检多。如何判断训练是否良好训练/验证损失平稳下降后趋于收敛。mAP50和mAP50-95持续上升后在一个高点稳定。验证集损失没有明显高于训练集损失且没有在后期反弹。如果训练过程不理想就需要进行问题排查。5.2 常见问题、原因分析与解决方案以下是我在训练吸烟检测模型过程中遇到的一些典型问题及解决方法问题现象可能原因解决方案与排查步骤训练损失居高不下或波动剧烈1. 学习率(lr0)设置过高。2. 数据标注存在大量错误或噪声。3. 数据预处理或增强过于激进导致图像难以学习。1.降低学习率尝试lr00.01或0.001。2.检查标注质量从训练集中随机抽样几十张图片用训练中的模型进行预测直观查看模型学到的和标注的差异。错误标注会严重干扰学习。3.简化数据增强暂时关闭Mosaic、MixUp等复杂增强只保留基础的色彩抖动看损失是否稳定。验证损失远高于训练损失且差距持续扩大过拟合1. 训练数据量太少。2. 模型复杂度如用了yolov8l或x相对于数据量过高。3. 数据增强不够模型记住了训练集的特有噪声。1.增加数据收集更多数据或使用更强大的数据增强如Mosaic, MixUp, CutMix。2.使用更小的模型从yolov8n或s开始。3.增加正则化适当增大weight_decay参数如从0.0005调到0.001。4.早停Early Stopping监控验证损失在其连续多个epoch不下降时停止训练。mAP50很低但召回率(Recall)很高模型产生了大量误检False Positives。把很多不是香烟的物体如笔、手指也检测出来了。1.检查负样本训练集中是否包含了足够多的“不含香烟”的图片需要确保数据集中有相当比例的负样本non_smoking标签的图片让模型学习什么是“不是香烟”。2.清理相似物在数据收集中是否有大量与香烟形状颜色相似的物体可以考虑在数据集中加入一些“困难负样本”如笔、筷子等并明确标注为背景。3.提高分类损失权重(cls_pw)让模型更关注分类的正确性。mAP50尚可但召回率很低模型漏检很多False Negatives。很多香烟没有被检测出来。1.关注小目标香烟是小目标。检查数据增强是否过度如随机缩放后目标变得更小。可以减小imgsz如从640降到320不对于小目标增大imgsz如到832可能更有效因为更大的输入分辨率保留了更多细节。同时确保Mosaic增强是开启的这对小目标检测有益。2.检查标注完整性是否存在大量未标注的香烟实例尤其是远处、模糊的小香烟。3.调整模型neck/head对于YOLOv8可以尝试使用带P2更高分辨率特征层的小目标检测专用模型如果官方有提供或者在自定义模型时关注浅层特征。训练后期性能突然崩溃指标骤降1. 学习率调度问题。2. 训练数据中存在某些损坏的图片或标注文件。3. 硬件或软件偶然错误。1.检查学习率曲线是否在后期学习率降得太低或有个异常跳变可以尝试使用余弦退火等更平滑的调度器。2.检查数据完整性运行一个脚本遍历所有图片和标签文件确保都能正常打开和读取。3.从崩溃前的检查点恢复训练YOLOv8会定期保存检查点.pt文件可以加载崩溃前最后一个好的检查点降低学习率继续训练。5.3 模型导出与部署测试训练完成后模型会保存在runs/detect/train/weights/目录下其中best.pt是验证集上表现最好的权重。我们可以用这个模型在测试集上看看最终效果yolo taskdetect modeval modelruns/detect/train/weights/best.pt datadataset.yaml然后用一些从未见过的图片或视频进行推理测试这是真正的“实战”# 图片推理 yolo taskdetect modepredict modelruns/detect/train/weights/best.pt sourcepath/to/test_image.jpg # 视频推理 yolo taskdetect modepredict modelruns/detect/train/weights/best.pt sourcepath/to/test_video.mp4部署前的最后检查速度测试在不同的硬件CPU, 边缘计算设备上测试推理速度FPS看是否满足应用要求。场景泛化性找一些与训练集分布不同的图片如不同国家的香烟包装、电子烟、雪茄等测试模型的鲁棒性。如果泛化性差说明数据多样性仍需加强。错误案例分析仔细查看模型在测试集上预测错误的案例漏检、误检分析原因。是标注问题是数据缺失如某种特定角度还是模型能力上限这些分析是迭代优化数据集和模型的最宝贵输入。构建一个高质量的“吸烟数据集”远不止是收集和打标签它是一个系统工程涵盖了需求分析、数据采集、标准制定、工具流搭建、质量控制、模型训练调优和问题诊断的全流程。其中清晰的标注规范和持续的质量控制是保证数据质量的灵魂而基于数据洞察的模型调参则是提升性能的关键。这个过程充满了反复和调试但当看到自己亲手打造的数据集训练出的模型能准确地识别出各种场景下的吸烟行为时那种成就感是完全不一样的。希望这份详细的记录能为你构建自己的定制化数据集提供一个扎实的路线图。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进