如何使用 FastAPI 返回 NumPy 数组?

问题描述 投票:0回答:2

我有一个 h5 文件形式的 TensorFlow Keras 深度学习 模型。

如何在 FastAPI 中上传图像并返回 NumPy 数组?

import numpy as np
import cv2
from fastapi import FastAPI, File, UploadFile
import numpy as np
from tensorflow.keras.models import load_model
import tensorflow as tf

model=load_model("complete_model.h5")
app = FastAPI()

def prepare(image):
    IMG_SIZE = 224
    new_array = cv2.resize(image, (IMG_SIZE, IMG_SIZE))
    return new_array.reshape(-1, IMG_SIZE,IMG_SIZE,3)

@app.post("/")
async def root(file: UploadFile = File(...)):
    global model
    content = await file.read()
    nparr = np.fromstring(content, np.uint8)
    img = cv2.imdecode(nparr, cv2.IMREAD_COLOR).astype(np.float32)
    prediction = model.predict(prepare(img))
    return prediction

使用 Swagger UI 上传图像时,出现以下错误:

line 137, in jsonable_encoder
data = dict(obj)
TypeError: 'numpy.float32' object is not iterable

没有 FastAPI 的工作代码:

import numpy as np
import numpy as np
from tensorflow.keras.models import load_model
import tensorflow as tf
import cv2

model=load_model("complete_model.h5")

def prepare(image):
    IMG_SIZE = 224
    new_array = cv2.resize(image, (IMG_SIZE, IMG_SIZE))
    return new_array.reshape(-1, IMG_SIZE,IMG_SIZE,3)

img = cv2.imread("./test.jpeg").astype(np.float32)
prediction = model.predict(prepare(img))
print(prediction)

终端结果:

[[0.25442022 0.74557984]]

如何在使用 FastAPI 时获得相同的结果?

python numpy tensorflow opencv fastapi
2个回答
6
投票

从端点返回

response
(即您的情况下的
prediction
)时会引发错误。看起来 FastAPI 正在尝试使用
dict
 将 NumPy 数组转换为 
jsonable_encoder
,FastAPI 在从端点返回值时在内部使用它,并且似乎调用了 Python 的 vars()
方法,如您提供的错误所示
这里(查看讨论这里,以及文档)。因此,您可以做的是将 NumPy 数组转换为 Python list
,然后将其序列化为 
JSON
 对象:

return json.dumps(prediction.tolist())
在OpenAPI(Swagger UI)上,您仍然能够看到预期的结果。但是,如果您需要将其转换回 NumPy 数组,您可以解析 JSON 字符串,如下所示。

arr = np.asarray(json.loads(resp.json())) # resp.json() if using Python requests
如果您想将 NumPy 数组作为原始字节返回并在浏览器中显示图像或下载图像,请查看 

这个答案


0
投票
您还可以将 NumPy 类型转换为 Python 类型。

return {str(key): value for key, value in prediction.items()}
    
© www.soinside.com 2019 - 2024. All rights reserved.