python - OSError: cannot identify image file <_io.BytesIO object at ...> 尝试使用 Keras 模型进行预测时
问题描述
我在 YouTube 上关注 deeplizard 的“将 Keras 神经网络部署到 Flask Web 服务”教程,但被卡住了。我发现了一些对类似问题有帮助的建议(比如这个和这个),但由于某种原因,它们对我不起作用。或者也许我错误地应用它们。
它对线路感到不安image = Image.open(io.BytesIO(decoded))
。
这是我拥有的代码(对不起,它不是最小的,我不确定如何在不删除可能相关的细节的情况下简化它)。
如果您有任何建议,请让我知道。
非常感激。
app = Flask(__name__)
def get_model():
global model, graph
model = load_model('model.h5')
print(' * Model loaded!')
graph = tf.Graph()
def preprocess_image(image, target_size):
if image.mode != 'RGB':
image = image.convert('RGB')
image = image.resize(target_size)
image = img_to_array(image)
image = np.expand_dims(image, axis=0)
return image
print(' * Loading model...')
get_model()
@app.route('/predict', methods=["POST"])
def predict():
message = request.get_json(force=True)
encoded = message['image']
decoded = base64.b64decode(encoded)
with graph.as_default():
image = Image.open(io.BytesIO(decoded))
preprocessed_image = preprocess_image(image, target_size(50, 50))
prediction = model.predict(preprocessed_image).tolist()
response = {
'prediction': {
'food': prediction[0][0],
'notfood': prediction[0][1]
}
}
return jsonify(response)
我怀疑这可能是因为我的模型将输入作为:
model.predict_classes(i.reshape((-1, 50, 50, 3)), batch_size=32, verbose=0)[0]
但是用户通过 html 上传的图像并没有被重塑……我试图将其添加到代码中,但到目前为止还没有运气。
解决方案
我遇到了同样的问题。目标大小没有问题,因为它将取决于您部署的模型所训练的数据集中图像的目标大小。
无论如何,问题在于您从客户端发送到服务器的图像类型(png/jpg)。确保在下面的代码行(clientside.html)
base64Image = dataURL.replace("data:image/png;base64,","");
您特别提到了png,并且您还发送了相同类型的图像,例如imagename.png(png 图像)。
我希望这可能会有所帮助
推荐阅读
- c# - 对具有多个不同可见数字签名的 pdf 文件进行数字签名
- wso2 - 将 Shibboleth SP 添加到 WSO2 身份服务器中的租户
- elasticsearch - [field] 下应为 [START_OBJECT],但在 [geohash_grid] 中得到了 [VALUE_STRING]
- video - 具有色差的网络视频转换
- c - PostgreSQL 中 C 函数的最高性能?
- python - 在 Python 中调用父类中的子方法
- java - Java 8 Stream API - Java 9 Collectors.flatMapping 用 Java 8 重写
- arrays - 完成游戏的最佳顺序
- dart - 数据更改时自动刷新 UI
- kotlin - MockK 模拟方法返回接口未来