TensorFlow灰度图目标检测报错:输入张量形状不匹配求助
嘿,这个问题我之前做灰度图目标检测时也踩过坑!咱们先把报错的核心说透:
你导出的model.ckpt模型,它的输入张量image_tensor:0定义的是3通道的RGB图像(形状(?, ?, ?, 3)),但你现在喂进去的是单通道的灰度图(形状(1, 2048, 2048, 1)),两者形状不匹配,所以触发了这个ValueError。
给你两个实用的解决方案,按需选择:
方案1:快速适配——把灰度图转成3通道(最推荐)
既然模型认3通道,咱们就把单通道的灰度图复制3次,模拟RGB格式的输入,改动几行代码就行。结合你的脚本,修改图像读取后的处理步骤:
原来的代码大概是这样(读取灰度图并扩展维度):
image = Image.open("your_test_image.png").convert('L') # 转为灰度单通道 image_np = np.array(image) image_np_expanded = np.expand_dims(image_np, axis=2) # 变成(2048,2048,1)
改成下面这样,把单通道复制成3通道:
image = Image.open("your_test_image.png").convert('L') image_np = np.array(image) # 把单通道数组复制3次,生成(2048,2048,3)的3通道图像 image_np_3channel = np.repeat(image_np[..., np.newaxis], 3, axis=2) # 再扩展batch维度,变成模型需要的(1,2048,2048,3) image_np_expanded = np.expand_dims(image_np_3channel, axis=0)
这样处理后,输入形状就完全匹配模型的要求了,直接就能正常预测。
方案2:根源修改——调整模型输入为单通道(适合长期用灰度图的场景)
如果你之后一直要基于灰度图做检测,不想每次都处理图像,可以修改模型的输入配置,重新导出:
- 找到你训练时用的
pipeline.config文件,定位到image_resizer和feature_extractor的配置项,把输入形状的最后一个通道数从3改成1,比如:image_resizer { fixed_shape_resizer { height: 2048 width: 2048 } } feature_extractor { type: "ssd_mobilenet_v1" # 这里是你的特征提取器类型 ... input_shape: [2048, 2048, 1] # 把3改成1 } - 用修改后的配置重新训练(如果你的原始训练数据就是灰度图,只是之前误按3通道训练的话,重新训练后导出的模型就能直接接收单通道输入了)。
一般来说方案1足够解决你的问题,不需要折腾重新训练,赶紧试试吧!
内容的提问来源于stack exchange,提问作者최종운
相关产品推荐
相关产品推荐

