我有以下帶有 FastApi 和 Uvicorn 的代碼,用于 ASGI 服務器實作。它應該通過發布請求獲取上傳的影像,并在回傳回應之前使用模型對其進行分類。該錯誤似乎與 Uvicorn 有關,但我不知所措。任何幫助將非常感激。有沒有人見過這樣的錯誤?這是代碼:
import uvicorn
from fastapi import FastAPI, File, UploadFile
import sys
from PIL import Image
from io import BytesIO
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import matplotlib.pyplot as plt
from tensorflow.keras.preprocessing import image
import PIL
import sys
from cv2 import cv2
from scipy import misc
import os
import shutil
from pathlib import Path
from tempfile import NamedTemporaryFile
from typing import Callable
app = FastAPI()
model = keras.models.load_model('best_model6.h5')
input_shape = (180, 180)
@app.post('/api/predict')
async def predict_image(file: UploadFile = File(...)):
suffix = Path(file.filename).suffix
with NamedTemporaryFile(delete=False, suffix=suffix) as tmp:
shutil.copyfileobj(file.file, tmp)
tmp_path = Path(tmp.name)
img = keras.preprocessing.image.load_img(
tmp_path, target_size=input_shape
)
img_array = image.img_to_array(img)
img_array = tf.expand_dims(img_array, 0) # Create batch axis
predictions = model.predict(img_array)
score = predictions[0]
file.file.close()
tmp_path.unlink()
return score
if __name__ == "__main__":
uvicorn.run(app, port=8080, host='0.0.0.0', debug=True)
錯誤是:
ValueError: [TypeError('cannot convert dictionary update sequence element #0 to a sequence'), TypeError('vars() argument must have __dict__ attribute')]
以及整個追溯:
Traceback (most recent call last):
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/uvicorn/protocols/http/h11_impl.py", line 373, in run_asgi
result = await app(self.scope, self.receive, self.send)
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/uvicorn/middleware/proxy_headers.py", line 75, in __call__
return await self.app(scope, receive, send)
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/uvicorn/middleware/debug.py", line 96, in __call__
raise exc from None
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/uvicorn/middleware/debug.py", line 93, in __call__
await self.app(scope, receive, inner_send)
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/fastapi/applications.py", line 208, in __call__
await super().__call__(scope, receive, send)
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/starlette/applications.py", line 112, in __call__
await self.middleware_stack(scope, receive, send)
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 181, in __call__
raise exc
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/starlette/middleware/errors.py", line 159, in __call__
await self.app(scope, receive, _send)
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/starlette/exceptions.py", line 82, in __call__
raise exc
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/starlette/exceptions.py", line 71, in __call__
await self.app(scope, receive, sender)
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/starlette/routing.py", line 656, in __call__
await route.handle(scope, receive, send)
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/starlette/routing.py", line 259, in handle
await self.app(scope, receive, send)
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/starlette/routing.py", line 61, in app
response = await func(request)
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/fastapi/routing.py", line 234, in app
response_data = await serialize_response(
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/fastapi/routing.py", line 148, in serialize_response
return jsonable_encoder(response_content)
File "/Users/.../Desktop/project/venv/lib/python3.9/site-packages/fastapi/encoders.py", line 144, in jsonable_encoder
raise ValueError(errors)
ValueError: [TypeError('cannot convert dictionary update sequence element #0 to a sequence'), TypeError('vars() argument must have __dict__ attribute')]
uj5u.com熱心網友回復:
從 Keras 模型回傳的 preedit 函式是一個 Numpy 預測陣列(參見此處),每個預測也是一個 numpy 陣列。
但是 FastApi 在回應中使用 jsonable_encoder(請參閱此處)并且 numpy 陣列是不可接受的。score.tolist()例如,您應該轉換為 list( ) 以回傳預測分數。在同一個鏈接中,您將看到可以不使用 jsonable_encoder 直接回傳回應
我希望我幫助了你。祝你好運
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/318303.html
