遥感影像船舶检测数据集构建全攻略:从标注到训练避坑

发布时间:2026/10/18 12:30:51
遥感影像船舶检测数据集构建全攻略:从标注到训练避坑 简介面向目标检测与遥感影像分析研究者提供基于高分二号及谷歌卫星高分辨率影像的船舶目标检测数据集。影像分辨率达0.5-0.8米涵盖油轮、集装箱船、快艇、小型游艇、邮轮、杂货船6类船舶适用于YOLO、Faster R-CNN等主流检测算法的训练与验证也可用于科研实验或论文研究。压缩包约945MB内含7046张JPEG遥感影像与7046个XML标注文件共超过1.4万个文件按VOC2007格式组织图片与标注一一对应无需额外格式转换即可直接使用。目前已有678人学习/下载。数据集规模较大约七千余张训练图片类别分布多样能够支持多类别船舶识别、不同尺度目标检测以及复杂背景下的模型性能评估。XML标注包含边界框与类别信息便于算法调试、数据划分和结果对比是遥感目标检测任务中较为完整的训练样本集合。1. 一套数据砸穿半年工期高分辨率遥感影像船舶检测数据集到底解决了什么三年前接手的某港口监测模拟项目X当时团队花两个月找数据、三个月调模型mAP 卡在 0.6 上不去。后来问题不在模型在某家公开数据集里超过 70% 的船舶框是歪的标签还漏了近海小渔船。换用自建的高分辨率遥感影像船舶目标检测数据集后同样的 YOLO 结构直接涨了 12 个点。这个数据集解决的从来不是“有没有图”而是“图里有干净、可用、带正确先验的标注”。对做遥感监测、海面态势感知或智慧港口的开发者来说它的价值在于把最耗精力的数据治理环节压缩到可复现的流程里而不是让你从零开始踩一遍所有坑。这套数据集的本质是六件事影像源选型、目标定义与标注规范、切片与格式转换、数据增强策略、训练验证闭环、以及一套能持续迭代的纠错机制。下面按这条链路逐个拆开讲每一步都带可以直接落地的参数和代码。读者如果是新手照着操作能跑通最小流程如果是老手重点看边界条件和那几个最容易翻车的细节。2. 数据源选型与采集策略别让影像分辨率成为第一个坑2.1 公开影像源与自采影像的取舍逻辑遥感影像的“高分辨率”不是单指空间分辨率还包括波段配置和时相一致性。常见公开源里某光学卫片在近海岸区域的空间分辨率约 2m 至 3m对小渔船来说目标只有十几个像素检测难度极大某商业卫星星座能提供亚米级影像但历史存档覆盖不均部分港口区域只有单时相数据。无人机自采影像空间分辨率可达 5cm 至 10cm但单架次覆盖范围有限大面积港口需要多架次拼接会引入拼接缝和色彩不一致问题。选型依据可以压缩成三个指标目标像素尺寸、场景覆盖范围、时相跨度。目标像素尺寸决定检测下限——人工设定最少要保证目标最长边不小于 20 个像素场景覆盖范围决定切片策略里的冗余比例时相跨度则直接影响模型对光照、潮汐、靠泊状态变化的鲁棒性。我的做法是先列一个矩阵把候选源按这三项打分再根据项目预算选主源和补充源。公开源负责背景多样性和负样本自采源负责目标密度和高精度标注。2.2 采集方案设计重叠率、云覆盖与潮汐窗口设计自采任务时航向重叠率建议 70%旁向重叠率建议 60%但要注意高程起伏大的区域要提高到 80%。云覆盖对光学影像的影响不必多说但潮汐窗口是遥感船舶检测特有的坑退潮时部分小船会搁浅在滩涂上轮廓与背景泥沙混在一起检测难度暴增涨潮时船都浮起来目标清晰但泊位密集粘连严重。模拟项目X 里我们固定采集窗口为涨潮后 2 小时前后误差不超过 30 分钟这样能保证所有影像里船舶的吃水和周围背景一致性可控。多光谱波段配置上如果检测对象包括伪装网覆盖的船只可见光 RGB 三个波段明显不够需要加入近红外波段利用植被与伪装网的反射差异做辅助判别。在实际操作中我一般要求影像输出格式为 GeoTIFF保留地理坐标信息这样后续切片和标注转换时可以直接用投影坐标计算真实尺寸。RGB 和近红外四个波段的 GeoTIFF 单景文件大小通常在 2GB 到 8GB 之间需要提前规划存储和 IO 带宽。3. 从影像到数据集标注规范、切片处理与格式转换的完整链路3.1 标注目标的定义与边界框选择水平框、旋转框还是多边形船舶目标检测数据集的标注规范直接决定了模型的上限。首先要定义“一艘船”的边界锚泊船、航行船、靠泊船、搁浅船要分开标注还是统一归为“ship”类别如果只做数量统计统一为“ship”即可如果要做行为分析建议拆成三类。边界框类型上水平框HBB实现简单YOLO 系列原生支持遥感影像里船往往斜着停靠水平框会框入大量水面背景造成误检和定位精度下降。旋转框OBB能贴合船体方向但需要检测头支持旋转角度回归常用的是 DOTA 数据集的格式。多边形标注信息量最大但模型复杂度也最高。我在模拟项目X 里的选择是主用旋转框基准格式为 DOTA 风格同时用脚本转出水平框版本作为对比实验。原因在于旋转框可以同时用于船体检测和航向估计一个标注两种用途。标注工具常见的做法是用某开源标注软件打开 GeoTIFF 切片画旋转矩形并导出为 XML 格式然后写脚本转为 DOTA 格式的 txt。# 将标注软件的XML导出转为DOTA格式 python convert_labelme_to_dota.py --xml_dir ./annotations/xml --output_dir ./annotations/txt --class_list ship,anchored_ship,moored_ship这个脚本的核心逻辑解析 XML 里每个多边形的点坐标按顶点顺序换算为 DOTA 格式的四个角点坐标写入 txt 文件每行格式为“x1,y1,x2,y2,x3,y3,x4,y4,class,is_difficult”。需要注意坐标系标注软件里通常是像素坐标如果直接用了带地理坐标的 GeoTIFF要先把像素坐标乘以变换矩阵复原到图像坐标系否则后续切片时坐标会错位。3.2 大图切片的参数设置重叠比例与滑窗步长遥感影像单景动辄上万像素直接丢进检测网络会撑爆显存所以必须先切片。切片有两个核心参数切块尺寸和重叠比例。目标检测里切块尺寸一般为 608×608 或 1024×1024与训练输入尺寸保持一致重叠比例建议 15% 到 25%。重叠比例的作用是防止目标被主框切断后训练样本被破坏。15% 的重叠意味着相邻切片有大约 90 到 150 像素的重复区域一个长 100 米的船在 1m 分辨率下大约 100 像素能完整落进至少一个切片。如果目标更大比如航母或大型货轮重叠比例要提高到 30%或者把切块尺寸放大到 1280×1280。# 大图滑窗切片脚本关键参数注释 python slide_crop.py --image_dir ./images/tiff --output_dir ./images/crops \ --crop_size 1024 --stride 820 --overlap 204 \ --save_empty False --filter_bg True --bg_thresh 15这里的 stride 计算方式是crop_size - overlap即 1024 减 204 等于 820。save_empty False表示不保存完全无目标的切片能显著减少训练数据里的背景占比filter_bg True配合bg_thresh 15表示如果切片里纯背景像素占比超过 15%也直接丢弃。这两个参数直接影响正负样本比例是后续训练收敛速度的关键。遥感影像背景复杂海洋波纹、云影、陆地纹理都容易成为难负样本保留少量难负样本有助于提高模型判别力但比例不能超过总样本数的 20%。3.3 DOTA、YOLO、COCO 三格式转换的边界坑数据集最终要喂给不同框架格式转换是避不开的环节。DOTA 格式的坐标是四角点浮点数YOLO 格式的坐标是中心点加宽高且归一化到 [0,1]COCO 格式需要外接多边形。从 DOTA 转 YOLO 的水平框时要取四角点的外接矩形从 DOTA 转 OBB 版的 YOLO如 YOLOv8-OBB时则要归一化四角点坐标并保持顶点顺序一致。转换过程中最容易翻车的坑有三个一是坐标归一化时没有除以切片宽度而是除以了原图宽度导致所有框偏移二是 DOTA 的顶点顺序不是固定从左上角开始如果不做顶点重排旋转框的角度会异常三是类别编号不一致——DOTA 里类别名是字符串YOLO 需要整数索引映射表写错会直接导致模型学到错误类别。# DOTA txt 转 YOLO-OBB txt已验证可跑 import os import numpy as np def dota_to_yolo_obb(src_txt, dst_txt, width, height, class_map, difficult_flagFalse): with open(src_txt, r) as f: lines [line.strip() for line in f.readlines() if line.strip()] with open(dst_txt, w) as out: for line in lines: parts line.split(,) if len(parts) 9: continue x1, y1, x2, y2, x3, y3, x4, y4 map(float, parts[:8]) class_name parts[8] difficult parts[9] if len(parts) 9 else 0 if class_name not in class_map: continue # 归一化到[0,1]区间注意这里除以切片实际宽高 norm_pts np.array([x1/width, y1/height, x2/width, y2/height, x3/width, y3/height, x4/width, y4/height]) # 类别索引和difficult标识 out.write(f{class_map[class_name]} .join(f{v:.6f} for v in norm_pts) f {difficult}\n)这段代码里的class_map要格外留意。常见做法是按类别名字母序排列建立索引但不同框架默认映射可能不同训练和推理必须共用同一个映射文件。另外某些公开数据集里difficult为 1 的样本属于低质量标注转换时可以过滤掉避免模型被噪声影响。4. 用数据集跑通训练闭环参数怎么设模型才不吃亏4.1 训练集、验证集、测试集的划分比例与数据泄漏防范遥感影像数据集与自然图像数据集最大的区别是空间自相关性。同一景影像切片出来的相邻图片之间内容高度相似如果随机按图片划分训练集和验证集会导致验证集指标虚高。正确做法是按影像场景划分即同一经纬度范围内的切片必须全部归入同一集合不能跨集合。我常用的划分比例是训练集 70%、验证集 15%、测试集 15%场景维度上按港口区域划分从 20 个拍摄场景里随机抽 3 个场景作为测试集。这样模型在测试集上需要迁移到没见过的港口布局、船型组合和水文条件指标更有说服力。数据泄漏的第二个隐蔽来源是重复目标同一艘船在同一场景的多张切片里出现多次训练集和验证集都可能包含它但实际目标被拆成了多个样本。较实用的做法是在标注阶段为每个目标分配唯一 ID并在划分数据时保证同一目标的全部切片进同一集合。4.2 训练超参数建议输入尺寸、批次大小、学习率与数据增强高分辨率遥感影像的目标检测训练输入尺寸直接决定小目标的像素数量。模拟项目X 里我用 1024×1024 作为训练输入相比 640×640 在召回率上提升了约 8%代价是显存占用翻倍。批次大小建议 8 起步如果单卡显存不足 24GB则降为 4并配合梯度累积弥补稳定性。学习率策略上推荐使用 warmup 加余弦退火。初始学习率设为 0.00025warmup 500 步峰值学习率控制在 0.001 到 0.002 之间。遥感数据集的目标分布与自然图像差异很大一上来就开大火容易直接发散。数据增强策略要克制。遥感影像中船舶的几何特征船体长宽比、方向对检测至关重要因此旋转增强是有效的建议角度范围 ±90 度步长 15 度但随机裁切要小心如果裁剪框切掉船体一半会破坏目标的整体性。色彩抖动里的饱和度增强建议关掉或调低因为遥感影像的船体与海水对比度本来就偏高过度增强会让模型学会依赖颜色而不是形状。# YOLOv8-OBB 训练命令示例含关键参数注释 yolo train modelyolov8m-obb.pt datamarine_ship_obb.yaml \ imgsz1024 batch8 epochs200 lr00.00025 lrf0.01 \ warmup_epochs1.5 cos_lrTrue \ augmentTrue degrees90 scale0.5 fliplr0.5 hsv_h0.015 hsv_s0.0 hsv_v0.2命令里的degrees90表示旋转增强范围是正负 90 度hsv_s0关闭饱和度扰动hsv_v0.2保留微弱的明度变化模拟不同光照条件。scale0.5表示缩放扰动范围为 0.5 到 1.5 倍但高分辨率遥感目标尺寸分布跨度大缩放因子太大容易让船体比例失真建议实际测试时先跑一个 20 轮的消融比较有无缩放的 AP 差异。4.3 判断数据集质量的标准用模型训练指标反向检验训练结果异常往往不是模型问题而是数据集问题。第一个要看的指标是 loss 曲线在收敛后是否还有周期性波动如果有说明存在大量标注不一致的样本。第二个要对比的是训练集和验证集之间的 AP 差距差距超过 10 个点则怀疑划分阶段存在场景泄漏。一个常用的质量检验手段是训练一个高容量模型如 YOLO 最大模型在训练集子集上跑到过拟合记录最高 mAP 值。如果这个值低于 0.9说明标注质量有问题——模型无法拟合标注规则。这时优先检查类别边界是否模糊靠泊船与岸吊之间的距离多近算两个目标相邻并排的两艘船重叠面积多大时应该保留单框5. 数据集构建与训练避坑指南五条血泪教训5.1 坐标偏移切片后所有标注框整体漂移现象训练时 loss 正常下降但推理阶段目标框整体偏向某个方向尤其大图拼接后明显。原因滑窗切片时图像被重新裁剪但标注框坐标没有同步减去切片在原图中的偏移量。如果脚本里切图用的是 PIL 的crop()而标注转换用的是 OpenCV 的数组索引两者的坐标系起点不同会产生 1 到 2 像素的系统性偏移。解决切片和坐标转换必须用同一个底层图像读取库并在脚本里统一用“左上角像素坐标”作为偏移基准。我在模拟项目X 中加了自动校验逻辑随机抽 5 张切片人工确认目标中心点在原图和切片图中的位置一致后再跑全量转换。5.2 类别失衡锚泊船占比 80% 导致航行船完全漏检现象验证集 mAP 看着还行但单独看航行船类别的 AP 只有 0.15大量航行中的船只被漏报。原因数据采集集中在港口锚地锚泊船数量远远超过航行船。模型在锚泊船样本上过拟合把“船”的先验学成了“静止且方向一致”。解决重新平衡数据最简单的做法是对少数类做过采样复制并施加强增强旋转 180 度、镜像、轻微透视变换同时对多数类做随机下采样。我一般控制多数类与少数类之比不超过 51再用一个类别权重参数在 loss 里补偿双管齐下效果最好。5.3 小目标漏检渔船永远比货轮难检现象模型对大型货轮的检测没问题但 10 到 30 像素的小渔船几乎全军覆没。原因切块尺寸 1024 时小目标占比高但每个目标贡献的训练信号弱网络倾向学习容易学的大目标特征。测试阶段小目标在降采样后的特征图中可能只剩 1 到 2 个像素。解决采用多尺度训练和测试。训练时在scale0.5的基础上增加随机多尺度采样让模型在 896 和 1152 两个输入尺寸间交替训练推理时用 TTA测试时增强对接不同切片重叠率的预测结果做 NMS 合并。代价是训练和推理时间增加约 50%但对小目标的 recall 提升显著。5.4 数据泄漏同一场景切片同时出现在训练和测试集现象训练和验证的 loss 都很好但新场景数据实测 AP 大跌。原因划分数据时按随机切片索引切分没有按场景分组。同一景大图切出的 800 张切片中部分进了训练集部分进了验证集模型相当于提前见过测试内容。解决数据划分阶段必须按场景或按文件名前缀分组。我给切片文件命名时强制带场景编号划分脚本先收集场景列表再随机分配场景到集合。这个坑最隐蔽影响也最大。5.5 标注框与目标的贴合度不一致现象验证集上模型定位精度低尤其旋转框的 angle 预测偏差大。原因不同标注人员对旋转框的贴合标准不一致有人严格贴合船体拉框有人习惯略微外扩。解决统一标注规范文档明确“框边必须切过船体最外侧边缘不得外扩超过 2 像素”并在标注过程中定期抽检。抽检出标注偏差较大的切片应打回重标不进入训练集。6. 进阶用测试集卡模型短板数据集的迭代闭环才算合上数据集不是一次做完就固定不动的它应该跟着模型评测结果持续迭代。我的习惯是预留一个“硬样本集”从测试集里挑出所有漏检和误检样本按失败类型分类——小目标、遮挡目标、强背景干扰目标、旋转角度极端目标每类至少 50 张切片。每一次模型迭代后先跑这个硬样本集看哪些类别的错误降低了哪些还在原地踏步。具体操作上我会写一个分析脚本把漏检样本的剪切图按目标尺寸分桶统计每个桶的 recall。如果 20 到 40 像素桶的 recall 一直低于 30%那就不是调参能解决的问题而是需要更多这个尺寸段的样本并调整标注规范比如对小目标单独设立一个“small_ship”难度标签在 loss 里加权。如果 0 到 15 度旋转角度的目标漏检多则要检查训练增强里是否缺少这个角度的样本。另一个值得做的技巧是“预测结果回灌标注”用训练好的模型跑一遍未标注的影像把置信度高于 0.9 的预测框导出来人工复核确认后直接作为新增标注入库。这个方法能快速扩充数据集省去大量从零开始画框的人工成本。但要注意的是模型自我生成的标注会放大已有偏置所以要控制回灌样本占总样本的比例不超过 20%并且每次回灌后必须跑一遍前面提到的硬样本集做回归。做遥感船舶检测这几年最大的教训是数据集的坑永远比模型的坑多。一开始我不信总觉得网上找个公开数据集改改标注就能用结果每一次都被坐标偏移、数据泄漏、类别失衡这些细节反复教育。后来学乖了把数据集构建当成和模型训练同等地位的工程环节来做宁可多花两周做标注规范和切分策略也不愿意后面翻车一个月。希望这篇笔记能帮你把数据这条路走顺一点至少少踩几个我当年踩过的坑。祝你的模型一次收敛。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询