ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

YOLOv5吸烟行为识别数据集构建与模型训练全流程实战

2026/9/4 1:20:16 拓冰建站 浏览量
YOLOv5吸烟行为识别数据集构建与模型训练全流程实战 简介本资源是专为YOLOv5目标检测模型定制的吸烟行为识别数据集面向计算机视觉初学者、安防算法工程师及智能监管系统开发者解决公共场所吸烟行为自动识别与精确定位的技术需求。数据集覆盖室内封闭空间、户外公共区域及高密度人群等真实复杂场景经专业标注与标准化清洗确保标注一致性与图像质量可直接用于禁烟监测、智慧城管、校园/厂区智能巡检等落地任务的模型训练与验证。压缩包共2000个文件含1995个YOLO格式txt标注文件每图一标含吸烟目标边界框与类别、3个关键配置yaml文件含类别定义与路径设置、1个权重下载脚本sh及1份结构化说明md文档整体体积仅39.88MB轻量易部署。目前已有71人学习下载配套脚本与清晰目录设计显著降低环境配置门槛支持开箱即训是少有的聚焦细粒度行为识别、兼顾工程实用性与教学友好性的高质量开源数据资源。1. 项目缘起为什么需要一个专门的吸烟行为识别数据集在计算机视觉的安防与公共健康领域吸烟行为识别一直是一个具有现实意义但颇具挑战性的任务。你可能在很多公共场所见过“禁止吸烟”的标识但实际监管往往依赖人力巡查效率低且存在盲区。随着深度学习特别是以YOLO系列为代表的目标检测算法的成熟用AI摄像头自动识别吸烟行为实现智能化预警与管理逐渐从一个概念变成了可落地的需求。然而当我真正着手用YOLOv5来训练一个吸烟行为识别模型时遇到的第一个、也是最棘手的问题就是找不到一个“趁手”的、高质量的数据集。网上公开的数据集要么样本量稀少要么标注质量堪忧场景单一根本无法覆盖现实中千变万化的吸烟场景。比如有人坐着抽有人站着抽有人手部被遮挡有人在昏暗光线下还有各种香烟、电子烟的不同形态。一个泛化能力强的模型必须建立在丰富、多样的数据基础上。这就是我决定自己动手整理和构建一个“YOLOv5吸烟行为识别数据集”的初衷。它不是一个从零开始的标注工程而是对现有零散资源的一次系统性筛选、清洗、增强和标准化目标是产出一个开箱即用、贴近实战的数据集让后续的研究者或开发者能跳过数据准备的坑直接聚焦于模型优化与应用。围绕这个数据集我会详细拆解从数据收集、处理、标注到最终适配YOLOv5训练格式的全流程并分享其中积累的实操经验和避坑指南。2. 数据集构建的核心挑战与设计思路构建一个专用于行为识别而不仅仅是目标检测的数据集其复杂度远高于标注“猫”“狗”这样的静态物体。吸烟行为是一个动态过程且关键特征往往在于手部与面部区域的相对位置关系以及手持的香烟这个细小目标。这直接决定了我们的数据集设计思路不能照搬通用目标检测的做法。2.1 关键挑战分析目标定义模糊“吸烟行为”本身不是一个有形的、边界清晰的物体。我们需要将其解构为可检测的视觉元素组合。通常这包括香烟/电子烟核心物体但尺寸小易被遮挡或与类似物体如笔、筷子混淆。手部特别是手持香烟的手关键的动作执行者。口部区域行为完成的标志性区域香烟靠近嘴边。烟雾可选强相关特征但极难稳定捕捉和标注。场景与视角多样性数据必须覆盖室内、室外、白天、夜晚、近距离、远距离、正面、侧面、俯视等多种场景。单一视角的数据训练的模型换个角度就可能失效。标注粒度与成本是只标香烟还是标“手香烟”的组合框或是标出整个人体关键点再判断行为标注方案直接影响模型的学习目标和最终效果也决定了标注工作量和成本。2.2 我们的设计思路与方案选择经过多次试验我采用了“两级目标”的标注方案以平衡效果与成本主目标Primary Targetsmoking。这个类别直接代表“吸烟行为”。标注框覆盖从手部持烟处到口部的整个行为发生区域。这个框通常是一个包含人头、肩部及抬起手臂的长方形。它的优势在于模型直接学习“吸烟”这个完整行为的视觉模式对于快速筛选和报警非常有效。辅助目标Auxiliary Targetcigarette。单独标注香烟或电子烟本身。这个细小目标的标注有助于模型在复杂场景下如手部被部分遮挡时依然能通过检测到香烟来确认行为。同时它为模型提供了更细粒度的学习特征。为什么选择这个方案对比只标香烟漏检率高且无法区分是拿着烟还是点着烟或只标人无法区分是否在吸烟这个组合方案在模型训练中形成了有效的监督信号互补。smoking框提供了上下文信息cigarette框提供了精确的局部证据。在模型后处理阶段可以设定规则如cigarette框与smoking框的重叠度、相对位置来进一步提升识别准确率降低误报。注意这个方案标注成本高于只标单一目标但远低于标注人体姿态关键点。对于安防这类对实时性要求高、需要快速响应的场景这是一个性价比很高的折中方案。3. 数据收集、清洗与预处理实战有了设计思路下一步就是获取原始数据。我的数据来源主要有三个公开数据集爬取、合规的网络视频素材截取、以及部分模拟场景的自采数据。3.1 多源数据收集策略公开数据集挖掘搜索了如“Aeroscapes”、“BDD100K”等包含街景、人物的数据集从中人工筛选出包含吸烟行为的图片或视频帧。也参考了“CityPersons”等数据集中行人的多样性。网络视频素材处理从一些合规的影视剧、纪录片、公开监控演示视频中截取包含吸烟镜头的片段。这是数据多样性的重要来源能提供丰富的场景和人物姿态。关键工具使用OpenCV或FFmpeg按固定间隔或场景变化抽帧。帧率选择对于行为识别抽帧间隔不宜过大否则会丢失动作连贯性。我通常设置每秒抽1-2帧既保证了数据量又避免了过多相似帧。自采数据补充在私人场所通过模拟不同角度、光照条件下的吸烟动作采集一部分数据用于填补公开数据中缺乏的特定场景如极暗光线下。3.2 数据清洗与去重流程收集来的原始图像质量参差不齐必须经过严格清洗。自动化初筛模糊/低分辨率过滤使用OpenCV的拉普拉斯方差cv2.Laplacian计算图像清晰度设定阈值过滤掉过于模糊的帧。重复图像去除使用imagededup库或计算图片的dHash差异哈希移除内容几乎完全相同的重复图像防止数据偏差。人工复审自动化筛选后必须人工快速浏览。剔除那些吸烟行为不明确、主体过于微小、或画面质量极差的图片。这一步无法省略是保证数据集“干净”的关键。3.3 数据增强策略以小博大的艺术初始数据量可能仍然有限尤其是cigarette这类小目标样本。数据增强是提升模型泛化能力、防止过拟合的利器。我采用的增强管道不仅考虑通用性更针对吸烟行为的特点# 示例使用Albumentations库定义增强管道 import albumentations as A transform A.Compose([ # 基础空间变换 A.HorizontalFlip(p0.5), # 水平翻转非常有效能直接创造新的视角 A.RandomRotate90(p0.3), # 90度旋转模拟不同摄像头安装角度 A.RandomBrightnessContrast(p0.4), # 亮度对比度调整应对光照变化 A.HueSaturationValue(p0.3), # 色相饱和度调整 # 针对小目标(cigarette)和遮挡的增强 A.RandomResizedCrop(height640, width640, scale(0.8, 1.0), p0.5), # 随机裁剪再放大模拟目标在不同距离下的尺度变化 A.Cutout(num_holes8, max_h_size32, max_w_size32, fill_value0, p0.5), # Cutout/Mosaic增强可模拟遮挡但对小目标要控制hole的大小避免直接擦除目标 # 注意谨慎使用重度模糊或噪声可能会让细小香烟特征消失 ], bbox_paramsA.BboxParams(formatyolo, label_fields[class_labels]))增强经验谈Mosaic增强YOLOv5默认训练时会使用Mosaic增强将四张图拼成一张。这对于小目标检测有奇效因为它强制模型学习在不同上下文背景中定位小目标。在我们的数据集中它能极大地增加cigarette出现在各种复杂背景下的样本。MixUp增强另一种高级增强以一定比例混合两张图像及其标签。需谨慎使用因为“吸烟”和“非吸烟”图像的混合可能产生语义上矛盾的标签干扰学习。我通常只在训练后期模型已经相对稳定时以较低概率引入。尺度多样性确保数据集中既有包含整个人体的远景图也有聚焦于手部-脸部的特写图。这可以通过调整抽帧时的原始视频分辨率或在增强中设置不同的RandomResizedCrop比例来实现。4. 标注工作流与YOLO格式适配清洗和增强后的图像进入标注环节。我选择使用Roboflow在线平台进行标注它比本地LabelImg等工具在协同管理和后续格式转换上更方便。当然你也可以使用CVAT或LabelStudio。4.1 标注规范制定在开始标注前团队或自己必须统一规范这是保证标注质量的生命线smoking框范围尽可能紧贴行为区域。上边界通常在头顶上方一点下边界到胸部或上腹部左右边界包含抬起的手臂。核心是要框住“手-烟-嘴”这个动作单元。难点处理对于侧面视角框可能会是较窄的长方形对于多人聚集且只有一人吸烟框要紧贴该行为人避免包含过多无关他人。cigarette框范围紧贴香烟或电子烟的主体包括燃烧端如果有可见红光或烟。对于电子烟框住整个设备主体。可见部分很少时即使只露出一小截只要可辨识也应标注。如果完全被手遮挡则不标。标签一致性同一个目标在不同帧中框的大小和位置应平滑变化符合运动规律。标注时需要偶尔回看前后帧进行检查。4.2 从标注工具到YOLOv5格式Roboflow等平台通常支持直接导出YOLO格式。YOLO格式的标注文件.txt与图片同名每行代表一个目标格式为class_id x_center y_center width height坐标和宽高都是相对于图片宽度和高度的归一化值0到1之间。关键步骤验证标注格式导出后务必写一个简单的脚本进行验证这是避免训练时出现“诡异”错误的关键一步。import os from PIL import Image def validate_yolo_annotation(img_dir, label_dir, class_names): for label_file in os.listdir(label_dir): if not label_file.endswith(.txt): continue img_file label_file.replace(.txt, .jpg) # 假设图片是jpg格式 img_path os.path.join(img_dir, img_file) label_path os.path.join(label_dir, label_file) # 检查图片是否存在 if not os.path.exists(img_path): print(fWarning: {img_file} not found for {label_file}) continue with Image.open(img_path) as img: img_w, img_h img.size with open(label_path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: print(fError: Invalid line format in {label_file}: {line}) continue class_id, x_c, y_c, w, h map(float, parts) # 检查坐标是否在[0,1]范围内 if not (0 x_c 1 and 0 y_c 1 and 0 w 1 and 0 h 1): print(fError: Bbox out of bounds in {label_file}: {line}) # 检查类别ID是否有效 if int(class_id) len(class_names): print(fError: Invalid class_id {class_id} in {label_file}) # 用法 class_names [smoking, cigarette] # 顺序对应class_id 0和1 validate_yolo_annotation(path/to/images, path/to/labels, class_names)这个脚本能帮你抓出标注文件中的格式错误、越界坐标、类别ID错误等常见问题。4.3 数据集划分将标注好的数据按比例划分是标准操作。我的划分策略是训练集Train70%。用于模型参数学习。验证集Validation20%。用于训练过程中监控模型性能调整超参数防止过拟合。测试集Test10%。完全留白仅在最终模型训练完成后用于评估其真实的泛化能力。测试集的图片不应参与任何数据增强或训练过程。划分时要确保各类别smoking,cigarette在三个集合中的分布比例大致相同避免某一类在某个集合中缺失。5. YOLOv5模型训练配置与调优要点数据集准备就绪后就可以启动YOLOv5训练了。这里我分享针对我们这个特定数据集的关键配置和调优经验。5.1 环境搭建与数据配置文件首先从官方仓库克隆YOLOv5代码并安装依赖。然后创建我们的数据集配置文件smoking_dataset.yaml放在yolov5/data/目录下。# smoking_dataset.yaml path: /path/to/your/smoking_dataset # 数据集根目录 train: images/train # 训练集图片相对路径 val: images/val # 验证集图片相对路径 test: images/test # 测试集图片相对路径 # 类别数 nc: 2 # 类别名称顺序必须与标注时的class_id对应 names: [smoking, cigarette]重要细节path可以是绝对路径也可以是相对于YOLOv5项目根目录的相对路径。确保images和labels文件夹在trainvaltest子目录下结构一致。5.2 模型选择与超参数调整YOLOv5提供了n,s,m,l,x等不同大小的模型。对于吸烟行为识别我的经验是从YOLOv5s开始它是一个很好的平衡点速度和精度兼顾。在数据集不是特别巨大的情况下例如1-2万张图片s模型通常能取得不错的效果且推理速度快适合部署。如果追求更高精度且计算资源充足可以尝试YOLOv5m或YOLOv5l。YOLOv5x对于我们的任务可能过参数化容易过拟合除非你的数据量非常大10万。关键超参数调优 启动训练的命令类似python train.py --img 640 --batch 16 --epochs 100 --data data/smoking_dataset.yaml --weights yolov5s.pt --hyp data/hyps/hyp.scratch-low.yaml--img 640输入图像尺寸。YOLOv5训练时会自动缩放到这个尺寸。对于小目标香烟检测增大img尺寸如1280可能有益因为小目标在更高分辨率下包含更多像素。但代价是训练速度变慢、显存消耗增加。我建议先用640训练一个baseline如果发现cigarette的AP平均精度很低再尝试增大尺寸。--batch批次大小。在显存允许的情况下尽可能设大有助于训练稳定。如果出现OOM内存不足可以减小batch或img尺寸或者使用--multi-scale训练多尺度训练YOLOv5支持。--epochs训练轮数。100轮是个不错的起点。通过观察验证集损失val_loss和指标mAP0.5是否收敛来决定是否提前停止或增加轮数。--hyp超参数配置文件。hyp.scratch-low.yaml是针对从头训练scratch的保守配置。对于我们的任务建议调整hyp文件中的fl_gamma参数。Focal Loss用于解决类别不平衡问题。我们的数据集中cigarette目标数量远少于smoking目标属于典型的不平衡。可以尝试将fl_gamma从默认值如1.5或2.0适当调大例如3.0让模型更关注难以分类的cigarette样本。5.3 训练过程监控与问题诊断训练开始后TensorBoard或YOLOv5自带的日志是重要的诊断工具。关注验证集损失val_loss它应该随着训练轮数稳步下降并最终趋于平缓。如果val_loss在下降后突然上升可能是过拟合的迹象需要检查数据增强是否足够或增加正则化如调整weight_decay。核心指标mAP0.5这是衡量检测精度的核心指标。重点关注两个类别的APAP_smoking通常较高因为目标相对较大。AP_cigarette这是难点。如果这个值一直很低比如低于0.3说明模型没学会检测香烟。可能的原因数据中cigarette样本太少、标注质量差、或者模型/超参数不适合小目标检测。此时需要回到数据层面增加cigarette的样本或增强或者尝试专门的小目标检测优化策略。学习率曲线YOLOv5使用余弦退火等动态学习率策略。确保学习率正常下降。如果损失曲线震荡剧烈可能是初始学习率太大可以尝试减小--lr0。5.4 针对小目标Cigarette的优化技巧如果cigarette检测效果不佳除了调整数据还可以在模型层面进行微调修改Anchor BoxesYOLOv5默认会使用K-means聚类你的训练数据生成一组新的Anchor。这是自动的通常效果很好。但你可以通过检查utils/autoanchor.py运行后输出的新Anchor尺寸来确认它们是否覆盖了cigarette这种极小目标宽高可能只有几个像素。如果不覆盖可以考虑在数据增强中增加小目标的出现概率或者手动在model.yaml中添加更小的Anchor需谨慎一般不建议。注意力机制可以为YOLOv5的Neck或Head部分添加注意力模块如CBAM或SE。这些模块可以帮助模型聚焦于图像中更重要的区域对于在复杂背景中定位细小香烟有帮助。但这需要修改模型代码属于进阶操作。特征金字塔优化YOLOv5的PANet结构已经做了多尺度特征融合。确保训练时开启了多尺度训练--multi-scale这能让模型更好地适应不同尺度的目标。6. 模型评估、测试与部署前验证训练完成后模型在验证集上的表现只是一个参考。真正的考验在完全独立的测试集上。6.1 全面评估与错误分析使用以下命令在测试集上运行评估python val.py --weights runs/train/exp/weights/best.pt --data data/smoking_dataset.yaml --task test --img 640仔细分析输出的结果混淆矩阵Confusion Matrix查看cigarette被误检为背景漏检或其他类别的比例以及smoking的误检情况。PR曲线Precision-Recall Curve观察在不同置信度阈值下模型的精确率和召回率。如果cigarette的PR曲线面积小说明模型对其识别能力弱。可视化检测结果使用--save-txt和--save-conf选项保存测试集的检测结果然后抽样查看。这是最直观的方法。看看模型在哪些图片上成功了在哪些图片上失败了漏检、误检。常见的失败模式有香烟被手完全遮挡。远处或极暗环境下的香烟。类似香烟的细长物体笔、吸管导致的误报。多人场景中吸烟行为框定位不准。6.2 部署前优化降低误报的实用策略基于错误分析我们可以在不重新训练模型的情况下通过后处理规则来优化部署效果置信度阈值调优为两个类别设置不同的置信度阈值。smoking可以设低一些如0.4以保证召回率宁可错报不可漏报cigarette可以设高一些如0.6或0.7因为它的误报成本高把笔当成烟会很尴尬。空间关系过滤利用我们“两级目标”的优势。制定一条规则一个有效的“吸烟行为”警报必须同时检测到smoking框和一个与之有空间交集的cigarette框。可以计算cigarette框的中心点是否落在smoking框内或者两者的IoU交并比是否大于一个阈值如0.1。这能过滤掉大量孤立的、可能是误检的cigarette。时序平滑对于视频流应用不要逐帧独立判断。可以设置一个时间窗口如5帧只有当在这个窗口内连续或多次检测到“吸烟行为”才触发最终警报。这能有效抑制单帧的偶然误检。6.3 模型导出与部署考量YOLOv5训练出的.pt文件是PyTorch模型。部署时需要根据目标平台进行转换ONNX通用格式使用export.py脚本可以轻松导出。这是转换为其他运行时如TensorRT, OpenVINO的中间步骤。TensorRT如果部署在NVIDIA Jetson等边缘设备上转换为TensorRT引擎能极大提升推理速度。需要安装TensorRT并可能进行FP16或INT8量化。CoreML / TFLite针对苹果iOS设备或安卓/嵌入式设备。部署经验在转换和部署时务必确保预处理图像归一化、通道顺序等与训练时完全一致。一个常见的坑是训练时用了--img 640但部署时输入尺寸不一致导致性能严重下降或错误。7. 项目总结与未来扩展方向构建这个数据集并完成YOLOv5模型训练的全过程是一次从数据到模型的完整闭环实践。核心收获在于深刻理解到对于特定的、细分的视觉任务高质量、针对性强的数据集是成功的基石其重要性甚至不亚于模型结构本身。我个人的体会是在“吸烟行为识别”这个任务上花费在数据收集、清洗、标注和增强上的时间至少占了整个项目周期的60%以上。而一个设计良好的标注方案如我们的“两级目标”能事半功倍让模型更容易学到本质特征。这个数据集和训练流程还有很大的扩展空间数据维度扩展目前以RGB图像为主。未来可以考虑纳入红外热成像数据因为香烟的燃烧点有显著的热信号这在夜间或遮挡情况下可能成为关键特征。这需要多模态数据融合的技术。从检测到精细行为分析当前模型只能判断“是否在吸烟”。可以进一步例如判断“点燃”、“吸食”、“持烟”等更细粒度的阶段。这需要更密集的时序标注和可能引入视频理解模型如SlowFast, Timesformer。轻量化与边缘部署优化为了在更低算力的设备如RV1106、RK3568这类嵌入式芯片上运行可以探索模型剪枝、量化、知识蒸馏等技术在精度和速度间寻找最佳平衡点。YOLOv5本身也提供了更小的模型如YOLOv5n可以作为起点。持续学习与数据迭代将初步部署的模型用于实际场景收集它判断困难或出错的案例难例将这些数据加入训练集进行重新训练能让模型在实际应用中不断进化越来越“聪明”。最后这个项目所有相关代码、数据处理脚本以及整理后的数据集在符合数据来源许可的前提下我都计划开源。希望这份详实的构建指南能为你启动自己的特定目标检测项目提供一份可靠的“地图”避开我走过的那些弯路更高效地抵达目的地。本文还有配套的精品资源点击获取