ARTICLE DETAIL

资讯详情

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

农场航拍目标检测数据集:1000张VisDrone风格农机标注与YOLOv8实战

农场航拍目标检测数据集:1000张VisDrone风格农机标注与YOLOv8实战 简介这份资源是面向无人机俯视视角农业场景的目标检测数据集适合从事智慧农业、农机识别、行人检测等方向的研究者与算法工程师使用。数据采集自农场环境标注类别涵盖car、people、tractor、van四类可用于训练车辆、农机与行人的检测模型帮助解决农业场景下小目标密集、遮挡严重等检测难点。压缩包共2000个文件包含497张jpg图像、1502个txt标注文件及1个yaml配置文件整体约522.36MB目录已按train、val、test划分完毕data.yaml中已写好类别名称与路径yolov5、yolov7、yolov8等主流框架可直接读取训练省去自行整理与划分数据的工作。目前已有451人学习下载配套博文提供了数据集与检测结果的参考链接便于读者对照验证模型效果快速搭建农业场景目标检测的基线方案。1. 农场航拍目标检测数据集1000 张 VisDrone 风格农机标注到底能跑出什么拿到一份无人机俯拍农场的数据集第一反应往往不是兴奋而是怀疑——俯视视角下农机和行人尺度差异极大标注质量参差直接开训大概率翻车。这份 VisDrone 风格的农场目标检测数据集包含 1000 多张 DJI 无人机采集的俯视图像标注了 car、people、tractor、van 四类目标目录已经按 train/val/test 划分完毕附带 data.yamlyolov5、yolov7、yolov8 可以直接开训。它解决的核心问题是你不需要从零采集和标注农场场景数据省掉至少两周的标注工期。适合做农业机械检测、无人机巡检、边缘部署验证的从业者也适合想跑通 YOLO 全流程但手头没有合适数据的新手。数据集和检测结果参考链接指向一篇 CSDN 博客里面有更详细的训练记录。2. 数据集结构与标注格式先搞清楚目录里到底装了什么2.1 目录层级与 data.yaml 的真实含义这份数据集的目录结构是典型的 YOLO 训练格式但有几个细节容易看走眼。先看 data.yaml 的内容names: [car, people, tractor, van] train: ./train/images val: ./valid/images test: ./test/image注意test路径写的是./test/image而不是./test/images这大概率是原始配置的笔误。如果你直接拿这份 yaml 去跑 yolov8 的验证或推理会报路径找不到。常见做法是手动改成./test/images或者确认解压后 test 目录下到底叫什么名字。另外val对应的是valid目录不是val这也是 YOLO 数据集常见的命名习惯别想当然去改。目录展开后大致是这样dataset1/ ├── data.yaml ├── train/ │ ├── images/ │ └── labels/ ├── valid/ │ ├── images/ │ └── labels/ └── test/ ├── images/ └── labels/images 里是 jpg 原图labels 里是同名的 txt 标注文件。标注格式是 YOLO 标准的class_id x_center y_center width height坐标已经归一化到 0~1。类别索引对应 names 列表0car1people2tractor3van。2.2 四类目标的标注特点与潜在问题从文件名看图像主要来自 DJI_0011、DJI_0016、DJI_0017 几个架次说明是同一区域多次飞行采集的。这种采集方式的好处是场景一致性强坏处是如果训练集和验证集按随机划分同一架次的相邻帧可能同时出现在 train 和 val 里导致验证指标虚高。我一般会先检查一下 train 和 val 的文件名前缀分布如果 DJI_0017 的帧同时大量出现在两边验证集的可信度就要打折扣。四类目标的尺度差异很明显。tractor 和 van 在俯视图中通常占几十到上百像素car 更小people 最小可能只有十几个像素。这种尺度分布对 YOLO 的 anchor 匹配和特征金字塔是不小的考验。如果你直接拿默认配置训小目标的召回率大概率不理想。常见做法是在训练前先跑一遍标注可视化确认 people 类的框有没有漏标或错标。import cv2 import os import random img_dir dataset1/train/images label_dir dataset1/train/labels names [car, people, tractor, van] colors [(255,0,0), (0,255,0), (0,0,255), (255,255,0)] files os.listdir(img_dir) samples random.sample(files, 6) for f in samples: img cv2.imread(os.path.join(img_dir, f)) h, w img.shape[:2] label_path os.path.join(label_dir, f.replace(.jpg, .txt)) if not os.path.exists(label_path): continue with open(label_path) as fp: for line in fp: cls, x, y, bw, bh map(float, line.strip().split()) x1 int((x - bw/2) * w) y1 int((y - bh/2) * h) x2 int((x bw/2) * w) y2 int((y bh/2) * h) cv2.rectangle(img, (x1,y1), (x2,y2), colors[int(cls)], 2) cv2.putText(img, names[int(cls)], (x1, y1-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, colors[int(cls)], 1) cv2.imwrite(fvis_{f}, img)这段脚本随机抽 6 张训练图把标注框画出来存成 vis_ 开头的文件。跑完打开看一眼重点检查 people 类有没有框到农机上tractor 和 van 有没有混淆。如果发现某类目标大量漏标建议先补标再训否则模型学到的就是错的。3. 用 YOLOv8 跑通训练从环境配置到第一轮收敛3.1 环境搭建与依赖版本选择YOLOv8 的环境配置比 v5 简单不少但版本兼容性依然是玄学。我一般用 conda 建一个干净环境Python 选 3.9 或 3.10这两个版本和 ultralytics 的兼容性最稳。conda create -n farm_yolo python3.10 -y conda activate farm_yolo pip install ultralytics8.1.0 pip install opencv-python pillow matplotlibultralytics 的版本不要盲目追新8.1.x 系列在目标检测任务上比较稳定。如果你要用 yolov5 或 yolov7那就得单独 clone 对应仓库依赖冲突会更麻烦。yolov5 需要 torch1.7yolov7 对 torch 版本更敏感建议 torch 1.12~1.13。显卡驱动和 CUDA 版本对不上是新手最常见的翻车点跑torch.cuda.is_available()返回 False 的话先检查 CUDA 和 torch 版本是否匹配。3.2 训练命令与关键参数设置假设数据集解压在./dataset1data.yaml 已经修正了 test 路径训练命令可以这样写yolo detect train \ data./dataset1/data.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectfarm_runs \ nameexp1逐项说明modelyolov8s.pt选 small 版本参数量适中适合 1000 张量级的数据集imgsz640是默认输入尺寸如果显存够可以试 1024对小目标更友好batch16在 8G 显存上基本能跑不够就降到 8lr00.01是初始学习率YOLOv8 默认用 SGD 时这个值比较稳patience20表示 20 轮没提升就早停防止过拟合。训练启动后重点看几个指标box_loss 和 cls_loss 是否稳定下降mAP50 在前 10 轮有没有明显上升。如果 loss 震荡剧烈先把 batch 调小、lr0 降到 0.001 试试。如果 mAP50 一直卡在很低的值大概率是 data.yaml 路径不对或者标注格式有问题。3.3 训练过程监控与结果解读YOLOv8 训练时会在farm_runs/exp1下生成 weights、results.csv、confusion_matrix.png 等文件。results.csv 里记录了每轮的 loss 和 mAP可以直接用 pandas 画曲线import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(farm_runs/exp1/results.csv) df.columns df.columns.str.strip() plt.figure(figsize(12,4)) plt.subplot(1,2,1) plt.plot(df[train/box_loss], labelbox_loss) plt.plot(df[train/cls_loss], labelcls_loss) plt.legend() plt.subplot(1,2,2) plt.plot(df[metrics/mAP50(B)], labelmAP50) plt.plot(df[metrics/mAP50-95(B)], labelmAP50-95) plt.legend() plt.savefig(training_curve.png)跑完看曲线如果 mAP50 在 0.6 以上说明模型基本学到了东西。如果 people 类的 AP 明显低于其他类那就是小目标问题可以考虑增大 imgsz 或者用 yolov8m/l 更大的模型。confusion_matrix.png 能直观看到哪两类容易混tractor 和 van 在俯视图下确实容易混淆如果混淆严重可以在数据增强里加一点旋转和缩放。4. 避坑与排查这份数据集训练时最容易翻车的五个点4.1 路径配置错误导致训练直接报错现象运行训练命令后报FileNotFoundError或AssertionError: train: No labels found。原因data.yaml 里的路径是相对路径YOLO 解析时是相对于 ultralytics 的 datasets 目录不是你的当前工作目录。解决把 data.yaml 里的路径改成绝对路径或者用path字段指定根目录。我一般直接写绝对路径省得来回折腾。4.2 验证集指标虚高但实际推理效果差现象训练完 mAP50 有 0.8但拿新图片推理时漏检严重。原因train 和 val 里存在同一架次的相邻帧模型相当于在验证集上“见过”相似画面。解决按架次划分 train/val比如 DJI_0011 和 DJI_0016 做训练DJI_0017 做验证。如果原始划分已经混了可以手动重新分。4.3 people 类小目标召回率极低现象car 和 tractor 检测正常people 几乎检不到。原因people 在 640 输入下可能只有几个像素特征金字塔底层信息丢失严重。解决把 imgsz 提到 1024 或 1280或者在训练时开启mosaic1.0和scale0.5增强小目标样本。如果还不行换 yolov8m 或加 P2 检测层。4.4 显存溢出导致训练中断现象训练几轮后报CUDA out of memory。原因batch 太大或 imgsz 太高显存不够。解决先把 batch 降到 8 或 4再不行就降 imgsz。YOLOv8 支持ampTrue混合精度默认开启如果关了可以重新打开省显存。4.5 标注文件里有空文件或格式错误现象训练时警告Ignoring corrupted label或某张图没有对应标注。原因标注过程中可能产生了空 txt 或坐标超出 0~1 范围。解决写个脚本扫一遍 labels 目录检查空文件和坐标越界import os label_dir dataset1/train/labels bad [] for f in os.listdir(label_dir): path os.path.join(label_dir, f) if os.path.getsize(path) 0: bad.append((f, empty)) continue with open(path) as fp: for i, line in enumerate(fp): parts line.strip().split() if len(parts) ! 5: bad.append((f, fline{i} format)) continue vals list(map(float, parts[1:])) if any(v 0 or v 1 for v in vals): bad.append((f, fline{i} range)) print(bad)跑完把 bad 列表里的文件处理掉该删的删该重标的重标。5. 进阶技巧用置信度门限和 TTA 把农机检测调到能用训练完模型只是第一步真正部署到无人机巡检或边缘设备上推理阶段的调参往往比训练更影响最终效果。YOLOv8 推理时有两个参数值得反复调conf和iou。conf 是置信度门限低于这个值的框直接丢弃iou 是 NMS 的 IoU 阈值控制重叠框的合并程度。yolo detect predict \ modelfarm_runs/exp1/weights/best.pt \ source./dataset1/test/images \ conf0.35 \ iou0.5 \ saveTrue \ save_txtTrueconf 设 0.35 是我在农场场景下比较常用的起点。设太高会漏掉小目标设太低会引入大量误检。你可以从 0.25 到 0.5 之间扫一遍看 PR 曲线找平衡点。iou 设 0.5 对密集目标比较友好如果农机扎堆可以降到 0.4 减少漏合并。另一个提点的手段是 TTATest Time AugmentationYOLOv8 推理时加augmentTrue会做多尺度翻转增强再合并结果对小目标和遮挡目标有一定提升代价是推理速度慢 2~3 倍。边缘设备上慎用服务器端可以开。from ultralytics import YOLO model YOLO(farm_runs/exp1/weights/best.pt) results model.predict( source./dataset1/test/images, conf0.35, iou0.5, augmentTrue, saveTrue )跑完对比一下开 TTA 和不开的检测结果如果 people 类召回明显提升且误检没暴增那就值得开。如果速度要求高还是老老实实调 conf。最后说一个我自己的习惯每次训完模型不管指标多好看我都会拿 test 集里最暗、最模糊、目标最密集的几张图单独跑一遍肉眼过一遍检测框。指标是给论文看的实际能不能用眼睛说了算。从那以后我每次部署前都强制走一遍这个肉眼验证翻车次数少了很多。希望帮到你。本文还有配套的精品资源点击获取
返回列表