ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

飞机卫星图目标检测数据集详解:从标注到YOLOv8训练避坑指南

飞机卫星图目标检测数据集详解:从标注到YOLOv8训练避坑指南 简介这是一份面向人工智能目标检测研究者和初学者的高质量数据集专注卫星遥感图像中的飞机识别适用于单类别检测模型的训练、评估与算法验证也可服务于无人驾驶、智能监控和遥感分析等实际场景。资源包共含2000个文件包括1000张1024x1024高分辨率JPG彩色图像、1000个配套XML标签文件内含飞机目标边界框坐标以及1个info.txt元数据说明压缩包整体约291.76MB。目前已有633人学习下载数据规模适中、类别单一既适合入门者快速跑通目标检测流程也能支撑遥感领域的算法调优实验。卫星视角带来的阴影、遮挡和复杂背景会促使模型更好地区分目标与环境从而提升实际场景下的检测鲁棒性。利用这些样本可方便地应用于YOLO、SSD、Faster R-CNN等主流检测框架为飞机目标检测方向的实践与探索提供扎实的数据基础。1. 人工智能目标检测数据集飞机卫星图3先别急着开训这份数据集的水比你想的深做人工智能目标检测项目时数据集决定上限模型只是逼近这个上限。看到“飞机卫星图3”这个标题你应该意识到这不是普通的自然图像数据集而是遥感影像里的垂直细分场景从卫星或航拍图上把飞机目标框出来。这类数据集的难点不在“检测”本身而在目标尺度小、背景复杂、标注标准不一。很多读者第一反应是“下载下来直接跑 YOLO”结果往往在训练后发现 mAP 很低或者推理时对着停机坪疯狂误报。这篇文章我会以这个标题为切入点把飞机卫星图目标检测从数据整理、标注转换、训练参数到踩坑细节完整讲一遍适合正在做遥感目标检测、毕业设计或人工智能大作业的从业者也适合想把 YOLOv8 用在自有数据集上的人。2. 飞机卫星图检测为什么难小目标、大背景和标注标准的三角关系卫星图里的飞机检测和街景行人检测完全不是一回事。很多人第一次拿到数据后会惊讶一张 1024 分辨率的卫星图里飞机可能只占 30×30 像素整张图却有几百个疑似目标——候机楼、廊桥、地面车辆、跑道标线看起来都像。如果不先把这类数据的特性搞清楚后面所有步骤都会在错误的方向上反复折腾。2.1 卫星图里飞机的“样子”和自然图像完全不同自然图像里物体占据画面主体语义清晰卫星图是俯视视角飞机只是一个带机翼的几何轮廓颜色和周围停机坪接近。小目标检测问题在这里最典型coco 数据集里小于 32×32 像素的目标通常不算主流但卫星图中的飞机大量落在这个范围。更重要的是尺度问题。同一张卫星图里停场飞机、滑行飞机、跑道上的飞机因为拍摄分辨率和高度不同尺寸差异可以超过十倍。用固定锚框的检测器训练这种数据必须注意锚框尺寸的设置。YOLO 系列虽然能自适应计算锚框但前提是训练集里的目标尺寸分布有代表性。如果你的训练样本里几乎都是大飞机部署时遇到小飞机就很容易漏检。我在处理这类数据时第一步永远是统计分析所有标注框的宽高分布和面积分布而不是直接开始训练。这一步能帮你判断该用哪种预处理策略也能提前发现标注错误。统计方法很简单读取所有标注文件计算每个框的宽度、高度、面积然后画直方图。如果看到面积集中在几个离散区间说明数据来源可能混合了不同分辨率需要统一。2.2 “飞机卫星图3”这类数据集里通常有什么类别、尺度和分辨率从标题推测“飞机卫星图3”大概率是按来源或批次编号的数据集比如不同机场、不同卫星传感器的图像集合。这类数据集的常见构成方式是一组包含飞机的卫星图或航拍图配 XML 或 TXT 格式的标注文件。类别可能只有“飞机”一类也可能细分为“客机”“战斗机”“运输机”等取决于采集者的标注粒度。你需要关注几个关键指标。一是图像分辨率常见的有 0.5 米/像素、1 米/像素更高的比如 0.3 米/像素能看清飞机轮廓但数据集体积也大。二是目标数量密度有的图只有三五架飞机有的机场图中几十架密集排列后者会让 NMS 后处理压力变大。三是图像尺寸从 512×512 到 4096×4096 都有这直接决定训练时的输入尺寸和显存占用。拿到数据集后我建议先做一次质量审计。打开几张样本图把标注框绘制到图上逐类检查是否有错标、漏标、框过大或过小的情况。表情可能有误差但这一步能帮你建立对数据的直观感受。很多公开数据集的问题不是标注不对而是标注标准不一致比如有人把整个停机坪框进去有人只框机身。如果不做清洗模型会学到混乱的边界。2.3 选数据集前先想清楚检测目标、评估指标和场景边界在下载任何数据集之前先问自己三个问题。第一你要检测的是静止停场的飞机还是滑行中的飞机静止场景相对简单滑行中会有运动模糊需要更大的训练数据。第二你关心的是召回率还是精确率在安全监控场景里漏检一架飞机远比误报严重在资源普查场景里你可能更关注精确率。第三你的应用场景是整图检测还是视频流检测视频流需要考虑时序信息单纯用单帧检测器会频繁抖动。这些问题的答案决定了数据集的选型和预处理策略。比如只看停场飞机那么旋转增强可以适度使用如果要检测不同朝向的飞机最好使用旋转框标注而不是水平框因为水平框在飞机斜放时会包含大量背景导致正样本特征被稀释。评估指标方面遥感目标检测通常用 mAP0.5 和 mAP0.5:0.95 两个指标。前者对定位精度要求低适合看整体检出率后者更严格能反映框的质量。实战中你会发现飞机这类小目标在 mAP0.5 上表现尚可一旦提升 IoU 阈值mAP 会急剧下降原因是标注框和预测框的偏差在绝对像素上虽然小但相对目标尺寸来说很大。所以如果你最终要接后续的识别或跟踪模块必须把 mAP0.5:0.95 作为主要优化对象。3. 把数据集整理成模型能吃的样子标注、格式转换与目录划分很多人在这一步栽跟头。下载的数据集格式五花八门有的是 COCO JSON有的是 PASCAL VOC XML有的是已经转好的 YOLO txt。如果格式不统一训练脚本会直接报错或者读入错误数据。更隐蔽的问题是坐标系的混淆有的标注是绝对像素坐标有的是归一化坐标有的用了左上角加宽高有的用了中心点加宽高。这节我会讲清楚目标检测常用标注工具的产出格式以及如何通过脚本把它们统一成 YOLO 可用的格式。3.1 标注格式对比COCO、VOC、YOLO txt 怎么选三种主流格式各有各的使用场景。PASCAL VOC 的 XML 文件包含对象类别、边界框坐标、图像尺寸等信息结构清晰但冗长早期标注工具 LabelImg 默认输出这种格式。COCO JSON 把整个数据集的标注放在一个 JSON 文件里包含 images 和 annotations 两个数组支持 segmentation、area、iscrowd 等字段更适合做实例分割和复杂任务。YOLO txt 则是每个图像对应一个 txt 文件每行是“类别 中心点x 中心点y 宽 高”坐标全部归一化到 0~1 之间。对于飞机卫星图检测我一般会统一成 YOLO txt 格式原因有三个。第一Ultralytics YOLO 系列原生支持这种格式不需要额外的适配层。第二txt 文件小读取快训练时对 IO 的压力小。第三归一化坐标不依赖具体图像尺寸方便在不同分辨率下复用。但 YOLO txt 有个缺点它不记录图像尺寸。如果你之后想转回 COCO需要自己维护图像宽高信息。所以我会在转换时同时生成一个 JSON 元数据文件记录每张图的路径和尺寸相当于给自己留后悔药。这个文件看起来多余但在后续做滑窗推理或验证集检查时非常有用。3.2 用 LabelImg / CVAT 做飞机目标的标注流程与参数如果你拿到的数据集没有标注或者需要重新标注常见做法是用 LabelImg 或 CVAT。LabelImg 是本地工具适合几百张图的小项目CVAT 是 Web 工具适合多人协作和大量数据。用 LabelImg 标注飞机时有几个设置项值得注意。默认的 PascalVOC 模式保存为 XML需要改成 YOLO 模式直接输出 txt。标注时建议把 mode 设为“Single Class”因为飞机检测通常只有一类避免类别选择出错。另外LabelImg 对旋转框的支持很差只能画水平矩形。如果飞机的方向分布很大建议考虑用 CVAT 的旋转框标注功能或者提前确定你只做水平框检测。CVAT 的标注流程比 LabelImg 复杂一点但值得投入。创建任务时要把图像尺寸信息填写正确标注时选择“任何形状”里的“旋转矩形”模式导出时选择 YOLO 1.1 格式。导出后你会得到每个图像对应的 txt 文件以及一个包含类别列表的 obj.names。这里有个隐藏坑CVAT 的 YOLO 导出目录结构是 images 和 labels 分离的但有些版本导出的 txt 文件里类别索引是从 0 开始这和 YOLO 约定一致但有的导出工具会从 1 开始需要检查。标注飞机时还要注意边界框的贴合程度。我的习惯是让框紧贴飞机主体的边缘包含机翼但不包含连接廊桥。如果廊桥和飞机相接宁可稍微切掉一点廊桥也不要让框大到把地面也包进去。原因很简单检测器的正样本是框内区域的特征如果框内背景太多模型会学到“飞机周围的地面”而不是飞机本身。3.3 从 VOC/COCO 转成 YOLO 格式脚本与四个边界坑转换脚本是数据集整理的必经之路。我提供一个从 VOC XML 转 YOLO txt 的 Python 脚本模板它依赖 PyTorch 的 os 和 xml.etree 库不需要额外安装第三方包。import os import glob import xml.etree.ElementTree as ET def voc_to_yolo(xml_dir, label_dir, output_dir, classes): os.makedirs(output_dir, exist_okTrue) for xml_path in glob.glob(os.path.join(xml_dir, *.xml)): tree ET.parse(xml_path) root tree.getroot() # 图像宽高来自 XML 的 size 节点 size root.find(size) width int(size.find(width).text) height int(size.find(height).text) txt_name os.path.basename(xml_path).replace(.xml, .txt) txt_path os.path.join(output_dir, txt_name) with open(txt_path, w) as f: for obj in root.iter(object): cls obj.find(name).text if cls not in classes: continue box obj.find(bndbox) x1 float(box.find(xmin).text) y1 float(box.find(ymin).text) x2 float(box.find(xmax).text) y2 float(box.find(ymax).text) # 转换到 YOLO 中心点加宽高并归一化 x_center (x1 x2) / 2.0 / width y_center (y1 y2) / 2.0 / height w (x2 - x1) / width h (y2 - y1) / height class_id classes.index(cls) f.write(f{class_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}\n) if __name__ __main__: classes [airplane] voc_to_yolo(path/to/xml, path/to/labels, path/to/output, classes)这段脚本逻辑简单但实际转换时会有四个边界坑我逐个说一下。第一个坑是 XML 里的坐标可能超出图像边界原因是一些标注工具的 bug 或人工误操作转换前必须对 x2、y2 做 min(width, x2) 这样的剪裁否则归一化坐标会大于 1。第二个坑是目标太小导致宽或高为 0这种样本应该直接过滤掉不写入 txt否则训练时会出现空锚框。第三个坑是 XML 中 size 节点的宽高是原始图像尺寸但实际图像可能被缩放或裁剪过比如用 OpenCV 预处理时改了尺寸却忘了更新标注转换出来的坐标系就全错了。第四个坑是类别名不完全是 strict 匹配比如“airplanes”和“airplane”并存需要先统计所有类别名字再决定是否合并。3.4 划分训练集、验证集、测试集比例和随机种子数据划分看起来简单实际最容易出问题。常见比例是训练集 70%、验证集 15%、测试集 15%但在小目标数据集上我更推荐按“场景或图像来源”划分而不是按图像随机划分。比如同一个机场的卫星图如果同时出现在训练和验证里模型会对这个机场的特定光照和背景过拟合验证指标虚高。实现上只需要一个随机划分脚本但有两个细节要留意。第一使用固定随机种子保证别人能复现你的结果。我通常用 random.seed(2024) 或者在 sklearn 的 train_test_split 里指定 random_state。第二划分完成后把三个集合的图像数量、目标数量、目标平均大小打印出来确认分布接近。如果发现验证集里全是小飞机训练集里全是大飞机训练时模型就会在验证集上表现怪异。还有一个很少被提到的点测试集一旦确定就不要反复改动。很多人为了刷分看到验证集 mAP 不高就重新划分一次这等于把验证集信息偷偷泄漏给模型。正确的做法是只在验证集上迭代全部调完之后再用测试集跑一次最终结果。对于飞机卫星图这种小目标场景测试集的作用是给一个最终可信的数字而不是参与调参循环。4. 用 YOLOv8 训练自己的飞机检测数据集配置、命令与必调参数数据整理完成后就进入正式训练环节。这里我以 Ultralytics YOLOv8 为例因为它的 CLI 和 Python API 都很完善对自定义数据集的适配过程几乎是零门槛。YOLOv8 的检测头是 Anchor-Free 的相比 YOLOv5 的 Anchor-Based 设计在模型定义层面少了一些锚框相关的配置但核心训练技巧和参数仍然相通。4.1 准备工作数据集文件结构和 data.yaml 的写法要让 YOLOv8 认你的数据集文件结构很重要。常见结构是 images 目录下分 train、val、test 三个子目录labels 目录下同样分层且所有图像和标注文件一一对应。同一张图的图像文件和标注文件必须同名只是扩展名不同图像是 .jpg标注是 .txt。注意标签文件中每行对应一个目标如果某张图没有目标也要保留一个空 .txt 文件否则训练脚本可能报数据集一致性错误。data.yaml 是数据集的配置文件内容很简洁。我通常手写一个而不是依赖自动生成工具因为需要精确控制路径。path: /home/user/satellite_aircraft # 数据集根目录 train: images/train val: images/val test: images/test nc: 1 names: [airplane]这里 path 建议写绝对路径尤其是用 IDE 启动训练时相对路径容易出错。names 列表的索引顺序要和标注文件的类别 id 一致类别是 airplane 就写 [airplane]。如果有多类飞机比如客机和战斗机顺序不能乱。这里有个注意点data.yaml 必须在项目根目录下或者通过命令参数指定完整路径。写错路径时Ultralytics 会去下载数据集这个坑很多人遇到过。验证数据配置是否正确的命令是yolo detect train datadata.yaml modelyolov8s.yaml epochs0epochs0 不会真正开始训练但会加载数据集并打印类名、图像数量和标签数量。如果输出里类别顺序和你预期不一致说明 data.yaml 写错了。我一般会先把这个命令跑通再开始正式训练省得训练到一半才发现类别错位。4.2 启动训练一个可以直接复现的最小命令数据集结构正确后训练命令并不复杂。我用的是 yolov8s 模型因为它在速度和精度之间比较均衡。训练命令如下yolo detect train \ datadata.yaml \ modelyolov8s.yaml \ pretrainedyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ workers4 \ projectruns/aircraft \ nameexp1 \ seed42这条命令的核心参数我解释一下。pretrained 代表加载 COCO 预训练权重这对遥感小目标非常有用因为 COCO 里有飞机这个类别预训练模型已经具备一定的飞机特征提取能力。imgsz 设置训练输入尺寸640 是一个折中值如果想追求小目标召回可以提高到 1280但显存占用会成倍增长。batch 受显存限制16 到 64 之间可以调整显存不够时优先降低 batch 而不是 imgsz。workers 是数据加载线程数Windows 上需要调低到 0Linux 下可以按 CPU 核心数设置。seed 固定随机种子方便复现。训练过程中Ultralytics 会自动在 runs/aircraft/exp1 下生成 weights 目录里面包含 best.pt 和 last.pt。best.pt 是验证集 mAP 最高的权重last.pt 是最后一轮权重。我几乎总是用 best.pt 作为最终模型。训练结束后验证结果会输出到跑到的目录但还需要手动做一次可视化验证。4.3 影响小目标检测效果的几个关键参数imgsz、anchors、mosaic、hsv对于飞机卫星图这种小目标数据有几个参数的效果远大于其他参数。首先是 imgsz。卫星图里飞机目标可能只有二三十像素如果输入尺寸太小网络下采样后目标可能只剩几个像素特征完全消失。实测中imgsz 从 640 提升到 1280小目标的 mAP0.5 可能提升 15 个点以上。代价是训练时间和显存增加。如果你的数据集有大量 1024 以上的原图1280 几乎是必备选择。其次是 mosaic 增强。YOLOv8 默认开启 mosaic1.0它把四张图拼成一张能够大幅增加目标上下文多样性对大多数场景都有效。但在飞机卫星图上密集小目标场景下 mosaic 偶尔会把同一个飞机拼出重影导致标注混乱。我的建议是保留 mosaic1.0但如果训练后期发现验证集 mAP 震荡明显可以调低到 0.5 或者最后十个 epoch 关掉。第三个是 hsv 增强。卫星图受光照影响大但色相变化不像自然图像那么剧烈直接把 hsv_h、hsv_s、hsv_v 调太大会把停机坪的灰色变成奇怪的彩色反而干扰模型。我一般把 hsv_s 从默认的 0.7 降到 0.3hsv_v 保持 0.4hsv_h 保持 0.015。这么做保留微小的光照变化去除不必要的颜色扰动。第四个是 close_mosaic这个参数在 ultralytics 的配置里存在它控制在最后几个 epoch 是否关闭 mosaic。关闭 mosaic 能让模型在接近真实分布的数据上微调稳定最终指标。我习惯设置 close_mosaic10也就是最后十个 epoch 关闭 mosaic。4.4 训练中怎么判断模型状态loss、mAP、混淆矩阵训练输出会实时打印 box_loss、cls_loss、dfl_loss 和对应的 mAP 指标。很多初学者看到 box_loss 一开始下降、后来波动就以为出了问题。其实小目标检测的 loss 曲线天然不太平滑因为小目标对锚框偏移的敏感性高同一个 batch 里目标大小差异又大导致梯度方向不稳定。我判断训练状态时主要看验证集 mAP0.5 和 mAP0.5:0.95 是否持续上升。一般到第 50 个 epoch 后mAP 曲线会开始收敛如果到 80 个 epoch 还在涨就加训练轮数。训练结束后在验证集上跑一次 predict 命令把结果输出成带标注框的图像yolo detect predict \ modelruns/aircraft/exp1/weights/best.pt \ sourcepath/to/val_images \ imgsz1280 \ conf0.25 \ saveTrue然后把几个典型图像可视化出来看两类错误漏检和错检。漏检通常发生在小目标和遮挡密集的场景错检则容易出现在廊桥、摆渡车、停机坪漆线等纹理和飞机相近的目标上。我见过最离谱的一次是模型把一架飞机的影子当成飞机因为训练集里飞机影子方向和轮廓与真实飞机高度相似。这种问题无法单靠改参数解决只能回到数据层面补充负样本或多尺度裁剪。5. 飞机卫星图数据集训练的避坑指南5 个曾经让我翻车的细节这个标题看起来简单但数据集本身的数据质量、格式和训练策略里藏着大量陷阱。以下五条几乎都是我亲身踩过坑之后才总结出来的每一条都按“现象、原因、解决”的方式展开希望能帮你少走弯路。5.1 现象训练时报错“image not found”或者 mAP 始终为零原因通常是标注文件和图像文件名不匹配或者文件夹路径里存在大小写不一致。Windows 和 Linux 对文件名大小写的敏感度不同比如图像是 Airplane_001.jpg而标注文件是 airplane_001.txt在 Windows 上训练没事迁移到 Linux 服务器上就找不到对应关系。解决方法是写一个脚本扫描 images 和 labels 两个目录找出所有“有图无标”和“有标无图”的文件把不匹配的挑出来处理。另一个常见原因是训练脚本自动从图像文件名推断标注文件路径时把扩展名替换错了。Ultralytics 的逻辑是要求 .jpg 对应 .txt如果你的图像是 .jpeg 或 .png检查一下是否写清楚了扩展名。我的习惯是统一把图像转为 .jpg省去这类麻烦。5.2 现象模型对大飞机检得很好小飞机全部漏掉原因很直白目标尺寸跨度大而模型的感受野和锚框即使是 anchor-free 也要做尺度分配主要覆盖了中大型目标。如果你的数据里 95% 的飞机都占几十像素那么模型会倾向于忽略小目标。解决思路有两个层面。数据层面可以别直接用原图训练先把卫星图切成多块瓦片尤其是把目标区域按小块裁剪出来保证训练样本中大小目标的分布更均衡。模型层面把 imgsz 提升到 1280并且考虑使用 SAHI 这种切片推理框架。训练时还可以打开 Ultralytics 的 cos_lr 参数学习率用余弦退火能让训练后期在小目标上的收敛更稳定。这里必须提醒不要随意调高增强参数来“弥补”小目标不足hsv 和 scale 增强过强只会引入干扰。最好的办法是让模型在原始尺度上直接看到更多小目标也就是提升解码分辨率。5.3 现象飞机斜着停时水平检测框里包含大量背景模型容易误检这是飞机检测里最经典的问题。水平框的回归目标在斜方向飞机上会包含机头和机翼之间的空白区域导致框内特征杂糅。更严重的是如果同一场景里飞机朝向各不相同水平框的一致性很差模型学到的特征不稳定。解决方案有三种按成本从低到高排列。第一种是数据增强在训练时对图像做随机旋转旋转角度覆盖 0 到 360 度这能让水平框更好地适应斜向飞机。第二种是换用旋转框检测模型如 YOLOv8 的 OBB 方向模式但这种模式需要你的标注本身是旋转框不能用水平框标注训练。第三种是两阶段检测先用水平框模型快速找出候选区域再用一个旋转框分类器做细分类工程复杂但精度上限最高。对于大多数人我建议先尝试第一种方案成本最小见效也快。5.4 现象验证集上 mAP 很高但部署到新图片上误检一大堆这个现象几乎是所有遥感检测项目的共同痛点。原因是验证集和训练集来源于同一个机场或同一批卫星影像背景纹理和光照条件高度相似模型学到的其实是“这个机场的停机坪旁边的飞机”而不是泛化的“飞机”。解决方法是重新划分数据集时按区域或机场分组而不是随机划分整个文件夹。比如有 A、B、C 三个机场的图像训练集用 A、B验证集用 C测试集再单独拿一个不同分辨率的 D 机场。这样才能逼模型学到真正可迁移的飞机特征。同时部署时需要对新场景做风格归一化比如统一分辨率和色调否则模型性能会明显下降。这个坑很难完全避免但可以缓解。我一般会在项目一开始就规划数据来源而不是等所有数据混在一起后再划分。如果数据已经混在一起按文件名前缀或时间戳分组的脚本也能用但效果会打折扣。5.5 现象训练了 200 个 epochbest.pt 的 mAP 反而不如中间某个 epoch原因通常是数据量大训练后期的增强设置过强导致验证损失开始反弹。模型在训练集上过拟合验证集上的泛化误差变大。这在密集小目标场景下格外明显因为小目标的损失在小范围内抖动得很厉害。解决方法是使用 early stopping 或者模型保存策略。Ultralytics 默认保存 best.pt本身已经具备这种能力。但如果发现过拟合确实存在可以把 epochs 减少到 100同时开启 weight decay一般设置为 0.0005让权重收缩更明显。另一个技巧是训练最后 10 到 20 个 epoch 关闭 mosaic 和 mixup相当于给模型一个“冷静期”。如果你用的是自己的训练脚本一定要加一个自动保存验证集最优模型的逻辑而不是盲目保存最后一轮。这个坑的根源在于很多人把深度学习训练当成“一定训练越久越好”实际上在小数据集上几十个 epoch 可能已经足够了。对于飞机卫星图这种类别单一的数据集我通常先跑 50 个 epoch 做快速验证确认模型能正确收敛再充分训练到 100 到 150 个 epoch。6. 用 RoI 裁剪和滑窗推理提升小目标召回一个能立刻上手的技巧当你完成上面的训练得到一个能在验证集上稳定工作的模型接下来要面对的是真实场景里的超大卫星图。一张 5000×5000 的影像直接丢给模型做预测会面临两个问题显存不够以及小目标分辨率不足。常规思路是缩放整图但这一缩飞机可能就模糊到不可分辨了。我的方案是滑窗推理加结果合并。把原图切成若干块有重叠的瓦片分别用模型预测再把所有预测框映射回原图坐标最后用加权 NMS 合并重叠区域的重复框。切片尺寸一般设为训练时的 imgsz比如 1280重叠率设置 0.2 到 0.5重叠率越高目标被切断的概率越低但推理时间越长。这里的代码骨架可以用 Python 实现核心是避免把同一个飞机切到两块瓦片里后输出两个框。import numpy as np from ultralytics import YOLO def slide_inference(model, img, tile_size1280, overlap0.2, conf0.25): h, w img.shape[:2] step int(tile_size * (1 - overlap)) boxes, scores, class_ids [], [], [] for y in range(0, h, step): for x in range(0, w, step): y1, y2 y, min(y tile_size, h) x1, x2 x, min(x tile_size, w) tile img[y1:y2, x1:x2] # 边位置补零保持瓦片尺寸一致 tile_pad np.zeros((tile_size, tile_size, 3), dtypenp.uint8) tile_pad[:y2 - y1, :x2 - x1] tile result model(tile_pad, confconf, verboseFalse)[0] for box in result.boxes: bx1, by1, bx2, by2 box.xyxy[0].tolist() # 只保留有效区域内的框并调整回原图坐标 if bx1 x2 - x1 and by1 y2 - y1: boxes.append([x1 bx1, y1 by1, x1 bx2, y1 by2]) scores.append(box.conf[0].item()) class_ids.append(box.cls[0].item()) return boxes, scores, class_ids这段代码中tile_pad 用于处理图像右侧和下侧边界的不足部分把补零区域框出的结果过滤掉。overlap 的设置需要权衡0.2 是性能优先0.5 是精度优先。合并结果时可以直接用 Ultralytics 内置的 ops.non_max_suppression或者自己实现一个 soft-NMS把重叠超过 0.5 的框合并保留置信度最高的那个。进阶技巧是使用 TTA也就是测试时增强。预测时对原图做 90 度旋转、水平翻转把多次预测的框结果叠加再 NMS能减少漏检。代价是推理时间变为原来的 4 到 8 倍。我在工程交付中通常只对关键区域开启 TTA比如某个特定机场的停机坪而不是全图无脑开启。最后说一个我自己的习惯每次训练完模型我都会保留训练时的 data.yaml 和网络配置的副本连同 best.pt 一起按照日期和数据集版本归档。否则三个月后回头调模型面对一堆 exp1、exp16 的文件夹你会完全记不清哪个模型是用哪个版本的数据训练出来的。这种项目管理的习惯比任何炼丹技巧都更能保证你的成果可复现、可交付。希望帮到你。本文还有配套的精品资源点击获取
返回列表