上传图像以使用 keras 进行预测时出现错误消息
Posted
技术标签:
【中文标题】上传图像以使用 keras 进行预测时出现错误消息【英文标题】:Error message when uploading image to do prediction using keras 【发布时间】:2020-11-15 00:56:24 【问题描述】:上传图片进行预测时出现错误提示
ValueError: 层 block1_conv1 的输入 0 与层不兼容:expect ed 输入形状的轴 -1 的值为 3,但接收到的输入形状为 [None, 2 24, 224, 4]
代码处理/预处理图像
def 模型预测(img,模型): img = img.resize((224, 224))
# Preprocessing the image
x = image.img_to_array(img)
x = np.true_divide(x, 255)
x = np.expand_dims(x, axis=0)
# Be careful how your trained model deals with the input
# otherwise, it won't make correct prediction!
x = preprocess_input(x, mode='tf')
preds = model.predict(x)
return preds
培训课程的输出
flow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Def 版本 编译模型... 模型有14716227个参数 型号:“型号”
层(类型)输出形状参数#
input_1 (InputLayer) [(None, 224, 224, 3)] 0
block1_conv1 (Conv2D) (None, 224, 224, 64) 1792
block1_conv2 (Conv2D) (None, 224, 224, 64) 36928
block1_pool (MaxPooling2D) (None, 112, 112, 64) 0
block2_conv1 (Conv2D) (None, 112, 112, 128) 73856
block2_conv2 (Conv2D) (无, 112, 112, 128) 147584
block2_pool (MaxPooling2D) (None, 56, 56, 128) 0
block3_conv1 (Conv2D) (None, 56, 56, 256) 295168
block3_conv2 (Conv2D) (None, 56, 56, 256) 590080
block3_conv3 (Conv2D) (None, 56, 56, 256) 590080
block3_pool (MaxPooling2D) (None, 28, 28, 256) 0
block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160
block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808
block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808
block4_pool (MaxPooling2D) (None, 14, 14, 512) 0
block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808
block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808
block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808
block5_pool (MaxPooling2D) (无, 7, 7, 512) 0
tf_op_layer_Mean (TensorFlow [(None, 512)] 0
辍学(Dropout)(无,512)0
密集(密集)(无,3)1539
【问题讨论】:
【参考方案1】:如果您想使用批量训练和测试部分,您绝对应该查看ImageDataGenerator
。它甚至不能帮助您创建批次,还可以帮助您进行图像增强(使您的模型健壮的艺术)。它为您提供rescaling
和preprocess_function
的参数,您可以轻松地将其设置为rescale=1/255., preprocessing_function=preprocess_input,
您的代码在 Channels 部分有问题。如果您使用的是channels_last
,那么它已经在(batch,width,height,3)
3 通道数据上进行了训练,当您尝试传递数据进行测试时,它会显示错误。
在这种情况下,您应该移除 Alpha 通道。请查看ImageData Generator。 flow_from_dataframe
、 flow_from_directory
和 flow
中都有一个参数,默认为 color_mode='rgb
。
否则,您可以将图像打开为
from PIL import Image
img = Image.open(img_path).convert('RGB') # get RGB PNG image
img = np.array(img) # Convert to numpy array
img = np.expand_dims(x, axis=0) # add an extra dimension for batch
然后你可以申请你的preprocess_function
img = preprocess_input(img, mode='tf')
preds = model.predict(img)
return preds
注意:如果您使用单个图像,您应该使用numpy
的reshape
或expand_dims
方法来创建额外的批处理轴,因为Keras
总是需要批处理。强>
【讨论】:
如果您觉得这个答案有帮助,请点赞并接受它,这样任何新人都会先看到答案,而不必查看所有答案。【参考方案2】:因为您尝试为模型提供 4 通道图像。将图像转换为数组后,请先使用 3 通道。
Preprocessing the image
x = image.img_to_array(img)
x = img[:, :, :3]
x = np.true_divide(x, 255)
x = np.expand_dims(x, axis=0)
【讨论】:
我认为不应该使用第 4 轴。这取决于您使用的色彩空间。如果RGBA
在预乘颜色空间中并且是半透明的,则需要除掉 alpha 以获得正确的RGB
颜色。如果颜色在非预乘颜色空间中,那么您可以丢弃 Alpha 通道。
文件“app.py”,第 89 行,在 predict_backend preds = model_predict(img, model) 文件“app.py”,第 51 行,在 model_predict x = image[:,:,:3 ] TypeError: 'module' 对象不可下标
请将 x = image[:, :, :3] 改为 x = img[:, :, :3]。
我收到以下错误 Image' object is not subscriptable以上是关于上传图像以使用 keras 进行预测时出现错误消息的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试使用朴素贝叶斯/Python进行预测时出现尺寸不匹配错误