上传图像以使用 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。它甚至不能帮助您创建批次,还可以帮助您进行图像增强(使您的模型健壮的艺术)。它为您提供rescalingpreprocess_function 的参数,您可以轻松地将其设置为rescale=1/255., preprocessing_function=preprocess_input,

您的代码在 Channels 部分有问题。如果您使用的是channels_last,那么它已经在(batch,width,height,3) 3 通道数据上进行了训练,当您尝试传递数据进行测试时,它会显示错误。

在这种情况下,您应该移除 Alpha 通道。请查看ImageData Generator。 flow_from_dataframeflow_from_directoryflow 中都有一个参数,默认为 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

注意:如果您使用单个图像,您应该使用numpyreshapeexpand_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进行预测时出现尺寸不匹配错误

尝试将文件(图像)上传到服务器时出现错误 403

使用 XAMPP 将图像上传到服务器时出现问题

尝试使用 MERN 上传图像时出现 400 错误请求错误

在 Keras 中实现 Causal CNN 以进行多变量时间序列预测

使用 ASP.NET Core Web API 将图像上传到 Cloudianary 时出现空文件错误