大尺寸卫星图像切块用于CNN目标检测:标注保留与结果合并
Hey there! 针对你在卫星图像目标检测中遇到的大尺寸图像适配416×416模型输入的问题,我来分享一套实战性很强的解决方案,涵盖训练阶段的图像切块+标注保留,以及测试阶段的结果合并:
一、训练阶段:图像切块与标注信息保留
1. 图像切块策略
- 滑动窗口切块:用416×416的窗口以固定步幅(推荐208,即50%重叠率)在大图像上滑动遍历,确保覆盖所有区域。如果图像边缘剩余尺寸不足416,可采用黑边填充或镜像填充的方式补全,保证每个切块都是标准的416×416规格。
- 目标导向切块:如果数据集里的目标分布不均匀,优先围绕标注目标所在区域切块(比如每个切块至少包含1个完整/半完整目标),减少无意义的空切块,提升训练效率。
2. 标注坐标的转换与过滤
这一步是核心,必须把原图像的标注框坐标映射到对应切块的局部坐标:
假设原图像的标注框坐标为(x_min, y_min, x_max, y_max),当前切块在原图像的左上角起始坐标为(crop_x, crop_y),那么切块内的标注框坐标计算逻辑如下:
# 转换为切块内的局部坐标 crop_x_min = max(0, x_min - crop_x) crop_y_min = max(0, y_min - crop_y) crop_x_max = min(415, x_max - crop_x) # 图像索引从0开始,416尺寸的最大索引为415 crop_y_max = min(415, y_max - crop_y)
- 过滤无效标注:如果原标注框与切块的重叠面积占原框面积的比例低于阈值(比如30%),直接丢弃该标注,避免训练时引入不完整的目标干扰模型学习。
- 格式适配:如果你的模型用YOLO格式标注,记得把转换后的坐标归一化(比如
x_center = (crop_x_min + crop_x_max)/2 / 416),再保存为对应格式的标注文件。
二、测试阶段:检测结果合并
1. 检测结果的坐标还原
每个切块的检测结果需要先还原回原图像的全局坐标:
假设切块在原图像的左上角起始坐标为(crop_x, crop_y),切块内的检测框坐标为(det_x_min, det_y_min, det_x_max, det_y_max),那么原图像的全局坐标计算为:
# 转换为原图像的全局坐标 orig_x_min = det_x_min + crop_x orig_y_min = det_y_min + crop_y orig_x_max = det_x_max + crop_x orig_y_max = det_y_max + crop_y
同时保留检测框的置信度、类别标签等信息。
2. 重复检测框的去重处理
由于切块存在重叠区域,同一个目标会被多个切块重复检测到,需要用**非极大值抑制(NMS)**来合并重复框:
- 先将所有还原后的检测框按类别分组;
- 对每个类别的框,按置信度从高到低排序;
- 依次遍历框,计算当前框与已保留框的IoU(交并比),如果IoU大于设定阈值(比如0.5),则丢弃当前框;否则保留。
- 进阶可选:用Soft-NMS替代传统NMS,对重叠框的置信度做衰减而非直接丢弃,更适合卫星图像中边缘模糊、形态不规则的目标。
3. 边缘补全区域的结果修正
如果训练时对图像边缘做了补黑边处理,测试时要检查检测框是否落在补黑边的区域,若有则裁剪掉超出原图像范围的部分,只保留有效区域的检测结果。
小提示
如果你用的是YOLO系列模型(比如Ultralytics YOLOv8/v9),官方已经内置了滑动窗口推理和结果合并的功能,直接调用类似下面的代码就能搞定,不用自己从零实现:
from ultralytics import YOLO model = YOLO("your_trained_model.pt") results = model.predict( source="large_satellite_image.jpg", imgsz=416, stride=208, # 滑动步幅 merge=True # 自动合并重叠区域的检测结果 )
内容的提问来源于stack exchange,提问作者vvv
相关产品推荐
相关产品推荐

