简介:本资源是专为YOLOv5目标检测模型定制的吸烟行为识别数据集,面向计算机视觉初学者与智能安防系统开发者,解决公共场所吸烟行为自动检测与精确定位的实际问题,适用于禁烟监管、智慧园区监控等落地场景。压缩包共2000个文件,含1995个YOLO格式标注txt文件(每张图像对应一个边界框坐标及类别标签)、3个配置yaml文件(定义类别数、路径及训练参数)、1个权重下载脚本download_weights.sh和1份README.md说明文档,整体大小39.88MB,结构规范、开箱即用。已有71人学习下载,资源已通过清洗与标准化处理,确保标注一致性与图像质量稳定性;配套脚本可一键获取预训练权重,README明确标注规范与目录逻辑,大幅降低YOLOv5训练入门门槛,助力快速开展模型微调与效果验证。
1. 项目缘起:为什么需要一个专门的吸烟行为识别数据集?
在计算机视觉的落地应用里,安防监控下的行为识别一直是个热门且充满挑战的领域。其中,吸烟行为的自动识别,对于工厂、仓库、加油站、写字楼、学校宿舍等禁烟区域的智能化管理,有着非常直接和迫切的需求。我接触过不少项目,客户的需求很明确:在监控画面里,一旦有人点烟或手持香烟,系统要能立刻报警,通知管理人员。听起来简单,但真做起来,你会发现市面上通用的目标检测数据集,比如大名鼎鼎的COCO,或者人脸、车辆数据集,在这里几乎派不上用场。
为什么?因为“吸烟”这个行为,不是一个静态的物体,而是一个由“人”、“香烟”(或烟头)以及特定的姿态(如手持香烟靠近嘴边)共同构成的动态复合事件。COCO数据集里有“人”,但没有“香烟”这个类别;你或许能找到一些包含烟头的通用物体数据集,但识别出一个孤立的烟头,和判断一个人正在吸烟,完全是两码事。后者需要模型理解人手的姿态、香烟与人脸(特别是嘴部)的相对位置关系,甚至烟雾的细微特征。这就是为什么,如果你想用YOLOv5这类高效的目标检测框架来做一个真正可用的吸烟行为识别系统,第一步,也是最关键的一步,就是构建一个“对症下药”的专属数据集。
最近在相关社区和论坛里,关于“yolov5训练自己的数据集”、“yolov8训练自己的数据集”的讨论非常火热,这反映了大家从“跑通Demo”到“解决实际问题”的普遍诉求。而“吸烟行为识别”正是一个典型的需要“自己的数据集”的场景。没有高质量、场景匹配的数据,再先进的模型也是巧妇难为无米之炊。所以,今天我想结合我的经验,详细拆解一下构建一个用于YOLOv5的吸烟行为识别数据集,需要关注哪些核心环节,以及如何避开那些新手最容易踩的坑。
2. 数据集构建的核心挑战与设计原则
构建一个行为识别数据集,远比标注一堆猫猫狗狗要复杂。它涉及到对“行为”本身的定义、场景的多样性以及标注的粒度。对于吸烟行为识别,我们主要面临以下几个挑战:
2.1 行为定义的模糊性
什么才算“吸烟行为”?是手指夹着烟?是烟正在嘴边?还是必须有明显的烟雾吐出?在项目初期,必须和业务方(或自己)明确一个可操作的定义。根据我的经验,最稳妥且可检测的定义是:“人手持点燃的香烟(或类似物),且香烟末端(烟头)位于人脸嘴部附近区域”。这个定义包含了三个关键元素:人(主体)、香烟(道具)、特定的空间关系(靠近嘴部)。它避免了去判断“吸”这个动作(太难),而是抓住了吸烟前、吸烟中、吸烟后几个阶段最共有的、最视觉化的特征。
2.2 场景与视角的多样性
监控摄像头可不是都装在同一个高度和角度。你的数据集必须覆盖:
- 视角:平视、俯视、仰视。工厂天花板下的摄像头往往是俯视,而走廊摄像头可能是平视。
- 距离:远景(全身)、中景(半身)、近景(特写)。不同距离下,香烟在图像中的像素大小可能只有几个到几十个像素,对检测器是巨大考验。
- 光照:白天、夜晚、室内灯光、逆光、阴影。夜晚或光线不足时,烟头的亮光是关键特征,但也可能和手机屏幕、其他光源混淆。
- 背景:办公室、车间、仓库、楼道、室外。背景越复杂,干扰越多。
2.3 负样本的精心设计
一个健壮的模型不仅要认识“吸烟”,还要能坚决地排除“非吸烟”。负样本的质量直接决定了模型的误报率。你需要刻意收集并标注大量容易混淆的场景:
- 手持类似物:手持笔、手机、零食、工具等靠近嘴边。
- 手部其他姿态:托腮、捂嘴、打电话等。
- 其他光源:夜晚的手机屏幕、手电筒、电焊光斑等(可能与烟头高光混淆)。
2.4 标注规范的制定
这是数据集质量的基石,必须在标注前以文档形式固定下来,并让所有标注人员统一理解。
- 标注类别:至少需要两个类别:
person(人)和cigarette(香烟)。有些人会考虑增加smoke(烟雾)类别,但我个人不推荐初期这样做。烟雾半透明、形态多变,极难标注一致,且对于“是否在吸烟”的核心判断,香烟本身的位置信息已经足够,引入烟雾反而可能引入噪声和标注歧义。 - 标注框(Bounding Box):
person框:尽可能紧密地框住整个人体,即使部分被遮挡。cigarette框:这是关键!框的目标不是整支烟,而是燃烧的烟头部分加上部分烟体。因为未点燃的香烟很难与白色小棍区分,而燃烧的烟头(有红色亮点和灰色烟灰)是更稳定、更显著的特征。框应尽可能小且精确地覆盖这个区域。
- 遮挡与截断处理:明确约定,香烟被手部分遮挡时如何标?只露出烟头时如何标?人在图像边缘被截断时如何标?这些都要有示例说明。
3. 数据收集与预处理实战流程
有了设计原则,接下来就是动手干活。数据收集是体力活,也是技术活。
3.1 数据来源渠道
完全依赖网络爬虫抓取的图片,往往场景单一、质量参差不齐,且涉及版权风险。一个更可靠的方案是混合数据源:
- 公开数据集挖掘:虽然很少有现成的“吸烟行为”数据集,但可以从一些相关数据集中提取素材。例如,一些细粒度动作识别数据集或监控场景数据集中,可能包含吸烟的片段。需要仔细筛选。
- 模拟拍摄:这是获取高质量、针对性数据的最有效方式。在确保安全和合规的前提下,可以在多种模拟场景(办公室、楼梯间、仓库角落)下,请志愿者模拟吸烟动作(可使用电子烟或类似道具替代,避免真实健康危害),从不同角度、距离进行拍摄。使用手机或相机录制视频,再抽帧成图像。
- 合作获取:与相关安防企业或园区合作,在脱敏(打码人脸和隐私信息)后,使用其真实的、非隐私区域的监控历史数据片段。这是最贴近实际应用的数据,价值最高。
3.2 视频抽帧与图像清洗
如果你获得的是视频素材,抽帧是关键步骤。切忌每秒都抽,那样会产生大量高度相似的冗余数据,浪费标注资源和训练时间。
- 抽帧策略:采用自适应抽帧。在动作变化平缓期(如人静止站立),降低抽帧频率(如每秒1帧或每2秒1帧);在动作变化剧烈期(如抬手点烟、吸烟动作),提高抽帧频率(如每秒10-15帧)。可以使用OpenCV计算连续帧之间的差异度(如MSE、结构相似性SSIM)来实现自动化的自适应抽帧。
- 图像清洗:抽帧后,手动或利用简单脚本快速浏览,删除完全模糊、过度曝光或欠曝、主体不完整的废片。
3.3 数据预处理与增强(Pre-processing & Augmentation)
这里的数据增强指的是在标注前或训练时自动进行的图像变换,以扩充数据多样性。对于吸烟识别,有些增强要慎用:
- 推荐使用:
- 色彩抖动:调整亮度、对比度、饱和度、色调。模拟不同光照和摄像头色彩偏差。
- 随机缩放和平移:小幅度的缩放和裁剪,让模型不依赖于目标在图像中的固定位置和大小。
- 添加噪声:高斯噪声、椒盐噪声,模拟摄像头质量差或传输干扰。
- 模糊:高斯模糊、运动模糊,模拟目标运动或对焦不准。
- 谨慎使用或避免:
- 大角度旋转:香烟通常是水平或斜向的,90度旋转后可能变得不真实(竖着的长条香烟?)。
- 镜像翻转:水平翻转是安全的,可以增加。但需注意,如果数据集中存在文字等非对称信息,翻转可能导致上下文错误(不过吸烟场景一般不影响)。
- Mosaic增强:YOLOv5训练时默认使用的Mosaic增强(将四张图拼成一张)非常强大,能极大地提升模型对小目标和背景的鲁棒性。对于吸烟识别这种小目标(烟头)检测任务,强烈建议开启。它能帮助模型在复杂拼接背景下依然定位到微小的烟头。
4. 标注工具选择与YOLO格式详解
工欲善其事,必先利其器。标注工具的选择直接影响效率。
4.1 标注工具对比
- LabelImg:老牌经典,本地软件,支持Pascal VOC和YOLO格式。适合小规模、入门级项目。缺点是效率较低,无团队协作功能。
- CVAT (Computer Vision Annotation Tool):英特尔开源的基于Web的标注系统,功能强大。支持图像、视频标注,多人协作,自动化标注(交互式分割、跟踪)。对于吸烟行为这种需要标注多帧视频序列的项目,CVAT的插值跟踪功能可以极大提升效率——你只需要标注关键帧上的香烟位置,它能在中间帧自动插值生成标注框。
- Roboflow:在线平台,提供从数据预处理、标注、增强到版本管理的一站式服务。非常适合团队协作和项目管理,但高级功能需要付费。
- Make Sense AI:免费的在线标注工具,界面友好,支持YOLO格式,适合个人或小项目快速上手。
对于吸烟行为识别项目,如果数据量较大(数千张以上)或涉及视频序列,我推荐使用CVAT。它的跟踪功能在标注连续动作时能节省至少70%的时间。
4.2 YOLO格式标注文件解读
YOLOv5要求特定的标签格式。每张图片对应一个同名的.txt文件。
# class_id center_x center_y width height 0 0.512 0.634 0.120 0.250 1 0.345 0.712 0.015 0.008- 每一行代表一个标注对象。
- class_id:类别索引,从0开始。例如,
0代表person,1代表cigarette。这个对应关系需要在一个data.yaml配置文件中明确定义。 - center_x, center_y:标注框中心点的归一化坐标(除以图片宽度和高度),范围0~1。
- width, height:标注框的归一化宽度和高度,范围0~1。
这里有一个至关重要的细节:cigarette框的width和height会非常小(比如0.01-0.05),因为烟头在整张图中占比极小。这正是小目标检测的难点所在。在标注时,务必确保框得足够精确,哪怕只差几个像素,在归一化后也可能产生较大误差。
4.3 标注质量控制流程
标注不是一蹴而就的,必须建立质检环节。
- 标注指南:编写详细的标注说明书,包含大量正例、反例、边界案例的截图说明。
- 试标与校准:让所有标注员先标注同一批(如50张)图片,对比结果,统一标准,解决歧义。
- 中期抽检:在标注过程中,随机抽取5%-10%的已标数据进行核查,计算标注一致性和准确率。
- 交叉验证:将数据分给不同标注员进行二次独立标注,通过计算框的IoU(交并比)来评估标注一致性。对于
cigarette这类小目标,可以适当放宽IoU阈值(如从0.5降至0.3),因为几个像素的偏差对IoU影响很大。
5. 数据集组织与YOLOv5项目集成
标注好的数据,需要按照YOLOv5要求的目录结构进行组织,并编写配置文件。
5.1 标准目录结构
smoking_detection_dataset/ ├── images/ │ ├── train/ │ │ ├── image001.jpg │ │ └── ... │ └── val/ │ ├── image101.jpg │ └── ... └── labels/ ├── train/ │ ├── image001.txt │ └── ... └── val/ ├── image101.txt └── ...images/train和images/val分别存放训练集和验证集的图片。labels/train和labels/val分别存放对应的YOLO格式标签文件。- 重要:务必确保
train和val两个集合是完全独立的,即同一场景、同一人的不同帧不能同时出现在训练集和验证集,否则会严重高估模型性能,造成“数据泄露”。应该按视频片段或场景来划分。
5.2 创建data.yaml配置文件
这个文件是YOLOv5训练时读取数据集信息的入口,放在项目根目录下。
# smoking_detection_dataset/data.yaml path: ../smoking_detection_dataset # 数据集根目录的相对路径或绝对路径 train: images/train # 训练集图片路径,相对于 `path` val: images/val # 验证集图片路径,相对于 `path` test: # 测试集路径(可选) # 类别数量 nc: 2 # 类别名称列表,顺序必须与标注文件中的 class_id 对应 names: ['person', 'cigarette'] # 可选:下载命令/URL(本例中不需要) # download: ...这个简单的配置文件告诉YOLOv5:数据在哪、怎么划分、有几个类别、分别叫什么。
5.3 数据集划分策略
通常按70%(训练): 20%(验证): 10%(测试)的比例划分。划分时一定要以“场景”或“视频ID”为单位随机划分,而不是打乱所有图片随机分,这样才能保证验证集和测试集能真实反映模型在未见过的场景下的泛化能力。
6. 数据增强策略的针对性调整
YOLOv5在训练时内置了丰富的数据增强,但我们需要根据吸烟行为识别的特点,对其超参数进行微调。这些调整通常在hyp.scratch.yaml或自定义的超参数文件中进行。
6.1 针对小目标(烟头)的增强
mosaic: 1.0: 保持开启。Mosaic增强对于让小目标(烟头)出现在各种复杂上下文环境中训练至关重要。copy_paste: 0.0: 建议关闭。复制粘贴增强可能将烟头不合逻辑地粘贴到非手部区域,制造出错误的训练样本。scale: 0.5: 缩放增强系数。可以保持默认或略微调高,增加尺度多样性。flipud: 0.0和fliplr: 0.5: 上下翻转建议关闭(人倒立吸烟不真实),水平翻转可以开启。
6.2 针对光照变化的增强
hsv_h: 0.015: 色调(Hue)增强强度。可以稍微增加(如到0.02),模拟不同色温的光照。hsv_s: 0.7: 饱和度(Saturation)增强强度。保持较高值,以应对监控画面色彩失真的情况。hsv_v: 0.4: 明度(Value)增强强度。保持适中,模拟亮度变化。
6.3 一个参考的增强超参数片段
# hyp.smoking.yaml (自定义) lr0: 0.01 lrf: 0.01 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3.0 warmup_momentum: 0.8 warmup_bias_lr: 0.1 box: 0.05 cls: 0.5 cls_pw: 1.0 obj: 1.0 obj_pw: 1.0 iou_t: 0.20 anchor_t: 4.0 fl_gamma: 0.0 hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 0.0 translate: 0.1 scale: 0.5 shear: 0.0 perspective: 0.0 flipud: 0.0 fliplr: 0.5 mosaic: 1.0 mixup: 0.0 copy_paste: 0.0注意,这里我将degrees(旋转)和flipud(上下翻转)设为0,copy_paste也设为0,以更贴合实际场景。
7. 模型训练与数据集性能验证
数据集准备好后,就可以用它来训练和验证YOLOv5模型了。这个过程也是检验数据集质量的试金石。
7.1 使用自定义数据集启动训练
假设你的YOLOv5代码目录为yolov5/,数据集和配置文件按上述准备好后,一个典型的训练命令如下:
cd yolov5 python train.py --img 640 --batch 16 --epochs 100 --data ../smoking_detection_dataset/data.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name smoking_detection_v1 --hyp hyp.smoking.yaml--img 640: 输入图像尺寸。对于监控场景,640是一个兼顾速度和精度的常用尺寸。如果烟头目标特别小,可以尝试增大到960或1280,但会显著增加显存消耗和训练时间。--batch 16: 批次大小,根据你的GPU显存调整。--epochs 100: 训练轮数。对于中等规模数据集,100-150轮通常足够。--data: 指向你的data.yaml配置文件。--cfg: 选择模型结构。yolov5s.yaml是最小的模型,速度快,适合部署。如果精度不够,可以换用yolov5m.yaml或yolov5l.yaml。--weights: 加载预训练权重。从yolov5s.pt开始进行迁移学习,这是收敛速度和效果的最佳起点。--name: 本次训练运行的名称,用于在runs/train/下创建结果目录。--hyp: 使用我们自定义的超参数文件。
7.2 通过训练过程监控数据集问题
训练开始后,密切关注TensorBoard或日志输出的指标,它们能暴露出数据集的潜在问题:
- Box Loss 和 Objectness Loss 居高不下:可能标注框质量差(不准确、不一致),或者
cigarette这类小目标太难学。回顾标注样本,检查小目标的框是否标得足够好。 - 验证集精度(mAP@0.5)远低于训练集:这是典型的过拟合,说明验证集和训练集分布差异大,或者验证集本身标注有问题。检查数据集划分是否做到了“场景独立”,并抽查验证集的标注质量。
- 某个类别(如
cigarette)的AP值特别低:说明该类别数据量可能不足,或者多样性不够(例如,全是白天数据,没有夜晚数据)。你需要针对性补充这类数据。
7.3 模型评估与错误分析
训练完成后,在验证集上运行评估,并仔细分析模型预测错误的样本:
python val.py --data ../smoking_detection_dataset/data.yaml --weights runs/train/smoking_detection_v1/weights/best.pt --img 640YOLOv5会生成详细的评估报告和混淆矩阵。更重要的是,它会保存预测结果的可视化图片。你需要一张张查看这些图片,特别是那些漏检(False Negative)和误检(False Positive)的案例:
- 漏检香烟:是香烟太小?光照太暗?被严重遮挡?还是姿态过于罕见(如手背完全遮住烟头)?这些案例指明了数据集的“盲区”,需要补充类似场景的数据。
- 误检:把什么当成了香烟?是手指、笔尖、灯光反光,还是其他?这些案例是你的负样本需要加强的方向,在数据集中增加更多此类“易混淆”负样本。
8. 数据集的迭代与维护
没有一个数据集是生来完美的。模型评估的错误分析,是驱动数据集迭代升级的最重要反馈。
8.1 建立数据闭环
构建一个“训练-评估-分析-补充-再训练”的闭环:
- 用初始数据集V1训练模型。
- 在独立的测试集或真实场景数据上评估模型。
- 分析错误案例,归纳出数据缺陷类型(如“夜晚背光烟头漏检”、“手持白色细棍误报”)。
- 根据缺陷类型,定向采集和标注新的数据。
- 将新数据加入原有数据集,形成V2版本。
- 用V2数据集重新训练或微调模型。
8.2 版本化管理
使用类似Git的思维或工具(如DVC、Roboflow的版本功能)来管理数据集的不同版本。每次迭代都要记录:增加了什么数据、解决了什么问题、模型性能提升了多少。这能让你清晰地看到数据工作的投入产出比。
8.3 关于数据量的经验之谈
经常有人问:“到底需要多少张图?” 这没有固定答案,取决于场景复杂度。对于一个室内办公场景的吸烟识别,一个可用的起点可能是:
- 训练集:3000-5000张包含吸烟行为的图像(对应约10-20万个人和香烟的标注实例)。
- 验证集:500-1000张。
- 测试集:300-500张。
如果场景扩展到室内外多种环境、光照变化极大,数据量可能需要翻倍甚至更多。记住,数据的多样性和质量远比单纯的数量更重要。1000张覆盖了各种挑战场景的精心标注的图片,可能比5000张单一场景的图片更有价值。
构建一个高质量的YOLOv5吸烟行为识别数据集,是一个需要耐心、细心和科学方法的过程。它远不止是“打框”那么简单,从行为定义、场景规划、负样本设计,到标注规范、质量检查、增强策略,每一步都影响着最终模型的成败。希望这份详细的拆解,能帮你避开我当年踩过的那些坑,更高效地打造出属于你自己的、能真正解决实际问题的“弹药库”。毕竟,在AI落地的战场上,高质量的数据,永远是第一生产力。
本文还有配套的精品资源,点击获取