
简介这份资源面向从事安全监控、火灾预警方向的开发者与深度学习学习者提供一套基于YOLOv5的烟雾检测完整方案帮助快速搭建可实时识别烟雾的目标检测系统。压缩包共约2000个文件整体360.52MB以3688张jpg烟雾图像、3688个txt标注与3687个xml标注构成核心数据集另含43个yaml配置、35个py脚本、3个pt权重文件及dockerfile、sh、md等部署与说明文件覆盖数据、训练、推理到容器化部署的完整链路。资源内含经过大量多场景烟雾图像训练好的模型已能区分烟雾与雾、灰尘等易混目标可直接集成到监控、无人机巡检或智能安全设备中并支持按需微调再训练。目前已有2356人学习下载适合希望省去数据采集与标注成本、直接上手烟雾检测项目的中高级读者参考。1. 烟雾检测项目落地为什么我押注 YOLOv5 而不是换新模型去年帮一个做园区安防的朋友看方案对方丢过来一个“基于 YOLOv5 的烟雾检测含训好的模型和数据集”的包说想直接跑起来看效果。我第一反应是YOLOv5 都出到 v8、v11 了怎么还在用 v5结果拆开一看数据集标注质量、模型收敛曲线、推理速度这几项摆出来我闭嘴了。对于烟雾检测这种“目标边界模糊、正负样本极不均衡、误报代价高”的场景YOLOv5 的工程成熟度和调参手感反而比追新版本更稳。这份资源的核心价值就三点一份已经标好的烟雾数据集、一个训好的权重文件、一套能直接推理和继续微调的代码。它解决的不是“从零搭检测框架”的问题而是“我不想在数据清洗和基础训练上再耗两周”的问题。适合谁做安防监控、森林防火、工业厂区烟火识别的算法工程师或者手里有摄像头但缺一个能跑通 baseline 的开发者。如果你指望它开箱即达到产线级零误报那得先看完后面的避坑章节再决定。2. 拆开资源包数据集结构与 YOLOv5 训练链路怎么对上2.1 烟雾数据集的目录约定与标注格式拿到包先别急着train.py先看数据目录。常见做法是datasets/smoke/下面分images/和labels/再各自分train/、val/这是 YOLOv5 默认认的布局。标注文件是.txt每行class x_center y_center width height坐标全部归一化到 0~1。烟雾检测通常只有一个类所以 class 基本都是0。我一般会先跑一遍统计脚本确认标注框没有越界、没有宽高为 0 的脏数据import os import glob label_dir datasets/smoke/labels/train bad [] for txt in glob.glob(os.path.join(label_dir, *.txt)): with open(txt) as f: for i, line in enumerate(f): parts line.strip().split() if len(parts) ! 5: bad.append((txt, i, 字段数不对)) continue cls, x, y, w, h map(float, parts) # 归一化坐标必须在 0~1 之间宽高不能为 0 if not (0 x 1 and 0 y 1 and 0 w 1 and 0 h 1): bad.append((txt, i, f坐标异常: {parts})) print(f异常标注条数: {len(bad)}) for b in bad[:10]: print(b)这段脚本的逻辑很直白逐行读标注检查字段数和归一化范围。参数上唯一要注意的是label_dir要指向你实际的训练标签目录。如果异常条数超过总标注的 1%别犹豫先清洗再训练否则后面 mAP 上不去你根本不知道是模型问题还是数据问题。2.2 从 data.yaml 到 train.py训练参数怎么设才不翻车YOLOv5 的训练入口是train.py但它依赖一个data.yaml来描述数据集路径和类别。这个文件写错训练直接报Dataset not found。典型内容如下path: ../datasets/smoke # 数据集根目录 train: images/train # 相对 path 的训练图片路径 val: images/val nc: 1 # 类别数烟雾检测通常为 1 names: [smoke] # 类别名称然后启动训练python train.py \ --data data/smoke.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0 \ --project runs/train \ --name smoke_exp参数逐个说--weights yolov5s.pt表示从官方预训练权重开始微调烟雾数据量不大时这比从头训收敛快得多--img 640是输入分辨率烟雾目标通常占画面比例小640 是速度和精度的折中显存够可以上 1280 但推理会慢--batch 16按显存调8G 卡跑 640 大概能到 16爆显存就降到 8--epochs 100是上限实际看mAP0.5早停。训练过程中重点盯val/box_loss和metrics/mAP_0.5如果 box_loss 震荡不降多半是学习率或标注问题。2.3 用训好的权重做推理conf 和 iou 怎么调资源里带了best.pt推理命令python detect.py \ --weights runs/train/smoke_exp/weights/best.pt \ --source test_images/ \ --img 640 \ --conf-thres 0.35 \ --iou-thres 0.45 \ --save-txt--conf-thres是置信度阈值烟雾检测里这个值特别敏感调高到 0.5 以上漏报明显增多调到 0.2 以下满屏误报。我一般从 0.35 起步根据业务容忍度微调。--iou-thres控制 NMS 合并烟雾区域重叠多0.45 比较稳调到 0.6 会出现同一团烟多个框。--save-txt会把检测结果存成 YOLO 格式方便后续做二次分析或可视化对比。3. 烟雾检测的独有难点小目标、误报与数据不均衡怎么破3.1 烟雾目标边界模糊带来的标注一致性烟雾和行人、车辆不一样它没有硬边界。同一张图A 标注员框到烟羽边缘B 标注员只框浓烟核心训出来的模型就会“精神分裂”。常见做法是制定标注规范只框可见烟雾的密集区域稀薄过渡带不框。如果资源里的数据集已经标好建议随机抽 20 张图叠加标注框看一眼确认风格统一。不一致的话要么重标要么在训练时用--rect关闭矩形推理减少形变影响。3.2 正负样本失衡与背景图策略真实监控里烟雾出现的时间占比极低如果训练集全是含烟图模型会把“类似烟的云、雾、蒸汽”全判成烟。我一般会往训练集里掺 10%~20% 的纯背景图不含任何标注这些图在 YOLOv5 里会被当作负样本能显著压低误报。具体操作是在data.yaml的train路径下放背景图对应labels目录放空.txt文件。注意空文件不能没有否则 YOLOv5 会报找不到标签。3.3 小目标烟雾的检测上限与切片推理早期火灾的烟往往只占画面几十个像素640 分辨率下经过 32 倍下采样后特征几乎消失。如果业务场景是远距离监控两个方向一是训练时用--img 1280二是推理时用 SAHI 切片推理把大图切成小块分别检测再合并。切片推理的代价是耗时翻几倍但小目标召回能提升 10%~20%。资源里的模型如果是在 640 下训的直接上 1280 推理效果不一定好最好用 1280 重新微调几个 epoch。4. 避坑与排查这五条血泪经验能省你两天现象训练 loss 正常下降但 mAP 一直是 0。原因data.yaml里names和标注文件的 class 索引对不上或者val路径下没有图片。 解决检查val目录是否为空确认nc等于实际类别数用python -c import yaml; print(yaml.safe_load(open(data/smoke.yaml)))打印配置核对。现象推理时所有图都输出同一个框或没有框。原因权重文件和模型结构不匹配比如用 YOLOv5s 的权重去加载 YOLOv5m 的配置。 解决确认--weights对应的模型版本best.pt里存了模型结构信息直接用detect.py加载即可不要手动改--cfg。现象训练到一半显存爆了。原因--batch太大或--img太高也可能是 dataloader 的--workers开太多导致内存泄漏。 解决降 batch 到 8 或 4--workers设成 4 以下加--cache ram前先确认内存够。现象检测结果框抖动严重视频里一闪一闪。原因单帧检测没有时序平滑烟雾本身形态变化快。 解决在推理后处理里加简单的 IOU 跟踪或滑动窗口投票连续 3 帧中 2 帧检出才输出能明显稳住画面。现象模型在测试集上很好换一个摄像头就崩。原因域偏移训练数据的光照、角度、烟雾颜色和实际场景差异大。 解决拿新场景的图做少量标注用--weights best.pt --epochs 20 --freeze 10冻结骨干微调通常几十张图就能拉回来。5. 进阶技巧用验证集反推阈值与模型导出训练完别只看mAP0.5就收工那个指标是遍历所有置信度算出来的实际部署你得定一个固定阈值。我习惯用val.py跑一遍验证集导出 PR 曲线找 F1 最大的那个点作为conf-threspython val.py \ --weights runs/train/smoke_exp/weights/best.pt \ --data data/smoke.yaml \ --img 640 \ --conf-thres 0.001 \ --iou-thres 0.6 \ --save-json--conf-thres 0.001是为了让所有预测都保留方便后续画 PR 曲线。跑完在runs/val/下会有PR_curve.png肉眼找 F1 峰值对应的置信度通常比拍脑袋定的 0.5 更合理。如果业务对漏报零容忍就把阈值往左移牺牲精确率换召回。部署到边缘设备时用export.py转 ONNX 或 TensorRTpython export.py \ --weights runs/train/smoke_exp/weights/best.pt \ --include onnx \ --img 640 \ --batch 1 \ --simplify--simplify会做算子融合ONNX 模型体积更小、推理更快。转 TensorRT 的话把--include换成engine但注意 TensorRT 版本要和设备驱动匹配不然就是黑匣子报错。我一般先在 PC 上验证 ONNX 推理结果和 PyTorch 一致再上设备省得来回折腾。从那以后我每次拿到新数据集都强制先跑一遍标注统计和背景图检查再开始训练。这个习惯帮我省下的返工时间比调参本身多得多。希望帮到你。本文还有配套的精品资源点击获取