ARTICLE DETAIL

资讯详情

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

农场航拍目标检测数据集:1000张VisDrone标注与YOLO训练实战

农场航拍目标检测数据集:1000张VisDrone标注与YOLO训练实战 简介这份资源是面向无人机俯视视角下农场场景的目标检测数据集适合从事农业智能化、无人机巡检及YOLO系列算法实践的开发者与研究者使用可解决农场中车辆、农机与行人检测任务缺乏标注数据的问题。压缩包共约2000个文件包含497张jpg图像、1502个txt标注文件及1个yaml配置文件整体约522.36MB目录已按train、val、test划分完毕data.yaml中定义了car、people、tractor、van四类目标yolov5、yolov7、yolov8等算法可直接加载训练。目前已有452人学习下载。数据集覆盖多段无人机视频抽帧图像标注格式规范省去自行采集与标注成本读者可快速复现检测流程、验证模型效果并在此基础上调整类别或扩充样本适用于课程设计、科研实验与算法对比等场景。1. 农场航拍目标检测数据集1000 张 VisDrone 风格标注与 YOLO 开箱训练拿到一份无人机俯拍农场的数据集第一反应往往不是兴奋而是怀疑这玩意儿标注到底靠不靠谱类别是不是只有车和行人train/val/test 有没有真的划好还是随便切两刀我拆过不少所谓「YOLO 即插即用」的数据包十有八九在 data.yaml 路径上翻车。这份 VisDrone-农场中农业机械目标检测数据集-yolo-1.zip 算是少见的规矩货1000 多张 DJI 无人机俯视帧标注覆盖 car、people、tractor、van 四类目录已经按 train/valid/test 分好data.yaml 直接给到yolov5、yolov7、yolov8 拉起来就能训。它解决的是农业场景里「农机和行人混在一起、俯视小目标密集」这类检测需求适合做智慧农业巡检、农机调度统计、田间安全监控的从业者也适合想拿真实航拍数据练 YOLO 全流程的人。下面我按自己复现的顺序把这份资源从结构到训练到踩坑讲透。2. 拆包看结构data.yaml 与四类标签的对应关系2.1 目录布局与文件命名规律先把压缩包解开别急着丢进训练脚本。这份数据集的目录是标准 YOLO 布局train、valid、test 三个子集各自带 images 和 labels 两个文件夹。图片命名是 DJI_0017_frame60_jpg.rf.d471ef262b540d39849b2759a87d7c7b.jpg 这种格式前缀 DJI_00xx 是无人机架次编号frame 后面跟的是抽帧序号中间那段 rf 加哈希是标注工具导出时生成的唯一标识。这个命名规律有用同一架次、相邻帧的图片往往场景高度相似做数据划分时如果随机切容易把同一段视频的相邻帧同时分进 train 和 val造成验证集虚高。这份数据集已经划好了省了这一步但你如果要自己扩数据得记住按架次切而不是按帧随机切。目录结构大致是这样VisDrone-农场农机/ ├── data.yaml ├── train/ │ ├── images/ # 训练图片 │ └── labels/ # 对应 txt 标注 ├── valid/ │ ├── images/ │ └── labels/ └── test/ ├── images/ └── labels/data.yaml 里写的是names: [car, people, tractor, van] train: ./train/images val: ./valid/images test: ./test/image这里有个细节要盯住test 路径写的是./test/image少了个 s。多数 YOLO 版本在只做训练和验证时不读 test 字段所以不影响训练但你要是跑 test 推理或者用某些脚本自动加载 test 集就会报路径不存在。常见做法是手动改成./test/images或者确认你的 test 文件夹实际就叫 image。我一般会先ls一遍确认再决定改 yaml 还是改文件夹名。2.2 四个类别的标注边界与易混点names 里四类car、people、tractor、van。看着简单实际标注时最容易混的是 car 和 van以及 tractor 和某些大型农用车辆。俯视视角下van 通常比 car 长、车顶更方tractor 则带明显的农机特征比如后部作业装置、顶棚结构。但航拍分辨率有限时一辆停在田边的白色面包车和一辆 SUV 在 640 像素缩放下可能只差十几个像素标注一致性就成了模型上限的关键。这份数据集来自 VisDrone 风格的标注流程类别定义相对克制没有把 truck、bus 单独拆出来而是归到 van 或 car这对农业场景是合理的——田间主要就是乘用车、面包车、拖拉机和走动的人。训练前建议做一次类别分布统计看看四类是否均衡。农业场景里 people 和 tractor 往往偏少car 和 van 偏多直接训会导致模型对拖拉机和行人召回偏低。统计脚本可以这样写import os from collections import Counter label_dir train/labels counter Counter() for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f)) as fp: for line in fp: cls int(line.split()[0]) counter[cls] 1 names [car, people, tractor, van] for i, n in enumerate(names): print(f{n}: {counter[i]})这段逻辑很直白遍历 train/labels 下每个 txt取每行第一个字段就是类别 id累加计数。跑完你就能看到四类的实例数。如果 tractor 或 people 明显少于其他类后面训练时要么加类别权重要么做过采样否则 mAP 会被多数类拉偏。参数上类别 id 必须和 data.yaml 的 names 顺序严格一致顺序错了模型学出来的标签就是错的这种错误在训练 loss 上不一定明显但推理时会把拖拉机框成 car。2.3 标注格式确认YOLO txt 的五列含义每张图对应一个同名 txt每行五列class_id x_center y_center width height后四个都是归一化到 0 到 1 的相对值。这是 YOLO 标准格式yolov5 到 yolov8 都直接吃。但要注意有些导出工具会写成绝对像素坐标或者把类别写成字符串这份数据集从命名和 yaml 看是标准归一化格式不过我还是建议抽几张验证一下import os label_dir train/labels for f in os.listdir(label_dir)[:5]: if not f.endswith(.txt): continue with open(os.path.join(label_dir, f)) as fp: lines fp.readlines() print(f, -, len(lines), objects) for line in lines[:3]: vals line.split() print( cls:, vals[0], coords:, [round(float(v), 3) for v in vals[1:]])如果打印出来的坐标都在 0 到 1 之间说明格式没问题如果出现几百上千的数值那就是绝对坐标需要自己转归一化。这个检查花不了一分钟但能避免训到一半发现框全飘了。另外注意空 txt 文件有些图片没有目标对应 txt 是空的这是正常的YOLO 会当作背景图处理不要删。3. 从零跑通训练yolov8 配置、命令与参数调优3.1 环境准备与依赖版本这份数据集官方说 yolov5、yolov7、yolov8 都能直接训我一般先用 yolov8 跑基线因为它的 CLI 最省事依赖也相对干净。环境用 Python 3.9 到 3.11 都行太新或太旧容易在 torch 版本上卡住。安装命令pip install ultralyticsultralytics 会自动带上 torch、torchvision 和 opencv 这些依赖。如果你机器上有 CUDA装完确认一下python -c import torch; print(torch.cuda.is_available())输出 True 才说明 GPU 可用。没有 GPU 也能训但 1000 张图在 CPU 上跑 100 轮可能要几个小时不划算。显存方面yolov8n 在 640 分辨率、batch 16 下大概占 4 到 6 GB8 GB 显存的卡够用如果上 yolov8m 或更大batch 要降到 8 甚至 4。3.2 data.yaml 路径修正与训练命令前面提到 test 路径少个 s训练前先改掉或者确认文件夹名。然后建一个训练脚本from ultralytics import YOLO model YOLO(yolov8n.pt) # 用预训练权重起步 results model.train( dataVisDrone-农场农机/data.yaml, epochs100, imgsz640, batch16, device0, workers4, projectruns/farm, nameyolov8n_baseline, patience20, lr00.01, lrf0.01, augmentTrue, )逐项说下参数。data指向你的 data.yaml路径别写错相对路径是相对你运行脚本的目录。epochs100是上限配合patience20如果 20 轮验证 mAP 没提升就早停省时间。imgsz640是 YOLO 默认输入尺寸航拍小目标多的话可以试 1024但显存和速度要权衡。batch16按显存调爆显存就减半。device0指定第一块 GPU多卡可以写device0,1。lr00.01是初始学习率lrf0.01是最终学习率系数YOLO 默认余弦退火这两个值对航拍数据一般够用。augmentTrue开启内置增强包括 mosaic、HSV 抖动、翻转等对小目标检测帮助明显。如果你用 yolov5命令类似把模型换成 yolov5s.pt训练脚本用 train.py参数名基本对应。yolov7 也差不多但依赖版本更挑建议单独建环境。3.3 训练过程监控与关键指标解读训练启动后控制台会打印每轮的 box_loss、cls_loss、dfl_loss 和验证集的 precision、recall、mAP50、mAP50-95。前几轮 loss 下降快是正常的重点看 mAP50 有没有稳步上升。航拍农场数据里car 和 van 的 AP 通常最高tractor 和 people 偏低如果 people 的 AP 长期低于 0.3就要考虑是不是小目标太多、分辨率不够或者标注里行人框太小被 mosaic 增强切没了。训练完在runs/farm/yolov8n_baseline/下会有 weights/best.pt 和 last.pt以及 results.csv 和混淆矩阵图。results.csv 可以直接用 pandas 读出来画曲线import pandas as pd df pd.read_csv(runs/farm/yolov8n_baseline/results.csv) print(df[[epoch, metrics/mAP50(B), metrics/mAP50-95(B)]].tail(10))看最后 10 轮的 mAP 是否还在涨如果已经平了说明 100 轮够了如果还在涨可以加轮次。混淆矩阵能告诉你哪两类在互相误判比如 car 被预测成 van 的比例高那就说明这两类特征在俯视下确实难分后续要么加数据要么在推理后处理里做规则约束。3.4 推理验证与结果可视化训完拿 best.pt 跑几张验证图看看效果from ultralytics import YOLO model YOLO(runs/farm/yolov8n_baseline/weights/best.pt) results model.predict( sourceVisDrone-农场农机/valid/images, conf0.25, iou0.45, saveTrue, projectruns/farm, nameval_pred, )conf0.25是置信度阈值低于这个的框不输出iou0.45是 NMS 的 IoU 阈值控制重叠框合并。航拍小目标密集时iou 可以适当调低到 0.4避免相邻农机被合并。saveTrue会把画框后的图存到 runs/farm/val_pred 下直接翻图看有没有漏检和误检。重点看拖拉机在田埂边、行人在树荫下这两类场景这是这份数据集里最容易翻车的地方。4. 避坑与排查路径、显存、类别不均衡的常见翻车4.1 现象训练报 FileNotFoundError找不到 test/image原因data.yaml 里 test 路径写的是./test/image而实际文件夹叫 images或者反过来。YOLO 在训练阶段通常不读 test但某些版本或某些脚本会在初始化时校验所有路径。解决先ls确认实际文件夹名然后把 data.yaml 的 test 字段改成一致。如果 test 集暂时不用也可以把 test 那行删掉或注释但注意 YAML 注释用 #。4.2 现象CUDA out of memorybatch 16 跑不动原因显存不够可能是图片分辨率高、模型大或者 workers 太多导致数据加载占用额外显存。解决先把 batch 降到 8 或 4再把 imgsz 从 640 降到 512 试试。workers 从 4 降到 2 也能缓解。如果还不行换 yolov8n 这种小模型。别硬扛爆显存时训练中断前面的 epoch 白跑。4.3 现象mAP 看着不低但推理时拖拉机全漏原因类别不均衡tractor 实例数远少于 car模型倾向于把不确定的框判成多数类或者直接不输出。也可能是 tractor 的标注框偏小被增强切掉。解决先跑 2.2 的统计脚本确认实例数。如果 tractor 确实少训练时加cls1.5之类的类别权重YOLOv8 里可以通过自定义 loss 或过采样实现或者把 tractor 图片复制多份进 train。另一个办法是关掉 mosaic 的最后 10 轮让模型在真实分布上微调YOLOv8 有close_mosaic参数设成 10 表示最后 10 轮关闭 mosaic。4.4 现象验证集 mAP 很高但换一批新架次的图就崩原因数据划分时同一架次的相邻帧被分进了 train 和 val验证集和训练集高度相似指标虚高。这份数据集已经划好但如果你自己扩数据或重新切分很容易犯这个错。解决按 DJI_00xx 架次编号分组整组进 train 或 val不要按帧随机切。检查方法是看 val 里的文件名前缀是否在 train 里也大量出现如果是就说明泄漏了。4.5 现象训练 loss 正常下降但验证 mAP 一直是 0原因最常见的是 label 路径不对YOLO 找不到标注把所有图当背景训了。也可能是类别 id 超出 names 长度比如标注里出现 4 或 5但 names 只有 4 类。解决检查 labels 文件夹是否和 images 同级且同名对应。再抽查几个 txt确认类别 id 只在 0 到 3 之间。如果 id 越界要么改标注要么在 data.yaml 里补上对应类别名。5. 进阶技巧用 1024 分辨率与切片推理榨干小目标召回基线跑通后真正决定这份数据集上限的是小目标召回。农场航拍里行人和远处农机在 640 分辨率下可能只有十几个像素YOLO 的 stride 下采样后特征几乎消失。我一般会做两件事一是把训练分辨率提到 1024二是推理时用切片辅助。训练改分辨率很简单把imgsz640改成imgsz1024但 batch 要相应降到 8 或 4否则显存爆炸。1024 下训练时间大概翻倍但 people 和 tractor 的 AP 通常能涨 5 到 10 个点。如果显存实在不够可以试 768 折中。切片推理SAHI 思路是在推理阶段把大图切成带重叠的小块分别检测再合并。ultralytics 本身不直接带但可以手动实现简化版import cv2 from ultralytics import YOLO model YOLO(runs/farm/yolov8n_baseline/weights/best.pt) img cv2.imread(valid/images/DJI_0017_frame60_jpg.rf.d471ef262b540d39849b2759a87d7c7b.jpg) h, w img.shape[:2] tile 640 overlap 128 boxes [] for y in range(0, h, tile - overlap): for x in range(0, w, tile - overlap): crop img[y:ytile, x:xtile] if crop.shape[0] 32 or crop.shape[1] 32: continue res model.predict(crop, conf0.25, verboseFalse)[0] for b in res.boxes: xyxy b.xyxy[0].cpu().numpy() xyxy[0] x xyxy[1] y xyxy[2] x xyxy[3] y boxes.append((xyxy, float(b.conf[0]), int(b.cls[0]))) # 这里再对 boxes 做一次全局 NMS省略具体实现 print(total boxes:, len(boxes))逻辑是把原图按 640 窗口、128 重叠滑动切块每块单独推理再把框坐标加回原图偏移。重叠是为了避免目标被切在边界上漏检。最后需要自己做一次 NMS 去重否则同一个目标会在相邻块里被检多次。这套做法对行人和远处拖拉机提升明显代价是推理时间成倍增加实时场景要权衡。另一个技巧是验证时用conf0.1低阈值跑一遍看召回上限在哪。如果低阈值下 people 还是漏那就是模型特征能力不够得换更大模型或加数据如果低阈值下召回够了但误检多那就是阈值和后处理的问题调 NMS 和 conf 就能解决。我习惯在最终交付前把 conf 从 0.1 到 0.5 扫一遍画 precision-recall 曲线选 F1 最高的点作为部署阈值。从那以后我每次拿到新数据集都强制先跑一遍类别统计和路径校验再开始训练省得训到一半才发现标签对不上。希望帮到你。本文还有配套的精品资源点击获取
返回列表