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

FastAPI部署TensorFlow CNN模型时numpy.ndarray无read属性报错如何解决

错误根因

你代码的核心问题是重复解析图片,且给Image.open()传入了错误的参数类型:

  1. 调用read_file_as_image(await file.read())后,返回的image已经是numpy数组类型
  2. 后续你又将这个numpy数组传入Image.open(image),但Image.open()仅接收文件路径、字节流、实现了read()方法的类文件对象,numpy数组没有read()方法,直接触发属性错误
  3. 额外注意:你贴出的原始代码存在多处缩进错误,也会导致运行异常
修复方案

去掉冗余的二次图片解析逻辑,统一做一次图片处理即可,你可以直接调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:09:01