从 PHP 脚本调用时,Flask API 始终预测相同的类

问题描述 投票:0回答:1

我有一个 Flask API,旨在预测上传的胸部 X 射线图像是否属于正常类别或肺炎类别。当我从 PHP 脚本调用 API 时,无论输入图像如何,预测始终为肺炎 (100.00%)。

这是我的设置:

Flask API 代码

from flask import Flask, request, jsonify
from tensorflow.keras.models import load_model
from PIL import Image
import numpy as np
import os

app = Flask(__name__)

# Load the pre-trained model
model = load_model('../doctor/NU_detection_notverygood.keras')

# Class names for predictions
class_names = ['NORMAL', 'PNEUMONIA']

@app.route('/')
def home():
    return "PNEUMONIA Detection API is running!"

@app.route('/predict', methods=['POST'])
def predict():
    if 'image' not in request.files:
        return jsonify({'error': 'No image file provided'}), 400

    try:
        image = request.files['image']
        img = Image.open(image).convert('RGB')  
        img = img.resize((224, 224))         

        img_array = np.array(img) / 255.0
        img_array = np.expand_dims(img_array, axis=0)  

        predictions = model.predict(img_array)
        predicted_class = 1 if predictions[0] > 0.5 else 0
        predicted_label = class_names[predicted_class]
        probability = predictions[0][0]

        return jsonify({
            'prediction': predicted_label,
            'probability': float(probability),
            'confidence': float(probability)
        })
    except Exception as e:
        return jsonify({'error': str(e)}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

用于发送图像的 PHP 代码

if (isset($_POST['submit'])) {
    if (isset($_FILES['img']) && $_FILES['img']['error'] == 0) {
        $image = $_FILES['img']['name'];
        $image_tmp_name = $_FILES['img']['tmp_name'];
        $folder = 'uploaded_img/';
        $image_folder = $folder . $image;

        if (!is_dir($folder)) {
            mkdir($folder, 0777, true);
        }

        if (move_uploaded_file($image_tmp_name, $image_folder)) {
            $url = 'http://localhost:5000/predict';
            $cfile = new CURLFile($image_folder, 'image/jpeg', $image);
            $data = array('image' => $cfile);

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            $response = curl_exec($ch);
            curl_close($ch);

            if ($response === false) {
                echo "Error in prediction!";
            } else {
                $result = json_decode($response, true);
                $prediction = $result['prediction'] ?? 'No result';
                $probability = $result['probability'] ?? 'No probability data';
                echo "Prediction: $prediction, Probability: $probability";
            }
        } else {
            echo "Failed to upload the file.";
        }
    }
}

问题:

  1. 当我在 colab 中使用 Python 并使用相同图像测试模型时,预测是准确的(正常或肺炎)。

  2. 使用 PHP 脚本发送图像时,API 始终会为每个图像预测肺炎 (100.00%),即使对于在 Colab 中测试时被正确分类为正常的图像也是如此。

我尝试过的步骤:

  1. 已验证 Flask API 是否可以与 Python 脚本一起正常工作。
  2. 在 Flask 中记录 request.files['image'] 对象,以确认从 PHP 脚本接收到图像。文件似乎已正确接收。
  3. 确认文件正在上传并传递给 PHP 中的 CURLFile。
  4. 确保 PHP 脚本对请求使用正确的多部分/表单数据编码。
  5. 在 Flask API 中一致地调整图像大小并标准化。

可能出了什么问题?

  1. PHP 脚本中上传或传输过程中文件是否已损坏?
  2. PHP 中的 CURLFile 是否无法以正确的格式发送文件?
  3. 与 Python 相比,通过 PHP 接收图像数据时的处理方式是否不匹配?

无论图像是通过 PHP 脚本还是 Python 脚本上传,Flask API 都应该返回准确的预测(正常或肺炎)。

为什么当请求来自 PHP 时,Flask API 总是返回 PNEUMONIA (100.00%)? 如何确保 PHP 脚本以与 Python 脚本相同的方式正确发送图像文件? 任何见解或建议将不胜感激。谢谢!

python php flask ml
1个回答
0
投票

您一直使用 PHP 作为客户端和 Flask 之间的代理的原因是什么?为什么不直接使用Flask呢?

但是,当文件在 PHP 脚本中的文件夹之间移动时,也许您需要重命名文件,例如,如果您收到名为 test1.jpg 的图像,您可以尝试通过添加一些时间戳然后最后添加文件名来重命名该文件名为 test1-12123434.png 的目的是避免 PHP 服务器上的文件可能出现的缓存问题

© www.soinside.com 2019 - 2024. All rights reserved.