ARTICLE DETAIL

资讯详情

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

遥感卫星图像飞机油罐船只检测:YOLOv5格式数据集实战指南

遥感卫星图像飞机油罐船只检测:YOLOv5格式数据集实战指南 简介这份资源面向从事遥感图像目标检测的算法工程师、研究生及竞赛选手提供一套按YOLOv5目录格式整理的卫星图像数据集涵盖飞机、油罐、船只三类目标可直接投入训练省去格式转换与清洗环节。数据均为800×600的RGB图像标注清晰训练集含2398张图片及对应txt标签验证集含1393张图片及对应标签并附3类别文本说明。资源包共约2000个文件以1999个txt标注文件和1个Python可视化脚本为主压缩包约237.68MB解压后目录结构规整便于按训练、验证模块快速检索。其中show.py可随机读取一张图片绘制边界框并保存至当前目录无需修改即可运行方便直观核验标注质量。目前已有215人学习下载适合需要快速验证检测模型、开展遥感场景实验或补充训练数据的读者使用。1. 遥感卫星图像下的飞机油罐船只检测为什么值得从这套 YOLOv5 格式数据集做起拿到一批遥感卫星图像想直接训练一个能同时识别飞机、油罐、船只的检测模型最卡脖子的往往不是模型结构而是数据。遥感图像里的目标有几个特点尺度差异极大飞机可能只有几十个像素油罐是密集排列的圆形船只在海面上又细又长背景还特别杂云层、海浪、港口设施都会干扰。这套数据集的价值就在于它已经把这三类目标标注好并且整理成了 YOLOv5 直接可用的目录格式省掉了从原始标注到训练格式转换这一大段最容易翻车的环节。它适合两类人一类是想快速验证遥感目标检测方案是否可行的算法工程师另一类是需要一个干净起点来复现 YOLOv5 训练流程的从业者。你不需要自己从零标注几千张卫星图拿到就能跑通训练、评估、推理这条链路把精力放在调参和业务适配上。接下来我会按「数据长什么样、怎么接进 YOLOv5、训练时哪些参数必须改、推理和评估怎么验证、踩过哪些坑」的顺序把整套流程讲清楚。2. 先看清数据YOLOv5 目录格式到底长什么样2.1 目录结构与三类目标的标注逻辑YOLOv5 要求的数据组织方式很固定核心是 images 和 labels 两个平行目录里面再分 train、val有时还有 test。图片和标注文件同名只是扩展名不同标注是 .txt每行一个目标格式为class_id x_center y_center width height全部是归一化到 0 到 1 之间的浮点数。这套遥感数据集的三类目标通常按 0、1、2 编号常见约定是 0 对应飞机、1 对应油罐、2 对应船只但具体顺序必须以数据集自带的说明或 classes.txt 为准不能凭感觉猜。一个典型的目录长这样dataset/ ├── images/ │ ├── train/ │ │ ├── 000001.jpg │ │ └── ... │ └── val/ │ ├── 000101.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── 000001.txt │ │ └── ... │ └── val/ │ ├── 000101.txt │ └── ... └── data.yaml这里有个容易被忽略的点遥感图像的尺寸往往不是 640×640可能是 1024×1024 甚至更大。YOLOv5 训练时会统一 resize 到 imgsz 指定的大小但标注的归一化坐标是基于原图宽高的所以只要标注是按原图归一化的resize 不会破坏坐标关系。真正会出问题的是图片和标注不匹配比如图片被裁过但标注没跟着改这种数据混进去训练loss 会异常震荡。2.2 data.yaml 的写法与类别名映射data.yaml 是 YOLOv5 训练入口写错一个路径就会直接报错退出。常见写法如下path: /home/user/dataset train: images/train val: images/val nc: 3 names: 0: plane 1: oil_tank 2: shippath 是数据集根目录train 和 val 是相对 path 的路径。nc 是类别数这里固定为 3。names 的顺序必须和标注文件里的 class_id 严格对应如果标注里 0 是油罐而你写成 plane训练不会报错但模型学到的语义就全乱了评估时 mAP 会低得莫名其妙。我一般会先抽几张标注文件用脚本统计每个 class_id 出现的次数确认三类都有样本且没有出现 3 或更大的 id。import os from collections import Counter label_dir dataset/labels/train counter Counter() for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue with open(os.path.join(label_dir, fname)) as f: for line in f: line line.strip() if not line: continue cls_id int(line.split()[0]) counter[cls_id] 1 print(类别分布:, dict(counter))这段脚本遍历训练集所有标注文件统计每个类别出现的次数。如果某个类别数量为 0说明数据划分有问题如果出现 3 以上的 id说明标注格式和 data.yaml 不一致必须先修正再训练。参数上只需要改 label_dir 指向你的实际路径其他不用动。3. 把数据接进 YOLOv5环境、配置与最小训练命令3.1 环境配置与依赖安装YOLOv5 对环境不算挑剔但版本错配是新手最常见的翻车点。我一般用 conda 建一个干净环境Python 选 3.8 或 3.9PyTorch 按官方命令装对应 CUDA 版本。不要在一个已经装了一堆包的环境里硬塞依赖冲突会让你查半天。conda create -n yolo5 python3.9 -y conda activate yolo5 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt这里 CUDA 版本要和你显卡驱动匹配cu118 对应 CUDA 11.8如果你驱动较老就换成 cu113 或 cpu 版本。装完后用python -c import torch; print(torch.cuda.is_available())验证输出 True 才说明 GPU 可用。requirements.txt 里包含了 numpy、opencv、matplotlib 等依赖一般不会出问题如果卡在某个包上多半是网络或版本源的问题换国内源重试即可。3.2 用 train.py 跑通第一轮训练数据放好、环境装好后最小训练命令其实很短python train.py \ --data dataset/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0 \ --project runs/train \ --name exp_remote逐项说明--data 指向你的 data.yaml--weights 用预训练权重遥感数据和自然图像差异大但预训练仍能加速收敛不建议从零开始--img 640 是输入尺寸遥感小目标多的话可以提到 1024但显存占用会明显上升--batch 16 在 8G 显存上跑 640 尺寸基本够用显存不够就降到 8--epochs 100 是起步值实际看 mAP 曲线决定是否加--device 0 指定第一块 GPUCPU 训练就写 cpu。训练开始后重点看几个输出box_loss、obj_loss、cls_loss 是否稳定下降mAP0.5 是否在涨。如果 loss 一开始就 nan多半是学习率或数据有问题先查标注有没有越界坐标。3.3 遥感场景下必须调整的三个参数默认超参是给 COCO 这类自然图像调的直接套到遥感数据上效果往往不理想。我一般会重点改这三个第一个是 imgsz。遥感图像里飞机、船只目标普遍偏小640 下缩得太狠小目标几乎消失。提到 1024 甚至 1280小目标召回会明显改善代价是显存和训练时间。如果显存不够可以先用 640 跑通流程再用 1024 正式训练。第二个是 anchor。YOLOv5 默认 anchor 是基于 COCO 聚类的和遥感目标尺寸分布不匹配。可以用python utils/autanchor.py --data dataset/data.yaml重新聚类把生成的 anchor 写进模型配置或训练参数里。这一步对油罐这种密集小目标提升比较明显。第三个是数据增强。遥感图像翻转、旋转是合理的但上下翻转要谨慎因为卫星视角下上下翻转可能产生不真实的场景。mosaic 增强对小目标有帮助但遥感图像拼接后可能出现目标被截断的情况可以适当降低 mosaic 概率比如从 1.0 降到 0.5。python train.py \ --data dataset/data.yaml \ --weights yolov5s.pt \ --img 1024 \ --batch 8 \ --epochs 150 \ --hyp data/hyps/hyp.scratch-low.yaml \ --device 0这里 --hyp 指定了低学习率增强配置适合小数据集微调。如果数据量在几千张以上可以用默认 hyp.scratch.yaml。参数没有绝对最优先跑一轮看 mAP 曲线再决定往哪个方向调。4. 训练过程排查loss 不降、mAP 不动、显存爆了怎么办4.1 从日志判断问题出在数据还是模型训练日志里最值得盯的是三个 loss 和验证集的 P、R、mAP。如果 box_loss 一直不降通常是标注框有问题比如坐标越界、宽高为 0、或者图片和标注不对应。如果 obj_loss 高但 box_loss 正常可能是背景样本太多负样本比例失衡。如果训练集 mAP 很高但验证集很低那就是过拟合需要加数据增强或减模型容量。我习惯在训练前先跑一遍数据校验import cv2 import os img_dir dataset/images/train label_dir dataset/labels/train bad [] for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue img_path os.path.join(img_dir, fname.replace(.txt, .jpg)) if not os.path.exists(img_path): bad.append((fname, 图片缺失)) continue img cv2.imread(img_path) h, w img.shape[:2] with open(os.path.join(label_dir, fname)) as f: for i, line in enumerate(f): parts line.strip().split() if len(parts) ! 5: bad.append((fname, f第{i}行格式错误)) continue cls_id, x, y, bw, bh parts x, y, bw, bh map(float, (x, y, bw, bh)) if not (0 x 1 and 0 y 1 and 0 bw 1 and 0 bh 1): bad.append((fname, f第{i}行坐标越界)) print(问题文件数:, len(bad)) for item in bad[:10]: print(item)这段脚本检查图片是否存在、标注行格式是否为 5 列、归一化坐标是否在合理范围。跑完如果问题文件数为 0基本可以排除数据格式问题把精力放到超参和模型上。4.2 显存不足时的降级策略显存爆了是最常见的硬中断报错通常是 CUDA out of memory。降级顺序我一般这样排先把 batch 减半再把 imgsz 从 1024 降到 640然后开梯度累积模拟大 batch最后才考虑换更小的模型。YOLOv5s 已经是最小档再小就是 nano但 nano 在遥感小目标上召回会掉得比较明显不建议一上来就用。python train.py \ --data dataset/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 8 \ --epochs 150 \ --device 0 \ --accumulate 2--accumulate 2 表示每 2 个 batch 更新一次梯度等效 batch 变成 16但显存占用按 8 算。这个参数在显存紧张时很实用代价是训练速度略慢。如果这样还爆就检查是不是有其他进程占着 GPU用 nvidia-smi 看一眼。4.3 验证集指标异常的常见原因验证集 mAP 不动或者异常低先确认三件事data.yaml 里 val 路径是否正确、验证集标注是否和训练集同一套类别编号、验证集图片是否真的存在。我遇到过 val 路径写成 train 的情况指标看起来正常但其实是过拟合。另外如果验证集里某个类别样本极少比如船只只有几张那这个类别的 AP 波动会很大不能只看总体 mAP要分类别看。还有一个隐蔽的坑遥感图像里目标密集NMS 的 iou_thres 默认 0.45油罐这种挨得近的目标容易被误删。可以在推理时把 iou_thres 调到 0.5 到 0.6 之间试试看召回是否改善。训练阶段的 NMS 参数在 val.py 里不影响训练本身但影响你看到的指标。5. 推理、评估与踩坑记录从跑通到跑好5.1 用 detect.py 做单图与批量推理训练完拿到 best.pt推理命令很直接python detect.py \ --weights runs/train/exp_remote/weights/best.pt \ --source dataset/images/val \ --img 1024 \ --conf-thres 0.25 \ --iou-thres 0.5 \ --device 0 \ --project runs/detect \ --name remote_test--source 可以是单张图、目录或视频--conf-thres 是置信度阈值遥感小目标建议先设 0.25 看召回再根据误报情况往上调--iou-thres 控制 NMS 合并程度密集目标调高一点。输出会保存在 runs/detect/remote_test 下带框的图片可以直接看效果。如果发现漏检多先降 conf如果误报多先升 conf 或检查背景类样本。5.2 评估指标怎么看才不被误导YOLOv5 验证输出里mAP0.5 和 mAP0.5:0.95 是两个核心指标。遥感目标检测里mAP0.5 通常比较高因为框只要重叠一半就算对但实际业务可能要求更准的定位这时候要看 mAP0.5:0.95。另外P 和 R 要一起看P 高 R 低说明模型保守漏检多R 高 P 低说明误报多。三类目标里飞机通常最好检因为形状固定、背景对比强油罐密集时容易粘连船只在海面上受波浪和云影干扰召回可能偏低。分类别看指标才能知道该补哪类数据。5.3 避坑记录五条血泪经验现象训练一开始 loss 就是 nan。原因标注里有坐标越界或宽高为 0 的行。解决用 4.1 的校验脚本跑一遍把越界行删掉或修正重新训练。现象mAP 一直停在 0.1 左右不涨。原因data.yaml 里 names 顺序和标注 class_id 不对应。解决统计标注里每个 id 的数量和 names 逐一对齐改完重新训练。现象显存够但训练速度极慢。原因dataloader 的 workers 设得太小或者图片尺寸过大导致 CPU 预处理成瓶颈。解决把 --workers 提到 8 或 16imgsz 先降到 640 跑通再升。现象验证集 mAP 很高但实际推理漏检严重。原因验证集和训练集分布太接近或者验证集里目标偏大没覆盖小目标场景。解决重新划分验证集确保包含各种尺度和背景的样本必要时单独建一个小目标测试集。现象油罐密集区域框大量重叠。原因NMS iou_thres 太低把相邻目标合并了。解决推理时把 iou-thres 从 0.45 提到 0.55 到 0.6观察召回变化找到误合并和漏检的平衡点。6. 进阶技巧用切片推理把遥感小目标召回再拉一档遥感图像里小目标漏检很多时候不是模型不行而是输入 resize 后目标像素太少。一个很实用的技巧是切片推理把大图切成有重叠的小块分别检测后再把结果映射回原图合并。这样每个小块里的目标相对变大召回会明显改善。YOLOv5 本身不直接带这个功能但可以自己写一个简单的切片推理脚本。import cv2 import numpy as np import torch def slice_inference(model, img_path, slice_size640, overlap128, conf0.25): img cv2.imread(img_path) h, w img.shape[:2] step slice_size - overlap boxes [] for y in range(0, h, step): for x in range(0, w, step): x2 min(x slice_size, w) y2 min(y slice_size, h) patch img[y:y2, x:x2] results model(patch, sizeslice_size)[0] for det in results.xyxy[0].cpu().numpy(): x1, y1, x2_, y2_, score, cls det if score conf: continue boxes.append([x1 x, y1 y, x2_ x, y2_ y, score, cls]) return boxes这段代码把原图按 slice_size 切块overlap 控制重叠区域避免目标正好落在切缝上被截断。每个小块送进模型推理再把框坐标加回原图偏移。最后需要对所有框做一次全局 NMS去掉重叠区域重复检测的目标。slice_size 一般设 640overlap 设 128 到 256 之间太小会漏切缝目标太大计算量上升。这个技巧在飞机和船只这类小目标上提升明显代价是推理时间成倍增加适合对召回要求高的离线场景。另一个值得试的是把训练时的 imgsz 和推理时的 imgsz 对齐。很多人训练用 1024推理忘了改默认 640小目标直接消失。detect.py 里显式写 --img 1024和训练保持一致指标才对得上。我自己的习惯是训练前先跑一遍数据校验训练中盯 loss 和分类 mAP推理时先看召回再看精度切片推理作为小目标场景的兜底手段。这套流程跑下来遥感三类目标检测基本能稳定落地。希望帮到你。本文还有配套的精品资源点击获取
返回列表