尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
卫星影像潜艇小目标检测:从旋转框标注到YOLOv8-OBB训练实战
简介面向人工智能与计算机视觉研究者的潜艇卫星图目标检测数据集适合需要水下目标识别训练数据的算法工程师、高校学生及军事海洋领域开发者。压缩包内含2001个文件由1000张1024×1024 JPEG卫星图像、1000个XML标注文件及1个说明txt组成整体345.83MB标注框已做好并附有条目性说明可直接用于YOLO、Faster R-CNN、Mask R-CNN等主流监督学习流程免去大量人工标注时间。已有1685人学习下载数据在海洋监控、国防安全等场景中具有明显实用价值。资源目录分为图像、标注与说明三部分便于解析与批量加载借助该数据集可系统练习目标检测的预处理、训练、验证与测试全流程包括数据增强、超参数调整等并针对潜艇小目标、复杂海面背景开展精度优化实验为后续工程落地提供扎实数据支撑。1. 卫星图里的目标检测最难的是数据而不是模型地球上每天产生海量卫星影像但要把其中一艘潜艇挑出来难度比在普通照片里找猫高出几个量级。问题不只是目标小而是整张图几乎没有上下文海洋背景高度重复目标与海浪、云影的对比度极低。这个数据集的价值正在这里它专门用来训练和评估能在卫星视角下发现细长小目标的检测模型。下面这条工程路线覆盖了数据组织、旋转框标注、切片训练和评估闭环不依赖昂贵的专有工具普通 GPU 机器就能跑通。适合要做遥感目标检测项目、或者正在找人工智能大作业题目的工程师与学生。2. 潜艇卫星图数据集搭建数据源选型与切片生成2.1 现成标注几乎找不到三条路径怎么选先泼一盆冷水完全公开、类别明确标注为 submarine 的卫星图数据集很罕见DOTA、HRSC2016、ShipRSImageNet 这些公开遥感数据集里潜艇通常被归进 ship 或 other类别粒度和边界都不一样。直接下载别人整理好的数据集当然省事但下载之后还要做类别合并、误检样本清洗工作量并不比自建小。自建数据我一般会从三条路径里选公开遥感数据集迁移学习。HRSC2016、ShipRSImageNet 覆盖大量水面舰船先用它们的旋转框权重做初始化再用少量潜艇样本微调收敛速度明显更快。这类数据集可能不含 submarine 类别但舰船与潜艇共享细长金属壳体的低层特征迁移价值很高。合规获取的亚米级商业光学影像。在 0.5~1 米分辨率下六七十米长的潜艇只占 60~120 像素正好落进小目标区间。拿到影像后先做几何校正再按地理位置裁剪重点确认影像的使用授权范围避免把源影像二次对外发布。3D 合成渲染。用 Blender 或 Unity 建一个精度足够的潜艇外形模型叠加真实海面纹理、太阳耀斑、云影渲染出卫星视角图。合成数据的标注完全精确能任意控制目标尺寸和朝向缺点是合成图像和真实影像之间永远存在域差异所以常规做法是合成数据做预训练、真实数据做微调。如果项目允许引入多源数据可以再加入船舶红外可见光双模态数据集做域外预训练这比从 ImageNet 起点硬训遥感模型效果好。想验证模型对光照不敏感时也可以把光学与合成孔径雷达影像放进同一个数据集但 SAR 噪声模型和光学完全不同建议先把光学路线跑通再扩展。提示公开数据集下载后先做类别分布体检统计每类目标的数量级和平均目标尺寸很多遥感类别都存在长尾分布直接影响后面训练时的样本采样策略。2.2 用 Rasterio 滑动窗口把大影像切成训练瓦片不管数据来自哪条路线训练前都要解决同一个问题原始影像太大。一张 8000×8000 的图直接送进 YOLO会被缩放成 640×640潜艇目标从几十像素缩到几个像素特征直接消失不缩放整图进去显存又放不下。标准的 YOLO 目标检测流程会把大图切成瓦片tile让目标在瓦片里至少占几十像素模型才学得到结构特征。切片时用 Rasterio 的 Window 只读取局部窗口的内存避免把整张大图一次性载入import numpy as np import rasterio from pathlib import Path from rasterio.windows import Window def crop_tiles(tif_path: str, out_dir: str, crop_size: int 1024, overlap: float 0.2, min_brightness: float 15.0) - None: out_dir Path(out_dir) out_dir.mkdir(parentsTrue, exist_okTrue) step int(crop_size * (1 - overlap)) with rasterio.open(tif_path) as src: for row in range(0, src.height - crop_size 1, step): for col in range(0, src.width - crop_size 1, step): window Window(col, row, crop_size, crop_size) data src.read([1, 2, 3], windowwindow) if np.mean(data) min_brightness: continue meta src.meta.copy() meta.update(count3, heightcrop_size, widthcrop_size, transformsrc.window_transform(window)) with rasterio.open( out_dir / ftile_{row:05d}_{col:05d}.tif, w, **meta ) as dst: dst.write(data)step是滑动步长crop_size 为 1024、overlap 为 0.2 时步长是 819相邻瓦片有约 205 像素重叠。重叠的目的很简单一个目标正好落在瓦片边缘时它会在下一张瓦片的中心区域完整出现不会因为切图被截断。min_brightness用 RGB 均值过滤纯海面瓦片跳过背景能省下大量无意义的训练迭代。window_transform给切出的瓦片保留了地理坐标变换后续把矢量标注同步裁剪时直接拿这个 transform 做坐标映射即可。提示如果原图是 4 波段影像读取前先用src.descriptions查看波段顺序read([1, 2, 3])可能取到的是近红外而不是红色波段。2.3 切片参数怎么定目标尺寸与上下文需要折中切片尺寸并不是越大越好。瓦片越大目标在整张图里的相对尺寸越小模型学到的又是小目标问题瓦片太小潜艇周边的海洋纹理、波浪走向这些上下文信息被切掉误检会增多。实际操作中参考以下参数参数推荐值说明crop_size6408G 显存 / 102416G 显存640 节省显存1024 保留更多上下文小目标 AP 通常更高overlap0.15 ~ 0.3太低边缘目标被切破太高产生大量重复样本min_brightness10 ~ 20按影像辐射亮度调整用于过滤纯海面标注保留阈值0.3目标面积在瓦片内占比低于 30% 时丢弃该框标注保留阈值这一项容易被忽略。切片时一个目标可能只剩一个角落在瓦片里保留这种破损标注会让模型学到潜艇就是一小块铁皮。我一般会计算目标多边形与瓦片窗口的交集面积占比低于 30% 的框直接删掉重叠率保证在真实场景中目标不会真的被漏掉它只是换到相邻瓦片里变成了完整目标。3. 旋转框标注与格式转换为什么是 DOTA 格式而不是 COCO3.1 水平框在细长目标上是坏标注潜艇这类细长目标姿态任意。如果标注工具只支持水平框HBB目标沿对角线方向摆放时水平框里可能超过一半是纯海面训练时模型被逼着从这些背景区域里学特征最终检测框偏大、定位不稳定。旋转框OBB用四个角点描述目标的最小外接矩形几乎不含背景边界更贴合目标本体这是 DOTA 数据集和 mmrotate 训练 DOTA 数据集的底层约定YOLOv8-OBB、CSL 角度分类等方案也建立在这个基础上。旋转框带来的另一个收益是训练时目标分配更稳定。在密集排布场景下水平框 IoU 容易把两个相邻目标判为同一个旋转框通过角度维度天然区分开正样本分配时的歧义大大减少。代价是标注成本上升标注一个框需要多调一个角度参数后面 3.2 会讲如何用工具把这个成本压到可控范围。3.2 DOTA 格式字段与标注工具的配合DOTA 格式的每个 txt 标注文件里一行对应一个目标字段依次是四角点坐标、类别名和 difficult 标记字段含义示例x1 y1 x2 y2 x3 y3 x4 y4顺时针排列的目标外接矩形四角像素坐标321 456 356 462 401 433 366 427classname类别名这个数据集只有 submarinesubmarinedifficult0 表示正常1 表示遮挡严重或目标不完整评估时忽略0四个角点必须是顺时针排列这是 DOTA 格式和下游转换脚本的共同约定。如果有标注工具导出的点序不统一转换前必须做一次点序重排否则训练阶段 OBB 解码会得出乱序多边形。标注工具我常用 X-AnyLabeling它开箱支持旋转框操作路径是加载影像切换到旋转框模式拖出主体后按住角度控制点调整朝向再选类别保存多人协作时它支持自动保存不容易丢标注进度。roLabelImg 是老牌方案交互稳定但界面偏旧适合小批量精标。3.3 DOTA 转 YOLO-OBB 的坐标归一化脚本YOLOv8 的 OBB 标签格式是class x1 y1 x2 y2 x3 y3 x4 y4所有坐标都归一化到 0~1。转换脚本不复杂但容易在坐标交错顺序上出错import numpy as np from pathlib import Path def dota2yolo_obb(src_txt: str, dst_txt: str, img_w: int, img_h: int): lines [] for line in Path(src_txt).read_text().strip().splitlines(): parts line.split() if len(parts) 9: continue coords np.asarray(parts[:8], dtypefloat) xs np.clip(coords[0::2] / img_w, 0, 1) ys np.clip(coords[1::2] / img_h, 0, 1) # YOLO 逐点解析顺序必须是 x1 y1 x2 y2 x3 y3 x4 y4 values np.stack([xs, ys], axis1).ravel() lines.append(0 .join(f{v:.6f} for v in values)) Path(dst_txt).write_text(\n.join(lines))代码的关键在于coords[0::2]取偶数位得到 x 坐标序列coords[1::2]取奇数位得到 y 坐标序列然后通过 stack 交替拼回x1 y1 x2 y2...。这里的 img_w 和 img_h 必须与瓦片原始尺寸一致不能填模型输入尺寸如果切出的瓦片是 1024×1024标签直接除以 1024。clip 到 0~1 是为了防止角点落在瓦片边界外时产生越界坐标。4. 用 YOLOv8-OBB 做切片训练小目标要靠切片推理捡回来4.1 数据划分的硬规矩同一个原图的所有瓦片必须同进退做完标注格式转换接下来的流程就是熟悉的 yolov8 训练自己的数据集流程。但数据划分时有一个容易忽略的规矩不能用瓦片级别随机划分。如果同一张原图切出的 20 张瓦片16 张进训练集、4 张进验证集验证集里就会混进大量与训练集重叠的海域模型见过类似的波浪纹理验证 mAP 会虚高 10 个百分点以上。正确做法是先给每张原图分配一个 group id按 group id 划分集合比例通常取 8:1:1。划分结果用目录隔离运行训练前检查瓦片文件名前缀确保同一个前缀没有同时出现在 train 和 val 目录里。集合原图比例用途train80%训练参数val10%选 best 权重、观察过拟合test10%最终评估只在结束时跑一次test 集要留到最后。很多项目用一个验证集反复调参最后模型在最好的那次权重上测出的指标其实已经不算数了因为验证集信息被间接用进了决策。4.2 训练命令与六个关键超参在 ultralytics 环境下OBB 训练命令如下yolo obb train datasubmarine.yaml modelyolov8n-obb.pt \ epochs100 imgsz640 batch8 device0 \ lr00.005 mosaic1.0 close_mosaic10 \ degrees180 scale0.3 hsv_h0.015submarine.yaml 只写路径和类别名path: datasets/submarine train: images/train val: images/val names: 0: submarine六个超参的调整逻辑参数值设置理由imgsz6408G 显存的安全选项显存足够建议 1024小目标 AP 更高mosaic1.0拼接多张瓦片让模型看到更多海洋背景组合close_mosaic10最后 10 个 epoch 关闭 mosaic避免拼接边界干扰边框回归degrees180潜艇朝向任意旋转增强范围拉满scale0.3目标缩放抖动限制在 30%防止小目标被压成无效样本batch8OBB 比水平框多一个角度回归分支显存占用更高如果发现训练损失持续下降但 AP 上不去先检查模型容量而不是继续加 epoch从 yolov8n 换到 yolov8m通常比盲目训练 300 轮更有效。显存只有 8G 时也不要硬上 1024可以在推理阶段用切片补丁找回小目标。4.3 SAHI 切片推理缝合线附近的潜艇怎么不丢训练时用瓦片是为了让模型见到小目标推理时如果把 8000×8000 原图直接缩到 640目标等于消失这个矛盾必须用切片推理解决。SAHI 是遥感小目标检测的标准工具它先按设定尺寸切大图推理再把所有框变换回原图坐标重叠区域用非最大合并NMM拼接结果from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction model AutoDetectionModel.from_pretrained( model_typeultralytics, model_pathruns/obb/weights/best.pt, confidence_threshold0.35, image_size640, devicecuda:0, ) result get_sliced_prediction( image_8000.tif, model, slice_height640, slice_width640, overlap_height_ratio0.2, overlap_width_ratio0.2, postprocess_typeNMM, postprocess_match_metricIOU, postprocess_match_threshold0.5, ) result.export_visuals(visual_file_pathoutput/pred.jpg)slice_height 和 slice_width 要与训练 imgsz 保持一致否则模型见到的目标尺度与训练分布不同。overlap_ratio 取 0.2 和训练切片一致保证跨边界的目标在至少两张切片里完整出现。postprocess_match_threshold 控制合并阈值太高会留下重复框太低会把相邻目标误删0.5 是比较稳的起点。5. 评估潜艇检测模型面积分层 AP 与三个高频翻车点5.1 用面积分层的 AP 看模型缺什么如果只报 mAP50大概率会忽略一个问题这个数据集里绝大多数目标面积小于 32×32 像素模型可能对 80 像素的目标检测得很好但对真实分布所在的小目标区间几乎失灵。COCO 评估器按面积把目标分为 small、medium、large 三档训练完成后必须分别看。用 pycocotools 加载 COCO 格式的 GT 和预测结果从eval[precision]里取出 small APfrom pycocotools.coco import COCO from pycocotools.cocoeval import COCOeval coco_gt COCO(datasets/submarine/annotations/test.json) coco_dt coco_gt.loadRes(results.json) evaluator COCOeval(coco_gt, coco_dt, bbox) evaluator.evaluate() evaluator.accumulate() ap_small evaluator.eval[precision][0, :, 0, 1, 2].mean() print(fsmall AP: {ap_small:.3f})precision数组的维度依次是 IoU 阈值、recall 采样点、类别、面积档、最大检测数这里固定 IoU0.5面积档取索引 1 即 small最大检测数取 100得到的就是 small AP。如果模型输出的是旋转框用 bbox 评估会把 OBB 投影成水平外接矩形指标会偏乐观报告里要写明这个口径。5.2 三个翻车点与对应处理手段海杂波误检最常见。高亮海浪纹理在模型眼里很像船体线条解决思路是难负样本挖掘训练完跑一遍验证集把置信度大于阈值但没有匹配 GT 的误检框裁出来作为负样本背景切片加入训练。这比降低 confidence_threshold 有效得多。云层和太阳耀斑遮挡会让目标只露出一小段。处理方式是把曝光扰动增强调大hsv_v从默认 0.4 提到 0.6同时保留一部分带云影的切片而不是全部筛掉否则模型只在晴空条件下工作。角度边界问题是 OBB 特有的坑。标注点序在顺时针 89 度和 -89 度之间轻微抖动数值上会跳变 178 度。缓解方法是在标注规范里固定第一个角点为左上角最近的点并优先使用 YOLOv8-OBB 或 mmrotate 中 CSL 这类对角度周期变化不敏感的损失。5.3 一个值得写进评测脚本的多尺度 TTA 技巧最后建议把多尺度测试时增强写进评测脚本对同一张切片按 0.8、1.0、1.25 三个倍数缩放分别推理后再把框变换回原图坐标用 NMM 跨尺度合并保留均值置信度高于阈值的框。小目标通常在 1.25 倍图上多检出 20%而 0.8 倍图负责召回大尺寸目标两者互补。实现上只需要循环调用三次get_sliced_prediction把结果按坐标缩放后合并离线评估完全值得牺牲三倍推理时间把它封装成infer_with_tta(image_path, scales[0.8, 1.0, 1.25])之后每次消融实验跑同一套流程对比结果才公平。本文还有配套的精品资源点击获取
RELATED

相关推荐

Authentication architecture

Authentication architecture

Authentication architecture 【免费下载链接】agents Multi-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity 项目地址: https://gitcode.com/GitHub_Trending/agents24/agents Raw: raw/notes/…

📅 2026/9/11 23:51:46
Filament 文件上传字段(FileUpload)完整实战指南:存储、图片编辑、校验与安全防护

Filament 文件上传字段(FileUpload)完整实战指南:存储、图片编辑、校验与安全防护

Filament 文件上传字段(FileUpload)完整实战指南:存储、图片编辑、校验与安全防护 【免费下载链接】filament A powerful open-source UI framework for Laravel • Build and ship apps & admin panels fast with Livewire 项目地址: …

📅 2026/9/11 23:51:46
基于SpringBoot的充电桩管理系统:架构设计、部署与AOP优化

基于SpringBoot的充电桩管理系统:架构设计、部署与AOP优化

简介:基于SpringBoot的车辆充电桩设计与实现项目资料包,是一套面向计算机相关专业毕业设计或Java Web开发学习者的完整参考方案,覆盖充电桩管理系统的选题规划、代码实现、论文撰写与答辩准备等环节。资源内含项目源码、毕业论文及PPT答辩稿&…

📅 2026/9/11 23:51:46
MORE NEWS

更多资讯

📰

Shell条件语句详解与实战技巧

1. Shell条件语句基础解析作为一名有十年经验的Linux系统管理员,我处理过无数Shell脚本中的条件判断问题。条件语句是Shell编程中最基础也最易出错的部分,今天我们就来彻底拆解这个主题。Shell条件语句的核心作用是让脚本具备决策能力。想象你正在编写一…

📰

Spring Boot与Ollama大模型推理性能优化实战

1. 问题背景与核心挑战最近在本地开发环境中搭建了一个基于Spring Boot 3和Ollama的大模型推理服务,发现接口响应时间普遍在5秒以上,这显然无法满足生产环境的需求。我们的目标是将延迟降低到500ms以内,这对实时交互应用至关重要。Ollama作为…

📰

SSM+MySQL幼儿园管理系统源码解析:从部署到优化

简介:一款面向Java毕业设计与课程设计的幼儿园管理系统源码包,基于SSM框架和MySQL实现,覆盖管理员与会员两类角色。后台支持教师、课程、幼儿活动、餐饮、轮播图、留言等模块管理,前端提供关于我们、特色课程、活动与餐饮信息浏览…

📰

别踩雷!不是所有 AI 写作工具都靠谱,2026 高校认可工具精选

每年毕业季,无数同学深陷论文难题:开题毫无思路、搭建框架耗费数日、初稿逻辑松散、查重标红泛滥、AI检测超标、格式反复被导师驳回。面对海量的AI写作工具,不少学生抱着试一试的心态选择通用型平台,却往往发现这些工具存在诸多致…

📰

SpacetimeDB C++ 模块库实战:用 C++20 在数据库内构建 WebAssembly 模块

SpacetimeDB C 模块库实战:用 C20 在数据库内构建 WebAssembly 模块 【免费下载链接】SpacetimeDB Development at the speed of light 项目地址: https://gitcode.com/GitHub_Trending/sp/SpacetimeDB 导读 SpacetimeDB C 模块库(crates/bindin…

📰

多模态融合五种策略原理与PyTorch实现

简介:本资源是一份面向高校学生与初学者的多模态情感分析课程设计项目,聚焦期末大作业场景,解决文本与图像双模态数据协同建模的情感倾向识别问题。压缩包共47个文件,含17个核心Python源码(如main.py、Trainer.py、多种…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬