ARTICLE DETAIL

资讯详情

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

基于Python与Shell的茶叶枯萎病检测系统:图像识别与自动化调度实践

基于Python与Shell的茶叶枯萎病检测系统:图像识别与自动化调度实践 简介这份资源是面向茶叶种植者、农业科研人员及图像识别开发者的茶叶枯萎病检测系统设计源码基于Python与Shell构建用于解决传统人工识别耗时、准确率依赖经验的问题。压缩包共51个文件、约745KB以23个Python源码文件为核心承担数据处理与算法运行16个YAML配置用于灵活调整训练与检测参数另有Shell脚本实现自动化操作、Dockerfile支持容器化部署、Jupyter Notebook记录实验过程并配有TXT、Markdown及LICENSE等说明文件。系统覆盖图像采集、预处理到病害识别的完整流程结合YOLO系列算法对茶叶叶片病害进行快速判断与分类目录中可见模型配置、训练与检测脚本、工具模块等结构。目前已有272人学习下载适合希望快速搭建农业病害检测原型、研究YOLO落地应用或进行二次开发的读者参考与改进。1. 茶叶枯萎病检测系统从一片叶子的颜色说起茶园里最怕的不是虫是那种昨天看着还行、今天整片发黄的枯萎病。传统做法靠人眼巡园一个熟练工一天走下来也就覆盖几十亩等发现成片枯黄往往已经错过最佳处置窗口。基于 Python 和 Shell 的茶叶枯萎病检测系统要解决的就是把这件事从人眼扫变成机器筛用摄像头或手机拍下叶片图像Python 侧跑图像处理和分类模型Shell 侧负责批量调度、定时采集、日志归档和结果推送。它适合两类人——一类是懂点 Python、想给茶园做数字化改造的农业技术员另一类是拿它当课程设计或练手项目的学生因为这套东西麻雀虽小图像预处理、模型推理、脚本自动化、结果可视化全都能摸一遍。源码本身不复杂难的是把能跑变成在茶园里真能用。2. 系统拆解Python 管识别Shell 管调度2.1 为什么不是纯 Python 或纯 Shell很多人第一反应是检测系统嘛Python 一把梭。真到落地会发现Python 适合做单张图像的推理和模型加载但茶园场景里更常见的是每隔半小时扫一遍指定目录把昨天的结果打包归档磁盘快满了自动清理旧图这类重复性任务。这些用 Shell 写几行就搞定而且 cron 直接挂上去不用额外起进程守护。所以合理的分工是Python 负责看懂一张图Shell 负责让这件事按时、批量、可追溯地发生。两者通过文件系统和退出码通信简单、可调试、不引入额外依赖。2.2 目录结构与数据流一个能跑起来的版本目录大致长这样tea_blight/ ├── data/ │ ├── raw/ # 原始采集图 │ ├── processed/ # 预处理后 │ └── result/ # 检测结果 csv ├── models/ │ └── blight_v1.h5 ├── scripts/ │ ├── preprocess.py │ ├── predict.py │ └── run_batch.sh └── logs/数据流是Shell 定时把raw/里的新图交给preprocess.py预处理完写进processed/再调predict.py输出每张图的病害概率到result/最后 Shell 把结果汇总、清理过期文件。每一步都落盘出问题能回看中间产物这是排查玄学问题的后悔药。2.3 图像预处理别小看 resize 和归一化茶叶枯萎病的典型特征是叶缘焦枯、叶面出现不规则褐斑。模型能不能学到这些很大程度取决于预处理是否一致。下面是最小可用的预处理脚本import cv2 import numpy as np import os import sys def preprocess(src_dir, dst_dir, size(224, 224)): os.makedirs(dst_dir, exist_okTrue) for fname in os.listdir(src_dir): if not fname.lower().endswith((.jpg, .png, .jpeg)): continue path os.path.join(src_dir, fname) img cv2.imread(path) if img is None: print(f[WARN] 读取失败: {path}, filesys.stderr) continue # 统一尺寸保持长宽比会引入黑边这里直接拉伸 img cv2.resize(img, size, interpolationcv2.INTER_AREA) # 转 RGBOpenCV 默认 BGR img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 归一化到 0-1 img img.astype(np.float32) / 255.0 out os.path.join(dst_dir, fname) # 存成 npy 避免二次解码损失 np.save(out.replace(os.path.splitext(fname)[1], .npy), img) print(f[OK] 预处理完成输出到 {dst_dir}) if __name__ __main__: preprocess(sys.argv[1], sys.argv[2])逻辑说明遍历源目录过滤非图像文件统一 resize 到 224×224这是多数轻量分类网络的输入尺寸转 RGB 并归一化。参数上size可以按你用的模型改比如 MobileNetV2 常用 224EfficientNet-B0 也是 224别随意改成 256 又忘了改模型输入。存成.npy是为了后续批量读取快也避免 JPEG 反复压缩带来的画质漂移。注意cv2.imread遇到损坏文件返回 None这里直接跳过并打警告不让整个批次挂掉。2.4 推理脚本加载模型与批量预测推理部分用 Keras 或 PyTorch 都行这里给 Keras 版本因为.h5单文件好分发import numpy as np import os import csv import sys from tensorflow.keras.models import load_model MODEL_PATH models/blight_v1.h5 THRESHOLD 0.5 def predict_batch(npy_dir, out_csv): model load_model(MODEL_PATH) rows [] for fname in os.listdir(npy_dir): if not fname.endswith(.npy): continue arr np.load(os.path.join(npy_dir, fname)) arr np.expand_dims(arr, axis0) # 加 batch 维 prob model.predict(arr, verbose0)[0][0] label blight if prob THRESHOLD else healthy rows.append([fname, float(prob), label]) with open(out_csv, w, newline) as f: writer csv.writer(f) writer.writerow([file, prob, label]) writer.writerows(rows) print(f[OK] 写入 {out_csv}共 {len(rows)} 条) if __name__ __main__: predict_batch(sys.argv[1], sys.argv[2])逻辑说明逐张加载.npy扩维成(1, 224, 224, 3)送入模型取输出概率。THRESHOLD是判定阈值默认 0.5实际部署时建议根据误报代价调整——茶园里漏报比误报更致命可以降到 0.35 左右宁可多报几张让人复核。输出 CSV 方便 Shell 后续用awk或grep做统计。注意model.predict在批量大时慢可以改成model(arr_batch)直接调用但要注意显存。2.5 Shell 调度定时、批量、归档一条龙调度脚本是整套系统的节拍器#!/bin/bash set -euo pipefail BASE/home/tea/tea_blight RAW$BASE/data/raw PROC$BASE/data/processed RESULT$BASE/data/result LOG$BASE/logs/run_$(date %Y%m%d_%H%M).log # 1. 预处理 python3 $BASE/scripts/preprocess.py $RAW $PROC $LOG 21 # 2. 推理 python3 $BASE/scripts/predict.py $PROC $RESULT/result_$(date %Y%m%d_%H%M).csv $LOG 21 # 3. 清理 7 天前的原始图避免磁盘爆 find $RAW -type f -mtime 7 -delete # 4. 归档旧结果 find $RESULT -name *.csv -mtime 30 -exec gzip {} \; echo [DONE] $(date) $LOG逻辑说明set -euo pipefail让脚本遇到错误立即退出避免半途失败还继续跑。每一步输出重定向到带时间戳的日志方便回溯。find -mtime 7 -delete清理原始图保留 7 天足够人工复核结果 CSV 超过 30 天自动 gzip省空间又不丢数据。挂到 cron 上比如每 30 分钟跑一次*/30 * * * * /home/tea/tea_blight/scripts/run_batch.sh参数上-mtime的天数按你磁盘大小调1TB 盘存 224×224 的图一天几千张也就几百 MB7 天很安全。注意find -delete不可逆第一次跑之前先用-print确认匹配范围。3. 模型选型与训练别拿 ImageNet 的脑子直接套茶叶3.1 轻量网络优先MobileNetV2 是稳妥起点茶园场景往往没有 GPU 服务器推理可能跑在树莓派或旧笔记本上。MobileNetV2 参数量约 3.4M输入 224×224在 CPU 上单张推理几十毫秒精度对二分类健康/枯萎足够。如果数据量上千张也可以试 EfficientNet-B0但别一上来就 ResNet50那个在 CPU 上跑批量会让人等到怀疑人生。迁移学习是标配加载 ImageNet 预训练权重冻结前面层只训练最后几层全连接。3.2 数据增强枯萎病样本少得会造真实茶园里健康叶多、病叶少类别不平衡很常见。除了在 loss 里加class_weight增强也要针对病害特征来随机旋转、水平翻转、亮度微调、对比度扰动。别用太激进的裁剪因为病斑常在叶缘裁掉就没了。下面是一个增强配置片段from tensorflow.keras.preprocessing.image import ImageDataGenerator train_gen ImageDataGenerator( rotation_range25, width_shift_range0.1, height_shift_range0.1, brightness_range[0.8, 1.2], horizontal_flipTrue, fill_modenearest )参数说明rotation_range25允许 ±25 度旋转模拟拍摄角度变化brightness_range模拟阴天/晴天光照差异fill_modenearest避免旋转后出现黑边干扰。注意不要加vertical_flip叶子上下翻转不符合自然生长姿态反而引入噪声。3.3 训练与验证的划分坑划分训练集和验证集时千万别用随机划分。同一片叶子拍的多张图如果被分到两边验证精度会虚高。正确做法是按植株或拍摄批次划分同一株的图要么全在训练集要么全在验证集。这个细节很多课程设计源码里都忽略了导致模型在真实场景一塌糊涂。验证集比例 15%20% 即可留一部分做最终测试。4. 避坑与排查那些让系统看起来能跑的陷阱4.1 现象脚本手动跑正常cron 一挂就失败原因cron 的环境变量和交互式 shell 不同python3可能不在 PATH 里或者工作目录不是脚本所在目录。解决在脚本开头显式设置PATH和cd到项目根目录或者所有路径都用绝对路径。我一般会在 crontab 里写SHELL/bin/bash和PATH/usr/local/bin:/usr/bin:/bin。4.2 现象预处理后的图颜色发蓝原因OpenCV 读进来是 BGR忘了转 RGB 就送模型而模型是在 RGB 上训练的。解决在预处理里固定加cv2.cvtColor(img, cv2.COLOR_BGR2RGB)并且写个单元测试拿一张已知颜色的图验证通道顺序。4.3 现象推理结果全是同一类原因归一化不一致。训练时用了/255.0推理时忘了或者反过来。模型对输入尺度很敏感差一个量级输出就饱和。解决把预处理参数写进配置文件训练和推理共用同一份别两边各写各的。4.4 现象磁盘几天就满原因原始图没清理或者日志无限增长。解决find -mtime定期清理日志用logrotate或脚本里按大小截断。另外.npy文件比 JPEG 大好几倍预处理完如果不再需要可以删掉只留结果 CSV。4.5 现象Shell 脚本里cd失败但脚本继续跑原因没加set -ecd失败后后续命令在错误目录执行把文件写到奇怪的地方。解决开头set -euo pipefail并且cd后面跟|| exit 1。这是 shell 脚本入门里最值得养成的习惯。5. 进阶技巧把检测结果变成茶园能用的决策系统跑通只是第一步真正有价值的是让结果可行动。我习惯在结果 CSV 后面再加一步 Shell 统计用awk算出当天病害比例超过阈值就触发提醒awk -F, NR1 $3blight{c} END{print c/NR} result.csv这个比例可以写进日报也可以配合mail或企业微信机器人推送。另一个技巧是给结果图叠加检测框和概率用 Python 的cv2.putText几行就能画出来农技员一看就懂比纯数字直观得多。最后模型不是一劳永逸的建议每季度拿新采集的图做一次增量训练把误报和漏报的样本加进去精度会慢慢爬上来。我自己踩过的最大坑是训练完就不管了结果半年后雨季病害特征变化模型开始飘后来固定了每月复核一次结果 CSV 的习惯才稳下来。希望帮到你。本文还有配套的精品资源点击获取
返回列表