尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

无人机俯拍车辆行人检测:YOLO数据集开箱与训练避坑指南

发布时间:2026/9/23 18:48:28

资讯中心
01
ARTICLE

无人机俯拍车辆行人检测:YOLO数据集开箱与训练避坑指南

无人机俯拍车辆行人检测:YOLO数据集开箱与训练避坑指南
简介这份资源是面向无人机俯视视角目标检测任务的YOLO格式数据集适合从事车辆与行人检测的算法工程师、研究生及竞赛选手使用可解决航拍场景下小目标密集、视角特殊导致的标注数据匮乏问题。压缩包共2000个文件包含1648个txt标注文件、351张jpg航拍图像和1个yaml配置文件整体约850.13MB标注与图像一一对应可直接用于训练与验证。目录已按train、valid、test划分完毕data.yaml中定义car与person两类yolov5、yolov7、yolov8等主流框架无需额外转换即可开箱训练。目前已有1679人学习下载配套博文提供了检测结果参考便于读者快速评估数据质量与模型表现。对于需要搭建无人机视觉检测基线、验证算法在俯视小目标场景下泛化能力的读者这份数据集能显著节省数据采集与标注成本是开展相关实验的实用起点。1. 无人机俯拍车辆行人检测这份 YOLO 数据集到底能不能直接开训拿到一份标注好的数据集最怕的不是模型不收敛而是目录结构对不上、标签格式错位、train 和 val 的分布差出一大截。这次拆的vis-drone-yolov5-dataset-1.zip就是冲着「省掉清洗环节」来的1000 多张无人机俯视视角的车辆和行人图像已经按 YOLO 标准切好 train / valid / test附data.yaml类别只有car和person两类。它解决的是从零采集航拍数据、逐帧标注、再划分集合这条最耗时的链路适合做无人机视觉感知、小目标检测验证、YOLOv5/v7/v8 快速起训的从业者。下面按「结构核对 → 训练落地 → 踩坑排查 → 进阶技巧」把这份资源走一遍。2. 目录结构与 data.yaml先核对再动手2.1 解压后应该看到什么数据集的价值一半在标注一半在目录约定。YOLO 系列对路径的容忍度很低data.yaml里写的是相对路径训练脚本的工作目录一变报错就跟着来。先把压缩包解开确认三件事图像和标签是否成对、data.yaml的路径是否指向真实存在的文件夹、类别顺序是否和标签文件里的 class id 对齐。# 解压并查看顶层结构 unzip vis-drone-yolov5-dataset-1.zip -d vis-drone-dataset cd vis-drone-dataset find . -maxdepth 2 -type d | sort # 统计各集合图像数量确认 train/val/test 都有货 for d in train valid test; do echo -n $d images: ls $d/images 2/dev/null | wc -l done这段命令先看目录层级再数每个集合的图像数。正常情况train/images是主力valid/images和test/images各占一小部分。如果某个集合数量为 0说明解压不完整或者路径名和data.yaml不一致常见的是valid被写成val。2.2 data.yaml 的字段逐行读摘要里给出的配置是标准写法names: [car, person] train: ./train/images val: ./valid/images test: ./test/imagesnames的顺序就是类别 id 的映射car是 0person是 1。标签文件里每行的第一个数字必须落在这两个值里出现 2 就说明标注阶段类别表被改过。train/val/test用的是相对路径相对的是你启动训练时的当前目录不是data.yaml所在目录——这是新手最容易翻车的地方。稳妥做法是把data.yaml放在数据集根目录训练时cd到根目录再执行或者把路径改成绝对路径。# 抽查标签文件确认 class id 只在 0/1 范围内 head -n 3 train/labels/$(ls train/labels | head -n 1) # 输出形如0 0.512 0.634 0.041 0.088 # 依次是 class_id x_center y_center width height均为归一化值YOLO 标签是归一化后的x_center y_center width height取值 0~1。如果看到大于 1 的数说明标注工具导出的是像素坐标需要转换。这份数据集既然声明可直接训练抽查几份确认在范围内即可不必全量校验。2.3 类别不平衡与场景分布只有car和person两类但无人机俯拍场景里两者的出现频率往往差很多车辆成排出现行人零星分布。训练前建议快速统计一下两类框的数量比心里有数才能判断后面 mAP 波动是不是数据本身导致的。import os, glob from collections import Counter counter Counter() for lbl in glob.glob(train/labels/*.txt): with open(lbl) as f: for line in f: if line.strip(): counter[int(line.split()[0])] 1 print(counter) # 例如 Counter({0: 4200, 1: 900})Counter统计的是标注框数量而非图像数量。如果person框数明显偏少训练时可以考虑对含行人的图像做重采样或者调低person的置信度阈值来观察召回。这一步不改变数据只是让你在调参时有个基准。3. 用 YOLOv5 跑通第一轮训练3.1 环境与依赖YOLOv5 对 PyTorch 和 CUDA 版本敏感建议用 conda 隔离环境避免和系统里的其他框架打架。下面这套是常见组合具体 CUDA 版本按你显卡驱动来定。conda create -n drone-yolo python3.9 -y conda activate drone-yolo git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txtrequirements.txt会拉取匹配的 torch 版本。如果机器有 NVIDIA 显卡装完后用python -c import torch; print(torch.cuda.is_available())确认返回True否则训练会退回 CPU速度差一个数量级。3.2 启动训练与关键参数把数据集根目录和data.yaml的路径对齐后就可以起训。下面这条命令是无人机小目标场景下比较稳的起点python train.py \ --data ../vis-drone-dataset/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --hyp data/hyps/hyp.scratch-low.yaml \ --name drone_car_person--img 640是输入分辨率无人机俯拍目标偏小如果显存允许可以提到 1024小目标召回会更好但显存占用接近翻倍。--batch 16按显存调爆显存就降到 8。--hyp选hyp.scratch-low.yaml是因为这份数据规模不大低增强策略能减少过拟合。--weights yolov5s.pt用预训练权重做迁移比从零训收敛快得多。3.3 训练过程看什么指标训练日志里重点盯三个box_loss、obj_loss和验证集的mAP0.5。前两个持续下降是正常如果obj_loss震荡剧烈多半是学习率或 batch 设置问题。mAP0.5在 30 个 epoch 后应该开始爬升如果一直贴着 0先回去查标签格式和data.yaml路径而不是急着换模型。# 训练结束后用验证集跑一次评估 python val.py \ --data ../vis-drone-dataset/data.yaml \ --weights runs/train/drone_car_person/weights/best.pt \ --img 640val.py会输出每一类的 precision、recall 和 mAP。车辆通常比行人好检因为纹理和尺寸更稳定行人如果 mAP 明显偏低考虑提高输入分辨率或单独看几张漏检图定位原因。4. 避坑与排查这几处最容易翻车4.1 路径报错No such file or directory现象是训练刚启动就报找不到图像或标签。原因几乎都是data.yaml里的相对路径和当前工作目录不匹配。解决方式有两种把data.yaml里的路径改成绝对路径或者训练前cd到数据集根目录用--data data.yaml启动。我一般选后者路径短、迁移到别的机器时只改一处。4.2 标签类别越界Label class 2 is not in the model现象是训练中途报类别 id 超出names范围。原因是标签文件里出现了 0 和 1 以外的数字通常是标注时类别表被改过又没同步。解决方式是全量扫一遍标签把越界的行找出来。# 找出所有含非法 class id 的标签行 grep -rE ^[2-9] train/labels valid/labels test/labels | head定位到具体文件后要么修正类别 id要么把该文件从训练集移除。别直接忽略越界标签会让损失计算直接崩。4.3 显存溢出CUDA out of memory现象是训练几个 batch 后报显存不足。原因是--img或--batch设得太大。解决顺序是先降--batch到 8 或 4还不行再降--img到 512。另外 YOLOv5 的--cache参数会把图像缓存到内存数据量大时反而拖慢小数据集可以开1000 多张这个量级开--cache收益有限。4.4 验证集 mAP 远低于训练集现象是训练 loss 降得很好但验证 mAP 上不去。原因是 train 和 valid 的场景分布差异大或者验证集里某些类别样本太少。解决方式是先可视化几张验证集的预测结果看是漏检还是误检。漏检多就提高输入分辨率误检多就调高置信度阈值。这份数据集已经划分好集合如果分布确实偏可以手动重划但要在data.yaml里同步改路径。4.5 图像和标签文件名对不上现象是训练时提示某张图没有对应标签。原因是图像和标签的 basename 必须一致只是扩展名不同。解决方式是写个脚本核对两边文件名集合的差集。import os imgs {os.path.splitext(f)[0] for f in os.listdir(train/images)} lbls {os.path.splitext(f)[0] for f in os.listdir(train/labels)} print(缺标签的图:, imgs - lbls) print(缺图的标签:, lbls - imgs)差集为空才说明配对完整。有缺失就补标或删图别让训练脚本自己跳过跳过多了等于悄悄改了数据分布。5. 进阶小目标检测的输入分辨率与切片推理无人机俯拍的行人和车辆在 640 分辨率下往往只占几十个像素属于典型小目标。除了把--img提到 1024还有一个更彻底的做法是切片推理把大图切成带重叠的小块分别检测再合并结果。这对高分辨率航拍图效果明显代价是推理时间成倍增加。# 简易切片推理示意按 640 切块重叠 128 像素 import cv2 img cv2.imread(frame_002048.jpg) h, w img.shape[:2] tile, overlap 640, 128 step tile - overlap for y in range(0, h, step): for x in range(0, w, step): patch img[y:ytile, x:xtile] if patch.shape[0] tile or patch.shape[1] tile: continue # 送入模型推理记录框坐标并加上 (x, y) 偏移 # results model(patch)切片的关键参数是tile和overlap。tile跟训练分辨率对齐overlap用来避免目标被切在边界上。合并时用 NMS 去掉重叠框。这套流程在无人机视觉感知里很常见但要注意推理耗时实时场景慎用。另一个技巧是验证阶段用--conf-thres和--iou-thres扫一遍找到适合这份数据的阈值组合。车辆和行人的最优阈值往往不同如果业务上更看重行人召回就把person的置信度阈值单独调低。我一般会在验证集上跑几组阈值把结果记在表格里对比而不是凭感觉设一个数。参数建议起点调整方向img640小目标漏检多提到 1024batch16爆显存降到 8 或 4conf-thres0.25误检多调高漏检多调低iou-thres0.45重叠目标多适当调高从那以后我每次拿到新数据集都强制先跑一遍文件名配对和类别范围检查再启动训练。这两步花不了几分钟但能省掉后面几小时的无效等待。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。