
简介一套基于YOLOv8的智能家居阳台花盆自动灌溉监测系统面向计算机视觉、人工智能、通信工程等专业的毕业设计或课程设计解决模型训练与灌溉监测落地脱节的问题。项目中包含完整数据集、可视化界面与部署说明代码全部经过作者毕设实测可直接运行并产出核心指标曲线、混淆矩阵、F1分数曲线、精确率召回率曲线、验证集预测结果和标签分布图适合答辩汇报与后续二次开发。压缩包共8个文件以3个Python脚本为主分别对应可视化页面、视频检测和模型训练3个pt模型权重文件提供训练好的检测模型2个txt文档包含说明与使用引导整体仅15.91MB轻量易部署。目前已有36人学习浏览尤其适合需要快速拿到完整可运行方案、想在YOLOv8目标检测基础上扩展功能的在校学生和入门学习者。1. 把 YOLOv8 毕设变成“开箱即用”这套阳台花盆自动灌溉系统到底能干什么说句实话做 YOLOv8 方向毕业设计最难的不是读懂模型结构而是拿到一个能跑通全流程的完整工程。这套基于 YOLOv8 的智能家居阳台花盆自动灌溉监测系统就是把模型训练、实时检测、可视化界面、数据集和部署说明打包成了一个闭环摄像头识别阳台花盆判断盆土干湿状态再联动输出灌溉控制信号。它适合计算机视觉、人工智能、自动化、电子信息方向的毕设、课设或大作业也适合刚入门深度学习想找个练手项目的人。资源里带训练好的 best.pt 权重、yolov8n/yolo11n 预训练模型、完整标注数据集和 README 部署说明装好环境就能跑免去了从零凑数据的痛苦。2. YOLOv8 选型逻辑从 anchor-free 到阳台小目标检测2.1 为什么选 YOLOv8 而不是 YOLOv5 或 YOLO11毕设选型的第一原则不是“哪个指标最高”而是“能不能跑起来、能不能讲清楚、能不能改”。YOLOv5 胜在生态老、教程多但代码结构是分散在不同文件里的对新手来说想改一个损失函数要翻好几个模块YOLOv8 把训练、验证、导出、预测统一成了 ultralytics 一个包命令行和 Python API 都能直接调这对课程设计和毕设太友好了。你说想做个界面调模型两三行就能把推理结果接回 GUIYOLOv5 就得自己写一堆预处理后处理封装。从模型结构本身看YOLOv8 相比 YOLOv5 有几个明确变化一是 anchor-free。YOLOv5 需要预设 anchor 尺寸针对花盆这种长宽比接近 1:1、尺寸范围比较固定的物体还得先跑 k-means 聚类YOLOv8 直接基于中心点回归边界框少了一个环节代码里也少了一堆超参数答辩时好讲。二是 backbone 换成了 C2f 结构。C2f 在残差连接上做了更细粒度的梯度流动设计结合 SPPF 和多尺度特征融合 P3/P4/P5对阳台这种光线变化大、花盆小目标多的场景召回率比 C2 结构更稳。三是检测头解耦。YOLOv8 把分类和回归分成两个分支每个分支有自己独立的 loss收敛更稳定。实际训练时你会发现v8 在相同 epochs 下边界框的置信度分数更平滑不容易像 v5 那样出现“框很准但 conf 抖动”的情况。资源里还带了一个 yolo11n.pt这是 ultralytics 后来的版本。它和 v8 的接口完全一致可以拿来做对比实验同一份数据集分别用 yolov8n 和 yolo11n 训练表格里放两行的 mAP50 和推理耗时答辩评委一看就知道你有工程对比意识。2.2 系统整体流程摄像头采集 → 检测 → 灌溉决策整个系统的技术链路并不复杂胜在闭环完整。拆开看是五个环节图像采集从 USB 摄像头、RTSP 网络摄像头或本地视频文件读取帧目标检测把帧送到 YOLOv8 模型推理出花盆的边界框、类别和置信度状态判定根据检测到的类别干盆/湿盆和置信度判定当前区域是否需要灌溉控制输出将判定结果映射到 GPIO 引脚或串口指令控制电磁阀/继电器打开或关闭记录与展示把每一帧的检测结果写入日志同时在可视化界面中叠加显示。这个架构的精髓在于判断“需不需要浇水”用的是视觉特征而不是土壤湿度传感器。传统方案要埋电容式传感器每盆一个成本高还得布线这里用摄像头看盆土颜色和纹理属于典型的机器视觉替代物理传感器作为毕设来讲创新点和系统复杂度都够用了。各模块的输入输出可以整理成一张对照表答辩 PPT 里直接能用模块输入输出关键技术点图像采集摄像头/视频帧1080P BGR 图像OpenCV VideoCapture目标检测单帧图像边界框 类别 置信度YOLOv8n 推理状态判定检测结果干/湿 布尔标志类别映射逻辑灌溉控制状态标志GPIO 高低电平serial / RPi.GPIO界面展示检测后的标注帧可视化窗口PyQt5 cv2你不需要一开始就把五块全部连起来。本地跑通时可以把“灌溉控制”换成屏幕上的红绿灯提示等检测逻辑稳定了再接线接继电器这样排错范围小很多。这套标准我在多个项目里验证过翻车概率最低。2.3 数据集两类标签与 YOLO 标注格式这一个资源里最值钱的部分就是数据集。做目标检测毕设自己从头拍照标注一个能用的数据集至少要一到两周。数据集的目录结构是标准的 YOLO 格式dataset/ ├── images/ │ ├── train/ # 训练集图片 │ └── val/ # 验证集图片 ├── labels/ │ ├── train/ # 训练集标签 │ └── val/ # 验证集标签 └── data.yaml # 数据集配置文件每张图片对应一个同名.txt标签文件文件里每行代表一个目标class_id x_center y_center width height注意坐标都是归一化的范围 0~1。比如一张 640×640 的图中一个花盆的中心在 (320, 480)宽 200高 150那这一行就是0 0.5 0.75 0.3125 0.234375。data.yaml 是训练时的入口配置核心就三项path: dataset train: images/train val: images/val nc: 2 names: 0: dry_pot 1: wet_pot类别设计建议控制在两类干花盆和湿花盆。不要一开始就做五六类分类太多会导致部分类别样本不够mAP 掉得很惨。两分类的好处是精度容易做高而且灌溉决策逻辑简单直接——检测到 dry_pot 就打开灌溉wet_pot 就保持关闭。标注工具我用得最多的是 LabelImg轻量装完就能用class_id 按 0、1 编好就行。标注时注意一个细节把盆土区域框进去不要把整个花盆叶子全包上因为模型学的是“土壤颜色 盆沿纹理”框太多叶子会引入噪声。3. 本地复现跑通train_mode.py 参数拆解与两个检测脚本3.1 环境搭建一小时从零到能训练拿到资源后第一步是建独立 Python 环境不要直接装进系统 Python不然 torch 和 opencv 的依赖冲突会拉出一堆连锁报错。推荐 conda 创建虚拟环境conda create -n yolo_flower python3.9 -y conda activate yolo_flower pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torchvision pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ultralytics8.2.0这里选 Python 3.9 是因为 torch 对 3.9 的 wheel 支持最全避免自己在无 GPU 环境下编译源码。ultralytics 固定 8.2.0 是因为新版本对某些老显卡的 CUDA 兼容有调整锁版本能减少不确定因素。装好后跑一句验证python -c from ultralytics import YOLO; print(YOLO(yolov8n.pt))能正常打印出模型对象说明核心依赖没问题。如果提示缺包按提示逐一补齐即可通常是 opencv-python、numpy、pandas 这些基础库。这段配置我实测过在有 NVIDIA 显卡的机器上大约二十分钟能完成纯 CPU 机器也能跑只是训练时间会拉长到 3~5 倍。如果手头机器实在跑不动后面避坑章我会给替代方案。3.2 train_mode.py训练参数逐项拆解资源里的 train_mode.py 是训练入口核心代码长这样from ultralytics import YOLO if __name__ __main__: model YOLO(yolov8n.pt) # 加载预训练权重 results model.train( datadataset/data.yaml, # 数据集配置 epochs120, # 训练轮数 imgsz640, # 输入图像尺寸 batch16, # 批次大小 device0, # 使用 GPU patience15, # 早停耐心值 workers4, # 数据加载线程数 lr00.01, # 初始学习率 save_dirruns/train/flower, # 输出目录 )参数说明如下epochs120对中小数据集足够yolov8n 这种小模型通常在 80 轮后收敛120 轮有冗余但更保险batch16在 8GB 显存下刚好如果显存不足改成 8 或 4不要硬怼device0是 GPU 编号如果你只有 CPU 环境改成devicecpupatience15表示连续 15 轮 loss 不下降就提前停止避免浪费时间workers4是读取数据的进程数Windows 下如果报多线程错误改成workers0lr00.01是 SGD/AdamW 的初始学习率YOLOv8 的默认配置对这个规模的实验比较稳。训练结束后在runs/train/flower/目录下会自动生成 weights/best.pt、weights/last.pt以及 results.png、confusion_matrix.png、F1_curve.png、PR_curve.png 等评估图表这些就是答辩材料里的核心证据。不需要自己写额外脚本去画模型训练完就一起产出了。这段脚本跑通后你就完成了整个毕设最核心的一步。其余工作都是在这个基础上做外围包装。3.3 Visual_interface.py可视化界面的启动与逻辑训练好 best.pt 之后下一步就是启动可视化界面。界面脚本入口是 Visual_interface.py运行命令python Visual_interface.py界面设计通常是左侧实时视频流、右侧状态面板的结构左侧显示带检测框的摄像头画面右侧显示当前检测类别、置信度、灌溉状态和历史灌溉记录。整个界面的核心逻辑可以用这样一段结构来描述import cv2 from PyQt5 import QtWidgets, QtGui, QtCore from ultralytics import YOLO class MainWindow(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.model YOLO(best.pt) self.cap cv2.VideoCapture(0) self.timer QtCore.QTimer() self.timer.timeout.connect(self.update_frame) self.timer.start(33) # 约 30 FPS def update_frame(self): ok, frame self.cap.read() if not ok: return results self.model(frame, imgsz640, conf0.45) annotated results[0].plot() # 转换为 QImage 并显示到界面上这里的conf0.45是置信度阈值默认 0.25 时很多误检框会进来对毕设展示的观感影响较大我一般调到 0.4~0.5画面干净很多。如果你用的是 PyQt5 之外的其他 GUI 库比如 Tkinter 或 PySide2核心逻辑不变只是控件绑定部分不同。界面不是重点重点是它能把模型输出的检测框实时渲染到屏幕上并同步更新灌溉状态。3.4 Detection_video.py摄像头与视频文件实时检测如果你的答辩场景不需要 GUI只想在答辩现场放一段实时检测效果直接跑 Detection_video.py 更省事。脚本核心逻辑如下import cv2 from ultralytics import YOLO model YOLO(best.pt) # 0 代表默认摄像头改为视频路径如 test.mp4 则读取视频文件 cap cv2.VideoCapture(0) while cap.isOpened(): ret, frame cap.read() if not ret: break results model(frame, imgsz640, conf0.5) annotated results[0].plot() # 绘制检测框和标签 cv2.imshow(irrigation_monitor, annotated) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()需要注意的逻辑点results[0].plot()返回的是已经画好检测框的 BGR 图像直接用 cv2.imshow 显示不需要自己再画矩形框如果摄像头打不开cap.read()会返回 False脚本会立刻跳出循环看到黑屏窗口别慌先检查摄像头权限想保存检测视频用cv2.VideoWriter把 annotated 逐帧写入即可答辩前提前录好一段测试视频比现场连摄像头更稳。我之前做类似通讯课程设计时最烦的就是现场演示时摄像头驱动出问题所以强烈建议你先把检测视频录成 mp4权当兜底方案。4. 训练产出图表怎么读答辩说服力来源4.1 results.png一条曲线看懂训练是否收敛训练完成后的results.png是所有图表里信息量最大的一张。它包含多行子图train/val 的 box loss、cls loss、dfl loss以及 precision、recall、mAP50、mAP50-95 曲线。读图只需要看两件事第一loss 曲线是否单调下降并趋于平缓。如果 val loss 在某个 epoch 之后开始反弹上升说明过拟合了这时应该调大patience或者提前用早停如果 loss 还在下降但 mAP 曲线也在上升说明训练还没跑够可以适当加 epochs。第二mAP50 曲线的最终值。对两分类的花盆检测任务mAP50 在 0.85 以上算合格0.9 以上就是可以拿去答辩的水平。如果你的结果在 0.7 以下不要急着调参先回数据集里查标签有没有错标漏标。4.2 F1 分数曲线与 P-R 曲线找置信度阈值的依据F1_curve.png 和 PR_curve.png 都体现一个共同逻辑precision 和 recall 是互相制约的。阈值调高检测框更可靠但漏检增多阈值调低召回上来了但误检也上来了。F1 曲线横轴是置信度阈值纵轴是 F1 值曲线峰值对应的阈值就是当前模型的最优平衡点。你可以直接看这张图来决定界面里的conf参数应该设多少。比如曲线峰值落在 conf0.42 附近那 Visual_interface.py 里的conf0.45就是合理的。PR 曲线则用于计算 AP 值曲线下的面积就是 mAP。答辩时把这张图放出来评委问“您怎么验证模型好坏”你就能指着曲线下的面积讲 mAP 的定义这是标准且加分的回答路径。4.3 混淆矩阵与标签分布验证数据质量问题混淆矩阵confusion_matrix.png是所有图表里最容易被忽略但最关键的。它展示模型把一类样本误判成另一类的比例。对花盆场景最需要关注的格子是交叉点把干盆判成湿盆的比例高不高。如果干盆被大量判成湿盆那系统就会“该浇不浇”这是系统级的致命错误相反方向则最多是多浇几次水。再看labels.jpg它展示所有标注框的中心点分布、宽高分布和类别数量。如果你发现干盆和湿盆的数量严重不均衡比如干盆 800 个、湿盆 200 个那模型会偏向预测多数类。解决办法不是删数据而是做数据增强或类别加权。验证集预测结果图val_batch*_pred.jpg则是最直观的展示材料把标注框和预测框叠在同一张图上。我建议答辩 PPT 里放三到四张这样的对比图比纯文字讲模型结构有效得多。5. 复现避坑记录五个翻车点与排查思路5.1 OOM 显存溢出训练到一半报错现象脚本运行约十分钟后抛CUDA out of memory训练中断。原因batch16加上imgsz640对 8GB 显存来说已经接近上限如果后台还开了其他程序比如浏览器显存直接被占满。解决先把 batch 降到 8如果还不行降到 4同时把imgsz降到 480对花盆检测影响不大但显存占用能降低一半。另外给 Windows 设置 GPU 超时时间用管理员运行nvidia-smi --gpu0 --auto-select或者干脆把其他程序关掉专心训练。这条经验在同事的实际项目中反复出现batch 调小后的 mAP 损失通常不到一个点但稳定性提升巨大。5.2 训练 loss 出现 NaN现象训练到第 20 轮左右loss 突然变成 nan后续不再恢复。原因最常见的原因是学习率过大导致梯度爆炸尤其是自己调了lr0之后其次是 data.yaml 里类别数量nc与标签文件里的 class_id 不一致比如标签里出现了 class 2但 nc 只设了 2。解决把lr0从 0.01 改成 0.005 再跑一次同时检查所有标签文件用一段简单脚本扫描 class_id 最大值grep -o ^[0-9] dataset/labels/train/*.txt | sort -u把不存在的类别 id 过滤掉。如果 loss 还在跳就加载 last.pt 降低学习率继续训练不必从头开始。5.3 训练结束后找不到 best.pt现象训练正常结束但runs/train/flower/weights/目录里只有 last.pt没有 best.pt。原因save_dir参数指定了自定义输出目录而老版本 ultralytics 在自定义 save_dir 时best.pt 的保存逻辑可能没跟着走或者是训练被手动中断模型还没保存 best 权重。解决直接用默认的runs/detect/train路径训练完成后再手动拷贝或者检查代码里是否把save_dir拼错了路径。如果是中断导致就加载 last.pt 续训并设置save_period5让它每五轮保存一次。5.4 中文路径导致检测结果全为空现象模型加载正常但model(frame)返回的结果里没有任何检测框控制台也没有报错。原因资源放在E:\毕设项目\花草识别\这类中文路径下opencv 读取图片时路径编码解析失败返回了空帧。解决把整个项目目录放到纯英文路径下比如E:\flower_project\这是最省时间的办法同时把数据集里的图片文件名也改成英文或数字。这个坑在 Windows 上很常见macOS 和 Linux 反而不容易遇到。5.5 检测界面卡顿FPS 掉到不足 10现象Visual_interface.py 运行时画面严重卡顿检测框明显滞后。原因imgsz640同时开了workers多线程推理帧率和显示帧率没有解耦GUI 主线程被模型推理阻塞。解决把推理放到独立线程或者将imgsz降到 480再或者检测线程只对每三帧中的一帧做推理中间帧复用上一次结果。界面显示建议用cv2.resize把标注帧缩小到 960×540 再送去渲染体验直接翻倍。6. 把模型换成你自己的花盆数据重训三步与验证技巧如果你是拿这套系统做课设变体或者想换成家里的真实花盆场景重训流程只有三步。第一步替换数据集。把自己的图片整理成images/train、images/val和对应的labels目录修改 data.yaml 里的path、nc和names其他不用动。第二步修改 train_mode.py 里的类别参数和输出目录重新执行训练脚本。用我之前说的方式加载 yolov8n.pt 预训练权重借用 ImageNet 上的特征做迁移学习二三百张图片就能训出一个效果不错的模型。第三步训练完成后用model.val()验证新的 mAP50然后把 best.pt 复制到项目根目录替换旧权重重新启动 Visual_interface.py 就能看到新模型的效果。如果想做对比实验在 resources 目录里用 yolo11n.pt 再训一版把两边 mAP 和推理 FPS 列一张表。我自己每次换数据集后的固定动作是先跑一段检测视频确认新类别的边界框都正常画出再打开 GUI 看界面渲染。现在做类似的项目我都会强制走一遍这个流程训练 → val → 录视频 → 打开界面全部跑通才敢说“完成”。希望这份笔记能帮你绕开我踩过的坑顺利把毕设/课设落地。本文还有配套的精品资源点击获取