我正在使用 Flask 部署在 Python 中创建的图像分类器,但是当尝试提交图像进行预测时,我收到错误“P0ST 500 内部服务器错误”。
在前端,我使用这个 Javascript 将图像发送到 Python 脚本并检索预测(在 Python 中生成的一些文本字符串)
<script>
let base64Image;
$("#image-selector").change(function() {
let reader = new FileReader();
reader.onload = function(e) {
let dataURL = reader.result;
$('#selected-image').attr("src", dataURL);
base64Image = dataURL.replace("data:image/png;base64,","");
console.log(base64Image);
}
reader.readAsDataURL($("#image-selector")[0].files[0]);
$("#prediction-r1").text("");
$("#prediction-r2").text("");
$("#prediction-r3").text("");
$("#prediction-r4").text("");
});
$("#predict-button").click(function(){
let message = {
image: base64Image
}
console.log(message);
$.post("http://0.0.0.0:5000/predict_classifier", JSON.stringify(message), function(response){
$("#prediction-r1").text(response.prediction.r1.toFixed(6));
$("#prediction-r2").text(response.prediction.r2.toFixed(6));
$("#prediction-r3").text(response.prediction.r3.toFixed(6));
$("#prediction-r4").text(response.prediction.r4.toFixed(6));
console.log(response);
});
});
</script>
在 Python 方面,我使用 P0ST 例程获取 base64 图像并将其解码回常规图像,然后通过我已经指定的预处理通道发送:
@app.route("/predict_classifier", methods=["POST"])
def predict():
message = request.get_json(force=True)
encoded = message['image']
decoded = base64.b64decode(encoded)
decodedimage = Image.open(io.BytesIO(decoded))
styles = ["Baroque", "NeoClassical", "Gothic", "Modern", "Victorian"]
time.sleep(.5)
processed_image = preprocess_image(decodedimage, target_size=(300, 300))
bt_prediction = vgg19.predict(processed_image)
tf.shape(bt_prediction)
preds = model.predict(bt_prediction)
for idx, styles, x in zip(range(0,7), styles, preds[0]):
response1 = ("ID: {}, Label: {} {}%".format(idx, styles, round(x*100,2)))
response2 = ("Final Decision:")
time.sleep(.5)
for x in range(3):
response3 = ("."*(x+1))
time.sleep(.2)
class_predicted = np.argmax(model.predict(bt_prediction), axis=-1)
class_dictionary = generator_top.class_indices
inv_map = {v: k for k, v in class_dictionary.items()}
response4 = ("ID: {}, Label: {}".format(class_predicted[0], inv_map[class_predicted[0]]))
response = {'prediction': {
'r1': response1,
'r2': response2,
'r3': response3,
'r4': response4
}
}
return jsonify(response)
预处理例程如下所示,如果您好奇的话:
def preprocess_image(decodedimage, target_size):
if decodedimage.mode != "RGB":
decodedimage = image.convert("RGB")
decodedimage = img.resize(target_size)
decodedimage = img_to_array(image)
decodedimage = np.expand_dims(image, axis=0)
decodedimage /= 255.
return decodedimage
我尝试使用 ['GET', 'POST'] 但这只是抛出了另一个错误。关于什么可能导致沟通不畅的任何想法?有没有更简单的方法来做到这一点,而不涉及转换为 base64?我可以直接将图像传递给 Python 脚本而不需要所有解码吗?