news 2026/10/14 3:42:35

基于YOLOv8的杂草检测系统:从数据标注到模型部署实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于YOLOv8的杂草检测系统:从数据标注到模型部署实战

简介:面向农业智能化与计算机视觉学习者,这是一套基于YOLOv8的杂草检测系统源码,帮助用户通过深度学习自动识别作物与杂草类别。资源涵盖从数据预处理、模型训练、性能验证到最终预测的完整流程,适合希望掌握目标检测实战应用的入门及进阶开发者参考。包内共24个文件,包括负责训练、验证、推理及交互显示的4个Python脚本(train.py、val.py、predict.py、ui.py)、19张用于效果展示的图像,以及1份项目说明文档,压缩包整体约5.5MB,结构清晰便于按步骤对照使用。项目采用包含2427张标注图像的专用数据集,可体验真实农业场景下的数据增强与模型调参过程,为后续迁移至其他检测任务提供可复用的代码框架。该资源已有77人学习下载,对于关注智慧农业、精准施药或轻量化部署的开发者具有直接参考价值。

1. 杂草检测为什么选 YOLOv8:先想清楚,再动手

做农业视觉的人都知道,杂草检测是典型的“目标小、背景杂、实时性要求高”的场景。YOLOv8 在同类模型里把精度和速度平衡得最省心:不需要像 Faster R-CNN 那样堆显存,也不需要像传统图像处理那样手工设计颜色阈值。这份基于 Python 和 YOLOv8 的杂草检测系统源码,把训练、验证、推理的完整链路都封装好了,拿到手可以直接跑通,再按自己的地块数据去调。适合正在做智慧农业项目、毕业设计,或者想快速落地一套作物-杂草识别原型的开发者。我拆完这套源码后的直观感受是:它不只是一个模型文件,更像是一份“从标注到部署”的作业模板,你能看到别人是怎么处理类别不均衡和复杂背景的。

2. 环境搭建与数据集准备:把依赖装齐,再谈训练

2.1 环境版本组合与安装顺序

源码默认基于 YOLOv8 的官方框架 ultralytics。我通常不建议直接pip install ultralytics糊一版就开训,因为后面转 ONNX 或 TensorRT 时需要对齐版本。拆这份源码时,里面用的是 ultralytics 8.x 系列,配合 Python 3.8-3.10 都能跑,但要注意 PyTorch 和 CUDA 的匹配关系。

conda create -n weed_det python=3.9 -y conda activate weed_det pip install torch==2.0.1 torchvision==0.15.2 --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics==8.0.222 pip install opencv-python labelimg pyqt5

这里把 PyTorch 单独先装,避免 ultralytics 自动拉一个不带 CUDA 的 CPU 版本。torchvision 版本必须和 torch 对应,否则导入模型时可能报torchvision::nms类错误。labelimg 用于数据标注,按住快捷键 W 画框、D 切下一张,熟练了会快很多。装完后跑一句yolo predict model=yolov8n.pt source=bus.jpg验证安装,能出结果说明环境没问题。

2.2 数据集目录结构与标注格式

这套源码的默认数据结构遵循 YOLO 格式:图片和标注文件分开,train 和 val 各自独立。如果你从别的开源数据集转过来,最容易踩的坑是类别编号从 0 开始,而某些数据集的背景类占用了 0。

weeds_dataset/ images/ train/ img_001.jpg img_002.jpg val/ img_010.jpg labels/ train/ img_001.txt img_002.txt val/ img_010.txt weed.yaml

对应的 weed.yaml 内容如下:

path: D:/projects/weeds_dataset train: images/train val: images/val nc: 2 names: ['weed', 'crop']

这个文件里的 path 建议用绝对路径,尤其是 Windows 下相对路径经常因为盘符问题找不到数据。nc 是类别数,names 顺序必须和标注文件里的类别索引一一对应。如果你的场景只想识别杂草、不管作物,就设置 nc=1,names 只留 weed。标注文件每一行是“类别 x_center y_center width height”,坐标是归一化后的比例值。labelimg 默认保存成 YOLO 格式,注意在设置里把标注格式选成 YOLO,不然存成 Pascal VOC 的 xml,还得额外转换。

3. 模型训练与参数调优:别只跑默认参数

3.1 从预训练权重开始训练

YOLOv8 官方提供了 n/s/m/l/x 五个尺寸。杂草场景我建议从 yolov8n 或 yolov8s 起步,因为农业设备的嵌入式板子性能有限,直接上 l 或者 x 训练慢、推理也慢。源码里默认用的是 yolov8s,如果显存不够,换成 n 是代价最小的方式。

from ultralytics import YOLO model = YOLO("yolov8s.pt") results = model.train( data="weed.yaml", epochs=100, imgsz=640, batch=16, device=0, patience=10, workers=4, lr0=0.01, augment=True, )

这里的关键参数:imgsz 控制在 640,杂草和作物在田间图像里往往只占几十个像素,盲目调到 1280 会翻倍增加显存,但对小目标召回率的提升不一定明显。patience=10 表示连续 10 个 epoch 验证集 mAP 不涨就提前停止,这是防止过拟合又节省时间的好机制。如果 batch 太大导致显存溢出,就减半,同时可以等比例调低 lr0,比如 batch 从 16 降到 8,lr0 从 0.01 调到 0.005。

3.2 训练结果产物解析

训练完成后,源码会自动在runs/detect/train/下生成权重文件。很多人只盯着 best.pt 和 last.pt,其实同目录下的results.csv和results.png才是判断训练质量的主要依据。

runs/detect/train/ weights/ best.pt last.pt results.csv results.png confusion_matrix.png val_batch0_pred.jpg

我会先看 results.csv 里验证集的 mAP50 和 mAP50-95 曲线。如果 mAP50 能到 0.85 以上,而 mAP50-95 只有 0.4,说明框定得比较准但位置边缘不够精细,可以适当调高 imgsz 或者增加 mosaic 增强的强度。confusion_matrix.png 能直接看出哪些类别互相混淆——杂草和幼苗期的作物长得确实像,如果矩阵里这两个类的互相误判比例高于 15%,就要考虑是不是标注时类别边界不统一。

3.3 数据增强与类别不均衡处理

田间数据的难点是光照变化大、杂草密度不均。源码里开了 augment=True 以后,默认会启用 mosaic、翻转和 HSV 扰动。但 mosaic 对密集小目标场景有个副作用:四张图拼接后,目标会被切碎,导致标注框面积占比变小,模型学到的是残缺特征。我处理这个问题的做法是关闭 mosaic 的后面三分之一训练轮次。

model.train( data="weed.yaml", epochs=100, imgsz=640, batch=16, close_mosaic=10, hsv_h=0.015, hsv_s=0.5, fliplr=0.5, )

close_mosaic=10 表示最后 10 个 epoch 关闭 mosaic,让模型在接近真实分布的数据上微调。hsv_h 和 hsv_s 设置的是色相和饱和度偏移幅度,农田在不同时间拍摄颜色差异很大,这两个值稍微放大能提高跨时段泛化能力。如果你的数据集里杂草样本只有几百张,而作物样本几千张,最简单有效的办法是在训练前做离线复制粘贴增强——把杂草目标从原图抠出来,随机贴到作物的背景图中,同时把对应的标注框也写进去,这比任何算法层面的调参都直观。

4. 检测系统设计与推理部署:写一个能直接用的检测器

4.1 图片和视频批量推理脚本

源码里给了一个detect.py,把 YOLOv8 的原生 API 封装成了可批处理的检测器。我拆完以后按自己的习惯重写了一遍,逻辑更直白:读入文件列表,逐张推理,过滤低置信度结果,输出带框的图片和 JSON 格式的检测记录。

import cv2 from ultralytics import YOLO model = YOLO("runs/detect/train/weights/best.pt") def detect_image(image_path, conf_thres=0.35): img = cv2.imread(image_path) results = model(img, conf=conf_thres, imgsz=640) detections = [] for box in results[0].boxes: class_id = int(box.cls[0]) confidence = float(box.conf[0]) x1, y1, x2, y2 = map(int, box.xyxy[0]) detections.append({ "class": model.names[class_id], "confidence": round(confidence, 3), "bbox": [x1, y1, x2, y2], }) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2) label = f"{model.names[class_id]} {confidence:.2f}" cv2.putText(img, label, (x1, y1 - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2) return img, detections

这里的 conf_thres 默认设置为 0.35,比官方默认的 0.25 高一些。原因是杂草检测的误报代价不低:如果系统说这里有杂草,后面可能就触发喷洒动作了。宁可漏检一部分,也不要频繁误报。实际落地时建议在验证集上试跑几个阈值,画一条精确率-召回率曲线再定最终阈值。box.xyxy 是左上角和右下角的绝对像素坐标,方便直接画矩形,也方便后面接入机械臂做除草定位。

4.2 调用摄像头做实时检测

如果你的需求是架在田间小车上实时识别,可以把视频流源从文件改成摄像头或者 RTSP 流。源码里最基础的摄像头检测代码并不复杂,但有一个性能坑:逐帧推理消耗极大,推荐跳帧处理。

cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) frame_step = 2 frame_count = 0 while True: ret, frame = cap.read() if not ret: break frame_count += 1 if frame_count % frame_step != 0: continue annotated_frame, detections = detect_image(frame, conf_thres=0.4) cv2.imshow("Weed Detection", annotated_frame) if cv2.waitKey(1) & 0xFF == ord('q'): break

frame_step=2 表示每两帧推理一次,另一帧直接用上一帧的结果。这对运动缓慢的农业场景完全够用,同时能省掉近一半的 GPU 负载。真正要跑实时的话,强烈建议在 GPU 机上用device=0,CPU 模式下 640 分辨率推理一帧差不多要 150-300 毫秒,达不到实时的体感。

5. 避坑与常见问题:训练和部署里的五个翻车现场

5.1 图片尺寸过大导致 GPU 显存溢出

现象:训练刚开始一两步就报CUDA out of memory。原因:源数据图片是 4K 分辨率无人机拍摄的,没有统一缩放到训练尺寸。解决:不要直接把 imgsz 调低到 320,这样会丢失小目标信息。先在数据预处理阶段用cv2.resize把所有图片按长边缩放到 1280 以内,同时保持原图比例填充到 640 的倍数尺寸。我一般写一个批量缩放脚本,把图缩小后同步改标注坐标,用归一化坐标的好处就是缩放不会影响 txt 里的数值。

5.2 验证集 mAP 很高,但实际拍摄效果不好

现象:验证集 mAP50 到 0.9,但在新地块拍的照片里大量漏检。原因:数据划分时用了同一个地块、同一时段的图片,训练集和验证集背景高度相似,模型记住了背景而不是杂草本身。解决:按田块而不是按单张图片划分数据集。比如有三块田的数据,训练集用两块,验证集用另一块,这样验证结果才真正反映跨地块泛化能力。源码里如果只随机划分图片,建议自己改成按目录分组拆分。

5.3 标注框与目标贴合不准

现象:标注是矩形框,但细长的草叶在框里占了不到一半面积,训练出的框经常框住空背景。原因:用到的是目标检测,靠矩形框本身无法表达细长旋转目标。解决:要么接受矩形框并接受部分误差,要么把任务从检测改成旋转框检测,YOLOv8 官方不直接支持旋转框,可以引入其他库。如果是常规杂草场景,我建议在标注时尽量让框贴合叶子长轴,不要把整丛草圈成大矩形,让边界包含太多背景像素。

5.4 类别编号错位

现象:训练时 loss 不降,推理时把作物框成杂草。原因:标注工具导出的类别索引和 weed.yaml 里的 names 顺序不对应。比如标注软件里 weed 的 id 是 1,crop 的 id 是 0,而 yaml 里 weed 排在第 0 位。解决:训练前检查 labels 目录下任意一个 txt,确认第一列数字的范围,再对照 yaml 后写一个小脚本统计所有 txt 里出现的类别 id 集合,必须和range(len(names))完全一致。

5.5 推理时间波动大,帧率不稳定

现象:实时检测时 fps 忽高忽低,偶尔卡顿。原因:程序在推理线程里同时做图像读取和画框,遇到磁盘 IO 或内存回收时被阻塞。解决:把视频读取放到独立线程,用队列缓存,检测线程只管从队列取帧。另外,画框的cv2.putText在检测目标多时耗时明显,可以把标注文字渲染改成只在固定区域显示统计数字,或者每 3 帧刷新一次叠加层。

6. 进阶验证:用混淆矩阵和逐类指标检查模型是否真的能落地

模型训练完不是看 mAP 就够的,在杂草检测这种任务里,逐类指标比总指标更有指导意义。我会在跑完推理后,用源码生成的 confusion_matrix.png 和 results.csv 做一次系统检查,把结果导成表格逐类分析。

先看混淆矩阵的横轴和纵轴:横轴是真实类别,纵轴是预测类别。我只关心两个数:杂草被误判为作物的比例,以及作物被误判为杂草的比例。前者会造成漏喷,后者会造成误喷。理想状态下,这两个比例都应该小于 5%。如果杂草被误判的比例偏高,说明杂草和作物在纹理特征上确实重叠,需要回到数据层面补充更多处于苗期的样本,增加这些难样本的权重。

逐类指标我一般这样看:

import pandas as pd results = pd.read_csv("runs/detect/train/results.csv") weed_metrics = [col for col in results.columns if "weed" in col] print(results[["epoch", "metrics/precision(B)", "metrics/recall(B)"]].tail())

如果 precision 和 recall 不平衡,比如 precision 很高但 recall 很低,说明模型倾向于保守预测。在除草场景里,如果人力后续会复查,recall 可以调高一些,把 conf_thres 降下来;但如果系统是自动喷洒,precision 优先,conf_thres 就要保持在 0.4 以上。我在跑草地雀麦检测时,就曾经用这种逐类分析发现模型对出苗期杂草的召回率只有 0.3,后来把训练集里苗期的负样本减少、加了局部光度扰动,才把召回率拉到 0.65 以上。

最后一个验证习惯:把训练时没有见过的地块图片,挑出几十张做批量推理,把推理结果图按“草地、出苗期、长势旺”三类分组放一起看。如果某一类图片里边界框位置漂移明显,就像你看到的这个资源一样,再去调数据分布。从那以后我每次拿到新的杂草检测模型,都会强制走一遍“混淆矩阵-逐类指标-跨地块抽样”这个流程再谈上线。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 3:42:25

YOLO格式火灾检测数据集实战:从标注解析到训练调优

简介:一套面向火灾目标检测的YOLO格式数据集,训练集含174张真实场景火灾图像,覆盖近景火焰、烟雾扩散及复杂背景等多种形态,适用于智能安防监控、无人机火灾巡查、消防研究与模拟训练、智慧城市安全平台等场景,帮助开发…

作者头像 李华
网站建设 2026/10/14 3:42:16

MapReduce初级编程实践:从WordCount到shuffle机制与避坑指南

简介:《大数据技术原理与应用》实验报告四围绕MapReduce初级编程实践,是一份面向计算机专业学生、大数据初学者及相关开发者的完整技术报告。资源为单个docx文档,压缩包体积为10.48MB,基于VMWare虚拟机、Ubuntu、JDK1.8、Hadoop与…

作者头像 李华
网站建设 2026/10/14 3:42:08

栈与数制转换:C语言数据结构经典组合实战

简介:面向C语言初学者的数制转换实例代码讲解,完整演示如何借助顺序栈实现十进制到八进制等进制的转换。资源以严蔚敏《数据结构》中的数制转换算法为蓝本,将伪代码转化为可运行、可调试的C程序,覆盖顺序栈的初始化、压栈、出栈、…

作者头像 李华
网站建设 2026/10/14 3:41:54

2025智能驾驶白皮书解读:从技术分级到端到端与数据闭环的落地判断

简介:《汽车智能驾驶技术及产业发展白皮书》PDF电子版由中国汽车技术研究中心、清华大学与华为联合编写,面向智能网联汽车产业研究者、车企工程师与政策制定者,旨在系统梳理智能驾驶技术演进、产业生态与安全落地路径。资源为单个PDF文件&…

作者头像 李华
网站建设 2026/10/14 3:40:44

上海浦东张江壁挂炉维修|博世壁挂炉维修预约|附近持证师傅上门检修|欧米到家报修热线

🔥 壁挂炉是家庭中冬季24小时不间断供暖与供热水的核心设备,一旦突发不点火、不加热、漏水异响或显示屏报错,全家取暖和热水往往立刻受影响。上海家庭使用的壁挂炉品牌繁多,电控逻辑和燃烧结构差异较大。本文系统梳理上海地区壁挂…

作者头像 李华
网站建设 2026/10/14 3:40:44

PyTorch U-Net城市遥感水体识别实战:从假彩色影像到二值掩膜全流程

简介:这是一套面向城市区域水体提取的开箱即用实战资源,适合遥感、计算机视觉方向的学生与开发者,可用于本科毕业设计、课程大作业或轻量级水体监测原型开发。资源以高分辨率城市遥感影像为对象,集成U-Net与AttU-Net两种主流分割网…

作者头像 李华