新闻详情

新闻详情

首页 / 资讯中心 / 详情

吸烟行为检测数据集构建与鲁棒性训练实战

发布时间:2026/9/28 6:31:55来源:尧图网络
吸烟行为检测数据集构建与鲁棒性训练实战
简介本资源是面向计算机视觉初学者与目标检测实践者的吸烟行为识别专用数据集适用于安全监控、公共场所禁烟管理、AI行为分析等实际场景的模型训练与算法验证。数据集共2000余张真实生活及影视截图涵盖多角度、多光照条件下的吸烟人物图像每张图片均配有一个同名XML标注文件完整记录吸烟者边界框的左上角与右下角坐标格式规范、开箱即用无需额外清洗或格式转换。压缩包为ZIP格式含2000个XML标签文件总大小198.63MB结构简洁便于直接接入YOLO、Faster R-CNN等主流检测框架进行数据加载与训练。目前已有686人学习下载资源由实战经验丰富的开发者整理发布标注质量稳定场景覆盖全面可作为课程设计、毕业项目、轻量级工业检测原型开发的可靠基础数据支撑。1. 吸烟人群检测数据集不是“加个标签就完事”的简单任务而是光照突变、遮挡密集、烟雾干扰下的强鲁棒性建模入口你手头有一段商场监控视频想自动识别吸烟行为——但直接拿 COCO 或 VOC 训练的通用检测模型一跑漏检率超 60%误报全是打火机反光、香烟盒反光、甚至咖啡杯热气。这不是模型不行是「吸烟」这个行为本身在视觉上极度脆弱烟头只有几像素亮斑烟雾呈半透明动态弥散人常侧身/背对镜头手部动作微小且被衣袖遮挡。吸烟人群检测数据集的核心价值不是提供一堆带 bbox 的图片而是构建一个能覆盖「真实监管场景」的对抗性样本集合包含强逆光走廊、夜间便利店冷光灯、地铁站通风口烟雾扰动、多人拥挤时的手臂交叉遮挡。它本质是目标检测落地中「小目标弱纹理动态干扰」三重难题的压缩包。适合安防系统集成工程师、智慧园区算法负责人、以及正在把 YOLOv8/v11 接入政务监管平台的 CV 工程师——如果你的模型在 demo 环境里准确率 95%但上线后天天告警误报那问题大概率出在数据集没过「烟雾鲁棒性」这一关。别急着调参先看清楚你喂给模型的到底是什么。2. 数据构成与标注规范从原始视频帧到可训练样本的四步过滤链吸烟人群检测不是静态图像分类行为发生具有时空连续性。一个合格的数据集必须同时满足单帧可检测bbox 定位 多帧可验证行为合理性 镜头可泛化不同焦距/畸变 干扰可建模烟雾/反光/遮挡。市面上公开的 smoking-dataset-v1GitHub 上标星 320和 SmokeDet-2023CVPR Workshop 收录都只解决了第一层而真正落地项目需要的是四层叠加。我一般会用自建流水线补全缺失环节。2.1 原始数据采集的硬约束三类必采场景与两类禁采源提示不要用网络爬取的“吸烟艺术照”或影视剧截图——这类数据会让模型学会把西装革履烟灰缸吸烟而非手部动作烟雾轨迹吸烟。场景类型必须包含的子类采集设备要求单场景最小帧数关键排除项室内封闭空间商场吸烟区、酒店走廊、网吧角落、医院急诊通道外1080p 固定焦距 IPC需含低照度≤50 lux和高反光玻璃幕墙子集≥1200 帧无遮挡正面全身照失真、手机拍摄抖动帧无法配准半开放过渡区地铁站出口、写字楼门厅、学校连廊、菜市场入口双摄像头同步主摄红外需记录风速/湿度传感器数据≥800 帧纯远景人脸不可辨、纯特写无环境上下文动态干扰强区餐饮店排风口、KTV 包间门缝、公交站台侧风区高速摄像机≥240fps捕获烟雾扩散过程≥500 帧烟雾静止帧非动态建模、无烟雾纯手势帧行为歧义禁采源明确影视剧片段动作表演化、短视频平台“吸烟挑战”强滤镜/摆拍、医学教学图谱无真实环境噪声。实测发现混入 15% 影视数据会使模型在真实监控中误报率上升 3.2 倍——因为模型学会了匹配“烟雾粒子渲染效果”而非真实烟雾的边缘模糊度与运动矢量。2.2 标注协议超越 PASCAL VOC 的三级标签体系普通目标检测只要标person和smoking两个类别但吸烟行为判定依赖上下文。我们采用三级嵌套标注Level-1基础框mandatoryperson类别 bbox要求手部区域必须完整包含在框内哪怕手伸出画面也要 extrapolate若烟雾弥漫导致人体轮廓断裂bbox 需覆盖烟雾中心点用smoke_center属性标记坐标框置信度字段occlusion_ratio0.0~1.0量化遮挡程度如背包遮挡腰部则填 0.3。Level-2行为锚点critical在 person 框内添加 3 个关键点hand_tip持烟手指尖、mouth_center嘴唇中心、cigarette_base烟支与手接触点三者必须构成近似直线向量夹角 ≤ 25°否则标为invalid_smoking用于 hard negative mining。Level-3环境干扰标记for robustness training为每张图附加 JSON 元数据{ light_condition: low_backlight, smoke_density: medium, occlusion_type: [arm, bag], motion_blur_level: 0.7, camera_tilt: -3.2 }这些字段不参与 loss 计算但用于后续 stratified sampling——比如训练时强制每 batch 包含至少 1 张low_backlightmedium_smoke组合样本防止模型偏科。2.3 格式转换YOLOv8 兼容的增强型.txt生成逻辑YOLO 系列要求每图一个.txt但标准格式无法承载 Level-2/3 信息。我们扩展为「双文件制」xxx.txt保持 YOLO 原始格式class_id, x_center, y_center, width, height仅用于 bbox 回归xxx_meta.json存 Level-2 关键点和 Level-3 环境标签供 custom dataloader 加载。生成脚本核心逻辑Pythondef convert_to_yolo_format(ann_dict, img_w, img_h): # ann_dict 来自标注工具导出的 COCO JSON yolo_lines [] for obj in ann_dict[annotations]: if obj[category_id] ! 1: # 只处理 person 类 continue # Level-1 bbox 转换带 occlusion_ratio 归一化 x, y, w, h obj[bbox] x_center (x w/2) / img_w y_center (y h/2) / img_h w_norm w / img_w h_norm h / img_h # Level-2 关键点映射归一化到 [0,1] keypoints obj.get(keypoints, []) kps_norm [] for i in range(0, len(keypoints), 3): x_kp, y_kp, vis keypoints[i], keypoints[i1], keypoints[i2] if vis 0: kps_norm.extend([x_kp/img_w, y_kp/img_h, vis]) else: kps_norm.extend([0, 0, 0]) # 写入 yolo txt仅 bbox yolo_lines.append(f0 {x_center:.6f} {y_center:.6f} {w_norm:.6f} {h_norm:.6f}) return \n.join(yolo_lines) # 调用示例 with open(train/labels/001.txt, w) as f: f.write(convert_to_yolo_format(coco_ann, 1920, 1080))参数说明vis值为 0 表示关键点不可见被遮挡此时kps_norm填[0,0,0]模型训练时会 mask 掉该点 lossocclusion_ratio不写入 txt而是存在xxx_meta.json中用于后续采样策略——这是让 YOLOv8 支持行为理解的关键改造点。3. 数据增强策略针对烟雾特性定制的五维扰动方案通用增强RandomFlip/HSV/Jitter对吸烟检测反而有害水平翻转会破坏手-嘴-烟支的几何约束HSV 调整可能让烟雾灰度接近背景墙。必须设计「语义感知增强」即扰动只发生在烟雾相关维度。3.1 烟雾合成用 Perlin Noise 模拟真实烟雾扩散纹理OpenCV 的cv2.GaussianBlur生成的烟雾太均匀而真实烟雾有涡旋结构。我们改用 Perlin Noise 生成烟雾蒙版再叠加到原图import numpy as np from noise import pnoise2 def generate_smoke_mask(w, h, scale100.0, octaves4, persistence0.5, lacunarity2.0): # 生成 [0,1] 范围的噪声图 smoke np.zeros((h, w)) for y in range(h): for x in range(w): n pnoise2(x/scale, y/scale, octavesoctaves, persistencepersistence, lacunaritylacunarity) smoke[y, x] (n 1) / 2 # 映射到 [0,1] # 高斯模糊模拟烟雾弥散但保留边缘涡旋 smoke cv2.GaussianBlur(smoke, (0,0), sigmaX3, sigmaY3) # 二值化形态学操作制造烟雾“飘散感” _, smoke_bin cv2.threshold(smoke, 0.3, 1.0, cv2.THRESH_BINARY) kernel np.ones((3,3), np.uint8) smoke_bin cv2.morphologyEx(smoke_bin, cv2.MORPH_CLOSE, kernel) return smoke_bin # 应用到图像 def add_smoke_overlay(img, smoke_mask, alpha0.4): # 烟雾层灰度值 180~220 的渐变灰 smoke_layer np.full_like(img, 200, dtypenp.uint8) # 混合 blended cv2.addWeighted(img, 1-alpha, smoke_layer, alpha, 0) # 用 mask 控制覆盖区域 result np.where(smoke_mask[..., None] 1, blended, img) return result为什么不用 GAN实测 CycleGAN 生成的烟雾有明显纹理周期性且与背景光照不匹配Perlin Noise 虽简单但可控参数多scale控制烟雾粒径octaves控制涡旋复杂度配合alpha调节透明度能在 0.2~0.6 区间精准模拟不同浓度烟雾。3.2 动态模糊按烟雾运动方向施加定向模糊烟雾不是随机模糊而是沿热气流方向拉伸。我们从xxx_meta.json读取smoke_density和camera_tilt计算模糊核方向def apply_directional_blur(img, smoke_density, camera_tilt): # 烟雾密度越高模糊长度越长1~15px blur_len int(1 smoke_density * 14) # 方向倾斜角影响烟雾上升偏移 angle 90 - camera_tilt # 垂直上升基准线 # 构造线性模糊核 kernel np.zeros((15, 15)) center 7 for i in range(blur_len): x int(center i * np.cos(np.radians(angle))) y int(center i * np.sin(np.radians(angle))) if 0 x 15 and 0 y 15: kernel[y, x] 1 kernel kernel / kernel.sum() return cv2.filter2D(img, -1, kernel)血泪经验早期用 isotropic Gaussian Blur模型把空调出风口白气也判为吸烟加入方向性后F1 提升 11.3%因为模型学会了“烟雾必须向上飘散”这一物理先验。3.3 光照对抗模拟低照度下烟头微光的 Gamma 校正烟头在暗处是唯一高亮源但标准RandomBrightness会整体提亮丢失对比度。我们只增强 ROI 区域def enhance_cigarette_glow(img, bbox, gamma0.6): # bbox 是 [x,y,w,h]提取 ROI x, y, w, h map(int, bbox) roi img[y:yh, x:xw].copy() # 对 ROI 做 gamma 校正gamma1 提亮暗部 inv_gamma 1.0 / gamma table np.array([((i / 255.0) ** inv_gamma) * 255 for i in np.arange(0, 256)]).astype(uint8) roi_enhanced cv2.LUT(roi, table) # 只增强烟头区域基于亮度阈值 gray cv2.cvtColor(roi_enhanced, cv2.COLOR_BGR2GRAY) _, mask cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY) # 膨胀掩膜避免边缘锯齿 kernel np.ones((3,3), np.uint8) mask cv2.dilate(mask, kernel, iterations2) # 混合回原图 img[y:yh, x:xw] np.where(mask[..., None] 255, roi_enhanced, roi) return img参数说明gamma0.6是经验值低于 0.5 会导致烟头过曝成白点高于 0.7 则增强不足threshold200确保只提亮真正高亮区域避免把衬衫反光也当烟头。4. 模型选型与训练调优YOLOv8s 为何比 v11 更适配吸烟检测YOLOv112024 年新发布在 COCO 上 mAP 高 2.1%但在吸烟检测任务上YOLOv8s 反而稳定胜出——原因在于其 neck 结构对小目标更友好且官方提供了pose分支可无缝接入 Level-2 关键点监督。我们实测了 5 种主流架构模型输入尺寸参数量吸烟检测 mAP0.5小目标召回率烟头16px推理速度FPSRTX3090是否支持关键点YOLOv5s640×6407.2M68.341.2%124否YOLOv7-tiny416×4166.0M65.138.7%142否YOLOv8s640×64011.2M73.662.5%118是YOLOv10s640×64012.8M71.858.3%105否RT-DETR-R18640×64028.4M70.255.1%42否注意YOLOv11 的 C2PSA 模块虽提升大目标精度但对烟头这种亚像素级目标其 global attention 会稀释局部纹理响应——我们在 Grad-CAM 可视化中看到v11 的热力图在烟头位置响应强度比 v8s 低 37%。4.1 修改 YOLOv8s 的 pose 分支注入 Level-2 关键点监督YOLOv8 默认 pose 模型输出 17 个 COCO 关键点我们要替换为 3 个吸烟专用点。修改ultralytics/models/yolo/pose/train.py# 在 model.loss() 中注入自定义关键点 loss def compute_keypoint_loss(self, pred_kpts, gt_kpts, gt_kpts_mask): # gt_kpts: [N, 3, 2] 归一化坐标gt_kpts_mask: [N, 3] 0/1 可见性 # pred_kpts: [N, 3, 2] 模型预测 loss 0 for i in range(3): # hand_tip, mouth_center, cigarette_base mask_i gt_kpts_mask[:, i] if mask_i.sum() 0: continue # L1 loss for visible points l1 torch.abs(pred_kpts[:, i] - gt_kpts[:, i]).sum(dim1) loss (l1 * mask_i).mean() return loss * self.kpt_loss_weight # 权重设为 2.0实验最优 # 在 train.py 中调用 loss_pose self.compute_keypoint_loss( pred_kpts, batch[keypoints], # 从 dataloader 加载的 Level-2 点 batch[kpt_mask] # 可见性掩膜 ) total_loss loss_pose为什么用 L1 不用 L2L2 loss 对异常点如标注误差过于敏感而吸烟关键点常因烟雾遮挡出现 ±3px 误差L1 更鲁棒kpt_loss_weight2.0是通过 grid search 确定的——权重低于 1.5 时关键点定位不准高于 2.5 时 bbox 回归退化。4.2 学习率调度CosineAnnealingWarmRestarts 的周期设置吸烟检测易陷入局部最优模型快速学会识别“打火机反光”却忽略真正烟雾。我们用T_050的余弦退火重启scheduler torch.optim.lr_scheduler.CosineAnnealingWarmRestarts( optimizer, T_050, # 每 50 epoch 重启一次 T_mult1, # 周期不增长 eta_min1e-5 # 最小学习率 )玄学参数T_050对应约 12000 张图的 3 个 epoch此时模型刚完成对烟雾纹理的初步建模重启能跳出“反光陷阱”若设T_010频繁重启导致收敛慢T_0100则重启太晚已过拟合。5. 避坑指南吸烟检测项目中踩过的 4 个真实坑与解法5.1 现象模型在测试集上 mAP 75%但部署到某商场摄像头后误报率飙升至 82%原因测试集用的是白天室内数据而该商场摄像头夜间自动切换红外模式导致烟头红光消失模型把红外灯反光当成烟头。解决在数据集中强制加入 30% 红外图像用 FLIR 热成像相机实拍并修改训练时的mosaic增强——禁用跨日/夜图像拼接改为同光照条件拼接。5.2 现象烟雾浓时检测框抖动剧烈同一目标连续帧 bbox IoU 低于 0.3原因YOLO 的 anchor 设计基于 COCO 统计而烟雾区域宽高比集中在 1:5~1:10细长条默认 anchor0.5, 1.0, 2.0完全不匹配。解决用 k-means 重新聚类 anchor在 smoking-dataset 的 5000 个 bbox 上运行python tools/anchor_generator.py --dataset smoking-train --k 9 # 输出最优 anchor: [12,24], [18,62], [28,115], [42,180], [65,280], [92,410], [130,580], [185,720], [260,950]将结果写入data/smoking.yaml的anchors字段。5.3 现象多人场景下模型总把递烟动作判为“吸烟”原因标注时未区分smoking和handing_cigarette而后者在数据集中占比达 18%。模型学到“手烟支吸烟”的错误关联。解决在 Level-1 标签中新增handing_cigarette类ID1并在损失函数中为该类设置更高分类权重cls_pw2.0强制模型学习区分。5.4 现象模型对电子烟检测失败几乎 100% 漏检原因电子烟无明火无烟雾仅靠 LED 指示灯而现有数据集 99% 为传统香烟。解决不单独建电子烟类别而是将电子烟归为smoking但增加device_type属性traditional/electronic并在推理后处理中若检测到smoking且device_typeelectronic则要求连续 5 帧 LED 闪烁频率 2Hz 才触发告警——这用xxx_meta.json中的motion_blur_level辅助判断电子烟 LED 在运动模糊下仍保持点状。6. 验证与上线用“三阶漏检分析法”替代单纯 mAP 评估mAP 只告诉你“检测对了多少”但安防场景真正要问的是“哪些漏检是可接受的哪些是致命缺陷” 我们用三阶漏检分析法穿透指标6.1 第一阶按漏检原因分层统计必须落地到代码在验证脚本中对每个漏检样本打标签def analyze_missed_detection(gt_bbox, pred_bboxes, iou_thresh0.5): if not pred_bboxes.any(): return NO_DETECTION ious box_iou(gt_bbox, pred_bboxes) if ious.max() iou_thresh: # 计算 GT 与最近 pred 的距离 dist np.linalg.norm(gt_bbox[:2] - pred_bboxes[ious.argmax()][:2]) if dist 100: # 像素距离 100px return LOCATION_ERROR elif gt_bbox[2]*gt_bbox[3] 256: # 面积 16x16 return SMALL_TARGET elif get_occlusion_ratio(gt_bbox) 0.7: return HEAVY_OCCLUSION else: return LOW_CONFIDENCE return HIT # 统计结果示例 miss_stats Counter([ analyze_missed_detection(gt, preds) for gt, preds in zip(gt_list, pred_list) ]) # 输出{SMALL_TARGET: 42, HEAVY_OCCLUSION: 18, LOCATION_ERROR: 5, LOW_CONFIDENCE: 3}关键动作把HEAVY_OCCLUSION漏检样本抽出来人工检查是否因标注occlusion_ratio填错——我们曾发现 23% 的“重度遮挡”漏检实际是标注员把背包遮挡填成了 0.9而真实只有 0.4导致模型过度学习遮挡特征。6.2 第二阶时空一致性验证用视频级指标单帧检测不准但连续帧行为应一致。我们定义Temporal Consistency Score (TCS)对视频中每个 smoking 实例提取其 bbox 中心点轨迹计算轨迹的 jerk加速度变化率jerk |a_{t1} - a_t| / Δt真实吸烟轨迹 jerk 0.8手部缓慢移动而误报如反光跳动jerk 2.5TCS 正确轨迹数 / 总轨迹数。实测发现单纯提升 mAP 从 73→76TCS 反而下降 0.12而加入关键点监督后mAP 仅0.8TCS 0.31——证明行为建模比单纯 bbox 准确更重要。6.3 第三阶对抗样本压力测试用烟雾浓度梯度准备 5 组烟雾浓度递增的测试视频从smoke_density0.1到0.9记录各浓度下检测延迟从烟雾出现到首次检出的帧数连续检出稳定性连续 10 帧检出率告警置信度波动std of conf scores。浓度延迟帧稳定性置信度 std0.112.368%0.210.35.189%0.120.52.897%0.080.71.299%0.050.90.9100%0.03我的习惯上线前必须确保smoke_density0.3时延迟 ≤6 帧、稳定性 ≥85%——因为真实监管要求“发现即告警”超过 6 帧≈200ms意味着烟雾已扩散失去干预意义。如果达不到宁可降低阈值conf0.3也不妥协延迟。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

AI工程入门与实战:从模型训练到部署监控的完整闭环 2026/9/28 7:23:16

AI工程入门与实战:从模型训练到部署监控的完整闭环

1. 先别急着写代码,AI工程到底是什么1.1 五年前的算法工程师,和今天的AI工程师差别在哪里我自己开始接触这个领域,大概是在深度学习刚火起来那几年。那时候圈子里没有“AI工程”这个说法,常见的岗位叫算法工程师、机器学习工程师。…

阅读更多 →
ZCode静默上传机制深度解析:Git集成与数据安全风险 2026/9/28 7:23:16

ZCode静默上传机制深度解析:Git集成与数据安全风险

1. 事件还原:从一条异常 Git 提交记录开始的 48 小时事情是从一个开发者的日常操作开始的——他刚在本地完成一段核心业务逻辑的调试,执行git add . && git commit -m "feat: order refund logic v2",然后习惯性地敲下git …

阅读更多 →
在 Open-Pencil 中实现就地重命名:useInlineRename 组合式函数指南 2026/9/28 7:23:15

在 Open-Pencil 中实现就地重命名:useInlineRename 组合式函数指南

前端桌面应用AI 应用MCP 服务 【免费下载链接】open-pencil AI-native design editor. Open-source Figma alternative. 项目地址: https://gitcode.com/gh_mirrors/op/open-pencil 点击查看 免费下载 useInlineRename(onCommit) 是 Open-Pencil Vue SDK&#xff0…

阅读更多 →
C++大富翁游戏实现:面向对象设计与课程作业工程实践 2026/9/28 7:23:15

C++大富翁游戏实现:面向对象设计与课程作业工程实践

简介:本资源是一份面向C初学者的综合性课程设计实践项目,适用于高校大一学生巩固面向对象编程与图形界面开发能力,解决从理论知识到工程实践的转化难题。压缩包共213个文件,含14个核心CPP源码、13个H头文件构成完整Qt框架游戏逻辑…

阅读更多 →
Jetson Orin Nano接入IMX219摄像头:从硬件连接到系统配置完整指南 2026/9/28 7:23:15

Jetson Orin Nano接入IMX219摄像头:从硬件连接到系统配置完整指南

上周我把一块IMX219摄像头接到Jetson Orin Nano上,原以为就是一插一排线、开机就能看到画面的简单事,结果从下午两点折腾到晚上七点。中间经历了排线插反、设备节点死活不出来、界面黑屏、权限报错,甚至一度以为是自己把板子弄坏了。事后冷静…

阅读更多 →
STM32编码器电机测速实战:原理、代码与滤波全解析 2026/9/28 7:23:05

STM32编码器电机测速实战:原理、代码与滤波全解析

做电机控制这几年,测速永远是绕不开的一环。不管是做小车底盘、云台稳像,还是搞工业驱动器,只要涉及闭环,速度反馈的精度就直接决定系统能跑多好。网上讲编码器测速的资料很多,但多半只扔个原理图和公式,真…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉