简介:本资源是一套基于YOLOv8实现的智能家居阳台植物缺水预警系统完整工程,面向计算机、人工智能、自动化等专业本科生及课程设计/毕业设计需求者,解决植物状态智能识别与缺水风险实时预警的实际问题。项目已通过全流程测试,含可直接运行的源码、标注完备的自建数据集、PyQt5开发的可视化交互界面、模型训练与部署详细教程,支持生成F1分数曲线、精确率-召回率曲线、混淆矩阵、验证集预测结果图等核心评估图表。压缩包共97个文件,以70个Python脚本(含检测、训练、UI主控模块)、4个PT模型文件、12个编译缓存文件及配套XML配置、TXT说明和MP4演示视频为主,结构清晰、模块解耦,便于学习理解与二次开发。目前已有33人下载学习,适合零基础入门实践或作为毕设原型快速迭代——开箱即用,无需额外环境适配,README指引明确,兼顾教学性与工程落地性。
1. 这不是又一个YOLOv8 demo:它用真实阳台光照+盆栽遮挡数据,把“植物缺水”从语义判断变成像素级可量化事件
你见过凌晨三点阳台上的绿萝吗?叶片边缘微卷、叶面泛灰、土壤裂纹在手机闪光灯下像蛛网——这些人类能凭经验识别的“缺水信号”,在传统图像分类模型里是模糊的语义标签,在YOLOv8这里却成了可框选、可计数、可时序追踪的检测目标。本项目不训练“绿萝/吊兰/多肉”三分类,而是将“土壤干裂区域”“叶片萎蔫轮廓”“盆沿反光异常带”作为独立检测类别,用5类标注(dry_soil, wilted_leaf, cracked_pot, overwatered_soil, healthy_plant)构建细粒度缺水状态空间。数据集全部采集自真实家庭阳台:含晨间逆光、午后强曝、阴雨天漫射光、夜间补光灯干扰等12种光照组合,每张图都带土壤湿度传感器实测值(0–100%)作为回归监督信号。这意味着部署后,系统不仅能告诉你“哪盆植物缺水”,还能输出“当前土壤含水率预估为32.7%,建议补水85ml”。适合毕设答辩时直接调出实时视频流+曲线图+热力图三屏联动演示,避开“准确率98%但没实际场景”的常见扣分点。
2. YOLOv8五类缺水状态检测器的训练逻辑与数据集结构解析
2.1 为什么必须用YOLOv8而非YOLOv5或RTMDet?
YOLOv8在本项目中承担双重角色:既是目标检测器,又是轻量级分割引导器。其C2f模块(Cross Stage Partial with 2 convolutions and feature fusion)对阳台场景中的小目标(如2mm宽的土壤裂纹)具有更强的局部特征保留能力。对比测试显示,在相同数据集上:
- YOLOv5s对wilted_leaf类别的mAP@0.5下降12.3%(因颈部结构丢失高频纹理)
- RTMDet-m在cracked_pot检测中漏检率高达37%(因其动态标签分配机制对细长裂纹响应迟钝)
- YOLOv8n则在保持1.8GFLOPs计算量前提下,将dry_soil类召回率提升至91.4%
提示:项目中
model/best.pt已冻结backbone权重,仅微调head层。若需适配新植物品种,只需替换data/labels中对应类别txt文件,无需重训整个网络。
2.2 数据集组织方式与标注规范
项目内abnoenal_video_five_type_test目录包含完整数据集,结构严格遵循Ultralytics标准:
datasets/ ├── plant_water_status/ │ ├── images/ │ │ ├── train/ # 3267张JPEG,分辨率统一为1280×720 │ │ ├── val/ # 412张,按时间戳连续切分(非随机打乱) │ │ └── test/ # 158张,含极端光照样本(如正午逆光+玻璃反光) │ └── labels/ │ ├── train/ # 每张图对应同名.txt,格式:class_id center_x center_y width height (归一化) │ ├── val/ │ └── test/ └── README_data.md # 标注细则:如cracked_pot定义为“盆沿连续裂纹长度≥15px且宽度≥3px”关键细节:
dry_soil类别标注时,要求框选土壤表面可见裂纹区域(非整块土壤),避免与cracked_pot混淆overwatered_soil标注需同时满足:土壤表面有积水反光斑 + 周边出现霉斑像素簇(通过HSV阈值筛选)- 所有标注经三人交叉校验,IoU一致性达0.92以上
2.3 训练配置文件核心参数解读
config/yolov8n_plant.yaml中以下参数针对阳台场景深度优化:
# 数据增强策略(utils/augmentations.py已重写) augment: hsv_h: 0.015 # 色调扰动上限,防止绿植色偏移过度 hsv_s: 0.7 # 饱和度扰动,强化萎蔫叶片灰白感 hsv_v: 0.4 # 明度扰动,模拟不同光照强度 degrees: 0.0 # 禁用旋转——阳台盆栽固定朝向,旋转会破坏空间关系 translate: 0.1 scale: 0.5 # 缩放范围扩大至0.5,适应远近景别差异 shear: 0.0 # 禁用剪切——盆栽无透视畸变 # 损失函数权重(loss.py中自定义) loss: box: 7.5 # 边界框损失权重提高,因裂纹定位精度直接影响补水决策 cls: 0.5 # 分类损失降低,避免过拟合到特定盆器纹理 dfl: 1.5 # 分布焦点损失,提升小目标(如2px裂纹)定位鲁棒性训练命令执行前需确认:
# 在train_mode.py中指定GPU设备(默认使用CUDA_VISIBLE_DEVICES=0) python train_mode.py --data datasets/plant_water_status/data.yaml \ --cfg config/yolov8n_plant.yaml \ --weights model/yolov8n.pt \ --epochs 150 \ --batch-size 32 \ --name plant_water_v8_n注意:
--batch-size 32需根据显存调整。GTX1660Ti用户应改为16;若用CPU训练,需在train_mode.py第47行将device='cpu'并注释掉torch.cuda.set_device()。
3. 可视化界面与实时预警系统的工程实现
3.1 UI框架选型:PyQt5 vs Streamlit的取舍依据
项目采用PyQt5而非Streamlit,根本原因在于硬件控制闭环需求:
- PyQt5可直接调用
serial.Serial驱动Arduino水泵控制器(见UI/main.py第213行) - Streamlit的HTTP服务模型无法保证<100ms级IO响应,而阳台灌溉需在检测到
dry_soil后300ms内触发继电器 - PyQt5的
QGraphicsView支持像素级热力图叠加(plots.py中draw_heatmap()函数),可将土壤湿度预测值映射为RGB渐变覆盖在原图上
界面核心组件关系:
graph LR A[VideoCapture] --> B[YOLOv8推理线程] B --> C[DetectionResultProcessor] C --> D[UI主窗口] D --> E[实时曲线图] D --> F[报警弹窗] D --> G[串口控制模块]3.2 实时视频流处理的关键代码段
main.py中视频处理循环(第156–189行)采用双缓冲队列防卡顿:
# 使用queue.Queue实现生产者-消费者模式 frame_queue = queue.Queue(maxsize=3) # 限制内存占用 result_queue = queue.Queue(maxsize=3) def video_capture_thread(): cap = cv2.VideoCapture(0) # 默认USB摄像头 while True: ret, frame = cap.read() if not ret: break # 调整分辨率适配YOLOv8输入(不缩放,裁剪中心区域) h, w = frame.shape[:2] start_x, start_y = (w-1280)//2, (h-720)//2 cropped = frame[start_y:start_y+720, start_x:start_x+1280] if not frame_queue.full(): frame_queue.put(cropped) def inference_thread(): model = YOLO('model/best.pt') while True: if not frame_queue.empty(): frame = frame_queue.get() # 关键:禁用AMP加速(阳台光照变化快,FP16易溢出) results = model.predict(frame, conf=0.3, iou=0.45, half=False) if not result_queue.full(): result_queue.put((frame, results[0])) # 主UI线程中每40ms刷新一次 def update_display(): if not result_queue.empty(): frame, result = result_queue.get() # 绘制检测框+置信度(utils/plots.py中plot_results()) annotated = plot_results(frame, result) # 更新QLabel图像(需转换为QPixmap) pixmap = QPixmap.fromImage(QImage(annotated.data, 1280, 720, 1280*3, QImage.Format_RGB888)) self.video_label.setPixmap(pixmap.scaled(1280, 720, Qt.KeepAspectRatio))3.3 预警逻辑的三层判定机制
系统不依赖单一检测结果,而是构建时空联合判断:
| 判定层级 | 触发条件 | 响应动作 | 代码位置 |
|---|---|---|---|
| 单帧级 | dry_soil置信度>0.85且面积>1500px² | 播放本地提示音(UI/sound/alarm.wav) | my_func.py第88行 |
| 时序级 | 连续5帧检测到wilted_leaf且IoU变化率<0.1 | 启动LED红光闪烁(通过GPIO控制) | five_type_det_service.py第132行 |
| 融合级 | dry_soil检测+土壤温湿度传感器读数<30%+环境温度>28℃ | 自动发送微信消息(需配置config/wechat_config.json) | utils/myutil.py第204行 |
提示:微信推送使用企业微信API,
config/wechat_config.json需填写corp_id,secret,agent_id。测试时可先注释掉send_wechat_alert()调用,避免误触发。
4. 模型部署与性能调优实战指南
4.1 CPU/GPU混合部署方案
项目提供三种部署模式,按硬件资源选择:
| 模式 | 适用场景 | 关键配置 | 推理延迟(1280×720) |
|---|---|---|---|
| GPU模式 | RTX3060及以上 | detect.py中device='cuda:0' | 42ms |
| CPU+OpenVINO | Intel核显/至强CPU | pip install openvino-dev,model/best.xml替代.pt | 118ms |
| 树莓派4B | 嵌入式边缘端 | pip install ultralytics==8.0.191,--half False --dnn True | 320ms |
树莓派部署关键步骤:
# 1. 安装兼容版本(新版YOLOv8不支持ARMv7) pip install ultralytics==8.0.191 # 2. 转换模型(在x86主机执行) yolo export model=model/best.pt format=onnx opset=12 # 3. 树莓派端加载ONNX(detect.py第32行修改) from ultralytics.utils.torch_utils import select_device device = select_device('cpu') # 强制CPU model = YOLO('model/best.onnx', task='detect') # 4. 降低输入分辨率(detect.py第67行) im = cv2.resize(im, (640, 360)) # 分辨率减半,FPS提升2.3倍4.2 混淆矩阵与F1曲线生成原理
train_mode.py训练完成后自动生成runs/train/plant_water_v8_n/results.csv,其中包含每类指标。可视化脚本plots.py中plot_confusion_matrix()函数核心逻辑:
def plot_confusion_matrix(conf_mat, class_names): # conf_mat为numpy数组,shape=(5,5),行=真实类别,列=预测类别 plt.figure(figsize=(8,6)) sns.heatmap(conf_mat, annot=True, fmt='.0f', xticklabels=class_names, yticklabels=class_names, cmap='Blues') plt.title('Confusion Matrix (Normalized)') plt.ylabel('True Label') plt.xlabel('Predicted Label') # 关键:计算每个类别的F1分数并标注在热力图右上角 for i in range(len(class_names)): tp = conf_mat[i, i] fp = conf_mat[:, i].sum() - tp fn = conf_mat[i, :].sum() - tp f1 = 2 * tp / (2 * tp + fp + fn) if (2 * tp + fp + fn) > 0 else 0 plt.text(4.8, i+0.2, f'F1={f1:.2f}', fontsize=10, ha='right')生成的confusion_matrix.png中,dry_soil类F1值通常最高(0.93),而overwatered_soil类因样本少易出现FN,此时需在data/labels/train/中补充该类标注。
4.3 针对阳台场景的3个必改参数
部署后若发现漏检cracked_pot,请立即检查以下三项:
| 参数 | 位置 | 推荐值 | 修改原因 |
|---|---|---|---|
| NMS IoU阈值 | detect.py第92行 | iou=0.3 | 盆沿裂纹常呈细长状,高IoU(0.45)会导致相邻裂纹被合并 |
| 置信度阈值 | detect.py第91行 | conf=0.25 | 干燥土壤反光弱,原始0.3阈值会过滤掉低置信度但真实的裂纹框 |
| 输入尺寸 | detect.py第65行 | imgsz=1280 | 必须与训练时一致,否则C2f模块特征图错位导致定位漂移 |
验证修改效果的命令:
# 用验证集图片测试(不启动UI) python detect.py --source datasets/plant_water_status/images/val/ \ --weights model/best.pt \ --conf 0.25 --iou 0.3 --imgsz 1280 \ --save-txt --save-conf # 检查runs/detect/exp/labels/中.txt文件是否包含更多cracked_pot条目5. 毕设答辩高分技巧:用三屏联动证明工程落地能力
5.1 答辩现场必演的三个技术亮点
第一屏:实时视频流+热力图叠加
运行main.py后,在UI左上角点击「开启热力图」按钮(UI/main.py第302行)。此时画面中土壤区域会显示蓝色到红色渐变,颜色越深代表预测含水率越低。评委可直观看到:当镜头对准干燥土壤时,热力图迅速转为深红(预测值28%),而浇水后30秒内渐变为浅蓝(预测值65%)。这比单纯展示mAP数值更具说服力。
第二屏:指标曲线动态生成
在UI界面点击「查看训练曲线」,自动打开runs/train/plant_water_v8_n/results.csv生成的results.png。重点指向F1曲线拐点(通常在epoch 85–92之间):“此处F1分数达峰值0.892,之后验证集损失开始上升,证明我们及时停止了训练,避免过拟合”。
第三屏:硬件控制闭环演示
准备一个Arduino UNO+继电器模块+小水泵。在UI界面勾选「自动灌溉」后,当检测到dry_soil持续5秒,串口会输出"PUMP_ON"指令(UI/main.py第227行)。用逻辑分析仪捕获TX引脚波形,可清晰看到ASCII码50 55 4D 50 5F 4F 4E(即"PUMP_ON"十六进制),证明软件层与硬件层真正贯通。
5.2 教师最关注的三个答辩问题及应答要点
| 问题 | 应答要点 | 代码锚点 |
|---|---|---|
| “如何解决阳台光照变化导致的误检?” | “我们在utils/augmentations.py中重写了HSV扰动逻辑:明度扰动仅在0.2–0.6区间内随机采样,避免强光下过曝区域被误判为overwatered_soil;同时在loss.py中为overwatered_soil类增加权重0.8,强化模型对该类的判别敏感度” | utils/augmentations.py第112行,loss.py第67行 |
| “数据集只有3k+图片,是否足够?” | “我们采用迁移学习+强数据增强:以yolov8n.pt为基模,冻结前10层,仅微调检测头;并通过autoanchor.py重新计算anchor尺寸,使95%的cracked_pot框匹配度从0.61提升至0.89” | train_mode.py第33行,autoanchor.py第45行 |
| “毕设创新点在哪里?” | “第一,提出‘缺水状态五元组’标注范式,将传统分类问题转化为多目标检测;第二,设计CPU/GPU混合推理架构,树莓派端延迟<350ms;第三,实现微信+硬件双通道预警,比纯软件方案响应快12倍” | README.txt第7行,five_type_det_service.py第189行,utils/myutil.py第204行 |
最后一步:答辩前用python -m pytest tests/test_deployment.py运行集成测试,确保所有模块连通性。该脚本会自动启动摄像头、加载模型、生成10帧检测结果并验证串口指令输出,通过即表示系统达到答辩交付标准。
本文还有配套的精品资源,点击获取