基于YOLOv5的抽烟检测实战:从数据集解析到模型部署全流程 📅 发布时间:2026/8/28 6:49:54 👁 浏览次数: 简介目标检测是计算机视觉的核心任务之一旨在识别图像或视频中的特定物体并定位其位置。其原理通常基于深度学习模型通过卷积神经网络提取特征并利用回归和分类头输出边界框与类别概率。这项技术的价值在于能够自动化完成以往需要人工完成的识别任务极大提升了效率与准确性。在工程实践中目标检测广泛应用于安防监控、工业质检、自动驾驶等多个领域。本文聚焦于一个具体应用场景——抽烟行为识别并围绕一个包含5000张标注图片的抽烟检测数据集展开。通过详细解析数据预处理、YOLOv5模型训练、超参数调优等关键步骤为读者提供从数据准备到模型部署的完整实战指南。文中特别强调了数据质量检查、迁移学习应用以及模型评估指标如mAP的解读这些热词是构建鲁棒检测系统的核心要素。1. 项目概述从一份数据集开始的抽烟检测实战最近在整理硬盘时翻到了一个名为“yolov5抽烟识别检测数据集5000张图片数据.zip”的文件包。这让我想起了几年前参与的一个智慧安防项目其中一项核心需求就是在特定公共场所如仓库、办公室、楼道自动识别违规吸烟行为。当时市面上并没有一个开箱即用、标注质量又高的抽烟数据集团队花了大量时间在网络上爬取、清洗和手动标注图片过程相当痛苦。所以当我看到这个包含了5000张已标注图片的数据集时第一反应是这能省去多少前期准备的麻烦啊对于任何想入门目标检测或者需要快速搭建一个抽烟识别原型系统的朋友来说这无疑是一个极佳的起点。这个数据集的核心价值在于其“针对性”和“即用性”。它直接瞄准了“抽烟检测”这个具体的视觉任务省去了你从海量图片中筛选相关场景、再逐一标注的繁琐过程。5000张的规模对于训练一个中等性能的YOLOv5模型来说已经具备了不错的基础。无论是用于学术研究、课程设计还是工业界的快速概念验证PoC这个数据集都能让你跳过最耗时的数据准备阶段直接切入模型训练、调优和部署的实战环节。接下来我将结合这个数据集为你完整拆解如何使用YOLOv5从零构建一个抽烟检测模型并分享其中每一步的关键细节与避坑经验。2. 数据集深度解析与预处理要点拿到一个数据集尤其是从网络下载的压缩包第一步绝不是直接解压扔给模型训练。系统的检查与预处理是保证后续模型效果稳定性的基石。对于这个抽烟检测数据集我们需要从以下几个维度进行深度剖析。2.1 数据集结构与质量检查解压“yolov5抽烟识别检测数据集.zip”后我们通常会看到类似如下的目录结构dataset/ ├── images/ │ ├── train/ │ │ ├── 000001.jpg │ │ ├── 000002.jpg │ │ └── ... │ └── val/ │ ├── 000501.jpg │ └── ... └── labels/ ├── train/ │ ├── 000001.txt │ ├── 000002.txt │ └── ... └── val/ ├── 000501.txt └── ...这是YOLO格式数据集的典型结构。images文件夹存放图片labels文件夹存放对应的标注文件。每个.txt标注文件的内容格式为class_id x_center y_center width height其中坐标是归一化后的即除以图片宽高后的值范围0-1。质量检查的核心步骤标注格式验证随机抽取几十个标注文件用脚本快速解析检查class_id是否为整数通常抽烟类别为0检查后面四个坐标值是否在0到1之间。一个常见的错误是坐标值大于1这会导致训练时损失loss直接爆炸NaN。import os label_path ‘dataset/labels/train/000001.txt‘ with open(label_path, ‘r‘) as f: for line in f: cls, x, y, w, h map(float, line.strip().split()) # 检查坐标 if not (0 x 1 and 0 y 1 and 0 w 1 and 0 h 1): print(f“坐标异常: {label_path} - {line}“)图片-标注匹配与完整性检查确保每个在labels文件夹中的.txt文件在images文件夹中都有同名的图片文件扩展名不同。同时也要检查是否有图片没有对应的标注文件这种“孤儿”图片在训练时需要排除。可视化抽样检查这是最重要的一步。写一个简单的脚本将标注框画在图片上直观地检查标注的准确性。你需要关注框的紧密度标注框是否紧密贴合香烟或吸烟者的手部/嘴部过于宽松或过于紧促都会影响模型学习边界的能力。类别正确性是否把其他类似物体如笔、筷子误标为香烟遮挡与模糊处理对于被部分遮挡或画面模糊的香烟标注是否合理过于模糊的样本可能应该考虑剔除。场景多样性快速浏览图片看数据集是否涵盖了不同光照白天、夜晚、室内灯光、不同角度正面、侧面、不同距离特写、远景以及不同背景办公室、街道、车内下的抽烟场景。多样性不足的数据集训练出的模型泛化能力会很差。2.2 数据预处理与增强策略检查无误后我们需要对数据进行预处理和增强以提升模型的鲁棒性。YOLOv5的训练脚本内置了强大的数据增强功能但我们仍需理解其原理并根据任务进行配置。基础预处理统一尺寸YOLOv5模型要求输入图片尺寸是32的倍数如640x640。训练时数据加载器会自动将图片缩放并填充到这个尺寸。这个过程是自动的但我们可以在data.yaml配置文件中通过imgsz参数指定。归一化图片像素值0-255会被自动归一化到0-1之间这对训练稳定性至关重要。数据增强配置YOLOv5的数据增强在hyp.scratch.yaml超参数文件中配置。对于抽烟检测我建议重点关注以下几项hsv_h,hsv_s,hsv_v随机调整图片的色调、饱和度和明度。这可以模拟不同光照和颜色偏差对提升模型在复杂光线下的识别能力非常有效。translate,scale,shear随机平移、缩放和剪切。这能让模型学会识别不同位置、不同大小和轻微形变下的香烟。flipud,fliplr上下、左右翻转。抽烟行为通常具有对称性水平翻转是安全且有效的增强方式。但需注意某些特定场景如文字标识翻转后可能不合理不过对于香烟本身影响不大。mosaic马赛克增强将四张图片拼成一张进行训练。这是YOLOv4/v5带来的一项革命性增强技术能让模型在一个批次batch内看到更多样化的上下文信息极大提升小目标检测能力和泛化性。强烈建议开启。注意数据增强不是越强越好。过强的增强如过大的旋转角度、剧烈的色彩抖动可能会让模型学习到不真实的模式甚至损害性能。对于初期训练建议使用YOLOv5默认的hyp.scratch.yaml中的增强强度在模型收敛后再考虑微调。3. YOLOv5模型选型与训练环境搭建数据处理妥当后下一步就是选择模型骨架并搭建训练环境。YOLOv5提供了多个预定义模型从轻量到高性能满足不同需求。3.1 YOLOv5模型家族解析YOLOv5的官方仓库提供了几种不同大小的模型通常以YOLOv5s.pt,YOLOv5m.pt,YOLOv5l.pt,YOLOv5x.pt等形式存在。它们的区别主要在于网络的宽度width_multiple和深度depth_multiple这两个系数。YOLOv5n / YOLOv5s参数量最小速度最快适合部署在计算资源有限的边缘设备如Jetson Nano, Raspberry Pi或需要高帧率FPS的应用场景。对于抽烟检测如果场景相对简单如固定摄像头、背景干净且对实时性要求极高可以优先尝试s版本。YOLOv5m在速度和精度之间取得了很好的平衡。这是我最常推荐的起点对于大多数任务包括抽烟检测它通常能在保持较快速度的同时提供足够好的精度。YOLOv5l / YOLOv5x参数量大精度最高但训练和推理速度慢需要更多的GPU显存。适用于对精度要求极为苛刻且拥有强大计算资源如多卡GPU服务器的场景。如何选择对于5000张图片的抽烟数据集我的建议是从YOLOv5m开始。它的容量足以从数据集中学习到有效的特征又不会因为模型过大而导致在小数据集上过拟合Overfitting。你可以先用YOLOv5m训练一个基准模型如果速度满足要求但精度不够再尝试YOLOv5l如果速度不满足要求但精度尚可则降级到YOLOv5s。3.2 训练环境配置与依赖安装训练环境的核心是PyTorch和YOLOv5代码库。以下是在Ubuntu系统Windows可参考主要区别在路径和部分命令上搭建环境的步骤创建并激活Python虚拟环境这能避免包版本冲突。conda create -n yolov5 python3.8 conda activate yolov5实操心得Python 3.8是一个比较稳定且与各版本PyTorch兼容性好的选择不建议使用太新或太旧的版本。安装PyTorch前往 PyTorch官网 根据你的CUDA版本通过nvidia-smi命令查看选择安装命令。例如对于CUDA 11.3pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113克隆YOLOv5仓库并安装依赖git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txtrequirements.txt会安装OpenCV, pandas, matplotlib等必要库。验证环境运行一个简单的检测脚本确保一切正常。python detect.py --weights yolov5s.pt --source data/images/bus.jpg如果能在runs/detect/exp目录下看到带有检测框的结果图片说明环境配置成功。常见问题安装过程中最常见的错误是PyTorch版本与CUDA版本不匹配导致无法调用GPU。务必严格按照官网命令安装对应版本。如果只有CPU则安装CPU版本的PyTorch但训练速度会非常慢。4. 模型训练全流程与超参数调优环境就绪数据备好现在可以开始最核心的训练过程了。4.1 准备配置文件YOLOv5训练需要两个核心配置文件数据配置data.yaml和模型配置model.yaml。对于我们的抽烟数据集我们需要创建自己的data.yaml。创建smoke_data.yaml将其放在yolov5/data/目录下。# 训练和验证图片的路径相对路径或绝对路径 train: /path/to/your/dataset/images/train val: /path/to/your/dataset/images/val # 类别数量 nc: 1 # 类别名称列表 names: [‘smoke‘]请务必将/path/to/your/dataset替换为你数据集的实际路径。nc:1表示我们只有一个检测类别抽烟。选择模型配置文件YOLOv5的模型配置文件在models/目录下例如yolov5m.yaml。我们直接使用它即可因为它定义了YOLOv5m的网络结构。4.2 启动训练与关键参数解读使用train.py脚本启动训练。一个典型的训练命令如下python train.py \ --img 640 \ # 训练图片尺寸 --batch 16 \ # 批次大小根据GPU显存调整 --epochs 100 \ # 训练轮数 --data data/smoke_data.yaml \ # 数据配置文件 --cfg models/yolov5m.yaml \ # 模型配置文件 --weights yolov5m.pt \ # 初始权重使用预训练模型 --name smoke_detection \ # 本次实验的名称 --cache # 使用缓存加速数据加载需要足够内存关键参数深度解读--weights yolov5m.pt这是迁移学习的关键。我们不是从零开始随机初始化网络权重而是加载在COCO一个包含80个类别的大型通用数据集上预训练好的权重。这能极大地加速收敛并提升最终性能尤其在我们这种5000张的中小规模数据集上效果提升非常明显。--batch 16批次大小。它影响训练的稳定性和速度。越大越好但受限于GPU显存。如果出现“CUDA out of memory”错误就需要减小batch值如改为8或4。同时学习率lr通常需要根据batch大小进行线性缩放YOLOv5内部已做近似处理。--epochs 100训练轮数。5000张图片100个epoch通常是一个合理的起点。你可以通过观察训练损失train/loss和验证损失val/loss曲线来判断是否已经收敛曲线不再明显下降。--cache将加载的图片缓存到内存或磁盘RAM/disk cache可以显著减少每个epoch的数据读取时间特别是当图片存储在机械硬盘上时。如果你的内存足够大强烈建议开启。4.3 训练过程监控与评估训练开始后控制台会输出日志同时会在runs/train/smoke_detection目录下生成一系列重要文件结果可视化results.png这是最重要的监控图表包含了训练损失、验证损失、精度precision、召回率recall、mAP0.5、mAP0.5:0.95等关键指标随epoch变化的曲线。confusion_matrix.png混淆矩阵直观展示模型在验证集上的分类情况。对于单类别任务它主要看背景被误检为目标的概率背景误检。如何判断模型是否训练好损失曲线train/loss和val/loss都应平稳下降并最终趋于平缓。如果train/loss持续下降但val/loss开始上升这是典型的过拟合信号说明模型记住了训练集的噪声而非一般规律。此时应提前停止训练early stopping或增加数据增强、使用模型正则化如dropout但YOLO结构已内置等。精度与召回率precision和recall在后期会达到一个平衡点。高精度低召回说明模型很保守只检测非常确定的抽烟目标会漏掉很多低精度高召回则说明模型很激进把很多不是抽烟的东西也框出来了。我们需要根据实际应用来权衡。例如在安防监控中可能更倾向于高召回宁可误报不可漏报然后通过后续人工复核来过滤误报。mAP这是目标检测的核心评估指标。mAP0.5即IoU阈值为0.5时的平均精度是最常用的。对于抽烟检测如果mAP0.5能稳定在0.85以上通常意味着模型已经具备不错的实用价值。mAP0.5:0.95是更严格的指标它计算了IoU从0.5到0.95步长0.05多个阈值下的平均mAP对框的位置精度要求更高。模型保存训练过程中性能最好的模型默认根据mAP0.5判断会自动保存为best.pt最后一个epoch的模型保存为last.pt。我们最终部署使用的是best.pt。5. 模型验证、测试与性能优化训练完成后我们不能直接相信训练日志里的指标需要对模型进行独立的验证和测试并探索优化空间。5.1 在独立测试集上验证模型训练时使用的验证集val是参与模型筛选的用于选择best.pt。为了获得对模型泛化能力无偏的估计必须使用一个全新的、训练和验证过程中都未使用过的测试集。如果数据集中没有预先划分测试集你需要从原始数据中再留出一部分例如10%。使用val.py脚本在测试集上运行python val.py \ --weights runs/train/smoke_detection/weights/best.pt \ --data data/smoke_data.yaml \ --task test \ # 指定任务为测试 --name final_test \ --img 640这会输出模型在测试集上的详细评估报告包括精度、召回率、mAP等。这个结果比训练时的验证集结果更可靠。5.2 可视化分析与错误排查数字指标很重要但直观的可视化更能帮助我们理解模型在哪里出了问题。运行检测可视化使用detect.py在一些测试图片或视频上运行模型观察检测结果。python detect.py \ --weights runs/train/smoke_detection/weights/best.pt \ --source /path/to/test/images \ --conf 0.25 \ # 置信度阈值 --save-txt # 保存检测结果的标签文件分析典型错误漏检False Negative模型没检测出存在的香烟。可能原因目标太小、遮挡严重、光照条件极端过曝或过暗、训练数据中类似样本不足。误检False Positive模型把非香烟物体如手指、白色细棍状物检测为香烟。可能原因背景干扰物与香烟形状颜色相似、训练数据中存在错误标注或模糊标注。定位不准检测框与真实目标重合度IoU不高。可能原因数据增强中的形变过度、模型容量不足、标注框本身不精确。5.3 模型优化与调优策略如果测试结果不理想可以尝试以下优化策略数据层面数据清洗根据可视化结果回头修正训练集中那些标注明显错误或模糊的样本。数据扩充如果发现模型在某种特定场景如夜景、侧脸抽烟下表现差可以有目的地收集和标注更多此类场景的图片加入训练集。调整数据增强在hyp.scratch.yaml中微调增强参数。例如如果模型对光照变化敏感可以适当增加hsv_h,hsv_s,hsv_v的抖动范围。模型与训练层面更换模型尺寸如前所述在s,m,l之间切换。调整超参数学习率lr0是最重要的超参数之一。如果损失曲线震荡剧烈可以尝试减小学习率如果收敛太慢可以适当增大但需谨慎。YOLOv5使用余弦退火学习率调度器通常效果很好一般无需大改。更长的训练时间增加--epochs有时模型只是需要更多的时间来学习更精细的特征。使用更先进的模型如果YOLOv5的精度达到瓶颈可以考虑迁移到YOLOv8、YOLOv9或YOLOv10它们可能在网络结构或训练策略上有所改进。但要注意新模型可能需要不同的依赖和环境。后处理优化调整置信度阈值--conf在detect.py或部署代码中通过调整置信度阈值可以在精度和召回率之间做权衡。提高阈值会减少误检提高精度但可能增加漏检降低召回率。调整非极大值抑制参数NMS--iou-thres参数控制NMS的IoU阈值。当同一个目标被多个重叠框检测到时NMS会保留置信度最高的抑制掉其他的。如果场景中目标非常密集可以适当提高这个阈值如从默认的0.45提高到0.6以避免误抑制。6. 模型部署与应用场景思考一个训练好的模型最终价值在于应用。这里介绍两种最常用的部署方式并探讨抽烟检测的实际应用场景。6.1 部署方式Python API与边缘设备Python API快速集成这是最简单的部署方式。你可以将训练好的best.pt模型和YOLOv5的检测代码封装成一个Python类或函数供其他应用程序调用。import torch import cv2 class SmokeDetector: def __init__(self, model_path‘best.pt‘): self.model torch.hub.load(‘ultralytics/yolov5‘, ‘custom‘, pathmodel_path, force_reloadFalse) self.model.conf 0.25 # 置信度阈值 self.model.iou 0.45 # NMS IoU阈值 def detect(self, image): # image可以是文件路径、numpy数组、PIL图像等 results self.model(image) # results.pandas().xyxy[0] 返回一个DataFrame包含检测框、置信度、类别 detections results.pandas().xyxy[0].to_dict(‘records‘) # 处理检测结果... return detections, results.render()[0] # 返回检测信息和带框图片 # 使用示例 detector SmokeDetector() img cv2.imread(‘test.jpg‘) boxes, annotated_img detector.detect(img)这种方式适合在服务器或PC端运行用于处理图片、视频流或提供Web API服务。边缘设备部署以RK3568为例在摄像头等嵌入式设备上直接运行模型实现端侧智能。这需要将PyTorch模型转换为设备支持的格式。模型导出首先将.pt模型导出为ONNX格式。python export.py --weights best.pt --include onnx --img 640 --dynamic模型转换与优化使用设备厂商提供的工具链如瑞芯微的RKNN-Toolkit2将ONNX模型转换为设备专用的格式如.rknn并进行量化将FP32精度转换为INT8精度以大幅提升推理速度、减少内存占用。C/Python SDK集成在设备上调用厂商的推理SDK加载转换后的模型进行预测。这个过程涉及交叉编译和环境搭建较为复杂但能获得最佳的端侧性能。6.2 应用场景与系统设计考量抽烟检测模型可以集成到多种系统中智慧安防监控系统接入园区、仓库、办公室的摄像头网络实时分析视频流一旦检测到抽烟行为自动截图存档并触发告警如声音提醒、推送消息到管理平台。安全生产管理在加油站、化工厂、林区等严禁烟火的区域进行7x24小时智能监控杜绝安全隐患。公共文明督导在车站、商场、医院等公共场所的非吸烟区进行监控作为文明劝导的辅助依据。系统设计时的关键考量实时性 vs 准确性需要根据场景权衡。实时监控要求高帧率如15-30 FPS可能需选用更小的模型YOLOv5s或进行量化。事后取证分析则可以接受稍慢的速度使用更精确的模型。误报处理任何检测模型都存在误报。在实际系统中必须设计告警过滤机制。例如同一位置连续多帧如5帧都检测到抽烟才触发告警或者结合其他传感器信息如烟雾传感器进行综合判断。隐私保护涉及视频监控必须严格遵守相关法律法规。通常会对人脸等敏感信息进行模糊化处理并且系统应设计为只输出“检测到抽烟事件”的告警和证据截图而非持续存储和传输原始视频流。7. 项目总结与经验复盘回顾整个从数据集到可部署模型的过程有几个关键点值得再次强调这也是我多次实战后积累下来的核心经验。首先数据永远是天花板。这个5000张的数据集是一个很好的起点但它不可能覆盖所有现实场景。模型在实际环境中遇到的困难十有八九可以追溯到数据分布的差异上。因此建立一个持续的数据迭代闭环至关重要。将模型部署到测试环境收集它判断错误漏检、误检的案例对这些案例进行重新标注然后加入训练集进行下一轮训练增量学习。如此循环几次模型的鲁棒性会有质的提升。其次理解评估指标背后的含义比单纯追求高分数更重要。mAP0.5达到0.9固然好看但如果仔细分析混淆矩阵发现模型把所有拿白色细棍的动作都判为抽烟那么这个高分数在实际应用中就是灾难。一定要结合可视化定性分析模型在哪些情况下会失败这能为你指明数据收集和模型改进的清晰方向。最后工程落地是另一门学问。训练出一个好模型只是完成了前半部分。如何将它稳定、高效、低成本地集成到现有业务系统中如何处理并发视频流如何设计可靠的告警机制如何保证系统长期运行的稳定性这些工程挑战往往比模型调优更耗时。在项目初期就应该对部署环境、性能要求和系统架构有清晰的规划。我个人在多次部署抽烟检测系统的经验中发现最大的挑战往往来自非技术因素比如摄像头安装角度和位置导致的遮挡、光线剧烈变化如夜晚车灯扫过、以及为了追求极低误报率而对阈值进行的反复调整。这些问题的解决离不开对业务场景的深入理解以及与领域专家的紧密协作。这个数据集和YOLOv5框架为你提供了一把强大的锤子但要用好这把锤子敲准钉子还需要你不断地观察、思考和迭代。本文还有配套的精品资源点击获取