前言为什么做火灾检测火灾检测不管是做课程设计还是毕业设计都既有现实意义又容易在背景描述里展开。这期把整个过程从头到尾走一遍数据准备 → 环境配置 → 模型训练 → 推理检测 → PyQt5 桌面界面一套流程直接拿下初学者也能跑通。先别急着跑代码从头到尾看完一遍少走弯路。一、项目效果先看废话不多说先上效果截图来自实际训练好的模型本项目可以实现什么功能对应文件一句话说明 训练模型train.py输入数据集 → 输出可用于推理的权重文件 推理检测detect.py图片 / 视频 / 摄像头 / RTSP 流 / YouTube 都支持️ 可视化界面window.pyPyQt5 写的桌面程序图片检测视频检测摄像头实时监测 模型验证val.py计算 mAP、Precision、Recall 模型导出export.pyONNX / TFLite / CoreML 各种格式部署 数据转换data_gen.pyVOC 格式 → YOLO 格式一键转换 在线部署utils/flask_rest_api/restapi.pyFlask 提供 HTTP 接口二、YOLOv5 快速科普100 秒弄懂2.1 YOLOv5 是什么YOLOYou Only Look Once是一个系列的单阶段目标检测算法速度快、精度高、上手简单。v5 是 Ultralytics 公司用 PyTorch 重写的版本也是目前工程落地最流行的版本之一。2.2 四个模型选哪个YOLOv5 同一套架构有 4 种规模靠两个超参控制模型深度系数depth_multiple宽度系数width_multiple参数量推荐场景yolov5s0.330.50~7M✅ 入门首选速度精度平衡yolov5m0.670.75~21M精度更高显存够可上yolov5l1.01.0~47M精度最高训练慢yolov5x1.331.25~87M不推荐又慢又重本项目默认用 yolov5s初学者从最小模型开始跑通流程后再考虑升级模型。2.3 YOLO 格式标注长啥样YOLO 格式的标注是每张图片对应一个同名.txt每行一个目标class_id x_center y_center width height举个例子0 0.4531 0.6125 0.2063 0.3500表示0类别 id fire在本项目的names: [fire, nofire]中排第 0 位0.4531, 0.6125目标框中心点相对于图片宽高归一化到 0~10.2063, 0.3500目标框宽高同样归一化2.4 迁移学习是什么我们不会从 0 开始训练神经网络而是加载在 COCO 数据集上预训练过的yolov5s.pt做基础再用火灾数据微调。好处收敛快几十个 epoch 就有效果小数据集也能训出可用模型显存占用低三、环境搭建保姆级Windows 10/11 亲测可用3.1 软件准备软件下载地址作用AnacondaDownload Anaconda Distribution | AnacondaPython 环境管理必备PyCharm / VSCode二选一IDE 写代码NVIDIA 驱动下载 NVIDIA 官方驱动 | NVIDIAGPU 用户必装LabelImg / LabelMepip 可装数据标注可选 不熟悉 Anaconda PyCharm 的先看这篇如何在pycharm中配置anaconda的虚拟环境3.2 配置国内源必做不然下载能急死打开Anaconda Prompt依次执行conda config --remove-key channels conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/cloud/pytorch/ conda config --set show_channel_urls yes pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/web/simple3.3 创建 Python 3.8 虚拟环境conda create -n yolo5 python3.8.5 conda activate yolo53.4 安装 PyTorch重点方案 A有 NVIDIA 显卡强烈推荐先去官网更新显卡驱动然后根据显卡型号选 CUDA 版本GTX 10 系及以前CUDA 10.2RTX 20/30 系CUDA 11.3RTX 40 系CUDA 11.8# GTX 10 系 / CUDA 10.2 conda install pytorch1.8.0 torchvision0.9.0 torchaudio0.8.0 cudatoolkit10.2 ​ # RTX 30 系 / CUDA 11.3推荐 conda install pytorch1.10.0 torchvision0.11.0 torchaudio0.10.0 cudatoolkit11.3 -c pytorch方案 B只有 CPU能跑推理训练会很慢conda install pytorch1.8.0 torchvision0.9.0 torchaudio0.8.0 cpuonly验证 PyTorch 是否装对在 Anaconda Prompt 里输入python然后import torch print(torch.cuda.is_available()) # GPU 用户应输出 True print(torch.cuda.get_device_name(0)) # 应输出你的显卡型号3.5 安装其他依赖# 进入项目根目录 cd /d D:\yolov5-fire # 换成你自己的路径 ​ # 基础依赖 pip install -r requirements.txt ​ # Windows 下 pycocotools 的简单安装 pip install pycocotools-windows ​ # GUI 与标注工具 pip install pyqt5 labelme四、数据集准备附 2000 张标注数据获取方式4.1 数据集目录结构YOLOv5 要求数据集按下面的结构组织严格按命名不然找不到标签fire_yolo_format/ ├── images/ │ ├── train/ # 训练图片如 001.jpg, 002.jpg... │ └── val/ # 验证图片 └── labels/ ├── train/ # 训练标签如 001.txt, 002.txt... └── val/ # 验证标签关键规则图片和标签同名仅扩展名不同.jpgvs.txt没有目标的图片也要放对应的空.txt作为负样本labels必须与images同级名字固定是labels不能写 label/txt4.2 数据划分建议划分比例作用训练集 train80%训练模型验证集 val20%选最佳模型 调参训练时会按 80/20 自动划分原作者提供的 2000 张数据集已经按这个格式整理好了拿来即用。4.3 如果你有 VOC XML 格式的数据 → 一键转 YOLO很多公开数据集是 VOC 格式每个标注是一个.xml文件用项目里的 data_gen.py 就能一键转换。打开 data_gen.py先改 2 处# 第 37~44 行替换成你自己的 VOC 数据路径 FILE_ROOT D:/你的VOC数据根目录/ IMAGE_SET_ROOT FILE_ROOT VOC2021_Fire/ImageSets/Main IMAGE_PATH FILE_ROOT VOC2021_Fire/JPEGImages ANNOTATIONS_PATH FILE_ROOT VOC2021_Fire/Annotations LABELS_ROOT FILE_ROOT VOC2021_Fire/Labels DEST_PPP FILE_ROOT fire_yolo_format DEST_IMAGES_PATH fire_yolo_format/images DEST_LABELS_PATH fire_yolo_format/labels ​ # 第 54 行★★★ 最重要改成火灾类别默认是口罩的 face/face_mask不改类别会错乱 label_names [fire, nofire]然后运行python data_gen.py4.4 从零开始标注推荐用LabelImgGitHub 搜tzutalin/labelImg或者pip install labelImg打开 LabelImg选择Open Dir选图片文件夹左侧把格式切换成YOLO默认是 PascalVOC点一下就能切Create RectBox画框标上类别fire / nofire保存自动生成 YOLO 格式.txt五、配置文件修改三个文件改完就能训5.1 改数据配置data/fire_data.yaml打开 data/fire_data.yaml# ★★★ 把下面两行改成你本地数据集的绝对路径 ★★★ train: F:/sssssssssd/det/yolo/fire/fire_yolo_format/images/train val: F:/sssssssssd/det/yolo/fire/fire_yolo_format/images/val ​ # 类别数本项目 2 类 nc: 2 ​ # 类别名顺序决定 class_idfire0nofire1 names: [fire, nofire] 路径分隔符用/或\\不要用单个\会被当成转义字符。5.2 改模型配置models/mask_yolov5s.yaml打开 models/mask_yolov5s.yaml唯一必改项是nc类别数本项目已改成 2nc: 2 # number of classes必须和 fire_data.yaml 一致 depth_multiple: 0.33 width_multiple: 0.50 anchors: - [10,13, 16,30, 33,23] - [30,61, 62,45, 59,119] - [116,90, 156,198, 373,326] ... 注意项目里的三个 mask_yolov5 配置s/m/l只是命名沿用了上游口罩项目实际已经改为nc: 2放心用就行。5.3 预训练权重pretrained/yolov5s.pt确保项目目录下有 pretrained/yolov5s.pt没有会自动下载yolov5s.pt~14MByolov5m.pt~40MByolov5l.pt~89MB六、开始训练你的第一个火灾模型6.1 训练命令打开 Anaconda Promptconda activate yolo5后进入项目根目录GPU 训练推荐速度飞起python train.py --data fire_data.yaml ^ --cfg mask_yolov5s.yaml ^ --weights pretrained/yolov5s.pt ^ --epochs 100 ^ --batch-size 16 ^ --device 0 ^ --workers 4Windows cmd 换行用^一行写也行Linux / PowerShell 换行用\CPU 训练仅学习用急死人系列python train.py --data fire_data.yaml ^ --cfg mask_yolov5s.yaml ^ --weights pretrained/yolov5s.pt ^ --epochs 100 ^ --batch-size 2 ^ --device cpu ^ --workers 06.2 参数解读参数推荐值说明--datafire_data.yaml数据配置--cfgmask_yolov5s.yaml模型结构--weightspretrained/yolov5s.pt预训练权重--epochs100~300训练轮数--batch-sizeGPU 16 / CPU 2显存不够就往小调16→8→4→2--device0 / cpu0是 0 号 GPU--workersGPU 4 / CPU 0Windows 建议 0~4防多进程报错--img640默认输入尺寸--cache ram可选数据缓存进内存加速训练6.3 训练过程长啥样Epoch GPU_mem box_loss obj_loss cls_loss Instances Size 0/99 3.5G 0.0456 0.0521 0.0000 15 640: 100%|████████| 80/80 Class Images Labels P R mAP.5 mAP.5:.95 all 128 231 0.832 0.764 0.791 0.486三个 loss 持续下降、mAP 持续上升就对了。6.4 训练中断怎么续训python train.py --resume runs/train/exp/weights/last.pt自动恢复到中断的 epoch 继续训。七、训练结果看懂了吗mAP/损失曲线解读训练完成后结果会自动保存在runs/train/exp/目录下。7.1 目录结构runs/train/exp/ ├── weights/ │ ├── best.pt # ★★★ 验证集最优权重后面推理全用它 │ └── last.pt # 最后一轮的权重主要用于续训 ├── results.png # 8 条训练曲线box/obj/cls loss P/R/mAP ├── confusion_matrix.png # 混淆矩阵 ├── PR_curve.png # P-R 曲线越靠右上角越好 ├── F1_curve.png # F1 曲线 ├── labels.jpg # 数据集标签分布 ├── train_batch0.jpg # 训练批次可视化含马赛克增强 └── val_batch0_pred.jpg # 验证集预测效果7.2 关键指标指标含义可用标准Precision (P)预测为 fire 的样本里真正是 fire 的比例0.8Recall (R)真正的 fire 被检测出来的比例0.8mAP0.5IoU0.5 时的平均精度0.8 可以答辩演示mAP0.5:0.95IoU 从 0.5 到 0.95 取平均更严格0.5 不错7.3 TensorBoard 可视化训练过程tensorboard --logdir runs/train浏览器打开http://localhost:6006实时看曲线。八、模型推理图片/视频/摄像头/RTSP 一网打尽8.1 基础推理命令推理主脚本是 detect.py。# ★ 检测图片 python detect.py --weights runs/train/exp/weights/best.pt --source test.jpg ​ # ★ 检测视频 python detect.py --weights runs/train/exp/weights/best.pt --source fire_demo.mp4 ​ # ★ 检测整个目录批量处理 python detect.py --weights runs/train/exp/weights/best.pt --source data/images/ ​ # ★ 实时摄像头检测0 是默认摄像头编号 python detect.py --weights runs/train/exp/weights/best.pt --source 0 --view-img ​ # ★ RTSP 网络流海康/大华摄像头 python detect.py --weights runs/train/exp/weights/best.pt --source rtsp://admin:密码IP:554/stream ​ # 检测网络视频 python detect.py --weights runs/train/exp/weights/best.pt --source https://youtu.be/xxxx8.2 推理常用参数参数默认说明--weightsyolov5s.pt训练好的best.pt--sourcedata/images输入源--imgsz640推理尺寸越大越准越慢--conf-thres0.25置信度阈值误报多就调到 0.5--iou-thres0.45NMS 阈值--device0/cpu--view-imgFalse弹窗显示结果--save-txtFalse保存检测框坐标到 txt--save-confFalsetxt 里附带置信度--classesNone只检测指定类--classes 0只看 fire--halfFalseGPU 半精度推理提速8.3 误报多怎么调# 调高置信度只保留更确定的预测 python detect.py --weights best.pt --source test.jpg --conf-thres 0.5 --view-img ​ # 只检测 fire排除 nofire过滤一些干扰类 python detect.py --weights best.pt --source test.jpg --classes 0 --conf-thres 0.58.4 输出在哪检测结果在runs/detect/exp/含标注好的图片/视频、--save-txt时的坐标 txt。九、PyQt5 可视化界面毕设答辩 demo 必备光跑命令行怎么够项目自带了用PyQt5做的桌面可视化界面 window.py功能有️图片检测上传 → 检测 → 原图结果对比视频检测本地视频文件 / 摄像头实时监测 / 一键停止9.1 启动前必改 2 处打开 window.py# 第 54 行有 GPU 改成 0没 GPU 保持 cpu self.device cpu ​ # 第 60-61 行★★★ 改成你训练出来的 best.pt 路径 ★★★ self.model self.model_load(weightsruns/train/exp_yolov5s/weights/best.pt, deviceself.device) 小技巧如果你的训练目录是runs/train/exp可以重命名为runs/train/exp_yolov5s就不用改路径了匹配默认值。9.2 启动界面python window.py9.3 界面工作原理启动即加载模型避免每次检测都重新加载模型响应快视频检测用子线程threading.Thread(targetself.detect_vid)跑在后台不会卡死界面停止检测用事件通知self.stopEvent.set()告诉视频检测线程优雅退出9.4 想加个报警声音毕设加分项在检测到 fire 的时候播放蜂鸣声比如在 window.py 的detect_img/detect_vid里加import winsound # Windows 自带不需要额外安装 # 在得到检测结果 for *xyxy, conf, cls in reversed(det): 循环之后 if any(int(cls) 0 for *xyxy, conf, cls in det): # 检测到了 fire winsound.Beep(2000, 500) # 2000Hz 响 0.5 秒9.5 常用定制点速查想做什么改哪里换模型权重第 60 行weights切换 GPU/CPU第 54 行self.device 0改窗口标题第 48 行setWindowTitle(火灾检测系统)调输出显示尺寸第 52 行self.output_size 480调识别灵敏度第 249/421 行conf_thres换界面图标images/UI/下的 xf.jpg / lufei.png 等十、常见报错 Top 10 解决方案❌ No.1CUDA out of memory显存不够✅ 解决--batch-size从 16 → 8 → 4 → 2 逐步减小或者用更小模型 / 更小--img 512。❌ No.2torch.cuda.is_available()返回 False✅ 解决大概率装成 CPU 版 PyTorch 了。先pip uninstall torch torchvision再装对应 CUDA 版本的见第三节。❌ No.3 Windows 下训练报BrokenPipeError✅ 解决加--workers 0或--workers 4。❌ No.4AssertionError: train: No labels found✅ 解决检查数据集目录结构labels必须和images同级同名对应路径分隔符别用单个\。❌ No.5 检测不出来任何框输出空图✅ 解决调小--conf-thres0.25 → 0.1或者确认模型真的训好了mAP 0.5。❌ No.6 启动 GUI 报找不到exp_yolov5s/weights/best.pt✅ 解决window.py:60 把权重路径改成你实际的best.pt路径。❌ No.7data_gen.py转换后类别全错✅ 解决data_gen.py:54 的label_names没改成[fire,nofire]改完重跑。❌ No.8 路径含中文报错✅ 解决把项目和数据集都放在纯英文无空格路径下如D:\projects\yolov5-fire\。❌ No.9ImportError: No module named xxx✅ 解决pip install xxx如果是 utils 相关模块报找不到确认在项目根目录运行 conda activate yolo5。❌ No.10 PyQt5 界面图标是空白✅ 解决确认项目有images/UI/xf.jpg、up.jpeg、right.jpeg、lufei.png缺失就随便放个图片占位。十一、完整命令速查表直接复制粘贴# 环境 conda activate yolo5 python -c import torch; print(torch.cuda.is_available()) # 训练 # GPU 推荐 python train.py --data fire_data.yaml --cfg mask_yolov5s.yaml --weights pretrained/yolov5s.pt --epochs 100 --batch-size 16 --device 0 --workers 4 # CPU 仅学习 python train.py --data fire_data.yaml --cfg mask_yolov5s.yaml --weights pretrained/yolov5s.pt --epochs 100 --batch-size 2 --device cpu --workers 0 # 续训 python train.py --resume runs/train/exp/weights/last.pt # 看训练曲线 tensorboard --logdir runs/train # 推理 python detect.py --weights runs/train/exp/weights/best.pt --source test.jpg --conf-thres 0.4 --view-img python detect.py --weights runs/train/exp/weights/best.pt --source fire_demo.mp4 python detect.py --weights runs/train/exp/weights/best.pt --source 0 --view-img python detect.py --weights runs/train/exp/weights/best.pt --source rtsp://admin:pwdIP:554/stream # 验证 python val.py --weights runs/train/exp/weights/best.pt --data fire_data.yaml # GUI python window.py # 模型导出 python export.py --weights runs/train/exp/weights/best.pt --include onnx11.1 学习路径推荐少走弯路✅ 先用作者给的权重跑通detect.py检测一张图片建立成就感✅ 启动window.py玩一玩 GUI✅ 看懂数据格式 自己标 10 张图过一遍流程✅ 改好三个配置fire_data.yaml / mask_yolov5s.yaml / 数据路径✅ 小数据 s 模型 10 epoch 走完整训练流程✅ 看懂results.png、PR_curve.png✅ 全量数据 GPU 100 epoch 正式训练✅ 做 PyQt5 界面 报警声音 推理视频录制 毕设 demo 搞定