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

无人机俯拍车辆行人检测:YOLOv5俯视数据集训练与调优实战

发布时间:2026/9/23 17:00:12

资讯中心
01
ARTICLE

无人机俯拍车辆行人检测:YOLOv5俯视数据集训练与调优实战

无人机俯拍车辆行人检测:YOLOv5俯视数据集训练与调优实战
简介这份资源是面向无人机俯视视角目标检测任务的YOLO格式数据集适合从事车辆与行人检测的算法工程师、高校学生及竞赛选手使用可解决航拍场景下小目标密集、遮挡严重等训练数据匮乏问题。压缩包共2000个文件包含1648个txt标注文件、351张jpg航拍图像及1个yaml配置文件整体约850.13MB标注与图像一一对应覆盖car与person两类目标。目录已按train、valid、test划分完毕并附带data.yamlyolov5、yolov7、yolov8等主流框架可直接读取训练无需二次整理。目前已有1679人学习下载配套博文提供了数据集说明与检测结果参考。读者拿到后可直接复现训练流程用于验证模型在俯视小目标场景下的精度表现也可作为课程设计、论文实验或算法对比的基准数据目录结构清晰便于快速上手与迁移。1. 无人机俯拍下的车辆与行人为什么通用 YOLOv5 权重一上天空就翻车把摄像头从地面挪到几十米高空俯视角度下的车辆和行人会变成几十个像素的色块通用 COCO 权重直接推理漏检和误检会同时飙升。vis-drone-yolov5-dataset-1.zip 这个数据集要解决的正是无人机俯视视角下车辆与行人目标检测的域偏移问题——它把训练数据锁定在航拍俯视场景让 YOLOv5 在这个特定视角下重新收敛。如果你手上有无人机巡检、交通流量统计、园区人流监控这类需求又不想从零标注几万张图这个方向值得认真走一遍。下面按「数据集长什么样 → 怎么接进 YOLOv5 → 参数怎么调 → 坑在哪」的顺序拆开讲新手能照着跑通熟手能直接看到边界条件。2. 先看清 vis-drone-yolov5-dataset-1.zip 里到底装了什么2.1 俯视视角带来的三个检测难点无人机俯拍和地面平视是两种完全不同的成像条件。地面视角下行人高度约占画面三分之一车辆能看到完整侧面俯视视角下一个行人可能只有 20×40 像素车辆只剩车顶轮廓纹理信息几乎消失。这直接导致三个问题第一小目标占比极高YOLOv5 默认的 P3 特征层感受野偏大小目标特征容易被背景淹没第二目标方向任意车辆朝向在画面里旋转了 360 度水平锚框匹配效率下降第三背景干扰强路面、屋顶、树冠在俯视下颜色和纹理接近模型容易把阴影当成目标。vis-drone-yolov5-dataset-1.zip 的价值就在于它把训练样本全部约束在俯视域内让模型不用再花容量去拟合地面视角的分布。常见做法是直接拿 COCO 预训练权重做初始化然后在俯视数据上微调但微调前必须确认数据集的标注格式和类别定义。2.2 数据集目录结构与标注格式核对拿到压缩包后先别急着解压到训练目录第一步是核对内部结构。典型的 YOLOv5 格式数据集应该包含 images 和 labels 两个平行目录每个目录下再分 train、val、test 子集图片和标注文件同名不同后缀。用下面这段脚本快速统计类别分布和标注框尺寸判断是否和你的任务匹配。import os import yaml from pathlib import Path from collections import Counter # 指向解压后的数据集根目录 root Path(vis-drone-yolov5-dataset-1) label_dir root / labels / train img_dir root / images / train cls_counter Counter() wh_list [] for lbl in label_dir.glob(*.txt): with open(lbl) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue c, x, y, w, h int(parts[0]), *map(float, parts[1:]) cls_counter[c] 1 wh_list.append((w, h)) print(类别分布:, dict(cls_counter)) if wh_list: avg_w sum(w for w, _ in wh_list) / len(wh_list) avg_h sum(h for _, h in wh_list) / len(wh_list) print(f平均归一化宽高: {avg_w:.4f} x {avg_h:.4f}) small sum(1 for w, h in wh_list if w * h 0.01) print(f小目标占比(面积1%): {small / len(wh_list):.2%})这段脚本做三件事统计每个类别的实例数判断是否存在类别极度不平衡计算归一化宽高的均值如果平均面积小于 0.01说明小目标占主导后续锚框和输入尺寸都要针对性调整输出小目标占比超过 60% 就要考虑加 P2 检测层。参数上root 指向解压目录如果你的压缩包解压后多了一层文件夹需要手动对齐路径。类别编号从 0 开始连续如果发现跳号说明 data.yaml 里的 names 列表顺序和标注不一致这是最常见的翻车点之一。2.3 生成 data.yaml 与路径校验YOLOv5 训练依赖一个 data.yaml 描述文件里面写清楚 train、val 路径和类别名。路径建议用绝对路径避免从不同工作目录启动时找不到文件。下面是一个针对俯视数据集的模板。# data_drone.yaml path: /data/vis-drone-yolov5-dataset-1 train: images/train val: images/val test: images/test nc: 2 names: [vehicle, pedestrian]写完后用一行命令校验图片和标注是否一一对应缺失标注的图片会在训练时被静默跳过导致实际训练集缩水。# 检查每张图是否有对应标注输出缺失列表 for img in /data/vis-drone-yolov5-dataset-1/images/train/*.jpg; do lbl${img/images/labels} lbl${lbl%.jpg}.txt [ -f $lbl ] || echo 缺失标注: $img done | head -20如果输出大量缺失说明标注文件后缀不是 .txt 或者目录层级不对。这一步花两分钟能省掉训练半小时后才发现 mAP 异常的血泪经验。3. 把俯视数据集接进 YOLOv5从环境到首轮训练3.1 环境配置与依赖版本锁定YOLOv5 对 PyTorch 和 CUDA 版本比较敏感建议用 conda 建独立环境避免和系统里其他深度学习项目冲突。下面这套组合在多数 NVIDIA 显卡上验证过显存 8GB 以上就能跑通 batch size 16。conda create -n drone_yolo python3.9 -y conda activate drone_yolo pip install torch1.13.1cu117 torchvision0.14.1cu117 --extra-index-url https://download.pytorch.org/whl/cu117 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt参数说明python 3.9 是兼容性最好的版本3.11 以上部分依赖轮子不全torch 1.13.1 对应 cu117如果你的驱动只支持 cu116把索引地址换成 cu116 即可。装完后用python -c import torch; print(torch.cuda.is_available())确认输出 True否则后面训练会退回 CPU速度差几十倍。3.2 用预训练权重启动首轮微调俯视数据集通常几千到几万张从零训练收敛慢且容易过拟合标准做法是加载 COCO 预训练权重做迁移学习。首轮训练命令如下重点看几个参数怎么定。python train.py \ --data data_drone.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --hyp data/hyps/hyp.scratch-low.yaml \ --name drone_v1逐项说明--weights yolov5s.pt用 s 版本起步参数量小、推理快适合无人机端侧部署--img 640是输入分辨率俯视小目标多的话可以提到 1280但显存占用翻四倍--hyp hyp.scratch-low.yaml是低学习率增强配置微调场景比默认配置更稳--name drone_v1指定输出目录方便对比多轮实验。首轮跑完看 results.csv 里的 mAP0.5如果低于 0.3先别调模型回头检查标注质量和类别映射。3.3 锚框重聚类俯视目标尺寸和 COCO 差多少YOLOv5 默认锚框是在 COCO 上聚类得到的俯视车辆和行人的宽高比与地面视角差异明显直接沿用会导致正样本匹配率低。用内置的 k-means 脚本在自有标注上重新聚类通常能带来 2 到 5 个点的 mAP 提升。python utils/autanchor.py \ --data data_drone.yaml \ --img-size 640 \ --thr 4.0 \ --n 9 \ --output data/anchors_drone.yaml--thr 4.0是宽高比阈值俯视目标旋转多可以放宽到 5.0--n 9输出 9 个锚框对应三个检测层。跑完后把生成的锚框数值填进模型配置文件的 anchors 字段或者训练时用--anchors data/anchors_drone.yaml指定。注意锚框重聚类要在训练集上做用验证集会导致信息泄漏。4. 俯视小目标检测的参数调优与验证方法4.1 输入分辨率与 P2 检测层的取舍俯视场景下小目标占比高最直接的提升手段是提高输入分辨率。把--img从 640 提到 1280小目标在特征图上的像素数翻倍召回率明显上升。但代价是显存和推理延迟1280 输入下 yolov5s 单张推理在 T4 上约 25ms640 下约 8ms。如果部署端算力有限另一个选择是加 P2 检测层在 stride4 的特征图上做检测专门抓小目标。# yolov5s-p2.yaml 关键改动 head: - [-1, 1, Conv, [64, 3, 2]] # P2 - [[-1, 6], 1, Concat, [1]] - [-1, 3, C3, [128, False]] - [[-1, 4], 1, Conv, [256, 3, 2]] # 后续保持原结构检测层从三个变四个加 P2 后参数量和计算量增加约 15%但小目标召回通常能提升 5 到 8 个点。我的习惯是先用 1280 输入跑一版看上限如果延迟可接受就不动结构如果必须压延迟再考虑 P2 加 640 输入的组合。4.2 验证集评估与混淆矩阵解读训练结束后不要只看 mAP 一个数用 val.py 输出每类 AP 和混淆矩阵判断问题出在漏检还是误检。python val.py \ --data data_drone.yaml \ --weights runs/train/drone_v1/weights/best.pt \ --img 1280 \ --conf 0.25 \ --iou 0.5 \ --save-json--conf 0.25是置信度阈值俯视小目标得分普遍偏低可以降到 0.2 看召回变化--iou 0.5是 NMS 的 IoU 阈值车辆密集停放时调低到 0.4 能减少漏检。混淆矩阵里如果 vehicle 大量被判成 background说明正样本匹配不够回去检查锚框如果 vehicle 和 pedestrian 互相混淆说明类别特征区分度不足需要增加难例样本。4.3 数据增强策略俯视场景该开哪些YOLOv5 默认增强里mosaic 和 mixup 对俯视数据帮助很大但旋转和剪切要谨慎。俯视目标本身方向任意随机旋转不会引入不合理样本可以开到 ±30 度剪切增强在俯视下容易把目标切得只剩一半反而制造噪声建议关掉或把比例压到 0.1 以下。# hyp_drone.yaml 关键增强参数 degrees: 30.0 # 旋转角度范围 translate: 0.1 # 平移比例 scale: 0.5 # 缩放比例 shear: 0.0 # 关闭剪切 perspective: 0.0 # 关闭透视变换 mosaic: 1.0 # 开启 mosaic mixup: 0.1 # 轻度 mixupmosaic 把四张图拼成一张等效增加小目标数量和背景多样性对俯视检测收益明显。mixup 用两张图线性叠加能提升模型对遮挡的鲁棒性但比例太高会让小目标更模糊0.1 到 0.2 比较合适。5. 俯视数据集训练中的避坑与排查清单5.1 现象训练 loss 正常下降但 mAP 始终为 0原因data.yaml 里的 names 顺序和标注文件里的类别编号不一致模型学到的类别和评估时对不上。解决用 2.2 节的统计脚本打印类别分布确认标注里出现的编号和 names 列表索引一一对应缺类或多类都要修正。5.2 现象验证集 mAP 比训练集低 20 个点以上原因训练集和验证集来自不同飞行高度或不同区域域差异过大。解决检查两个子集的图片分辨率和目标平均尺寸如果差异明显重新划分数据集保证同一段飞行视频的帧不要同时出现在训练和验证集里避免信息泄漏。5.3 现象推理时车辆密集区域大量漏检原因NMS 的 IoU 阈值过高相邻车辆的检测框被互相抑制。解决把--iou从 0.5 降到 0.4 或 0.35同时把--conf降到 0.2观察召回变化。如果仍然漏检考虑换用 DIoU-NMS 或 soft-NMSYOLOv5 的 val.py 支持通过参数切换。5.4 现象训练到一半显存溢出原因mosaic 增强在后期关闭时输入尺寸不变但 batch 内图片实际像素量变化或者验证阶段 batch size 没同步调小。解决把--batch降到 8或者在训练脚本里设置--noval先跑完训练再单独验证。另外检查--img是否在训练中途被修改分辨率变化会直接撑爆显存。5.5 现象模型在测试集上把树冠阴影识别成车辆原因俯视场景下阴影和车辆顶部的颜色纹理接近训练集中负样本不足。解决收集一批纯背景和阴影图片作为负样本加入训练集标注为空文件即可同时在增强里开启 HSV 色调扰动让模型不过度依赖颜色特征。6. 从能跑到好用俯视检测的进阶技巧与验证习惯首轮训练跑通只是起点真正决定这个方案能不能落地的是推理阶段的工程化处理。俯视视频是连续帧单帧检测结果抖动大我一般会在推理后加一层简单的跟踪平滑用 ByteTrack 或 SORT 把相邻帧的检测框关联起来对同一目标的置信度做滑动平均输出轨迹而不是单帧框。这样即使某一帧漏检轨迹也不会断对交通流量统计这类应用来说稳定性比单帧 mAP 更重要。另一个容易被忽略的点是输入尺寸和部署端的匹配。训练用 1280部署时如果为了速度降到 640mAP 会掉一大截这个落差必须在选型阶段就测出来。我的习惯是训练时同时跑 640 和 1280 两版验证记录各自的 mAP 和延迟再根据部署端算力做取舍而不是训练完才发现精度不够。验证方法上除了标准 mAP建议按目标尺寸分桶统计召回率把验证集标注按面积分成小、中、大三档分别看每档的 AP。俯视场景下小目标 AP 往往比整体 mAP 低 15 个点以上这个数字才是你优化锚框和分辨率的直接依据。如果小目标 AP 长期上不去优先加 P2 层和提升输入分辨率而不是盲目加数据量。最后说一个我踩过的坑有次为了省事直接把地面视角的标注工具默认类别映射用到俯视数据集上结果 vehicle 和 pedestrian 的编号反了训练 loss 正常但推理全错排查了半天才发现是 data.yaml 的 names 顺序写反。从那以后我养成了一个习惯每次新建 data.yaml 后先用统计脚本打印类别分布确认编号和名称对得上再启动训练。这个两分钟的动作帮我省过至少三次通宵排查。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

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

03
WHY YAOTU

想打造同款高转化官网?

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

场景化定制

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

营销型架构

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

全周期服务

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

免费获取你的建站方案

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