简介面向茶叶种植者、农业科研人员及AI开发者这套基于Python和Shell的茶叶枯萎病检测系统设计源码针对传统人工检测效率低、准确率受经验制约等痛点覆盖图像采集、数据预处理、YOLO病害识别与结果输出等完整流程为茶园病害管理提供自动化技术方案。资源共51个文件以23个Python源代码、16个YAML配置、3个Shell脚本为核心并含Dockerfile、Jupyter Notebook、Markdown说明及License等压缩包仅745KBPython代码主要承担模型定义、训练、检测与API服务YAML配置便于调整数据路径和训练参数Shell脚本可自动下载YOLO-TLB权重、批量处理图像。目前已有272人学习/下载。借助Docker部署文件和Notebook示例使用者能快速跑通检测流程结合完整源码、预训练权重下载脚本及清晰目录结构既可针对不同茶园环境微调模型也可作为农业AI项目二次开发与教学设计参考。1. 茶叶枯萎病不用再靠肉眼硬扛这套 PythonShell 开源方案把检测流水线摊开给你看茶园的枯萎病一旦起来靠老师傅一片片翻叶子看一天看不了几亩地看走眼还得等专家复核。这套源码包把「图像采集、预处理、YOLO 识别、结果输出」整条链拆成了可以直接跑的 Python 脚本和 Shell 自动化文件配合 YOLO-TLB 权重训练完就能对叶片图片做病害定位。它面向的不只是茶叶种植者农研人员可以拿它做病害样本统计Python 开发者则能从中看到一套完整的目标检测工程骨架。下面我把文件结构、训练参数、部署坑位一层层拆开讲。2. 先拆包看结构50 个文件里YOLO-TLB 权重、YAML 配置和 Shell 脚本的分工2.1 源码包骨架从 detect.py 到 YAML 配置到底谁在干活打开压缩包第一眼文件分成了几类Python 源码在根目录和 models、utils 两个子目录里YAML 配置有 16 个Shell 脚本有 3 个外加 Dockerfile、requirements.txt 和 Jupyter Notebook。表面看文件很多真正在检测链路里起决定性作用的是三块。第一块是入口脚本。train.py 负责训练detect.py 负责用训练好的模型跑推理test.py 在验证集上算 mAP。第二块是模型定义models 目录里 yolov5s.yaml、yolov5m.yaml、yolov5l.yaml 分别对应不同深度和宽度的网络结构common.py 里是 C3、SPPF 这些基础模块的实现。第三块是配置层16 个 YAML 文件可以分成数据配置和超参配置coco128.yaml、VisDrone.yaml 这些是数据集描述hyp.scratch.yaml、hyp.finetune.yaml 是训练超参。我把根目录的关键文件整理成一张表方便对照着找文件作用使用时机train.py启动训练、加载数据配置和超参训练阶段detect.py加载权重做推理输出可视化结果推理阶段test.py在验证集上评估 mAP 等指标模型验证download_weights.sh下载 YOLO 预训练权重首次训练前requirements.txt声明 Python 依赖库环境搭建Dockerfile构建容器镜像固定运行环境部署阶段models/yolov5s.yaml定义模型结构训练配置utils/datasets.py数据加载与增强逻辑训练与推理共用这里有个容易误解的地方YAML 文件里写的不是随便填的参数模型配置里的 depth_multiple、width_multiple 直接决定模型参数量。yolov5s 是小模型适合在边缘设备跑yolov5x 是大模型精度上限高但吃显存。茶叶枯萎病检测如果跑在茶园现场的工控机上我一般从 yolov5s 起步先确认检测效果再逐步放宽。2.2 YOLO-TLB 权重为什么枯萎病识别要选目标检测而不是图像分类茶叶枯萎病的典型特征是叶片出现斑块和枯焦区域如果只做图像分类判断「有病/没病」你拿到的只是一个概率不知道病斑在叶片的哪个位置。目标检测会额外输出边界框把病斑在叶片上的具体位置框出来这对于后续统计病害面积、决定喷药区域很有价值。源码包里的 YOLO-TLB weights 目录从命名看 TLB 大概率是 Tea Leaf Blight 的缩写也就是针对茶叶枯萎病微调过的权重。微调的起点通常是 COCO 预训练权重因为 COCO 上有丰富的通用物体特征模型对纹理、边缘的敏感度已经很好再用茶园叶片图片继续训练收敛速度比从头训练快得多。为什么这套系统要把 Shell 脚本拉进来因为训练和检测不是一次性操作。实际使用中每周采集一批新叶片图片清洗、标注、跑训练、验证、再部署是一条重复流水线。Shell 脚本可以把「激活环境→同步数据集→启动训练→拷贝权重」串起来定个 crontab 就能自动跑。这比纯 Python 方案更省心也比纯手动操作更可复现。3. 环境与配置落地requirements.txt、Dockerfile 与 YAML 参数的逐行拆解3.1 依赖安装顺序按 requirements.txt 装别让版本冲突拦路拿到源码第一步不是跑代码而是把依赖环境装对。requirements.txt 里声明了 torch、opencv-python、numpy、matplotlib、pyyaml 等依赖其中 torch 是重头戏。如果你电脑有 NVIDIA 显卡安装前先确认 CUDA 版本再装对应版本的 PyTorch。没有 GPU 也没关系CPU 模式能跑只是训练速度慢。# 建议先创建独立的虚拟环境避免污染系统 Python conda create -n tea_blight python3.8 -y conda activate tea_blight # 安装核心依赖离线环境可改用 pip download 后内网安装 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple为什么强调先建虚拟环境因为 YOLOv5 对 numpy 和 opencv 的版本比较敏感numpy 版本过新可能导致部分 API 报错opencv-python 在无界面服务器上要装 headless 版本才省事。装完跑一句python -c import torch; print(torch.__version__)确认 torch 能正常导入再进入下一步。CPU 训练不是不能用但要把训练脚本里的设备参数指定为 CPU且数据集图片尺寸要适当缩小比如从 640 降到 416。一个几百张图片的小数据集CPU 训练可能要跑几个小时这个心理预期要有。3.2 YAML 配置迁移从 coco128.yaml 到自己的枯萎病数据集这个源码包里带了 16 个 YAML 文件它们分两类一类是数据配置一类是超参配置。数据配置里coco128.yaml 指向 COCO 数据集的子集VisDrone.yaml 是无人机视角数据集SKU-110K.yaml 是密集商品检测数据集。这些文件的存在是用来做迁移学习或者对比实验的。用这些现成配置跑通流程没问题但要真正检测茶叶枯萎病需要建自己的数据集并写一个 tea_blight.yaml。格式和 coco128.yaml 保持一致# tea_blight.yaml train: dataset/tea_blight/train val: dataset/tea_blight/val nc: 1 # 类别数量这里只检测枯萎病 names: [blight] # 类别名称关键参数是nc和names这两个必须和标注文件的类别索引严格对应。如果标注软件导出的是 0、1、2 多类别你的 names 列表顺序就要和标注索引一致否则训练时类别会错位推理出来框是对的但标签全乱。超参配置层的文件是 hyp.scratch.yaml、hyp.finetune.yaml 这类。hyp.finetune.yaml 适合在已有权重上做微调学习率设得较低hyp.scratch.yaml 是从零训练时用学习率相对较高。如果你的训练集只有几百到一两千张图片直接用 hyp.finetune.yaml 配合预训练权重比从头训练稳定得多。3.3 两条自动化路径download_weights.sh 权重下载与 Dockerfile 容器化先看权重下载脚本。第一次跑训练之前必须有预训练权重否则 train.py 会从随机初始化开始。download_weights.sh 做的事情本质上是把几个版本的 YOLO 权重从 release 地址拉下来放到 weights 目录#!/bin/bash # 下载 YOLOv5 预训练权重脚本 mkdir -p weights cd weights # -c 支持断点续传下载中断不用重新开始 wget -c https://github.com/ultralytics/yolov5/releases/download/v6.0/yolov5s.pt这个脚本可以改的地方是权重版本号如果后续 release 出了更稳定的版本把链接替换掉即可。网络环境不稳定的场景建议wget -c配合镜像加速地址或者先下载到本地再拷贝进服务器。Dockerfile 解决的是环境一致性问题。茶叶检测系统如果要在不同机器上部署手动装依赖很容易出现「这台能跑、那台跑不起来」的情况。Dockerfile 的做法是把 Python 版本、CUDA 依赖、pip 包全部固化到镜像层里FROM python:3.8-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [python, detect.py, --weights, weights/yolov5s.pt, --source, data/images]构建镜像时用docker build -t tea-blight-detector .启动容器时挂载数据目录-v $(pwd)/data:/app/data。需要注意 Docker 容器里的 GPU 访问要用--gpus all参数启动容器否则训练阶段检测不到 CUDA。4. 训练与检测全流程实战train.py 参数调优、detect.py 推理与 Shell 自动化4.1 训练前准备数据目录、标注格式与图片尺寸检查训练 YOLO 之前数据集格式必须整理成 YOLO 要求的布局。标注文件是 TXT 文本每一行表示一个目标框格式是class x_center y_center width height其中中心坐标和宽高都是相对图片尺寸归一化到 0~1 的数值。很多第一次接触的人在这一步翻车拿 VOC 的 XML 标注直接丢进去训练必然报错。需要把数据集整理成下面这种目录结构dataset/tea_blight/ ├── train/ │ ├── images/ │ │ ├── img001.jpg │ │ └── img002.jpg │ └── labels/ │ ├── img001.txt │ └── img002.txt └── val/ ├── images/ └── labels/图片和标签的同名对应关系不能乱train 目录下有多少张图片labels 里就必须有对应数量的 TXT 文件。哪怕某张图没有目标也要放一个空的 TXT 文件占位否则训练脚本会提示找不到标注。检查标注文件是否合法可以写一个小脚本遍历所有 TXT看看有没有坐标越界的行。这一步我每次都跑因为标注工具偶尔会导出坏数据import os label_dir dataset/tea_blight/train/labels for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f), r) as fp: for line in fp: parts line.strip().split() if len(parts) ! 5: print(f{f} 格式异常: {line}) x, y, w, h map(float, parts[1:]) if x 0 or y 0 or w 0 or h 0 or x w / 2 1 or y h / 2 1: print(f{f} 坐标越界: {line})这段脚本遍历所有标注文件检查每行的字段数量和归一化坐标是否在合法范围内。写脚本的意义在于标注工具导出的数据偶尔会出现坐标截断或交错不提前排查训练时 loss 会莫名其妙地跳。4.2 train.py 启动训练关键参数逐个过一遍训练命令看起来不长但每个参数都值得推敲。下面这条命令是我在两百多张茶叶叶片数据上跑过的配置python train.py \ --data tea_blight.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0 \ --hyp hyp.finetune.yaml \ --patience 20逐项说明--data指向数据配置文件--weights是预训练权重路径--img 640是训练图片缩放尺寸茶叶病斑通常较小640 起步比较稳显存不够再降到 512 或 416--batch 16是批次大小显存不足就降为 8 或 4--epochs 100是训练轮数小数据集 100 轮足够了--device 0指定 GPU 序号CPU 跑就写--device cpu--hyp选微调超参文件--patience 20表示 20 轮指标没有提升就提前终止训练省时间。训练过程看什么重点关注终端输出的 P、R、mAP0.5 这三列。茶叶枯萎病场景里如果 mAP0.5 在 0.85 以上基本可以满足日常筛查需求。如果 mAP 一直上不去先看是不是数据量太少或者标注框不够准而不是盲目加训练轮次。训练结束后best.pt 和 last.pt 会保存到 runs/train/exp 目录下。部署时只用 best.ptlast.pt 是备份用的不要搞混。4.3 detect.py 推理验证从单图到批量目录训练完权重用 detect.py 跑推理。最常见的用法是对一张图片或者一个图片目录批量检测python detect.py \ --weights runs/train/exp/best.pt \ --source data/test_images/ \ --img 640 \ --conf 0.25 \ --save-txt \ --project runs/detect--source可以是单张图片路径、目录、视频文件或摄像头编号--conf 0.25是置信度阈值低于这个值的预测框会被丢弃。枯萎病检测建议把阈值放在 0.25~0.3 之间太低会出现一堆误检框太高会漏掉边缘位置的低置信度病斑。输出结果会保存在 runs/detect/exp 下图片上会画好边界框和置信度。--save-txt会额外输出 YOLO 格式的 TXT 结果方便后续用脚本统计检测数量。第一次跑通后可以拿几张不同光照条件的茶园照片试试看看模型在逆光、阴影下的表现。4.4 用 Shell 串起完整流水线训练、评估、部署一步到位单独跑 train.py 和 detect.py 不难难在每次有新增数据都要重复执行一套操作。把流程写成 Shell 脚本可以直接挂到 crontab 里做周期训练。下面是一个典型的数据更新后自动重训脚本#!/bin/bash # 茶叶枯萎病模型自动重训脚本 set -e DATA_DIR/data/tea_blight LOG_DIR/data/logs DATE$(date %Y%m%d) # 1. 同步最新标注数据按需替换为 scp/rsync 的远端地址 rsync -avz farmercollector:/data/tea_images/ ${DATA_DIR}/train/images/ # 2. 激活 conda 环境并启动训练 source /opt/conda/etc/profile.d/conda.sh conda activate tea_blight python train.py \ --data tea_blight.yaml \ --weights weights/yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 50 \ --device 0 \ --project runs/train_$DATE # 3. 训练完成后把 best.pt 拷贝到部署目录 cp runs/train_${DATE}/exp*/best.pt /opt/tea_detector/weights/best.pt echo Training done at $(date) ${LOG_DIR}/retrain.log脚本核心是set -e任何一步命令执行失败脚本立刻退出避免训练失败后误把旧权重当新权重部署。定时任务加一行0 2 * * 1 /opt/tea_detector/retrain.sh每周一凌晨自动重新训练模型的时效性就有了保障。5. 避坑排查枯萎病数据集训练 YOLO 的五个翻车现场与修复方案5.1 现象一训练开始后 loss 曲线不降反升训练日志里可以看到 loss 一直在高位震荡甚至逐步走高。最常见的原因是超参数里写了过高的学习率微调时用了 hyp.scratch.yaml 这种从零训练的参数文件。解决方法是换用 hyp.finetune.yaml并把关键学习率参数调低到 0.001 量级在 YAML 里检查lr0和lrf的数值。另一个容易被忽略的原因是标注框的类别索引和 names 列表对应错位模型学到的梯度是矛盾的loss 自然很难降。5.2 现象二检测结果全是边界框但没有类别名和置信度模型在图片上框出了很多区域但框上不显示类别名或置信度。这个现象大概率是训练时nc配置成了 1但模型文件里的输出通道没有正确重建。检查 tea_blight.yaml 里的nc是否和标注文件里的类别编号一致。如果用的是--weights yolov5s.pt的 COCO 权重微调模型会把 COCO 的 80 类输出层替换成目标类别数替换失败或没有重新训练到收敛就会出现这种情况。处理办法是删掉 runs 目录下的旧训练缓存重新用--weights yolov5s.pt从预训练权重开始训。5.3 现象三标注坐标明明在 0~1 之间但训练报坐标无效标注坐标看起来是归一化的但训练时提示 bbox 坐标有 0 或负数。常见原因是图片被标注工具旋转或裁剪后导出坐标没有重新计算部分目标框中心点落到了图片范围外。这种情况用 4.1 节那个校验脚本能在训练前直接定位到具体文件。修复方式是回标注工具里重新导出或写 Python 把越界坐标裁剪到边界上。不处理硬着头皮训模型会学到错误的边框先验。5.4 现象四Docker 启动后检测不到 GPU用 Docker 部署训练环境nvidia-smi在容器里看不到显卡。原因是 Docker 默认不把宿主的 GPU 设备暴露进容器。启动容器时加上--gpus all参数并确保宿主机安装了 NVIDIA Container Toolkit。只加--gpus不加 runtime 配置也会有问题检查 /etc/docker/daemon.json 中的 nvidia runtime 是否配置到位。这个坑我在第一次容器化部署时踩过后来固定用docker run --gpus all --ipchost的组合再没出过问题。5.5 现象五叶片图片分辨率高但病斑小模型漏检严重茶园实拍照片经常是 3000×4000 的大图病斑只占几十个像素缩放到 640 后病斑特征几乎被抹掉。这时有两个方向一是把--img提高到 1280 训练代价是显存占用翻倍二是用滑动窗口切图把一张大图切成 640 尺寸的小块再送进模型。切图时要注意相邻窗口之间保留 10%~20% 的重叠避免病斑从中间被切开导致漏检。我处理茶园巡检数据时用的是后者速度快且不用换大显存显卡。6. 把模型推到真实验收环境迁移学习微调、指标验证与轻量化导出模型训练完、基础推理能跑通只是第一步。真正拿到茶园环境去验收还有三个动作要做。第一个动作是二次微调。第一次训练用的数据集可能来自实验室采集到了目标茶园光线、叶面湿度、背景都不一样直接用原权重检测效果会打折扣。我在换新茶园时通常收集三百到五百张现场图片标注后在现有 best.pt 基础上继续微调。命令稍微改动一下权重路径指向上一次训练的 best.ptepochs 降到 30 到 50数据配置换成新茶园的标注python train.py --data tea_blight_newcrop.yaml --weights runs/train/exp/best.pt --img 640 --batch 16 --epochs 40 --hyp hyp.finetune.yaml注意这里要保留--hyp hyp.finetune.yaml新数据量不大学习率太高会把预训练好的特征冲掉。第二个动作是跑测试集算指标。test.py 会在验证集上输出 mAP0.5、mAP0.5:0.95、precision、recall 四类指标。茶叶枯萎病这种场景我重点关注 recall 而不是死磕 mAP因为漏掉病斑的代价比误检大。recall 低了就调低置信度阈值或者补充困难样本数据。第三个动作是导出轻量格式。如果部署端是嵌入式设备或者手机端可以用 export.py 把 PyTorch 权重转成 TorchScript 或 ONNXpython export.py --weights runs/train/exp/best.pt --include onnx --img 640ONNX 格式可以接 OpenVINO 或 TensorRT 做推理加速在工控机上能把单张推理时间压到几十毫秒。导出后建议用同一组验证图片对比推理结果确认转换前后框的位置和置信度没有明显差异。这套源码包的价值在于把「采集→训练→检测→部署」的闭环都摊在了桌面上不用再满世界找零散的代码片段拼接。踩过的坑我都写在前面了尤其那个标注坐标越界的问题几乎每个初次上手的人都会撞上。从那以后我每次拿到新数据集第一件事就是跑标注校验脚本确认没问题再进训练流程这个习惯帮我省下了大量无效训练时间。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?