我有以下代码与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:
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')]
型
1条答案
按热度按时间q3qa4bjr1#
从Keras Model返回的predit函数是一个预测的Numpy数组(见这里),每个预测也是一个numpy数组。
但是FastApi在响应(see here)中使用jsonable_encoder,并且numpy数组是不可接受的。例如,您应该转换为list(
score.tolist()
)以返回预测分数。在同一个链接中,您将看到可以直接返回响应而不使用jsonable_encoder希望我帮到你了。祝你好运