卫星遥感舰船检测数据集实战:从VOC/COCO/YOLO到YOLO训练全流程
2026/9/9 1:19:51 网站建设 项目流程

简介:面向目标检测入门与遥感识别应用的YOLO训练数据集,包含1000张真实卫星遥感舰船影像,配套VOC、COCO、YOLO三种格式标签,可直接用于YOLO系列模型训练,适合高校课程设计、算法实验及竞赛备赛。资源共2000个文件,以1000个xml和990个txt标注文件为主体,另含Python数据集划分脚本、YAML配置文件及HTML版环境搭建与训练教程,压缩包整体84.08MB。目前已有565人学习。除数据外,还提供训练集、验证集、测试集划分脚本,支持按需生成ImageSets目录,并配套Linux与Windows双平台的YOLO环境搭建和训练案例教程,可帮助初学者从数据准备到模型训练完整走通流程。 拿到这个压缩包的时候,我的第一反应是终于不用再为卫星遥感数据的标注头疼了。做目标检测的人都知道,遥感场景下的舰船检测和日常的地面物体检测完全是两回事:俯瞰视角、目标尺度小、背景复杂,港口里的船密密麻麻挨在一起,海面上的船又和波浪纹路混在一起。手头有1000张标注好的卫星影像,还带了voc、coco、yolo三种格式的标签、划分脚本和训练教程,这基本就是一条龙服务,直接能省下我两个星期的数据准备时间。

这篇文章我就以实际使用的角度,把这个数据集的完整链路拆开讲一遍:从三种标签格式的区别与转换原理,到划分脚本的正确打开方式,再到YOLO训练的完整操作流程,最后把我自己踩过的坑和验证经验一并分享出来。无论你是刚入门的初学者,还是已经在跑YOLO但想省点时间的老手,这篇内容应该都能直接帮你落地。

1. 为什么卫星舰船检测不能拿通用目标检测数据集硬做

很多人一开始会有一个朴素的想法:目标检测框架是通用的,那我直接用COCO或者VOC的数据集训练一个模型,不也能用来检测卫星图里的船吗?表面上说得通,但实际效果几乎一定会让你失望。

先说目标的特征差异。自然影像里的船,比如COCO数据集里的船,大多是近景拍摄,船体在画面里占了很大的面积,轮廓清晰、纹理丰富,有的甚至能看到甲板上的集装箱。而卫星遥感影像里的船,普遍只有几十个像素大小,甚至更小,船体就是一个细长的亮斑或者暗色小点。模型在COCO上学会的"船"的特征,放在卫星图上根本对不上号,漏检率会高得离谱。

再说场景差异。卫星图的海面背景非常复杂,有波浪纹理、云层阴影、海岸线、礁石、养殖网箱,这些在模型眼里都可能和目标产生混淆。尤其是内河港口区域,船只密集排列、船头船尾方向各异,加上部分船体被码头设施遮挡,普通目标检测模型在这种场景下非常容易误检和漏检。

还有一个很现实的问题:标注风格。通用数据集的标注框大多是把整个目标连同周边小范围背景一起框进去,而遥感舰船检测的标注通常更贴边,框要紧紧包住船体。如果标注的边框标准差很多,模型学到的回归目标就不稳定,训练出来的模型边界框精度会明显变差。所以,要做出一个能用的遥感舰船检测模型,专类数据集是必需品,这也是我拿到这个包之后比较兴奋的原因。

2. 压缩包内的文件结构:三种格式标签并存到底解决了什么

解压完这个rar包之后,我先把目录结构捋了一遍。核心内容实际上分成了三类:影像数据、标签数据和配套工具。影像数据比较好理解,就是1000张卫星遥感图片;标签数据是重头戏,每张图片对应三种不同格式的标注文件;配套工具包含数据集划分脚本和训练教程文档。

2.1 VOC格式的组织方式

VOC(Visual Object Classes)格式的标签是以XML文件形式存在的,每一张图片对应一个同名XML文件。这个XML文件里记录了图片的尺寸、通道数,以及图片中每个目标对象的类别名称、边界框左上角和右下角坐标。

VOC格式最大的特点是人可读性好,用文本编辑器打开就能直接查看某个目标的坐标和类别,调试和人工检查时非常直观。但它也有个缺点:路径信息是绝对路径,一旦你的工程目录和标注时不一致,需要做路径替换才能正常工作。

在这个数据集里,VOC格式标签是作为"母版"存在的,因为它信息最完整,后续转成COCO或者YOLO格式,都以VOC里的坐标信息为基准。

2.2 COCO格式的组织方式

COCO格式用的是JSON文件,整个数据集的标注信息被汇总到一个大的JSON结构里。JSON里包含images数组(记录每张图片的id、文件名、宽高)、annotations数组(记录每个标注框的id、图片id、类别id、坐标及面积)、categories数组(记录类别名称和id的映射关系)。

COCO格式的坐标是[x, y, width, height]的形式,x和y是边界框左上角的坐标,width和height是框的宽高。如果你平时用Detectron2、MMDetection这类框架,COCO格式是它们的原生输入,这个数据集自带的COCO标签能让你直接跑这些框架,省去自己写转换脚本的麻烦。

2.3 YOLO格式的组织方式

YOLO格式的标签是TXT文件,每行一个目标,格式为:class_id x_center y_center width height。这里的坐标全部是归一化坐标,即用实际像素坐标除以图片的宽或高,所有数值都落在0到1之间。

YOLO格式看起来最简洁,但有个容易出错的点:中心点坐标和宽高都是归一化后的值,如果标注时图片尺寸和训练时不一致,或者你手动改了图片尺寸但没同步修改归一化坐标,模型训练就会完全跑偏。这个数据集给的YOLO标签是按原始图片尺寸归一化好的,使用时要确保训练入口不做缩放处理,或者使用能自动匹配的加载逻辑。

我把三种格式的关键差异整理成一个表,方便你对照理解:

标注格式文件后缀坐标形式存储方式适用框架
VOCXML左上角x、y,右下角x、y每图一文件Detectron2、MMDetection等
COCOJSON左上角x、y,宽w、高h整个数据集一个文件Detectron2、MMDetection等
YOLOTXT中心点x、y,宽w、高h(归一化)每图一文件YOLO系列、Ultralytics等

这里还要顺便说一句:不要觉得数据集同时给了三种格式是"多余的重复"。你换框架做实验的时候就知道多省事了,不夸张地说,我自己以前从VOC标注转YOLO格式,手写脚本处理坐标边界、类别映射、图片路径匹配这几个环节,没少花时间。拿到这个数据集后,换框架测试就是改一行配置的事。

3. 划分脚本:训练集、验证集、测试集不能随便乱切

数据集划分看起来是最简单的操作,不就是随机抽一部分图片做训练、一部分做验证吗?但实际上划分得是否合理,对你的实验结果可信度影响非常大。这个压缩包里附带的划分脚本,我看了下实现逻辑,算是把该考虑的点都考虑到了。

3.1 划分脚本的核心逻辑

脚本的核心思路是先按比例切分图片,再同步切分标签。我把它简化后的核心逻辑整理出来,大概是这样:

import os import random import shutil image_dir = 'images' label_dir = 'labels_yolo' train_ratio = 0.7 val_ratio = 0.2 # test_ratio = 0.1 all_images = [f for f in os.listdir(image_dir) if f.endswith('.jpg')] random.seed(42) # 固定随机种子,保证划分结果可复现 random.shuffle(all_images) train_split = int(len(all_images) * train_ratio) val_split = int(len(all_images) * (train_ratio + val_ratio)) train_images = all_images[:train_split] val_images = all_images[train_split:val_split] test_images = all_images[val_split:] def move_files(image_list, split_name): os.makedirs(f'dataset/{split_name}/images', exist_ok=True) os.makedirs(f'dataset/{split_name}/labels', exist_ok=True) for img_name in image_list: base_name = os.path.splitext(img_name)[0] shutil.copy(os.path.join(image_dir, img_name), f'dataset/{split_name}/images/') shutil.copy(os.path.join(label_dir, base_name + '.txt'), f'dataset/{split_name}/labels/')

几个关键点值得关注:

第一,随机种子固定为42(或者其他任意固定值)。这样每次运行脚本,划分结果完全一致,实验的可复现性有保障。你在做对比实验时,如果每次划分都不一样,模型效果差异就分不清是模型结构带来的,还是数据分布带来的。

第二,脚本保证了图片和标签的同步移动。这点看似基础,但实际中因为文件名不完全匹配、多扩展名等情况,很容易出现图片和标注文件对不上的问题。这个脚本用基础文件名(不含扩展名)做匹配,是比较稳妥的做法。

第三,划分比例用了常见的7:2:1。遥感数据本身获取难度大、标注成本高,数据量不大时,测试集比例不建议太大。训练集太小模型学不到位,验证集太小调参参考性又不足,7:2:1是个比较均衡的选择。

3.2 遥感场景下的划分注意点

在很多遥感数据集里,同一区域的不同切片之间可能是从同一张大图上切下来的,存在一定的空间相关性。如果随机划分,相邻切片的相似内容可能同时出现在训练集和验证集里,导致验证集分数虚高。更好的做法是按图幅或者地理区块划分,但通过脚本实现这类划分需要额外提供对应的分组信息,非结构化数据集的通用划分脚本往往做不到。

所以对这个数据集,我的建议是:先用自带的划分脚本跑通训练流程,如果后续做精度评估和调优,再考虑手动按区域构建验证集。至少要清楚当前随机划分模式下的精度指标会略微"偏乐观"一点。

4. YOLO训练环境搭建:最容易被卡住的环节其实是安装配置

环境配置是很多人拿到数据集之后遇到的第一个大坎。我陆续帮不少人调试过YOLO的训练环境,发现大部分问题都出在显卡驱动、CUDA版本和PyTorch版本三者不匹配上。这里我以YOLOv8为例,把环境配置的完整流程和版本选择思路讲清楚。

4.1 显卡与CUDA的匹配逻辑

先看你的显卡型号。NVIDIA显卡需要安装对应版本的显卡驱动,驱动支持向下兼容多代CUDA版本。然后PyTorch的CUDA版本要和你的驱动所支持的CUDA版本匹配。

这里有网传很多说法"必须安装CUDA才能跑YOLO",严格说不完全对。PyTorch在安装时会自带一套CUDA运行时库,并不需要你单独安装完整CUDA工具包,但显卡驱动必须支持对应的CUDA版本。这也是为什么有的人没装CUDA也能跑起来,而有的人装了CUDA还是报错,本质上是显卡驱动版本太老。

我建议的检查顺序是:

  1. 先看显卡型号,确认是否NVIDIA且支持CUDA加速。
  2. 查看驱动支持的最大CUDA版本,用nvidia-smi命令查看右上角CUDA Version。
  3. 根据驱动支持版本,安装匹配的PyTorch。
nvidia-smi # 输出中右上角的 CUDA Version,例如 12.1 # 这就是当前驱动支持的最高CUDA版本

这里要注意,驱动支持的CUDA版本和实际安装的PyTorch CUDA版本之间是"驱动版本 >= PyTorch CUDA版本"的关系,不是一定要相等。

4.2 YOLOv8的安装过程

YOLOv8使用Ultralytics框架,安装非常简单:

pip install ultralytics

但如果你打算用GPU训练,建议先安装好对应版本的PyTorch,再安装ultralytics,防止pip自动拉取一个CPU版本的PyTorch。以CUDA 11.8为例:

pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics

安装完成后,用下面的命令验证一下CUDA是否可用:

import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))

如果输出True并且正确显示你的显卡型号,说明环境OK,可以进入下一步了。

4.3 AMD显卡的情况说明

不少人在搜"AMD显卡能不能跑YOLO",这个问题确实问得挺多。AMD显卡的使用情况和N卡不同,如果你的显卡是AMD的RX 580这类型号,原生PyTorch是不直接支持ROCm的,需要安装特定版本的PyTorch才能调用AMD显卡,而且很多优化功能和生态工具链都不如NVIDIA完善。

基于我的经验:如果你有NVIDIA显卡,哪怕是比较老的1060或1650,训练YOLO的小数据集体验都会比AMD显卡顺畅很多。如果只有AMD显卡,优先使用CPU模式先把流程跑通,不要一开始就纠结GPU加速。这个数据集只有1000张图片,YOLOv8s在CPU上训练一个epoch也就是十几分钟到几十分钟的事,跑通流程和调试代码是完全够用的。

5. 训练配置文件:yaml和数据集的对应关系

环境搭好之后,下一步就是准备训练所需的配置文件。YOLO系列框架的训练入口都离不开一个data yaml文件,这个文件的作用是告诉模型:你要训练哪些类别、训练集和验证集的图片放在哪里。很多初学者的训练报错都出在这一步。

5.1 data yaml的关键字段

以这个数据集为例,对应的data yaml文件长这样:

# ship_detection.yaml path: /path/to/your/dataset # 数据集根目录(绝对路径) train: images/train # 训练集图片文件夹相对路径 val: images/val # 验证集图片文件夹相对路径 test: images/test # 测试集图片文件夹相对路径(可选) nc: 1 # 类别数量 names: ['ship'] # 类别名称列表

这里有几个容易踩的坑:

第一,path字段建议写绝对路径。很多人用相对路径后,在别的路径下运行训练命令就报找不到文件,排查半天。虽然Ultralytics框架支持相对路径,但绝对路径能省掉大多数路径问题。

第二,train和val字段填的是图片文件夹的路径,不是标注文件夹的路径。框架会从图片文件夹找同名TXT文件作为对应标注,注意不要搞反。

第三,nc和names的顺序和个数必须和标签文件的class_id对应。比如这个数据集只有"船"一个类别,class_id就是0,names列表第一个就是'ship'。如果names顺序写错,训练结果虽然能跑,但推理出来的类别名会错位。

5.2 模型配置文件的选择

YOLOv8提供了多种规格的模型,从轻到重依次是YOLOv8n、YOLOv8s、YOLOv8m、YOLOv8l、YOLOv8x。它们的主要区别是参数量和推理速度。

对于1000张图片这样的小数据集,我的建议是优先尝试YOLOv8s,它在精度和训练速度上比较均衡。上来直接跑YOLOv8x,模型太复杂、数据量相对不足,反而容易过拟合,训练时间也长。

使用默认配置初始化模型:

# 以yolov8s预训练权重为起点训练(如果从头训练,可去掉pretrained参数) yolo detect train data=ship_detection.yaml model=yolov8s.pt epochs=100 imgsz=640 batch=8

这里说下几个参数的思路:epochs=100是一般小数据集的常用值,如果训练曲线还没收敛可以适当增加;imgsz=640是默认输入尺寸,因为卫星影像的船只目标普遍较小,如果你发现训练时小目标的召回率偏低,可以考虑使用更大尺寸如1280作为输入,但显存占用和训练时间也会成倍增加;batch=8是按常见显卡显存设定的,具体要看你的显卡。

6. 训练过程中的监听指标与可视化验证

训练启动后,不要什么都不管就干等着看结果。我习惯用一套固定的监听节奏来确认训练状态是否健康,发现问题可以早点停掉,不至于白白浪费几个小时的训练时间。

6.1 关键训练指标怎么看

YOLO训练时,控制台和日志文件里会出现一堆指标,常用的是这几个:

指标全称含义关注时机
box_loss边界框损失预测框和真实框的差异程度全程
cls_loss分类损失类别预测错误的程度全程
dfl_loss分布焦点损失边界框分布预测的误差全程
precision精确率预测为正样本的目标中真正目标的比例验证阶段
recall召回率真实目标中被成功检出的比例验证阶段
mAP50平均精度(IOU=0.5)画PR曲线下的面积,核心评价指标验证阶段
mAP50-95平均精度(IOU 0.5-0.95)更严格的评价指标,对框位置要求高验证阶段

对于舰船检测这种小目标场景,我个人最关注的是recall和mAP50-95。recall低了说明很多船没被框出来,mAP50-95低了说明就算框出来了,位置精度也还不够好。模型训练结束后,最终权重文件保存的基准就是验证集上得分最高的一次。

6.2 训练结束后怎么检查效果

训练完成之后,先不要急着部署。我会先做两步检查:

第一步,看验证集上的预测结果图。Ultralytics训练结束后会在runs/detect/val目录下生成带标注的预测图。重点看海面背景下有没有把波纹误判成船、港口密集区域有没有漏检、紧挨着的两艘船有没有被框成一个。这一步是发现问题的效率最高的方式。

第二步,跑一下自测图片。选几张训练集中没有出现过的卫星影像,用训练好的权重做推理:

yolo detect predict model=runs/detect/train/weights/best.pt source=test_images.jpg imgsz=640 conf=0.25

conf是置信度阈值,遥感舰船检测因为目标小、容易漏检,阈值可以设得比常规低一些,比如0.2到0.25。如果设太高,很多真实船只可能因为置信度不足被过滤掉。

检查预测结果时,我还会顺手看一眼边界框紧贴程度。很多情况下模型输出的框比标注框大一圈,这在遥感场景里影响较大,因为小目标一旦框偏大,IoU计算时精度就上不去。

7. 数据质量检查和坑点排查经验

这个数据集整体质量是不错的,但我建议你在正式训练之前,先花点时间把控数据质量。用我下面方法快速扫一遍,能避免很多训练效果差的"隐形原因"。

7.1 检查标签和图片的对应关系

最容易出现的问题是图片里有船但标签文件漏标了,或者是标签文件对应错了图片。跑YOLO之前,我会用一个简单脚本检查图片数量和标签数量是否一致:

# 统计图片和标签数量 ls images/ | wc -l ls labels_yolo/ | wc -l

如果不一致,就要逐个找出缺失的文件。在YOLO框架下,如果一张训练图片没有对应的标签TXT,训练时会被当作背景图处理,不会报错但会影响模型训练。这个坑非常隐蔽,很多人训练了很久模型效果都不好,根本不会想到是这个原因。

7.2 检查标签坐标是否越界和超出范围

YOLO格式的归一化坐标理论上都应在0到1之间。如果出现大于1或者小于0的坐标,说明标注过程中有过特殊操作(比如裁剪、旋转),这类标签训练时会因为Anchor匹配不上而拖累模型。快速检查方法:

# 检查是否存在越界坐标 grep -E '[0-9]+\.[0-9]+' labels_yolo/*.txt | awk '{if($2<0||$2>1||$3<0||$3>1||$4<0||$4>1||$5<0||$5>1) print $0}'

凡是有输出记录的TXT文件,都需要人工确认一遍。这个数据集我检查下来基本没有这个问题,但养成这种检查习惯,换成其他数据集时会帮你省下大量排查时间。

7.3 数据增强的适度使用

YOLO训练默认会做一些数据增强,比如随机翻转、色彩调整、马赛克增强等。这些增强手段对提升模型泛化能力很有帮助,但在遥感场景下要留意一个反向问题:卫星图里船是有固定朝向特征的,比如船头往往是尖的,垂直翻转后船头朝下虽然语义上还是船,但和真实场景的分布可能不一致。

Ultralytics框架里可以通过调整增强参数来控制增强强度。如果你发现验证集效果不错、测试集效果较差,可以在训练参数里适当调低增强幅度。对于小目标检测任务,马赛克增强(mosaic)建议保留,因为它在增加样本多样性方面效果明显,但可以设置mosaic=0.5之类的中等概率而不是全程启用。

8. 针对舰船小目标的进一步调优建议

用这个数据集跑通基线之后,如果你还想进一步刷精度,下面这几个方向是我实际试过并且觉得有效的。

8.1 输入分辨率优先

小目标检测的通用第一法则,就是提高输入分辨率。同样是640x640的输入和1280x1280的输入,目标在特征图上的尺寸差异很大,对小目标的检出效果影响非常明显。代价是显存占用翻倍、训练时间变长,需要根据显卡实际情况权衡。

8.2 使用更高层特征融合

YOLO系列本身有FPN/PAN的结构来融合不同层特征,但对于极小目标,高层的语义信息和低层的细节信息融合还不够充分。可以考虑引入更浅层的高分辨率特征图参与检测,或者在训练时单独提高小目标的损失权重。

在不改动模型结构的条件下,最简单的方法是训练时用更小的Anchor尺寸,或对数据集中目标的尺寸分布做统计分析,看看可不可以针对性地调整。

8.3 切片推理

对于超大尺寸的卫星遥感图,常规做法不是直接整图推理,而是把大图切成小块,分别推理后再把结果拼回去。切片时要设置合适的重叠率,避免船只正好被切在切片边缘导致检测不到。这个数据集的图片尺寸相对可控,先用整图训练和推理是没问题的,但如果后续你换了大尺寸遥感影像,切片推理的流程还是要尽早规划。

9. 从数据集到落地部署的路线

训练出一个能用的模型之后,距离真正在业务里落地还有一段路要走。如果只是做实验,那到这里已经算完成了,但如果你是想把模型用到实际的遥感影像处理流程中,下面几个问题需要提前想清楚。

第一是精度和速度的取舍。YOLOv8n比YOLOv8s体积更小、推理更快,但精度会略低。如果检测任务对实时性要求高,比如处理视频流里的船只监控,那么轻量模型的优势就体现出来了;如果是离线处理大图,那速度压力不大,选更重的模型做精度更高的检测更合理。

第二是模型导出。Ultralytics框架支持直接导出为ONNX、TensorRT等格式:

yolo export model=runs/detect/train/weights/best.pt format=onnx imgsz=640

ONNX格式最大的价值是跨平台部署,可以在支持ONNX运行时(ONNX Runtime)的环境里加载模型推理,摆脱对特定训练框架的依赖。TensorRT则是NVIDIA显卡上做推理加速的利器,能比PyTorch原生推理快数倍,实际部署中很常用。

第三是框架的依赖问题。很多部署环境里不需要安装完整PyTorch和Ultralytics,只安装opencv-python、onnxruntime、numpy等依赖,加载导出后的模型文件即可完成推理。这个思路在低配服务器或嵌入式设备上特别实用,能少装上百MB的依赖包。

我在实际落地的时候踩过一个相关的坑:用小图训练好的模型,直接拿去推理大尺寸遥感图,效果很差。后来观察到是模型对大图上那些极端长宽比的目标适应性不好,解决思路是用切片推理加适当重叠,同时针对切片目标重新做一轮Fine-tune。这个经验分享出来,希望大家少走点弯路。

最后再分享一个实用小技巧:训练结束后,把验证集预测图和PR曲线存好,作为项目交付的一部分。后续不管是调优、换模型还是写报告,这些材料都能派上大用场。数据集只是起步,把流程跑顺、把评价体系建好,才是真正发挥这个压缩包价值的关键。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询