我正在使用以下代码解码 Base64 图像:
def string_to_image(base64_string):
decoded = base64.b64decode(base64_string)
np_data = np.frombuffer(decoded, np.uint8)
img = cv2.imdecode(np_data, cv2.IMREAD_UNCHANGED)
return img
目标是从请求正文接收图像,对其进行解码,使用张量流调整其大小,使用模型进行预测,然后返回一个响应,说明该图像是什么:
image_base64 = request.json['image']
decoded_image = string_to_image(image_base64)
image_resized = tf.image.resize(decoded_image, (256, 256))
model = load_model('src/models/mymodel.h5')
result = model.predict(np.expand_dims(image_resized/255, 0))
但是,我收到错误
ValueError: Input 0 of layer "sequential_2" is incompatible with the layer: expected shape=(None, 256, 256, 3), found shape=(None, 256, 256, 4)
。
我不知道如何将形状值从“4”更改为“3”。
我尝试了以下方法:
image_resized = tf.image.resize(decoded_image, (256, 256, 3))
但是我明白了
'size' must be a 1-D Tensor of 2 elements: new_height, new_width
。
我也尝试过:
image_resized = cv2.resize(decoded_image, (256,256,3))
但是我明白
OpenCV(4.6.0) :-1: error: (-5:Bad argument) in function 'resize'
Overload resolution failed:
- Can't parse 'dsize'. Expected sequence length 2, got 3
- Can't parse 'dsize'. Expected sequence length 2, got 3
请帮忙:(
在重塑张量后,您可以使用
tf.squeeze
来重塑数组。根据文档,tf.squeeze
将删除尺寸为 1 的轴。
image_resized = tf.reshape(decoded_image, (-1, 256, 256, 3, 1))
image_resized = tf.squeeze(image_resized)
通过 vijayachandran mariappan 评论和 AndreaYolo 回答,我找到了一个解决方案。首先,更改图像的通道,然后调整其尺寸:
decoded_image = string_to_image(image_base64)
decoded_image = decoded_image[:,:,:3]
image_resized = tf.image.resize(decoded_image, (256, 256))
我的模型就能够完美预测!
resized_image = tf.image.resize(decoded_image, [256, 256])
您遇到的错误消息表明调整大小的大小参数应该是具有两个元素的一维张量
'size' must be a 1-D Tensor of 2 elements: new_height, new_width