FastAPI部署TensorFlow CNN模型时numpy.ndarray无read属性报错如何解决
错误根因
你代码的核心问题是重复解析图片,且给Image.open()传入了错误的参数类型:
- 调用
read_file_as_image(await file.read())后,返回的image已经是numpy数组类型 - 后续你又将这个numpy数组传入
Image.open(image),但Image.open()仅接收文件路径、字节流、实现了read()方法的类文件对象,numpy数组没有read()方法,直接触发属性错误 - 额外注意:你贴出的原始代码存在多处缩进错误,也会导致运行异常
修复方案
去掉冗余的二次图片解析逻辑,统一做一次图片处理即可,你可以直接调整read_file_as_image函数,把转RGB、resize的逻辑都封装在里面,避免逻辑混乱。
修正后可运行的代码
import uvicorn import numpy as np from io import BytesIO from PIL import Image import tensorflow as tf from fastapi import FastAPI, File, UploadFile app = FastAPI() MODEL = tf.keras.models.load_model("models/16") CLASS_NAMES = ["benign","malignant"] @app.get("/ping") async def ping(): return "Hello, I am alive" def read_file_as_image(data) -> np.ndarray: # 所有图片处理逻辑统一放在这里完成 image = Image.open(BytesIO(data)).convert("RGB").resize((256, 256)) return np.array(image) @app.post("/predict") async def predict( file: UploadFile = File(...) ): # 只做一次图片读取转换 image = read_file_as_image(await file.read()) image = image / 255 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)
内容的提问来源于stack exchange,提问作者Hammad Ashraf
相关产品推荐
相关产品推荐

