ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

深度学习实战:Python+YOLOv8农作物叶部病害检测系统

2026/8/26 11:31:26 拓冰建站 浏览量
深度学习实战:Python+YOLOv8农作物叶部病害检测系统 简介深度学习是人工智能的核心技术通过卷积神经网络自动提取图像特征无需人工设计特征即可完成高精度识别。目标检测模型YOLOv8凭借出色的精度与速度平衡成为农业视觉应用的优选方案。在农作物叶部病害场景中传统图像方法受光照、背景干扰严重而基于深度学习的检测系统能有效定位病斑并输出置信度辅助农户精准施药。本文从数据集构建、标注清洗、模型训练到Web与移动端部署完整梳理一套可落地的农作物病害检测系统实战经验涉及开源数据集使用、YOLOv8训练调优、ONNX导出等关键环节为农业信息化与计算机视觉入门者提供可复用的技术路径。1. 项目背景与核心价值先说个真实的场景我家去年在郊外弄了个小菜园种了几垄番茄和黄瓜夏天一到叶片上开始出现黄斑、霉层肉眼看着不对劲但说不准是早疫病还是晚疫病等确诊清楚了半垄苗已经救不回来。农业植保领域的痛点就在这里——病害识别主要靠人靠植保专家的经验可专家不可能天天蹲在田里农户自己又很难准确判断早期症状。这也是我决定做这个项目的直接原因用深度学习Python搭建一套农作物叶部病害检测系统输入一张叶片照片几秒钟就能告诉你这是什么病、置信度有多高甚至直接在原图上框出病斑区域。这个项目不是停留在实验室demo的层面而是把数据集准备、模型训练、GUI推理、移动端迁移动能全部跑通了一遍。如果你正在学深度学习、想做计算机视觉方向的实战项目、或者本身就是农业信息化相关从业者这篇内容能帮你省掉一大圈弯路。从数据集怎么找、怎么清洗到YOLOv8怎么训练自己的数据再到把模型封装成可用的检测接口我踩过的坑你都用不着再踩一遍。核心关键词就四个深度学习、Python、源码、数据集下面全部展开讲偏实操不堆理论。2. 技术选型与整体方案设计2.1 为什么一定要用卷积神经网络来做病害检测传统图像处理识别病害一般走的是颜色阈值分割、纹理特征提取这条路。比如某种叶斑病有褐色斑点就设定HSV颜色空间的阈值范围把褐色区域提取出来再算斑点面积、密集度来判断病害等级。这套办法在单一背景下效果还行但一到田间自然场景就崩——光照变化、土壤反光、叶片重叠、虫咬损伤都会让颜色特征失效。卷积神经网络(CNN)天然适合这类任务因为它不需要人工设计特征网络自己会从大量标注样本中学习到病害的纹理、形状、颜色组合特征。更关键的是现代目标检测模型比如YOLO系列在识别是什么的同时还能定位在哪里这是传统方法很难做到的。病害检测不光是诊断有没有病还得告诉用户病斑分布在哪、面积多大这对后续精准施药非常重要。总结一下选型理由就三条第一田间环境复杂度高CNN的鲁棒性强于手工特征第二检测框输出比单纯分类更有实用价值第三当前生态最成熟PythonYOLOv8可以用相对较少的代码跑出一个不错的基线效果。2.2 YOLOv8为什么是这个项目的最优解我在选型阶段其实对比过几个主流模型包括Faster R-CNN、SSD、EfficientDet还有YOLOv5和v8。直接说结论YOLOv8是当前性价比最高、最适合农业场景快速落地的方案。Faster R-CNN精度很高两阶段检测器对小目标更友好但推理速度慢部署到Jetson Nano这类边缘设备上很吃力每秒只能跑几帧SSD速度快但小目标检测能力弱叶片上的早期病斑往往很小用SSD容易漏检YOLOv5是个成熟选择但v8在neck部分去掉了Anchor-Based机制改成Anchor-Free减少了大量调参工作同时在COCO上的mAP有小幅提升。我用一张表给各模型的实际表现做个直观对比这是我用同一份玉米叶病害数据集的实测结果训练环境是单张RTX 3060模型输入尺寸mAP0.5推理速度(FPS, GPU)显存占用结论Faster R-CNN(ResNet50)640×6400.78288.6GB精度高但太慢SSD(ResNet50)640×6400.694324.2GB小目标漏检严重YOLOv5s640×6400.813452.1GB稳定但需调AnchorYOLOv8n640×6400.824621.8GB轻量且部署方便YOLOv8s640×6400.851483.4GB均衡之选YOLOv8s最终成为我的首选在检测精度和速度之间找到了平衡点。实际部署到树莓派或者手机端的时候再蒸馏一个nano版本或直接导出为NCNN/TensorRT格式一整套迁移链路也顺畅。2.3 系统整体架构与工作流程这套系统的完整流程可以拆成三个阶段阶段一数据集构建。收集公开数据集、自采补拍、图像清洗、病害类别整理、标注、数据增强、划分训练/验证/测试集。这个阶段占掉整个项目70%的时间也是最决定模型上限的一步。阶段二模型训练。配置YOLOv8训练环境选择合适的基础模型权重设置训练参数启动训练分析训练曲线迭代调优最终得到一组满足精度要求的模型权重文件。阶段三推理与应用封装。写Python推理脚本加载模型对单张图片、本地视频、摄像头实时流做检测再用Flask或Gradio封装一个Web接口让不懂技术的人也能上传图片直接看结果最后可以导出为ONNX或者TFLite部署到移动端。整体的模块依赖关系也很清晰dataset模块负责数据加载与预处理training模块负责模型训练与验证inference模块负责实际检测webui模块负责对外展示。代码组织结构如下crop-disease-detection/ ├── configs/ # 训练与推理参数配置 │ ├── data.yaml # 数据集路径与类别配置 │ └── train_config.yaml # 超参数配置 ├── datasets/ # 数据集存放路径 │ ├── images/ │ │ ├── train/ │ │ └── val/ │ └── labels/ │ ├── train/ │ └── val/ ├── scripts/ │ ├── split_dataset.py # 数据集划分脚本 │ ├── train.py # 训练入口 │ ├── predict.py # 单张/批处理推理脚本 │ └── export_onnx.py # 模型导出脚本 ├── webui/ │ ├── app.py # Flask接口 │ └── templates/ # HTML模板 └── runs/ # 训练输出目录 ├── train/ # 权重与训练曲线 └── detect/ # 检测结果3. 数据集构建模型效果的上限在这里决定3.1 数据集来源公开数据、自采数据如何选配做农业病害检测数据集不像通用目标检测那样容易攒我主要走了三条渠道公开数据集方面最常用的是PlantVillage这是农业病害领域引用量最高的公开数据集包含14种作物、38个病害类别总共5万多张叶片图像。需要注意的是PlantVillage的图像绝大多数是单叶、纯色背景的实验室拍摄环境和田间真实场景差异巨大直接用PlantVillage训练出的模型放到田里测精度会明显下降。Kaggle上还可以找到许多细分病害数据集比如玉米叶病害玉米锈病、灰叶斑、北方叶枯病、番茄叶病害早疫、晚疫、叶霉病、黄化曲叶病等。找数据集的时候注意甄别图片质量有些用户上传的数据集标签错得离谱需要自己花时间清洗。自采数据是不可缺少的补充。我在野外拍了大概800多张叶片照片包括不同角度、不同光照、不同生育期的叶片用手机拍完就记录下病害类型后面逐一清理、筛选。如果你的项目要真正落地自采数据的占比最好不要低于30%这一部分数据决定了模型在你目标场景下的真实泛化能力。3.2 标注规范目标检测数据集的格式全解析YOLO系列使用txt格式的标注文件每个图像对应一个同名的txt文件每一行代表一个目标实例格式如下class_id center_x center_y width height需要注意坐标不是像素值而是归一化后的相对坐标范围在0到1之间。比如一张640×480的图片某个病斑中心点像素坐标为(320, 240)宽为160高为120那么对应txt中的内容是0 0.500000 0.500000 0.250000 0.250000因为320/6400.5240/4800.5160/6400.25120/4800.25。这个归一化的好处是无论训练时输入图片被缩放到多大标注信息都不会错位。标注工具我推荐用LabelImg上手简单支持YOLO格式直接导出但功能偏基础。如果你需要自动打标、半自动辅助标注推荐用X-AnyLabeling它内置了许多预训练模型可以先用模型粗标一遍人工再修正效率能提升好几倍。我这800多张图用半自动标注方式两天就完成了纯手工的话至少要一周。3.3 数据清洗与质量排查的独家经验很多人拿到公开数据集下载完直接用我强烈不建议。清洗阶段有几个关键动作第一查看每张图片的标注是否有越界问题。YOLO格式要求中心点坐标和宽高都在0-1之间但有些数据集是从VOC格式转换过来的转换过程可能出现像素坐标忘记归一化的情况。我写了一个快速校验脚本import os def check_label_files(label_dir): error_files [] for filename in os.listdir(label_dir): if not filename.endswith(.txt): continue filepath os.path.join(label_dir, filename) with open(filepath, r) as f: lines f.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: error_files.append((filename, 字段数量错误)) break try: values [float(x) for x in parts[1:]] except ValueError: error_files.append((filename, 数值格式错误)) break if any(v 0 or v 1 for v in values): error_files.append((filename, 数值越界)) break return error_files if __name__ __main__: errors check_label_files(datasets/labels/val) for err in errors: print(f文件 {err[0]} 的问题: {err[1]})第二检查标签与图片内容是否匹配。这个只能靠抽检我个人习惯是每50张图抽1张用LabelImg打开快速扫一眼确认框的位置和类别都对得上。公开数据集里偶尔会有反例比如玉米锈病的图里标着灰叶斑这种脏数据对模型训练的误导非常大。第三删除模糊、过暗、过曝的图片。这些图即使是人眼都看不清模型更学不到有效特征留在数据集里只会增加训练噪声。我用的筛选方式是写一个脚本统一计算每张图的Laplacian方差低于阈值(比如80)的判为模糊图再人工确认后删除。3.4 数据增强小数据集起死回生的关键手段农业病害数据集的规模通常不大除非你花大力气自采否则单个类别能凑到500-1000张就算不错了。为了让模型获得更好的泛化能力数据增强是必须做的。我在训练中使用了两种增强层一种是YOLOv8自带的在线增强包括随机平移、随机缩放、水平翻转、色彩空间抖动这些在训练过程中实时进行不会增加磁盘占用推荐默认开启。另一种是离线增强在训练前对少数类样本做扩充。常用的离线增强手段有旋转以90度为单位旋转对叶片病害形态不敏感适合所有类别亮度调整模拟清晨、正午、傍晚不同光照条件高斯模糊模拟相机失焦或运动模糊Mosaic增强把4张图拼成一张YOLOv8的mosaic参数默认开启对提升小目标检测能力很有帮助我实际操作时发现用在线增强适度离线增强的组合后模型的mAP0.5从0.781提升到了0.851涨幅接近9个百分点非常可观。但注意不要增强过头——把训练图片扭曲得和真实场景严重不符反而会导致模型学习到错误的特征。4. 环境搭建与模型训练全流程4.1 半小时搞定深度学习GPU环境训练深度学习模型显卡至关重要。我自己用的是RTX 3060 12GB显存版本训练YOLOv8s级别的模型绰绰有余如果是RTX 4060或更高端的卡性价比还会更好。如果没有独立显卡也不是不能跑YOLOv8n在CPU上训练一次大概需要2-3小时纯粹做实验熟悉流程还是可以接受的但做正式训练强烈建议用GPU。环境安装的完整步骤也写一下省去你到处翻文档的功夫。建议直接装Anaconda用conda创建独立环境避免和系统的Python版本冲突conda create -n yolo python3.9 conda activate yolo pip install torch2.1.0 torchvision0.16.0 --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics pip install labelimg注意PyTorch的安装命令要根据你的CUDA版本选择对应的index-url装上之后可以用Python验证一下GPU是否可用python -c import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))一切正常的话输出会显示True和你的显卡型号。如果显示False说明CUDA版本和PyTorch不匹配大概率是安装命令选错了。在Linux上跑深度学习还有个小坑Ubuntu22、Ubuntu24等新系统会自带显卡驱动但安装完驱动后重启黑屏、挂载不上NVIDIA模块等问题很常见。我实测下来最快的解决方式是先用ubuntu-drivers devices查看推荐驱动版本然后安装如果系统主动更新了内核导致驱动失效就用dkms重建模块而不是反复重装驱动。4.2 数据集目录与配置文件编写YOLOv8的训练集成像结构是有固定约定的图片和标注分别放在images和labels目录下而且训练集和验证集分开放置。目录结构整理好之后还需要写一个data.yaml配置文件告诉训练器数据集在哪里、类别有几类。我的数据集是从PlantVillage和自采数据混合而来类别选了我最关注的4种番茄叶部病害data.yaml内容如下train: datasets/images/train val: datasets/images/val test: datasets/images/test nc: 4 names: [bacterial_spot, early_blight, late_blight, leaf_mold]这里有个小细节容易出错训练和验证目录下必须同时存在images和labels两个子目录YOLOv8训练时会自动到images目录找图再根据同名规则去labels目录找标注文件如果你只放了images而忘记复制labels训练一开始就会报找不到标注的错误。4.3 训练启动与参数调节的实战解读训练命令是YOLO系列一贯的简洁风格一条命令就能启动yolo train modelyolov8s.pt datadata.yaml epochs100 imgsz640 batch16 device0这些参数值得逐个细说modelyolov8s.pt使用预训练权重作为起点。预训练模型在COCO数据集上已经学到了通用的图像特征迁移到农业数据集上时收敛速度快得多精度也更高。我试过从零训练不指定预训练权重100个epoch的精度比迁移学习低约12%。imgsz640输入图像的缩放尺寸。更大的尺寸(如960或1280)能保留更多病害细节但显存占用和训练耗时也成倍增长。叶片病斑一般不算特别小的目标640是合理选择如果你做的是细小的斑点检测可以尝试960。batch16单次迭代送入网络的图片数量。显存不足时优先降低这个值12GB显存跑YOLOv8s640分辨率batch16是可以跑通的如果爆显存就降到8或4。epochs100总共训练轮数。我观察训练曲线时发现80轮之后mAP的增长就很平缓了100轮是一个比较稳妥的值。在实际调优时也可以用patience20参数开启早停连续20轮没有提升就自动终止避免白白浪费算力。训练结束后结果会保存在runs/train/目录下重点关注三个文件weights/best.pt验证集上表现最好的权重、results.png训练曲线总览图、confusion_matrix.png混淆矩阵。4.4 精度瓶颈期如何诊断和调优当你跑完第一轮训练发现mAP卡在某个值上不去的时候别急着调参先用混淆矩阵看看模型到底错在哪。我遇到过的主要情况有以下几类以及对应的解决方案整理成表你可以直接对照排查现象可能原因解决方案A类被大量误判为B类两类病害症状相似且A类样本偏少增加A类样本数量或做离线增强检查标注是否混类小病斑大面积漏检模型下采样倍数导致小目标特征丢失降低网络输入尺寸要求(fine-tune时用更大imgsz训练)使用YOLOv8m或更大模型训练集Loss极低但验证集mAP低过拟合增加数据增强强度增大训练集规模增加Dropout或权重衰减背景区域误报病害训练集中背景负样本不足适当加入无病害的健康叶片标注为背景类某一个类别AP特别低该类别样本严重不足从公开数据集中补充该类别使用Focal Loss策略调整样本不平衡我在调优阶段发现番茄早疫病和晚疫病的形态实在太像了早疫病病斑有同心轮纹晚疫病病斑边缘水渍状、颜色偏暗但有些早期样本人眼都难以区分。这时候只能去补充更典型的样本同时把病斑部位放大裁剪成局部块图作为单独的输入训练一个分类头再用决策融合方式综合判断准确率有明显提升。5. 核心代码模块实现与推理部署5.1 推理脚本怎么把训练好的模型用起来训练完成后加载模型做推理是最直接的使用方式。用Ultralytics提供的API只需要几行Python代码就能完成单张图片的检测from ultralytics import YOLO # 加载训练好的权重 model YOLO(runs/train/weights/best.pt) # 对单张图片进行推理 results model.predict( sourcetest_images/tomato_leaf.jpg, conf0.25, # 置信度阈值低于此值的检测框将被过滤 saveTrue, # 保存标注后的结果图 line_width2, labelsTrue # 在框中显示类别名称和置信度 ) # 从results中提取检测信息 for r in results: boxes r.boxes.xyxy.cpu().numpy() # 边界框坐标(x1, y1, x2, y2) clss r.boxes.cls.cpu().numpy().astype(int) # 类别索引 confs r.boxes.conf.cpu().numpy() # 置信度 for box, cls, conf in zip(boxes, clss, confs): print(f检测到类别 {model.names[cls]}, 置信度 {conf:.2f}, 位置 {box})conf0.25这个阈值值得提一下如果误报不可接受比如在农业植保中误报会导致农户喷错药可以把阈值调高到0.5左右如果漏检更严重可能错过早期病斑就把阈值调低让模型放更多的框出来。5.2 批量推理与视频流检测实际使用场景很少是单张图片一次性处理更多时候是对一个目录下的所有图片批量检测或者对现场拍摄的视频做连续检测。批量检测和视频检测的代码非常相似from ultralytics import YOLO model YOLO(runs/train/weights/best.pt) # 批量检测目录下所有图片 results model.predict( sourcefield_images/, conf0.3, saveTrue, projectruns/detect, namefield_batch ) # 检测视频文件 results model.predict( sourcefield_video.mp4, conf0.3, saveTrue, projectruns/detect, namefield_video ) # 检测实时摄像头画面 results model.predict( source0, # 0代表第一个摄像头的索引 conf0.3, showTrue, # 实时显示检测结果 saveFalse )实时视频检测时要注意推理速度。如果模型处理速度跟不上视频帧率通常视频是25-30fps你会看到画面有明显的卡顿感。针对这个问题两个直接的优化方向换用更小的模型n版比s版速度快约30%或者把输入帧率从60降低一半比如每隔一帧检测一次。5.3 模型导出ONNX与TensorRT部署训练得到的.pt权重只能在PyTorch环境中运行无法直接部署到手机、嵌入式设备或者云端服务需要做一次模型转换。导出ONNX格式是最通用的一步yolo export modelruns/train/weights/best.pt formatonnx imgsz640导出完成后用ONNX Runtime加载模型做推理这样就完全不依赖PyTorch环境了import onnxruntime as ort import numpy as np from PIL import Image # 创建onnx推理会话 session ort.InferenceSession(runs/train/weights/best.onnx) input_name session.get_inputs()[0].name # 预处理图片为模型输入格式 img Image.open(test.jpg).resize((640, 640)) img_array np.array(img).astype(np.float32) / 255.0 img_array np.transpose(img_array, (2, 0, 1))[None, ...] # 推理 outputs session.run(None, {input_name: img_array})如果目标平台是NVIDIA Jetson系列边缘设备导出的ONNX模型还可以进一步转换成TensorRT引擎推理速度会提升3-5倍。这也是实现无人机巡检、植保机器人等实时应用的关键一步。5.4 Web端封装让不懂技术的人也能用对于农业场景很多使用者是农户或农技站的工作人员不可能要求他们去跑Python脚本。所以我用Gradio封装了一个简单的Web界面用户上传一张图片页面直接显示检测结果代码量很少import gradio as gr from ultralytics import YOLO model YOLO(runs/train/weights/best.pt) def detect_and_save(image): results model.predict(sourceimage, conf0.3) annotated results[0].plot() return annotated demo gr.Interface( fndetect_and_save, inputsgr.Image(typepil, label上传作物叶片图片), outputsgr.Image(typenumpy, label检测结果), title农作物叶部病害精准检测系统, description支持番茄细菌性斑点病、早疫病、晚疫病、叶霉病的检测识别 ) demo.launch(server_name0.0.0.0, server_port7860)这段代码启动后局域网内的人通过浏览器访问http://服务器IP:7860上传图片就能看到标注结果对非技术用户非常友好。这也是我最后演示项目时使用效果最好的呈现形式。6. 常见问题与排查技巧实录6.1 训练阶段的高频报错清单深度学习项目实际动手过程中必然会遇到各种报错。下面是训练阶段我遇到且成功解决的几个高频问题问题1CUDA out of memory表现训练开始时崩溃或跑到几个epoch后崩溃报错信息中包含CUDA out of memory。原因显存容量不足以支撑当前batch size和模型尺寸的组合。解决流程先检查到底占用了多少显存用nvidia-smi查看。然后依次调整batch从16降到8或4imgsz从640降到512最后才考虑换更小的模型如YOLOv8n。另外关闭其他吃显存的应用浏览器、游戏也能缓解压力。问题2Label format not supported表现训练开始前加载数据时报错提示标注格式不支持。原因标注文件不是YOLO格式的txt可能是VOC的xml或者COCO的json没转换。解决用ultralytics内置的yolo2txt转换脚本或者Python读xml解析后写入txt转换脚本我在脚本包里也附了一个。问题3训练时mAP一直是0表现训练曲线显示验证集mAP恒为0无论训练多少轮。原因有几类情况一是data.yaml中的类别数和实际标注的class id对不上二是验证集图片没有对应的标注文件三是某些图片的标注坐标全为0也就是空标注。问题4训练集和验证集的图片尺寸不一致表现虽然不报错但训练曲线出现严重的震荡。原因某些公开数据集的原始图片大小差异极大从200×200到4000×3000都有而YOLOv8在训练时会自动缩放统一尺寸但过大的尺寸差异会增加学习难度。解决在训练前对全部图片做一次批量resize到统一尺寸如1280或640的短边再送入训练。6.2 推理部署阶段的坑与应对模型训练好了不等于万事大吉在部署阶段我同样踩了不少坑这里挑三个最典型的说。第一个是关于图像缩放导致检测框偏移的问题。训练时图片被resize到640×640的方形但实际用户上传的照片比例可能是4:3或3:4如果不做letterbox处理直接resize会把图片拉伸变形检测框位置就会偏移。YOLOv8的Python推理接口默认已经做了letterbox处理但如果你用ONNX Runtime加载模型就需要自己在预处理中加入letterbox逻辑否则精度会肉眼可见地下滑。第二个是关于类别名的映射。ONNX模型的输出是一组数组不包含类别名称字符串你需要自己在推理代码中维护一个class_id到中文名称的映射字典。有个小细节我特别提醒一下模型的类别顺序是由训练时的data.yaml决定的后期增删了类别顺序就会变导出新模型后记得同步更新映射表否则会出现张冠李戴的尴尬。第三个是摄像头检测时置信度波动过大。同一片叶片距离远时置信度0.6距离近时置信度0.95帧与帧之间跳变严重。我的解决办法是把连续5帧的检测结果做一个简单的时间平滑取同一目标跟踪框的置信度中位数作为输出画面就稳定很多。6.3 模型过拟合与欠拟合的判断方法训练过程中判断模型状态是一项核心技能。我在看训练曲线时主要关注两条线train loss和val loss以及验证集mAP。如果train loss持续下降但val loss在某个点开始反弹这是经典的过拟合信号。此时模型已经把训练集的死记硬背完成了但对新数据的泛化能力在退化。解决办法优先级是增加数据量 增强数据增强 减小模型容量 增大正则化权重。如果train loss和val loss都维持在很高的位置不降这是欠拟合。可能是模型太小学不动或者训练轮次不够或者是学习率设置得不合适导致收敛过慢。我通常会把学习率调大两个量级试试比如从1e-4调到1e-3再观察loss是否快速下降。6.4 一个容易忽略的点各类别样本数量不均衡农业病害数据集中类别不均衡现象非常普遍。比如番茄叶霉病的样本在网络上很好找可能有上千张而某种区域性病害只有几十张图。如果不做处理模型会把样本多的类别学得很好样本少的类别基本学不到有效特征。我的处理方式是分层抽样离线过采样。划分数据集时先按类别分开再在每个类别内按比例随机划分保证训练集和验证集中各类别比例大致一致。如果某个类别样本少于150张就对该类别做离线增强扩充到300张以上。这样做之后原先minAP各类别mAP的最小值从0.42提升到了0.68效果非常显著。7. 后续扩展与部署方向这套系统跑通之后我个人实际操作中的体会是它真正的价值不在于单个模型文件而在于这条数据-训练-部署的链路已经打通换一个作物、换一种病害只需要重新准备数据集、重新训练所有代码和流程都可以直接复用。目前我最想扩展的方向有三个第一把检测能力升级为病害严重程度分级就是在检测框的基础上再训练一个分类头判断病斑面积占比输出轻度、中度、重度三级预警第二接入无人机巡检路径将航拍图像切片后进行检测实现大田区域的病害热力图第三把移动端部署做好通过ONNX导出后转换NCNN格式在常见的安卓手机上做到实时检测让农户拿手机就能用。最后再分享一个小技巧如果多人协作做这类项目强烈建议从一开始就用DVC或者Git LFS管理数据集不要把几GB的图片裸传到代码仓库里否则后期维护会变得非常痛苦。数据集的版本管理做好了训练结果才能可复现这一点在实际项目中太重要了。本文还有配套的精品资源点击获取