
简介这份茶叶与杂草检测数据集面向农业AI开发者、计算机视觉研究者及农业院校师生用于构建茶园杂草自动识别与精准除草模型解决作物与杂草混生场景下的目标检测与实例分割需求。资源包共656个文件以327张jpg实拍图像和327个同名txt标注文件为主体另附1个yaml数据配置与1份docx说明文档压缩包约25.71MB按训练集288张、验证集25张、测试集14张划分标注采用YOLO格式涵盖maleza杂草与te茶两个类别。目前已有54人学习下载。数据取材真实农业环境标注定位准确、类别标签清晰可直接接入主流深度学习框架用于农业智能监测系统开发、农业机器人集成、学术研究及教学培训帮助读者快速完成模型训练与部署验证。1. 茶叶与杂草检测数据集从一份压缩包到能跑通的检测基线茶叶种植里最耗人工的环节之一是除草。茶园行间杂草长得快人工识别又依赖经验嫩芽和杂草在俯拍视角下颜色接近、纹理相似肉眼都容易看走眼。这份「茶叶与杂草检测数据集」压缩包本质上就是为这类场景准备的一批带标注图像用来训练目标检测模型把「哪是茶树、哪是杂草」这件事交给模型去判断。它适合三类人想入门农业视觉检测的算法新手、手里有茶园但缺标注数据的工程团队、以及需要快速搭一个检测基线再迭代的开发者。拿到压缩包只是起点真正决定成败的是解压后怎么组织目录、怎么划分训练验证集、怎么选模型和调参。下面按我实际做过的顺序把这条路走一遍。2. 解压后先别急着训练把数据摸清楚再动手2.1 目录结构与标注格式的常见形态拿到一个检测数据集压缩包第一件事不是写训练脚本而是解压后把目录翻一遍。茶叶与杂草检测数据集这类农业数据集常见做法是图像放一个文件夹、标注放另一个文件夹标注格式大概率是 YOLO 的 txt每行类别 中心x 中心y 宽 高坐标归一化到 0~1也可能是 VOC 的 xml少数是 COCO 的 json。先确认格式后面所有脚本都围绕它写。# 解压并查看顶层结构先不覆盖已有文件 unzip -n 茶叶与杂草检测数据集_20251116_211936.zip -d tea_weed_raw cd tea_weed_raw # 看两层目录判断图像和标注是不是分开存放 find . -maxdepth 2 -type d | sort # 统计图像数量心里有个规模概念 find . -type f \( -iname *.jpg -o -iname *.png -o -iname *.jpeg \) | wc -l # 抽查一个标注文件确认格式 find . -type f -iname *.txt | head -1 | xargs -I{} sh -c echo {} ; head -5 {}这段命令的逻辑是先无损解压再用find摸清目录层级用wc -l估算数据规模最后抽一个标注文件看前几行。参数上-maxdepth 2避免目录太深刷屏-iname忽略大小写匹配扩展名。如果抽出来的 txt 每行是 5 个数字基本就是 YOLO 格式如果是 xml 带bndbox那就是 VOC。这一步花五分钟能省掉后面几小时的格式报错排查。2.2 类别分布与图像尺寸的快速体检摸清格式后要统计每个类别的框数量。茶叶与杂草检测数据集通常就两类茶叶或茶树和杂草但有的版本会细分多种杂草。类别不平衡是农业数据集的通病杂草框往往远多于茶叶框直接训练会让模型偏向多数类。import os, glob from collections import Counter label_dir tea_weed_raw/labels # 按实际路径改 counter Counter() img_sizes Counter() for txt in glob.glob(os.path.join(label_dir, *.txt)): with open(txt) as f: for line in f: parts line.strip().split() if len(parts) 5: counter[parts[0]] 1 # 第一列是类别 id print(类别框数量分布:, dict(counter)) # 抽查图像尺寸判断是否需要统一缩放 from PIL import Image for img in glob.glob(tea_weed_raw/images/*.jpg)[:20]: with Image.open(img) as im: img_sizes[im.size] 1 print(图像尺寸分布(前20张):, dict(img_sizes))逻辑说明遍历所有标注文件用Counter累计每个类别 id 出现的次数得到类别分布再抽 20 张图看尺寸是否统一。参数上parts[0]是类别 idparts[1:]是归一化坐标。如果发现某个类别框数为 0 或极少要么是标注遗漏要么是类别 id 映射错了得回去核对classes.txt或data.yaml里的类别顺序。图像尺寸如果不一致训练前必须统一 resize否则 dataloader 会报错。提示类别 id 是从 0 还是 1 开始不同数据集不一样。YOLO 官方习惯从 0 开始但有些标注工具从 1 开始映射错一位会让所有标签错位这是最常见的翻车点之一。3. 划分数据集与生成训练配置让 YOLO 能直接吃进去3.1 按 8:1:1 划分并落盘成标准目录YOLO 系列训练要求固定的目录结构images/train、images/val、labels/train、labels/val图像和同名标注文件必须一一对应。茶叶与杂草检测数据集如果原始是混在一起的就得自己划分。我一般按 8:1:1 分训练、验证、测试农业数据量通常不大验证集别低于 10%否则指标抖动大。import os, glob, random, shutil random.seed(42) # 固定种子保证可复现 img_dir tea_weed_raw/images lbl_dir tea_weed_raw/labels out tea_weed_yolo imgs sorted(glob.glob(os.path.join(img_dir, *))) random.shuffle(imgs) n len(imgs) n_train, n_val int(n * 0.8), int(n * 0.1) splits { train: imgs[:n_train], val: imgs[n_train:n_train n_val], test: imgs[n_train n_val:], } for split, files in splits.items(): os.makedirs(f{out}/images/{split}, exist_okTrue) os.makedirs(f{out}/labels/{split}, exist_okTrue) for img in files: stem os.path.splitext(os.path.basename(img))[0] lbl os.path.join(lbl_dir, stem .txt) shutil.copy(img, f{out}/images/{split}/{os.path.basename(img)}) if os.path.exists(lbl): shutil.copy(lbl, f{out}/labels/{split}/{stem}.txt) else: print(缺标注:, stem) # 图像没有对应标注必须查逻辑说明先固定随机种子再打乱保证每次划分一致按比例切片后逐张把图像和同名标注复制到对应 split 目录。参数上0.8/0.1/0.1是经验值数据量小于 500 张时可以把验证集提到 15%。代码里对缺失标注做了打印这一步很关键——图像有、标注没有的样本会污染训练必须人工确认是漏标还是负样本。3.2 data.yaml 的字段含义与类别顺序划分完要写data.yaml这是 YOLO 训练的入口配置。字段不多但每个都容易写错。# tea_weed.yaml path: /abs/path/to/tea_weed_yolo # 数据集根目录建议绝对路径 train: images/train val: images/val test: images/test nc: 2 # 类别数必须和 names 长度一致 names: 0: tea # 类别 id 必须和标注文件里的数字对应 1: weed逻辑说明path是根目录train/val/test是相对路径nc是类别数names是 id 到名称的映射。参数上最容易错的是names的顺序——如果标注里 0 是杂草、1 是茶叶这里写反了模型学到的语义就整个颠倒指标看着还行但实际全错。写完用一行命令验证路径是否可达。# 快速验证 yaml 里的路径能否找到图像 python -c import yaml,os; dyaml.safe_load(open(tea_weed.yaml)); print(os.path.exists(os.path.join(d[path], d[train])))3.3 用 YOLOv8 跑通第一个基线配置就绪后用 Ultralytics 的 YOLOv8 跑一个基线最快。它封装好训练循环几行就能启动。from ultralytics import YOLO model YOLO(yolov8n.pt) # n 是最小模型先跑通再换大模型 results model.train( datatea_weed.yaml, epochs100, imgsz640, # 输入分辨率农业小目标可提到 960 batch16, # 显存不够就降到 8 lr00.01, # 初始学习率 patience20, # 20 轮无提升就早停 projectruns_tea, namebaseline, )逻辑说明加载预训练权重后调用trainUltralytics 会自动读 yaml、建 dataloader、跑验证。参数上imgsz对茶叶与杂草这种小目标影响很大640 是默认值如果杂草在图中占比很小提到 960 通常能涨点代价是显存和耗时batch受显存限制跑不动就减半patience是早停防止过拟合空跑。第一次训练建议先用yolov8n跑通流程确认没有路径和格式错误再换yolov8s/m提精度。4. 训练过程中的参数调优与结果判读4.1 从 loss 曲线判断是欠拟合还是过拟合训练启动后runs_tea/baseline下会有results.csv和曲线图。看三个量train/box_loss、val/box_loss、metrics/mAP50。如果训练 loss 持续下降但验证 loss 早早反弹是过拟合该加数据增强或减模型容量如果两个 loss 都居高不下是欠拟合该加轮数或换更大模型。茶叶与杂草检测数据集的难点在于两类纹理接近mAP50 能到 0.8 以上算不错低于 0.6 就得回头查标注质量。# 从 results.csv 里抽关键列看趋势 python -c import pandas as pd df pd.read_csv(runs_tea/baseline/results.csv) df.columns [c.strip() for c in df.columns] print(df[[epoch,train/box_loss,val/box_loss,metrics/mAP50]].tail(10)) 逻辑说明读训练日志打印最后 10 轮的 loss 和 mAP。参数上列名带空格是 Ultralytics 的历史遗留先 strip 再取。如果 mAP50 在最后几轮还在涨说明epochs设少了如果早就不动甚至下降patience会帮你停。4.2 数据增强参数怎么设才不帮倒忙YOLO 默认开了一堆增强mosaic、hsv_h、hsv_s、flipud、fliplr等。农业图像里颜色是重要线索hsv_h色调抖动设太大反而有害因为茶叶和杂草的绿色差异会被打乱。我一般把hsv_h压到 0.015 左右hsv_s、hsv_v保持默认mosaic对小目标有帮助可以留着但训练后期建议关掉让模型适应真实分布。model.train( datatea_weed.yaml, epochs150, imgsz960, batch8, hsv_h0.015, # 色调抖动调小保护颜色线索 hsv_s0.7, hsv_v0.4, mosaic1.0, # 前期开后期可设 close_mosaic10 close_mosaic10, # 最后 10 轮关掉 mosaic fliplr0.5, flipud0.0, # 俯拍图像上下翻转不自然关掉 )逻辑说明hsv_h控制色调扰动幅度越小越保留原始颜色close_mosaic让最后若干轮关闭马赛克增强提升收敛稳定性flipud对俯拍茶园不适用因为上下翻转会产生不真实的视角。参数上这些值不是死的得看你的图像是不是正射俯拍。如果是无人机斜拍flipud可以适当开一点。4.3 用验证集跑一次推理看真实效果指标好看不代表能用必须把模型拉到验证集上出图看。YOLO 的predict可以直接对目录批量推理。from ultralytics import YOLO model YOLO(runs_tea/baseline/weights/best.pt) model.predict( sourcetea_weed_yolo/images/val, conf0.25, # 置信度阈值低了误检多高了漏检多 iou0.45, # NMS 的 IoU 阈值 saveTrue, projectruns_tea, nameval_pred, )逻辑说明加载最优权重对验证集批量推理并保存可视化结果。参数上conf是置信度门槛农业场景宁可漏检也别误检时调高到 0.4iou控制重叠框合并密集杂草场景可以适当调低。跑完去runs_tea/val_pred看图重点看两类错误把茶叶框成杂草、把杂草漏掉。前者多半是类别映射问题后者多半是训练不足或小目标分辨率不够。5. 避坑与排查茶叶与杂草检测里最容易翻车的几件事5.1 类别 id 映射错位指标虚高但全错现象训练 loss 正常下降mAP 看着也不低但推理图上茶叶和杂草的框颜色对调了。原因data.yaml里names的顺序和标注文件里的类别 id 不一致模型学到的语义整体偏移。解决打开一个标注文件看第一列数字再对照names确保 0 对应真实的第一类。改完重新训练别指望微调能救回来。5.2 图像与标注文件名不匹配静默丢样本现象训练能跑但实际参与训练的样本比预期少很多。原因图像是IMG_001.jpg标注是img_001.txt大小写或前缀不一致dataloader 找不到就跳过。解决划分数据集时就用脚本校验同名文件是否存在像 3.1 里那样打印缺失项别等训练完才发现。5.3 分辨率设太低小目标杂草全漏现象mAP50 卡在 0.5 上不去推理图上稍小的杂草完全没框。原因imgsz640对占比很小的杂草不够下采样后特征丢失。解决把imgsz提到 960 或 1280同时batch相应减小如果显存实在不够改用切片推理或换更轻的模型结构。5.4 验证集和训练集同源指标乐观得离谱现象验证 mAP 0.95一上真实茶园就崩。原因划分时没打乱或者同一株茶树的多个角度被分到了训练和验证两边造成数据泄漏。解决按拍摄批次或地块划分而不是纯随机同一地块的图像要么全在训练要么全在验证。这个坑最隐蔽指标越漂亮越要警惕。5.5 标注框越界或宽高为负训练直接报错现象训练启动就抛normalized coordinates out of range或 loss 变 NaN。原因标注里坐标超过 1 或为负常见于标注工具导出时的精度问题。解决写个校验脚本遍历所有标注把越界行打印出来修正或剔除。import glob for txt in glob.glob(tea_weed_yolo/labels/**/*.txt, recursiveTrue): for i, line in enumerate(open(txt)): p line.split() if len(p) 5: vals list(map(float, p[1:])) if any(v 0 or v 1 for v in vals) or vals[2] 0 or vals[3] 0: print(越界:, txt, 行, i, line.strip())逻辑说明遍历所有标注检查归一化坐标是否在 0~1 之间、宽高是否为正。参数上vals[2]、vals[3]是宽高必须大于 0。发现越界就回标注工具修正别硬训。6. 把基线推到能用的进阶技巧跑通基线只是开始要让茶叶与杂草检测真正能用还得在几个点上做文章。第一是难例挖掘把验证集里误检、漏检的图挑出来人工补标后加进训练集迭代两三轮mAP 通常能涨 5 到 10 个点。第二是类别不平衡处理如果杂草框远多于茶叶框可以在损失里给茶叶类加权或者对杂草做欠采样。第三是测试时增强TTA推理时对同一张图做翻转、多尺度把结果融合能稳定涨一两个点代价是推理变慢。# 推理时开启 TTA 和多尺度换取精度 model.predict( sourcetea_weed_yolo/images/test, augmentTrue, # 开启 TTA conf0.3, iou0.5, saveTrue, )逻辑说明augmentTrue让 Ultralytics 在推理时做测试时增强对同一目标多次预测再融合。参数上TTA 会让推理耗时翻几倍实时场景慎用离线批量检测可以开。另外导出模型时选对格式也影响落地服务器部署用 ONNX 或 TensorRT边缘设备用 NCNN 或 TFLite导出命令一行搞定。# 导出 ONNX方便跨平台部署 yolo export modelruns_tea/baseline/weights/best.pt formatonnx imgsz960逻辑说明把训练好的权重导出成 ONNXimgsz要和训练时一致否则精度会掉。参数上format可选onnx、engine、ncnn等按目标硬件选。我自己做这类农业检测项目最大的教训是别一上来就堆模型和调参先把数据摸清楚、把类别映射核对三遍、把验证集划分做干净。这三件事做扎实一个yolov8n的基线就能给你可用的结果这三件事马虎再大的模型也是白跑。茶叶与杂草检测数据集本身不复杂难的是把工程细节抠到位。希望帮到你。本文还有配套的精品资源点击获取