Unet++图像分割模型推理时测试图缩放及输出还原原尺寸疑问
自定义Unet++分割模型推理尺寸问题解答
1. 推理阶段是否需要做相同的416×416缩放
必须执行和训练阶段完全一致的缩放操作,原因如下:
- 训练阶段模型权重是基于416×416尺寸的输入学习得到的,适配该尺寸下的感受野、上下采样维度匹配,非适配动态输入的Unet++直接输入其他尺寸会触发张量维度不匹配的报错
- 若模型支持动态尺寸输入,不做相同缩放也会导致推理输入的数据分布和训练集不一致,出现协变量偏移问题,大幅降低分割精度
2. 416×416分割结果还原为原始434×636尺寸的实现方法
分割结果属于离散类别标签,还原缩放时要避免破坏标签语义,核心操作如下:
- 预处理阶段提前记录测试图像的原始高宽参数:
origin_h = 434、origin_w = 636,避免后续尺寸错配 - 得到416×416的模型输出mask后,使用最近邻插值法做尺寸还原,禁止使用双线性、双三次等会生成新像素值的插值方法,避免出现非法类别标签
- 若训练阶段对输入做了归一化、减均值等额外预处理,推理阶段也要做完全一致的处理,输出有对应逆操作的也要同步执行
如果使用Python+OpenCV实现,参考代码如下:
import cv2 # 原始测试图像 shape 为 (434, 636, 3) origin_img = cv2.imread("test_img.png") origin_h, origin_w = origin_img.shape[:2] # 推理前缩放和训练对齐,训练用什么插值这里保持一致 input_img = cv2.resize(origin_img, (416, 416), interpolation=cv2.INTER_LINEAR) # 此处省略模型推理过程,得到416×416的分割结果 pred_mask # 还原到原始尺寸,注意OpenCV的resize参数顺序为(宽, 高),插值用最近邻 pred_mask_origin = cv2.resize(pred_mask, (origin_w, origin_h), interpolation=cv2.INTER_NEAREST)
3. 推理流程修正
你当前规划的流程缺少结果还原步骤,和原始图像比对必须保证尺寸一致,修正后流程如下:
测试图像→记录原始尺寸→执行和训练完全一致的预处理(含缩放为416×416、归一化等)→输入模型推理→得到416×416的输出结果→将输出还原为原始图像尺寸→和原始尺寸的标注真值做比对
内容的提问来源于stack exchange,提问作者wonki cho
相关产品推荐
相关产品推荐

