You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 20:09:50