我有一个 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.";
}
}
}
问题:
当我在 colab 中使用 Python 并使用相同图像测试模型时,预测是准确的(正常或肺炎)。
使用 PHP 脚本发送图像时,API 始终会为每个图像预测肺炎 (100.00%),即使对于在 Colab 中测试时被正确分类为正常的图像也是如此。
我尝试过的步骤:
可能出了什么问题?
无论图像是通过 PHP 脚本还是 Python 脚本上传,Flask API 都应该返回准确的预测(正常或肺炎)。
为什么当请求来自 PHP 时,Flask API 总是返回 PNEUMONIA (100.00%)? 如何确保 PHP 脚本以与 Python 脚本相同的方式正确发送图像文件? 任何见解或建议将不胜感激。谢谢!
您一直使用 PHP 作为客户端和 Flask 之间的代理的原因是什么?为什么不直接使用Flask呢?
但是,当文件在 PHP 脚本中的文件夹之间移动时,也许您需要重命名文件,例如,如果您收到名为 test1.jpg 的图像,您可以尝试通过添加一些时间戳然后最后添加文件名来重命名该文件名为 test1-12123434.png 的目的是避免 PHP 服务器上的文件可能出现的缓存问题