
简介面向目标检测入门与遥感识别应用的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格式的组织方式VOCVisual 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(fdataset/{split_name}/images, exist_okTrue) os.makedirs(fdataset/{split_name}/labels, exist_okTrue) for img_name in image_list: base_name os.path.splitext(img_name)[0] shutil.copy(os.path.join(image_dir, img_name), fdataset/{split_name}/images/) shutil.copy(os.path.join(label_dir, base_name .txt), fdataset/{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还是报错本质上是显卡驱动版本太老。我建议的检查顺序是先看显卡型号确认是否NVIDIA且支持CUDA加速。查看驱动支持的最大CUDA版本用nvidia-smi命令查看右上角CUDA Version。根据驱动支持版本安装匹配的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就是0names列表第一个就是ship。如果names顺序写错训练结果虽然能跑但推理出来的类别名会错位。5.2 模型配置文件的选择YOLOv8提供了多种规格的模型从轻到重依次是YOLOv8n、YOLOv8s、YOLOv8m、YOLOv8l、YOLOv8x。它们的主要区别是参数量和推理速度。对于1000张图片这样的小数据集我的建议是优先尝试YOLOv8s它在精度和训练速度上比较均衡。上来直接跑YOLOv8x模型太复杂、数据量相对不足反而容易过拟合训练时间也长。使用默认配置初始化模型# 以yolov8s预训练权重为起点训练如果从头训练可去掉pretrained参数 yolo detect train dataship_detection.yaml modelyolov8s.pt epochs100 imgsz640 batch8这里说下几个参数的思路epochs100是一般小数据集的常用值如果训练曲线还没收敛可以适当增加imgsz640是默认输入尺寸因为卫星影像的船只目标普遍较小如果你发现训练时小目标的召回率偏低可以考虑使用更大尺寸如1280作为输入但显存占用和训练时间也会成倍增加batch8是按常见显卡显存设定的具体要看你的显卡。6. 训练过程中的监听指标与可视化验证训练启动后不要什么都不管就干等着看结果。我习惯用一套固定的监听节奏来确认训练状态是否健康发现问题可以早点停掉不至于白白浪费几个小时的训练时间。6.1 关键训练指标怎么看YOLO训练时控制台和日志文件里会出现一堆指标常用的是这几个指标全称含义关注时机box_loss边界框损失预测框和真实框的差异程度全程cls_loss分类损失类别预测错误的程度全程dfl_loss分布焦点损失边界框分布预测的误差全程precision精确率预测为正样本的目标中真正目标的比例验证阶段recall召回率真实目标中被成功检出的比例验证阶段mAP50平均精度(IOU0.5)画PR曲线下的面积核心评价指标验证阶段mAP50-95平均精度(IOU 0.5-0.95)更严格的评价指标对框位置要求高验证阶段对于舰船检测这种小目标场景我个人最关注的是recall和mAP50-95。recall低了说明很多船没被框出来mAP50-95低了说明就算框出来了位置精度也还不够好。模型训练结束后最终权重文件保存的基准就是验证集上得分最高的一次。6.2 训练结束后怎么检查效果训练完成之后先不要急着部署。我会先做两步检查第一步看验证集上的预测结果图。Ultralytics训练结束后会在runs/detect/val目录下生成带标注的预测图。重点看海面背景下有没有把波纹误判成船、港口密集区域有没有漏检、紧挨着的两艘船有没有被框成一个。这一步是发现问题的效率最高的方式。第二步跑一下自测图片。选几张训练集中没有出现过的卫星影像用训练好的权重做推理yolo detect predict modelruns/detect/train/weights/best.pt sourcetest_images.jpg imgsz640 conf0.25conf是置信度阈值遥感舰船检测因为目标小、容易漏检阈值可以设得比常规低一些比如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($20||$21||$30||$31||$40||$41||$50||$51) print $0}凡是有输出记录的TXT文件都需要人工确认一遍。这个数据集我检查下来基本没有这个问题但养成这种检查习惯换成其他数据集时会帮你省下大量排查时间。7.3 数据增强的适度使用YOLO训练默认会做一些数据增强比如随机翻转、色彩调整、马赛克增强等。这些增强手段对提升模型泛化能力很有帮助但在遥感场景下要留意一个反向问题卫星图里船是有固定朝向特征的比如船头往往是尖的垂直翻转后船头朝下虽然语义上还是船但和真实场景的分布可能不一致。Ultralytics框架里可以通过调整增强参数来控制增强强度。如果你发现验证集效果不错、测试集效果较差可以在训练参数里适当调低增强幅度。对于小目标检测任务马赛克增强mosaic建议保留因为它在增加样本多样性方面效果明显但可以设置mosaic0.5之类的中等概率而不是全程启用。8. 针对舰船小目标的进一步调优建议用这个数据集跑通基线之后如果你还想进一步刷精度下面这几个方向是我实际试过并且觉得有效的。8.1 输入分辨率优先小目标检测的通用第一法则就是提高输入分辨率。同样是640x640的输入和1280x1280的输入目标在特征图上的尺寸差异很大对小目标的检出效果影响非常明显。代价是显存占用翻倍、训练时间变长需要根据显卡实际情况权衡。8.2 使用更高层特征融合YOLO系列本身有FPN/PAN的结构来融合不同层特征但对于极小目标高层的语义信息和低层的细节信息融合还不够充分。可以考虑引入更浅层的高分辨率特征图参与检测或者在训练时单独提高小目标的损失权重。在不改动模型结构的条件下最简单的方法是训练时用更小的Anchor尺寸或对数据集中目标的尺寸分布做统计分析看看可不可以针对性地调整。8.3 切片推理对于超大尺寸的卫星遥感图常规做法不是直接整图推理而是把大图切成小块分别推理后再把结果拼回去。切片时要设置合适的重叠率避免船只正好被切在切片边缘导致检测不到。这个数据集的图片尺寸相对可控先用整图训练和推理是没问题的但如果后续你换了大尺寸遥感影像切片推理的流程还是要尽早规划。9. 从数据集到落地部署的路线训练出一个能用的模型之后距离真正在业务里落地还有一段路要走。如果只是做实验那到这里已经算完成了但如果你是想把模型用到实际的遥感影像处理流程中下面几个问题需要提前想清楚。第一是精度和速度的取舍。YOLOv8n比YOLOv8s体积更小、推理更快但精度会略低。如果检测任务对实时性要求高比如处理视频流里的船只监控那么轻量模型的优势就体现出来了如果是离线处理大图那速度压力不大选更重的模型做精度更高的检测更合理。第二是模型导出。Ultralytics框架支持直接导出为ONNX、TensorRT等格式yolo export modelruns/detect/train/weights/best.pt formatonnx imgsz640ONNX格式最大的价值是跨平台部署可以在支持ONNX运行时ONNX Runtime的环境里加载模型推理摆脱对特定训练框架的依赖。TensorRT则是NVIDIA显卡上做推理加速的利器能比PyTorch原生推理快数倍实际部署中很常用。第三是框架的依赖问题。很多部署环境里不需要安装完整PyTorch和Ultralytics只安装opencv-python、onnxruntime、numpy等依赖加载导出后的模型文件即可完成推理。这个思路在低配服务器或嵌入式设备上特别实用能少装上百MB的依赖包。我在实际落地的时候踩过一个相关的坑用小图训练好的模型直接拿去推理大尺寸遥感图效果很差。后来观察到是模型对大图上那些极端长宽比的目标适应性不好解决思路是用切片推理加适当重叠同时针对切片目标重新做一轮Fine-tune。这个经验分享出来希望大家少走点弯路。最后再分享一个实用小技巧训练结束后把验证集预测图和PR曲线存好作为项目交付的一部分。后续不管是调优、换模型还是写报告这些材料都能派上大用场。数据集只是起步把流程跑顺、把评价体系建好才是真正发挥这个压缩包价值的关键。本文还有配套的精品资源点击获取