资讯详情

资讯详情

YOLO吸烟行为检测数据集实战:从数据验证到模型训练与落地

简介这份YOLO吸烟检测数据集面向计算机视觉学习者与目标检测开发者用于训练和验证吸烟行为识别模型可应用于公共场所禁烟监控、工地安全管理等场景。数据集已按train、val、test完成划分并附带data.yaml配置文件类别涵盖no_smoking、no_smoking_area、smoking三类yolov5、yolov7、yolov8等主流框架可直接读取训练省去自行标注与整理目录的繁琐工作。压缩包共412个文件以204个jpg图像与204个txt标注文件为主另含4个yaml配置整体约11.48MB体积轻便便于快速下载与本地调试。目前已有658人学习下载配套博文还提供了检测结果参考方便读者对照验证模型效果。对于想快速跑通吸烟检测流程、研究多类别行为识别或搭建禁烟监控原型的读者这份资源能直接作为训练起点减少数据准备成本。1. 吸烟行为检测数据集从拿到 smoking-dataset-yolo-1.zip 到跑通第一轮训练上周有个做智慧工地和校园安防的朋友找我说甲方要在现有监控里加一路「吸烟行为识别」问我有没有现成的 YOLO 数据集能直接开训。我第一反应就是翻出这份 smoking-dataset-yolo-1.zip——它属于典型的「拿来就能跑」型目标检测数据集目录已经按 train/valid/test 切好data.yaml 也配好了yolov5、yolov7、yolov8 这些主流版本不用改结构就能直接喂进去。它解决的不是「从零标注」的问题而是帮你省掉最耗时的数据清洗和划分环节让你把精力放在模型选型和调参上。适合谁做安防、工地、校园行为分析的算法工程师以及想拿一个真实三分类数据集练手 YOLO 训练流程的人。下面我按自己拆包、验证、训练的顺序把这份资源讲透。2. 拆开压缩包先看什么目录结构、类别定义与 data.yaml 逐行解读拿到一个 YOLO 数据集我从来不急着敲训练命令而是先花十分钟把目录和配置文件过一遍。这一步能提前暴露 80% 的低级错误比如路径写错、类别名对不上、图片和标签数量不匹配。smoking-dataset-yolo-1.zip 解压后是一个标准的 YOLO 格式工程下面按我实际拆包看到的顺序讲。2.1 目录树与文件命名规律解压后顶层目录大致是这样smoking-dataset-yolo-1/ ├── data.yaml ├── train/ │ ├── images/ │ └── labels/ ├── valid/ │ ├── images/ │ └── labels/ └── test/ ├── images/ └── labels/图片文件名是b6_jpg.rf.80e68736669583c0526225e7e294ca4f.jpg这种形式前缀b6、b7、b3、c7、b2是原始采集批次或场景编号后面rf.加一长串哈希是导出工具常见的是 Roboflow自动加的唯一标识。这种命名看着乱但好处是不会重名坏处是你没法从文件名直接判断内容。标签文件是同名的.txt和图片一一对应放在同级labels/目录下。这里有个血泪经验很多人解压后直接看train/images里图片挺多就以为没问题结果labels目录是空的或者数量对不上。所以第一步一定是数数。# 分别统计三个子集的图片数和标签数两者必须相等 for split in train valid test; do img$(ls smoking-dataset-yolo-1/$split/images | wc -l) lbl$(ls smoking-dataset-yolo-1/$split/labels | wc -l) echo $split: images$img labels$lbl done逻辑说明ls | wc -l统计文件数量循环遍历三个子集。如果某个子集 images 和 labels 数量不一致说明有图片没标注或者标签文件丢失训练时 YOLO 会直接跳过无标签图片导致实际训练样本比你以为的少。参数上没什么可调的就是核对数量。2.2 data.yaml 三个类别与路径配置data.yaml 是 YOLO 训练的入口配置内容如下names: [no_smoking, no_smoking_area, smoking] train: ./train/images val: ./valid/images test: ./test/image逐行看。names是类别列表索引从 0 开始也就是说0no_smoking、1no_smoking_area、2smoking。标签 txt 里每行的第一个数字就是这里的索引所以类别顺序绝对不能改改了标签含义就全乱了。train、val、test是三个子集的图片路径注意这里是相对路径相对于你启动训练时的工作目录不是相对于 data.yaml 所在目录——这是新手最容易翻车的地方。注意test那行写的是./test/image少了个s。如果你的 test 目录实际叫images这行必须改成./test/images否则做测试集评估时会报路径不存在。我一般会先手动确认目录名再决定改不改。三个类别的设计其实有讲究smoking是明确的吸烟行为no_smoking是不吸烟的正常状态no_smoking_area是禁烟区域标识。这意味着模型不仅要识别「有没有烟」还要区分「人在不在禁烟区」属于行为加场景的联合判断。如果你的业务只关心吸烟动作本身可以只保留smoking和no_smoking两类重新生成标签但那就脱离了这份数据集的原设计。2.3 标签格式与坐标归一化YOLO 标签每行格式是class_id x_center y_center width height后四个都是归一化到 0~1 的相对值。随便打开一个标签文件看看# 查看某个标签文件内容确认格式正确 cat smoking-dataset-yolo-1/train/labels/b6_jpg.rf.80e68736669583c0526225e7e294ca4f.txt正常输出类似2 0.512 0.634 0.087 0.211表示类别 2smoking目标中心在图片宽高 51.2% 和 63.4% 位置框宽高占整图 8.7% 和 21.1%。如果看到坐标大于 1 或者负数说明标注工具导出时没归一化需要自己转换。这份数据集我抽查了几个文件坐标都在合理范围内格式是标准的。3. 用 YOLOv8 跑通第一轮训练环境、命令与参数怎么设数据确认没问题就可以上模型了。这份数据集官方说法是 yolov5、yolov7、yolov8 都能直接训我选 YOLOv8 演示因为它的命令行最简洁报错信息也最友好。下面从环境到训练到看结果一步步来。3.1 环境搭建与依赖安装我一般用 conda 建独立环境避免和系统里的包打架conda create -n yolo_smoke python3.10 -y conda activate yolo_smoke pip install ultralytics逻辑说明ultralytics这个包同时包含 YOLOv8 的训练、验证、推理接口装它一个就够了。Python 选 3.10 是因为 3.11 以上某些 torch 版本兼容性还在磨合3.10 最稳。装完可以yolo checks看一下环境它会列出 torch 版本、CUDA 是否可用。如果你有 GPU确认CUDA那行是可用状态没有 GPU 就用 CPU 训速度慢但能跑通流程。参数上ultralytics会自动拉取匹配的 torch 版本。如果你机器上已经有特定版本的 torch建议先pip install torch指定版本再装 ultralytics避免它给你升级或降级。3.2 训练命令与关键参数含义假设你已经cd到解压后的smoking-dataset-yolo-1目录训练命令yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ projectruns/smoke \ nameexp1逐参数说明。datadata.yaml指向配置文件路径要对。modelyolov8n.pt是 nano 版本预训练权重最小最快适合先跑通流程如果精度不够再换yolov8s.pt或yolov8m.pt。epochs100是训练轮数这份数据集规模不算大100 轮通常够收敛但要看后面的 loss 曲线决定加不加。imgsz640是输入分辨率YOLO 默认 640如果你的监控画面里吸烟动作目标很小可以提到 1280但显存占用会翻倍。batch16是批大小显存不够就降到 8 或 4。project和name决定结果保存路径跑完在runs/smoke/exp1/下能看到权重、曲线和日志。提示第一次跑建议先用epochs10快速验证流程通不通确认没问题再改成 100 正式训。这样能省下大量等待时间。3.3 训练过程看什么指标训练启动后终端会滚动输出每个 epoch 的 loss 和 mAP。重点盯三个box_loss、cls_loss、mAP50。box_loss是边界框回归损失cls_loss是分类损失两个都应该随 epoch 下降并逐渐平稳。mAP50是 IoU 阈值 0.5 下的平均精度应该上升。如果cls_loss一直不降常见原因是类别不平衡——这份数据集里smoking样本可能远少于no_smoking模型倾向于全预测多数类。训练结束后在runs/smoke/exp1/下会生成results.png里面包含所有曲线。我习惯先看confusion_matrix.png能直观看到三个类别之间有没有互相混淆。如果no_smoking和no_smoking_area混淆严重说明这两个类在视觉上区分度不够可能需要更多场景样本或调整标注边界。4. 训练完怎么验证推理、指标解读与常见误判排查模型训完不是看个 mAP 就完事得实际跑几张图看看效果再结合指标判断能不能上线。这一章讲验证流程和几个我踩过的坑。4.1 用训练好的权重做推理yolo detect predict \ modelruns/smoke/exp1/weights/best.pt \ sourcesmoking-dataset-yolo-1/test/images \ conf0.25 \ saveTrue逻辑说明model指向训练产出的最佳权重best.ptsource可以是单张图、目录或视频。conf0.25是置信度阈值低于这个值的检测框会被过滤。saveTrue把带框结果存到runs/detect/predict/下。跑完去翻结果图重点看漏检和误检漏检是明明在吸烟没框出来误检是把正常动作框成吸烟。参数上conf调低会召回更多但误检增加调高则相反。安防场景一般宁可误报不可漏报可以设 0.2 左右如果误报太多影响体验提到 0.4 再观察。4.2 混淆矩阵与 mAP 指标怎么读confusion_matrix.png的横轴是预测类别纵轴是真实类别对角线是正确预测。如果smoking那一行有大量落到no_smoking列说明吸烟被误判成不吸烟这是最危险的漏检。mAP50和mAP50-95两个指标前者宽松后者严格一般看mAP50判断整体可用性看mAP50-95判断框的定位精度。这份数据集如果mAP50能到 0.8 以上基本可用低于 0.6 就要考虑加数据或换更大模型。4.3 三个高频误判场景第一手靠近嘴部的动作打电话、吃东西容易被误判为吸烟因为视觉特征相似。第二远处小目标吸烟动作640 分辨率下可能只有十几个像素模型看不清。第三逆光或夜间红外画面颜色特征丢失smoking和no_smoking区分度下降。这三个场景我在实际项目里都遇到过解决办法分别是补充负样本、提高输入分辨率、增加红外场景训练数据。5. 避坑与排查路径、类别、显存和标签的五个真实翻车记录这一章是我和身边同事用这类数据集时踩过的坑每条按现象、原因、解决写你对照排查能省不少时间。现象一训练报No labels found。原因data.yaml 里的路径是相对启动目录的你在别的目录下敲命令YOLO 找不到train/images。解决要么cd到数据集根目录再启动要么把 data.yaml 里的路径改成绝对路径。现象二训练正常但 mAP 一直是 0。原因标签里的 class_id 超出了names列表范围比如标签写了3但只有三个类别0、1、2。解决用脚本扫描所有标签文件找出最大 class_id确认不超过len(names)-1。# 扫描所有标签输出出现过的最大类别索引 cat smoking-dataset-yolo-1/train/labels/*.txt | awk {print $1} | sort -n | uniq逻辑说明awk {print $1}取每行第一个字段即类别索引sort -n | uniq排序去重后列出所有出现过的类别。如果看到 3 或更大说明标签有问题。现象三CUDA out of memory。原因batch或imgsz设太大显存不够。解决先把batch降到 8 甚至 4还不行就把imgsz从 640 降到 416。也可以开混合精度训练YOLOv8 默认开启 AMP如果被手动关了记得打开。现象四test路径报错找不到目录。原因data.yaml 里写的是./test/image实际目录是images。解决核对实际目录名改 data.yaml 或重命名目录保持一致。现象五验证集指标很好但实际推理很差。原因train 和 valid 可能来自同一批场景分布太接近模型过拟合了。解决看 test 集指标如果 test 明显低于 valid说明泛化不行需要补充不同场景的数据。这份数据集已经分好了 test一定要用它做最终评估别只看 valid。6. 进阶技巧类别不平衡处理与从检测到行为判定的落地思路跑通基础训练后如果你要把这份数据集用到真实项目里还有两件事值得做。一是处理类别不平衡二是把单帧检测升级成时序行为判定。类别不平衡方面smoking样本通常少于no_smoking我一般会在训练时给类别加权。YOLOv8 没有直接的 class weight 参数但可以通过复制少数类样本或使用focal loss变体来缓解。更简单的做法是数据增强时对smoking类多做几次随机裁剪和亮度扰动间接提升它的占比。时序行为判定是落地关键。单帧检测到smoking不等于人在吸烟可能只是手拿了个类似烟的物体。我的习惯是对同一路视频流连续 N 帧中至少有 M 帧检测到smoking才触发告警。这个 N 和 M 要根据帧率调25fps 下我一般设 N50、M30也就是 2 秒内超过一半帧命中才报。这样能过滤掉大量瞬时误检。# 简化的时序判定逻辑counter 为滑动窗口内 smoking 命中帧数 from collections import deque window deque(maxlen50) def judge(is_smoking_frame): window.append(1 if is_smoking_frame else 0) if len(window) 50 and sum(window) 30: return True # 触发吸烟告警 return False逻辑说明deque(maxlen50)维护一个固定长度滑动窗口每帧追加 0 或 1窗口满且命中数达到阈值就返回 True。参数maxlen和阈值30按实际帧率和业务容忍度调整。这个逻辑不依赖模型本身是后处理层能显著降低误报。从那以后我每次拿到新的行为检测数据集都强制先跑一遍 test 集看混淆矩阵再决定要不要上时序后处理。这份 smoking-dataset-yolo-1.zip 的价值在于它把最繁琐的数据准备做完了你拿到手就能验证模型和调后处理逻辑省下的时间够你把告警策略打磨好几轮。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →