PIL图像预处理后输出形状(1,254,254,1)与预期(1,254,254,3)不符
问题根因
- 你输入的PIL图像
mode=L属于灰度单通道图像,转换为numpy数组后默认只有1个通道,因此经过预处理后最后一维维度为1,和预期的3通道不符。 - 项目外单独运行正常是因为测试时输入的是RGB模式的3通道图像,和项目内前端传入的灰度图像输入源不一致。
修复方案
首先在预处理第一步统一将输入的PIL图像转换为RGB模式,确保后续处理的都是3通道数据,修改后代码如下:
def preprocess(img): # 新增:统一将PIL图像转为RGB模式,兼容灰度图输入 img = img.convert('RGB') img = np.array(img) resized = cv2.resize(img, (254, 254)) img = tf.keras.preprocessing.image.img_to_array(resized)/255 img = np.array([img]) return img
如果不想改动PIL层面的处理,也可以在numpy数组转换后手动扩展通道,将单通道复制为3通道:
def preprocess(img): img = np.array(img) resized = cv2.resize(img, (254, 254)) # 新增:单通道转3通道 if len(resized.shape) == 2 or resized.shape[-1] == 1: resized = cv2.cvtColor(resized, cv2.COLOR_GRAY2RGB) img = tf.keras.preprocessing.image.img_to_array(resized)/255 img = np.array([img]) return img
验证方式
可以在预处理函数入口添加日志打印img.mode,确认项目内调用时传入的图像模式是否为L,即可定位输入差异问题。
内容的提问来源于stack exchange,提问作者Hamza.S
相关产品推荐
相关产品推荐

