ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

无人机俯视小目标检测:YOLOv5训练避坑与调参实战

无人机俯视小目标检测:YOLOv5训练避坑与调参实战 简介这份资源是面向无人机俯视视角目标检测任务的YOLO格式数据集适合从事计算机视觉、智能交通或安防监控方向的研究者与开发者使用可解决车辆与行人两类目标在航拍场景下的训练数据匮乏问题。压缩包共包含2000个文件以1648个txt标注文件、351张jpg图像和1个yaml配置文件为主整体约850.13MB标注与图像一一对应便于直接投入训练。数据集已按train、val、test完成划分并附带data.yaml其中names为car与person两类yolov5、yolov7、yolov8等主流算法均可直接读取训练无需额外整理目录。目前已有1679人学习下载说明其在同类航拍检测任务中具备一定参考价值。对于希望快速验证模型、复现检测效果或开展无人机视角下车辆行人识别实验的读者这份数据能省去采集与标注成本直接进入模型训练与调优环节。1. 无人机俯视视角下的车辆与行人检测为什么通用 YOLOv5 权重一上机就翻车把一台消费级无人机拉到 80 米高空挂上云台往下拍画面里的车只有几十个像素行人更是缩成一团模糊的色块。很多人第一反应是直接拿 COCO 预训练的 YOLOv5 权重跑推理结果 mAP 掉得惨不忍睹——车能勉强框住行人几乎全军覆没。这不是模型不行而是俯视视角 小目标 尺度剧烈变化这三件事叠加在一起把通用检测器的先验彻底打乱了。vis-drone-yolov5-dataset-1.zip 这类数据集要解决的就是这个错位问题它提供的是无人机俯拍场景下已经标注好的车辆和行人框让 YOLOv5 在贴近真实作业域的分布上重新收敛。适合谁用做无人机巡检、交通流量统计、应急搜救、园区安防的工程师以及想入门小目标检测但苦于没有对口数据的学生。这一章先把「为什么必须换数据、换配置」讲透后面几章再落到解压、转换、训练、调参和排错的具体动作上。2. 拆开 vis-drone-yolov5-dataset-1.zip目录结构、标注格式与三个先决判断拿到一个压缩包最忌讳的就是直接unzip然后train.py一把梭。先搞清楚里面装的是什么比调参重要十倍。2.1 俯视数据集的典型目录长什么样无人机视角的数据集常见做法是分成images和labels两个平行目录再各自切train/val/test。解压后先别急着训练用一条命令把结构摸清楚# 先看压缩包内文件清单不解压也能看 unzip -l vis-drone-yolov5-dataset-1.zip | head -50 # 解压到独立目录避免污染当前工作区 mkdir -p ~/datasets/vis-drone \ unzip vis-drone-yolov5-dataset-1.zip -d ~/datasets/vis-drone # 统计图片与标注数量确认是否一一对应 cd ~/datasets/vis-drone find . -name *.jpg -o -name *.png | wc -l find . -name *.txt | wc -l逻辑说明unzip -l先侦察避免解压出一堆嵌套目录图片数和 txt 数必须相等否则说明有图没标或有标没图训练时 YOLOv5 会直接报No labels found。参数上-d指定解压目标养成不往当前目录乱丢的习惯。2.2 标注格式判断YOLO txt 还是 VOC xmlYOLOv5 只认一种标注每张图对应一个同名.txt每行class x_center y_center width height且坐标是归一化到 0~1 的。如果解压出来是Annotations/*.xml那就是 VOC 格式必须先转。判断方法# 看有没有 xml find ~/datasets/vis-drone -name *.xml | head # 看 txt 内容长什么样 head -5 ~/datasets/vis-drone/labels/train/*.txt 2/dev/null如果 txt 里出现大于 1 的数值说明坐标没归一化是像素值需要除以图像宽高。这一步是血泪经验很多人训练 loss 不降最后发现是标注坐标没归一化模型在学一堆越界的框。2.3 类别映射与 data.yaml 的写法俯视数据集通常只有两类vehicle和pedestrian。类别索引从 0 开始顺序必须和标注文件里的 class id 严格对应。写一个vis-drone.yaml# vis-drone.yaml path: /home/user/datasets/vis-drone # 数据集根目录 train: images/train # 相对 path 的训练图路径 val: images/val test: images/test nc: 2 # 类别数 names: [vehicle, pedestrian] # 索引 0vehicle, 1pedestrian逻辑说明path用绝对路径最稳避免相对路径在不同工作目录下解析失败train/val写相对path的路径。参数上nc必须等于names长度写错会在构建检测头时报维度不匹配。如果数据集里还有truck、bus等细分要么合并进 vehicle要么扩nc但俯视小目标下类别越细越难训我一般先合并成两类跑通再说。3. 用 YOLOv5 在本地跑通俯视数据训练环境、命令与关键参数数据摸清楚了接下来是把它喂进 YOLOv5。这一章给的是能直接抄的命令和参数解释不是泛泛而谈。3.1 conda 环境与 YOLOv5 依赖安装YOLOv5 对 PyTorch 和 CUDA 版本敏感用 conda 隔离环境是常规操作conda create -n drone-yolo python3.9 -y conda activate drone-yolo # 克隆 YOLOv5 官方仓库用你本地已有的即可 git clone https://github.com/ultralytics/yolov5.git cd yolov5 # 安装依赖torch 按你的 CUDA 版本选 pip install -r requirements.txt逻辑说明Python 3.9 是 YOLOv5 兼容性最好的版本区间requirements.txt会自动拉 torch、torchvision、opencv 等。参数上如果你的显卡是 30/40 系装对应 CUDA 11.8 或 12.1 的 torch别用 CPU 版俯视数据训练量不小CPU 跑一天都出不来结果。装完用python -c import torch; print(torch.cuda.is_available())验证返回 True 才算过关。3.2 从预训练权重起步的训练命令俯视数据量通常不大从 COCO 预训练权重微调是最稳的起点python train.py \ --data vis-drone.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --hyp data/hyps/hyp.scratch-low.yaml \ --name drone_v1逻辑说明--weights yolov5s.pt加载预训练权重比从头训收敛快得多--img 640是输入分辨率俯视小目标可以往上提到 1280但显存翻倍--batch 16按显存调8G 显存跑 640 一般能到 16--hyp选低增强配置因为俯视数据本身视角单一过强增强反而引入噪声。训练日志和权重会落在runs/train/drone_v1/。3.3 三个必调参数img、anchor 与 iou 阈值俯视场景下默认参数经常不够用这三个必须动参数默认值俯视场景建议原因--img640960~1280小目标像素太少提分辨率直接增加有效特征anchorCOCO 预设重新聚类俯视框的宽高比和 COCO 差异大--iou-thres0.450.5~0.6密集车辆框重叠多阈值太低会误删anchor 重聚类用 YOLOv5 自带脚本python utils/autoanchor.py --data vis-drone.yaml --img 960逻辑说明autoanchor 会统计你数据集的框分布重新生成匹配的 anchor。参数上--img要和训练时一致否则聚类出的 anchor 尺度对不上。这一步做完把生成的 anchor 写回模型配置或让脚本自动更新小目标的召回率通常能涨几个点。4. 俯视小目标检测的避坑清单五条踩过的坑这一章全是翻车记录每条按现象、原因、解决写能帮你省下至少一周的调试时间。4.1 训练 loss 正常但验证 mAP 为 0现象训练日志里 box_loss、obj_loss 都在降但验证集 mAP 一直是 0。原因data.yaml里的val路径写错或者验证集图片和标注没对上模型在验证时找不到任何有效标签。解决手动ls一遍images/val和labels/val确认文件名一一对应路径用绝对路径再跑一次。4.2 行人检测召回率极低现象车辆框得还行行人几乎检不出来。原因行人在俯视下只有十几个像素默认 anchor 最小尺度还是偏大加上--img 640分辨率不够。解决把--img提到 960 或 1280重聚类 anchor并在hyp里适当降低obj损失权重让模型更关注小目标。4.3 显存溢出 OOM 中途崩掉现象训练跑几十个 iter 后报 CUDA out of memory。原因--img和--batch组合超出显存或者 dataloader 的workers开太多。解决降--batch到 8或开--img 960 --batch 8--workers设成 CPU 核数的一半别拉满。4.4 标注框越界导致训练不稳定现象loss 出现 NaN 或剧烈震荡。原因标注 txt 里有坐标大于 1 或小于 0 的框归一化没做干净。解决写个脚本扫一遍所有 txt把越界框裁到 [0,1]或者直接剔除该行。# 检查并修正越界标注 import os for root, _, files in os.walk(labels): for f in files: p os.path.join(root, f) lines open(p).readlines() fixed [] for ln in lines: c, x, y, w, h map(float, ln.split()) x, y, w, h [min(max(v, 0), 1) for v in (x, y, w, h)] fixed.append(f{int(c)} {x:.6f} {y:.6f} {w:.6f} {h:.6f}\n) open(p, w).writelines(fixed)逻辑说明逐行读入把四个坐标裁剪到 [0,1] 再写回。参数上int(c)保证类别是整数浮点格式保留 6 位足够。4.5 推理时框大量重叠现象同一辆车被框出好几个重叠框。原因NMS 的iou-thres默认 0.45密集场景下相邻框被误判为不同目标。解决推理时把--iou-thres提到 0.55~0.6或改用--agnostic-nms合并跨类重叠。5. 从跑通到好用俯视检测的进阶技巧与验证习惯跑通只是起点真正决定这套方案值不值得投入的是它在你自己的场景里稳不稳。我一般会做三件事来验证和提升。第一按高度分层验证。无人机 50 米、80 米、120 米拍出来的目标尺度完全不同把验证集按飞行高度分组分别看 mAP你会发现模型在某个高度区间突然变差那就是 anchor 或分辨率需要针对性调整的信号。第二用切片推理补小目标。如果目标实在太小可以把大图切成 640×640 的块分别推理再合并YOLOv5 生态里有现成的切片推理思路代价是推理时间线性增加但对行人这种十几个像素的目标提升明显。第三建立自己的回归测试集。从你的实际作业视频里抽 50 帧人工标好每次改完参数都在这 50 帧上跑一遍记录 mAP 和漏检案例。这比看训练 loss 靠谱得多也是我踩了无数坑后养成的习惯——训练指标好看不代表落地能用只有固定测试集上的数字才说真话。参数上再补一句--cos-lr余弦退火在俯视数据上通常比默认的线性调度更稳--label-smoothing 0.1能缓解标注噪声带来的过拟合。这些不是玄学是多次对比后留下的配置。希望帮到你。本文还有配套的精品资源点击获取
返回列表