使用 Flask 将图像从 Javascript 发送到 Python - P0ST 500 内部服务器错误

时间:2021-03-03 18:44:30

标签: javascript python tensorflow flask

我正在使用 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 脚本而不需要所有解码吗?

0 个答案:

没有答案
相关问题