ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLOv5吸烟行为检测实战:数据标注到部署全流程

YOLOv5吸烟行为检测实战:数据标注到部署全流程 简介针对吸烟行为检测这一细分场景该资源是一套基于Yolov5的完整源码与训练模型包适合计算机视觉开发者、算法工程师以及相关课题研究者直接上手。压缩包内共100个文件包含41个Python脚本、31个YAML配置、2个模型权重文件以及其他说明文档与Dockerfile既覆盖数据预处理、模型训练、实时检测等核心流程也提供了便于快速部署的容器化方案。已有334人学习下载。包体整体约25.74MB结构清晰可帮助使用者省去重复训练成本直接加载模型进行验证结合源码中的训练逻辑、配置文件与两个ipynb教程还能针对不同监控场景做阈值调整、数据增强或Fine-tune提升检测精度。对于希望快速搭建吸烟行为识别原型的开发者而言这是一份实用的参考资料。1. 厂区监控里最难的识别目标不是人而是那支烟在加油站、化工厂、仓库这类场景做行为识别真正让算法工程师头疼的不是“有人出现”而是“人手里有没有烟”。传统视觉方案靠背景差分和肤色检测一到夜间或者逆光就全线崩溃而YOLOv5把吸烟行为简化为一个单阶段目标检测问题——只要画面里出现“手与烟具的交互区域”就用边界框直接锁住。这个资源包提供了一整套可复现的工程文件源码覆盖数据处理、模型训练、实时检测的完整链路压缩包内的预训练权重可以直接加载不需要从零开始标注上万张图。解压后在带GPU的机器上跑通tutorial.ipynb几分钟就能在测试视频上看到稳定的吸烟框。适合有Python基础、想快速验证行为识别落地的研发人员也适合做毕设和工业巡检项目的工程师参考。2. 场景数据决定了精度上限小目标、遮挡与标签定义2.1 通用检测权重为什么管不住吸烟检测先看一个容易踩的坑直接拿COCO预训练的yolov5s.pt去检测吸烟漏检率会非常高。原因是COCO的80个类别里根本没有“烟”和“手持烟”这种细粒度目标且COCO训练集中的小目标占比远低于监控场景的实际分布。YOLOv5的输出特征图分P3、P4、P5三层分别负责小、中、大目标其中P3层是80×80的网格理论上适合检测烟头这种小目标——但预训练权重里P3层学到的特征是“人”“杯子”这类通用语义并不会对“手指间的白色细杆”产生强烈响应。另一个隐藏问题在anchor尺寸。YOLOv5默认锚框是基于COCO数据集聚类出来的比如[10,13]这类小锚框的数量只有3组而吸烟场景里烟头在1080p画面中往往只有20×20像素。锚框与真实框的IoU匹配率低正样本数量少训练时梯度信号弱模型自然学不进去。所以用资源包里的源码训练前第一件事不是改网络结构而是重新审视数据分布。提示吸烟行为检测的定位精度要求比普通行人检测高得多。边界框偏移5个像素普通目标分类问题不大但烟头和打火机的区分就可能失败。数据标注质量直接决定模型上限后续训练只是逼近这个上限。2.2 自制数据集的目录结构从零到可训练资源包源码遵循Ultralytics的标准数据组织方式如果你要加入自己的场景数据先把目录结构摆对。假设你的项目根目录叫smoking_detsmoking_det/ ├── data/ │ ├── images/ │ │ ├── train/ # 训练图片建议至少2000张 │ │ └── val/ # 验证图片建议300~500张 │ ├── labels/ │ │ ├── train/ # 每张图对应一个同名txt │ │ └── val/ │ └── smoking.yaml # 数据集配置文件标注工具推荐用LabelImg输出YOLO格式的txt文件每行是一个目标的标注信息格式为类别id x_center y_center width height其中中心坐标和宽高都做了归一化处理。标注命令如下pip install labelimg labelimg data/images/train data/labels/train # 打开标注界面标注时有一个要点不要只框烟头要把“手部持烟区域”框进去。因为单帧图像里烟头经常被手指遮挡模型需要学习手部姿态作为上下文线索。框的标注范围建议覆盖手指到嘴唇的三角区域类别统一归为0也就是smoking。2.3 半自动化标注用已训练模型反哺数据这个资源包内的模型权重是已经训练好的可以利用它做半自动化标注快速扩充数据集。思路很直接先用现有权重对摄像头截帧图做推理程序会把置信度较高的检测结果自动写入txt标签文件人工只需要删掉误检的框、补上漏检的框。注意有几个前提一是检测结果必须经过NMS去重二是置信度阈值不能设太高否则漏检太多人工补框的工作量反而变大。上述训练循环跑通之后你手里就有一套可用的基线模型。但这个基线模型的推理速度和精度之间的平衡还需要通过下一章的工程化手段来进一步打磨。3. 源码结构与训练环境Dockerfile、tutorial.ipynb与训练闭环3.1 资源包内文件的真实分工把压缩包解压后你会看到几个关键文件它们的职责并不相同。这里先用一张表把各文件的角色说明清楚文件作用使用场景Dockerfile / Dockerfile-cpu构建GPU版训练镜像有NVIDIA GPU的服务器配合nvidia-docker运行Dockerfile-arm64构建ARM架构推理镜像Jetson Nano等嵌入式设备部署tutorial.ipynb交互式训练与推理教程调试代码、观察中间结果、快速验证optimizer_config.json优化器与学习率策略配置调整训练超参数控制收敛行为README.md环境安装与运行指引首次部署时查阅这里注意Dockerfile和Dockerfile-cpu的区别前者默认使用CUDA 11.x的PyTorch镜像作为基础层包含cuDNN依赖适合训练后者用CPU版PyTorch专为无GPU的调试环境准备。Dockerfile-arm64则针对aarch64架构链接了ARM预编译的OpenCV和PyTorch wheel这一点对Jetson用户至关重要。3.2 Dockerfile关键层设计与构建命令Dockerfile的核心价值在于把YOLOv5的环境依赖固定下来。常见做法是以nvidia/cuda:11.4.2-cudnn8-devel-ubuntu20.04为基底按层安装Python 3.8、PyTorch 1.10和OpenCV。按依赖缓存层写可以避免每次改动代码都全量重装FROM nvidia/cuda:11.4.2-cudnn8-devel-ubuntu20.04 ENV DEBIAN_FRONTENDnoninteractive RUN apt-get update apt-get install -y python3.8 python3-pip git wget COPY requirements.txt /app/requirements.txt RUN pip3 install --no-cache-dir -r /app/requirements.txt COPY . /app WORKDIR /app CMD [python3, train.py]构建时注意架构参数。x86_64服务器上直接docker build -t yolo5-smoke:latest -f Dockerfile .即可启动训练容器Jetson设备上则需要指定平台参数否则pull下来的镜像会因为架构不匹配直接拒绝执行。提示实际部署中容器里跑训练要加--shm-size8g参数否则PyTorch Dataloader的多进程worker在容器内共享内存不足会报Bus error (core dumped)。3.3 tutorial.ipynb里的三级递进任务notebook文件是整个资源的调试入口。按照常规设计思路它按三级递进来组织第一级加载预训练权重跑通单张图片的推理确认环境里PyTorch和CUDA的版本兼容性。第二级对一段短视频做逐帧检测观察模型在连续帧上的稳定性。第三级则是选择一小批训练数据跑几个batch的迭代验证数据加载器和损失计算是否通畅。每一级都有独立的输出区你可以在Jupyter里直接看到中间特征图这比在训练脚本里打印日志直观得多。要注意的是notebook中的推理代码通常直接调用torch.hub.load此时需要确认模型权重文件路径是否正确。资源包里的权重放在根目录的weights文件夹下加载时要检查相对路径是否写对路径错了它会自动下载另一个模型这不仅慢而且权重分布差异会直接影响检测效果。4. 超参数、检测头配置文件与模型训练参数调整4.1 yolov5s.yaml模型结构检测头的细节进入训练环节之前需要先搞清模型配置文件的作用。这里以yolov5s.yaml为例它的核心是anchor锚框和检测层输出通道两个部分。yolov5s的检测头总共有三层每层对应一个stride默认是8、16、32。底层stride8的检测分支负责识别小目标这也就是后来版本中被称为P3输出层的结构。在吸烟行为的实际场景中烟头和手部交互区域往往是整幅画面中占比极小的区块因此stride8这一层的训练质量决定整体精度。建议实测训练时把输入分辨率从默认的640提高到960这样小目标的像素面积成倍增加有时比改动网络结构更有效python train.py --img 960 --batch 16 --epochs 100 --data smoking.yaml --weights yolov5s.pt这里的--img控制训练时图像被缩放到统一边长数值越大、小目标保留的细节越多但显存占用也会线性增长。显存低于8G的显卡建议先用640跑通一条完整流程再升级到960。4.2 optimizer_config.json中几个关键参数的工程解读这个资源包里的optimizer_config.json是训练收敛质量的核心开关其内容实质上是将训练时的优化器、学习率策略、权重衰减进行了集中治理。绝大多数使用者会直接忽略这个文件但这恰是影响模型泛化能力的重要部分。{ optimizer: SGD, base_lr: 0.01, momentum: 0.937, weight_decay: 0.0005, warmup_epochs: 3, cosine_annealing: true }第一个值得琢磨的是优化器为何选SGD而非Adam。在目标检测任务里Adam收敛快但往往落在尖锐极小值上泛化能力偏弱SGD配合高momentum在检测任务上通常能跑到更平缓的极小值。这个文件里momentum0.937跟Ultralytics默认训练参数一致这意味着在梯度方向剧烈变化时模型依旧能保持稳定的更新速度对缓解前期不稳定的振荡很有帮助尤其适用于数据集类别较少、正样本比较稀疏的吸烟检测任务。base_lr0.01配合cosine_annealingtrue是一组常见组合。前者对应batch size 32时的线性缩放基准如果你把batch size调到64或128按经验学习率应该等比放大到0.02或0.04但这种放大不能超过上限否则前期权重会被冲散后者让学习率沿余弦曲线从高到低平滑衰减后期训练会在低学习率区域多逗留一会儿帮模型把边界框回归精度再往上拔一点。warmup_epochs也很重要它的作用是让模型在前几个epoch用较小的学习率启动避免初始权重突变。吸烟目标在数据集中占比小前几个epoch的梯度本身就不稳定如果去掉warmup很容易出现loss在前10个batch内陡增后难以回落的情况。这里建议不要动保持3即可。4.3 公式表达与训练命令的组合搭配一个容易忽视的细节是数据配置文件smoking.yaml里的nc参数。如果只检测吸烟一种行为这里就写nc: 1但names列表里必须写成[smoking]名称列表的数量要跟nc严格一致否则程序解析时会直接报IndexError。这类配置错误在自定义数据集上极其常见。训练指令中还有一个关键的派生参数--hyp它指向超参数文件。如果你不想手动编辑optimizer_config.json也可以把里面数值转换到hyp.yaml中。实际操作中走过一条有效的训练路线保持SGD优化器不变将--hyp指向一个自定义的data/hyps/hyp.custom.yaml在其中单独调整fl_gamma和box两项损失权重能较快降低漏检。训练完成后用runs/train/exp/weights/best.pt做最终推理即可这个权重是验证集上mAP最高的那一代不是最后一轮。5. 部署验证置信度阈值、NMS与序列化特征可视化训练收尾后不要立刻扔到生产环境。先在验证集上做一次系统的阈值扫描找到精度和召回率的平衡点python detect.py \ --weights runs/train/exp/weights/best.pt \ --source test_video.mp4 \ --conf-thres 0.35 \ --iou-thres 0.5 \ --save-txt--conf-thres指的是置信度阈值低于它的边界框将被丢弃生产环境里烟雾和手部遮挡多阈值可以比COCO常规的0.25高一些。--iou-thres对应NMS的IoU门槛吸烟区域常常密集且重叠如果NMS阈值太低相邻两帧的检测框会被误删一个造成报警闪烁。建议车间场景先按conf0.4, iou0.5起步再按现场调试结果微调。如果你需要把检测结果接入监控平台做二次报警可以直接读runs/detect里生成的txt文件它是YOLO格式的归一化坐标一个检测框一行。偏工程化一点的验证技巧是把训练好的模型同时挂到两个不同分辨率的输入上对比同一帧画面的输出。具体做法是写一个轻量脚本分别设置--img 640和--img 1280推理同一段视频观察高分辨率下检测框抖动是否明显变小。如果1280下框稳定而640下抖动剧烈说明模型的定位能力还有提升空间建议回到数据增强环节给训练集增加更多不同距离下的吸烟样本。提示吸烟检测模型在现场长期运行后应当定期收集误报截图回补训练集每两周增量训练一次否则一到换季、光线变化明显时误检率会明显上升。如果想观察模型在决策时看的是图像哪个区域可以用Grad-CAM类方法把最后一层卷积的梯度加权特征图可视化叠加到原图上红色热区落在手指、烟头附近说明模型学到了正确的判别区域如果热区散落在背景或衣领上那就要查一下训练集是否引入了背景泄漏。这套可视化分析同样适用于直接调整资源包内Dockerfile-arm64对应的嵌入式部署版本在确认热区正确之后再对模型做TensorRT或ONNX转换精度损失一般能控制在2%以内。本文还有配套的精品资源点击获取
返回列表