
1. 项目背景与核心价值抽烟行为检测作为计算机视觉领域的典型应用场景在公共场所智能监控、安全生产管理等领域具有重要实用价值。这个毕业设计项目选择基于YOLO算法实现抽烟检测既符合计算机视觉技术的教学要求又能体现深度学习在实际场景中的应用。我去年指导过三个类似选题的毕设发现YOLO系列特别适合作为学生接触目标检测的入门框架。相比Faster R-CNN等两阶段检测器YOLO的单阶段检测思路更直观训练和部署门槛都更低。最新开源的YOLOv5甚至可以在消费级显卡上完成训练这对硬件资源有限的在校生特别友好。2. YOLO算法选型分析2.1 YOLO版本对比目前主流的YOLO实现包括YOLOv3Darknet框架的经典版本社区资源丰富YOLOv4在v3基础上引入CSPNet等优化YOLOv5PyTorch实现训练部署更简单YOLOv72022年提出的最新改进版本对于毕设项目我推荐使用YOLOv5s小型版本。实测在RTX 3060显卡上使用公开数据集训练只需2-3小时就能达到不错的准确率。而且其PyTorch生态有大量现成的工具链支持从数据标注到模型部署都有完整解决方案。2.2 算法核心原理YOLO将目标检测视为回归问题其核心创新在于将图像划分为S×S网格每个网格预测B个边界框及对应置信度同时预测每个网格的类别概率这种端到端的处理方式使其速度远超传统方法。以YOLOv5为例其骨干网络Backbone采用CSPDarknet颈部Neck使用PANet进行特征融合头部Head则输出检测结果。3. 数据集构建与标注3.1 数据收集方案抽烟检测需要包含以下场景不同光照条件下室内/室外多种抽烟姿势手持、叼烟等多人交互场景部分遮挡情况建议组合使用公开数据集和自采数据从Open Images等平台获取基础抽烟图像使用手机采集补充数据注意隐私合规制作负样本类似动作但非抽烟3.2 标注规范与工具使用LabelImg进行标注时要注意香烟区域标注为smoke手持香烟时标注整个手部区域对模糊图像建议多人复核保持宽高比在1:1到1:3之间标注文件采用YOLO格式类别 x_center y_center width height4. 模型训练实战4.1 环境配置推荐使用conda创建虚拟环境conda create -n yolo python3.8 conda activate yolo pip install torch1.10.0cu113 torchvision0.11.1cu113 -f https://download.pytorch.org/whl/torch_stable.html pip install -r requirements.txt # YOLOv5官方要求4.2 关键训练参数修改data/smoke.yamltrain: ../train/images val: ../valid/images nc: 1 # 类别数 names: [smoke] # 类别名称启动训练python train.py --img 640 --batch 16 --epochs 100 --data smoke.yaml --weights yolov5s.pt4.3 训练监控使用TensorBoard观察指标损失曲线box_loss, obj_loss, cls_loss验证集mAP0.5学习率变化当验证集指标连续10个epoch不提升时可考虑早停early stopping。5. 模型优化技巧5.1 数据增强策略在data/hyps/hyp.scratch-low.yaml中调整hsv_h: 0.015 # 色调增强 hsv_s: 0.7 # 饱和度增强 hsv_v: 0.4 # 明度增强 degrees: 10.0 # 旋转角度 translate: 0.1 # 平移比例 scale: 0.5 # 缩放比例5.2 模型剪枝使用TorchPruner进行通道剪枝from torchpruner import SparsePruner pruner SparsePruner(model, sparsity0.3) pruner.step() pruned_model pruner.prune()5.3 量化部署将模型转换为ONNX后量化python export.py --weights runs/train/exp/weights/best.pt --include onnx optimum-cli onnxruntime quantize --onnx_model path/to/model.onnx --output path/to/quantized_model.onnx6. 部署方案对比6.1 本地部署使用Flask创建Web APIfrom flask import Flask, request import cv2 app Flask(__name__) model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt) app.route(/detect, methods[POST]) def detect(): img request.files[image].read() img cv2.imdecode(np.frombuffer(img, np.uint8), cv2.IMREAD_COLOR) results model(img) return results.pandas().xyxy[0].to_json()6.2 边缘设备部署在树莓派上使用ONNX Runtimeimport onnxruntime as ort sess ort.InferenceSession(quantized_model.onnx) inputs {images: processed_img} outputs sess.run(None, inputs)7. 常见问题解决7.1 漏检问题排查检查标注是否完整增加hard negative mining调整NMS阈值--iou-thres参数7.2 误检优化方案收集更多负样本增加分类分支的损失权重使用Focal Loss处理类别不平衡7.3 性能瓶颈分析使用torch.profiler定位耗时操作对预处理进行并行化处理尝试TensorRT加速8. 毕设文档建议技术报告应包含问题定义与现状分析YOLO算法改进方案数据集构建过程消融实验设计部署测试结果社会效益分析演示系统建议包含实时摄像头检测界面历史记录查询功能统计报表生成模块我在验收时特别关注是否进行了充分的对比实验误检/漏检的具体解决方案部署方案的可行性分析这个项目如果扩展为完整系统可以考虑与现有监控平台集成添加吸烟频率统计功能开发移动端告警应用结合ReID技术追踪吸烟人员