如何用PIL调整FastAPI上传图片尺寸以适配图像分类模型?
解决FastAPI图像尺寸匹配问题
直接修改你的read_file_as_image函数,在转成numpy数组前完成尺寸调整和通道统一:
from fastapi import FastAPI, File, UploadFile import uvicorn import numpy as np from io import BytesIO from PIL import Image import tensorflow as tf app = FastAPI() MODEL = tf.keras.models.load_model("D:/Works/M.6/New Soil/Classification/Model/SoilModel.h5") CLASS_NAMES = ["Clay", "Loam", "Red","Sandy"] @app.get("/home") async def ping(): return "Hello, Welcome to CropChat" def read_file_as_image(data) -> np.ndarray: # 打开图片并转为RGB格式(避免PNG等带Alpha通道的图片出错) image = Image.open(BytesIO(data)).convert("RGB") # 调整尺寸到模型要求的(256,256) resized_image = image.resize((256, 256)) # 转成numpy数组返回 return np.array(resized_image) @app.post("/predict") async def predict( file: UploadFile = File(...) ): image = read_file_as_image(await file.read()) img_batch = np.expand_dims(image, 0) predictions = MODEL.predict(img_batch) predicted_class = CLASS_NAMES[np.argmax(predictions[0])] confidence = np.max(predictions[0]) return { 'class': predicted_class, 'confidence': float(confidence) } if __name__ == "__main__": uvicorn.run(app, host='localhost', port=8000)
关键修改说明:
- 新增
.convert("RGB"):上传的图片可能是PNG格式(带Alpha透明通道),而模型通常只接受3通道的RGB图像,这一步能统一通道数,避免维度不匹配报错 - 正确使用
resize方法:PIL的resize是返回新的图像对象,不是原地修改,必须赋值给变量后再转数组,这应该是你之前尝试无效的核心原因
如果你的模型要求输入像素值归一化到0-1区间,可以在转数组后追加一步:
return np.array(resized_image) / 255.0
内容的提问来源于stack exchange,提问作者PhidPhew
相关产品推荐
相关产品推荐

