实现smooth_blending大图像分割算法报图像形状无效TypeError
报错根因
TypeError: Invalid shape (3742, 3832, 2) for image data是图像读写、渲染接口抛出的格式不兼容错误,触发逻辑非常明确:
- 报错给出的数组维度是
(图像高度, 图像宽度, 通道数),其中通道数为2,而所有通用图像处理接口(matplotlib可视化、OpenCV/PIL读写等)仅支持1通道(灰度图)、3通道(RGB/BGR彩色图)、4通道(带透明度的RGBA图),不存在2通道的合法图像格式,直接传入必然触发报错。 - 核心问题出在卫星影像到无人机正射影像的场景适配环节:原卫星影像版本的代码要么分割类别数刚好匹配3通道输出要求,要么在预测后写了专门的维度转换逻辑;你当前运行时设置的
n_classes=2(对应前景、背景的二分类分割任务),predict_img_with_smooth_windowing会严格按照传入的类别数输出对应通道数的预测结果,最终生成2通道的类别概率图,这个数组直接送入后续图像显示、保存流程时就会触发格式错误。 - 极低概率是输入影像读取异常:如果无人机正射影像读取时意外丢失一个通道变成2通道,也可能导致输出维度异常,但这类问题一般会在模型预测阶段就触发维度不匹配报错,排查优先级低于前一种原因。
修复方案
按以下步骤修改即可:
- 调整预测输出维度,适配二分类场景要求
二分类分割不需要保留两个类别的概率通道,直接在预测逻辑中提取前景通道,把输出转为单通道格式即可,修改后的调用代码如下:predictions_smooth = predict_img_with_smooth_windowing( input_img, window_size=patch_size, subdivisions=2, # 滑窗最小重叠量,参数要求必须为偶数 nb_classes=n_classes, pred_func=( lambda img_batch_subdiv: model.predict(img_batch_subdiv)[..., 1:2] # 索引1对应前景类别通道,输出单通道预测结果,滑窗拼接后最终形状为(H,W,1),符合单通道图像格式要求 # 若需要直接输出二值掩码,可改为:(model.predict(img_batch_subdiv)[...,1:2] > 0.5).astype(np.uint8)*255 ) ) - 规范预测结果后处理逻辑
不要直接把原始多通道预测概率图传给图像显示、保存接口:- 单通道概率图先通过阈值转换为0/255取值的uint8格式掩码,再做保存或可视化
- 若需要生成彩色分割效果,把单通道掩码按照预设调色板映射为3通道RGB数组,调整形状为
(H,W,3)后再调用图像处理接口
- 校验输入影像读取逻辑
确认读入的input_img是3通道RGB格式数组;如果用OpenCV读取正射影像,记得把默认的BGR通道顺序转为RGB,避免输入维度或通道顺序异常导致模型输出错乱。
内容的提问来源于stack exchange,提问作者Debarun Chakraborty
相关产品推荐
相关产品推荐

