基于FastAPI部署ONNX格式ViT肺炎分类模型遇500错误求助
问题根源
错误出在返回值类型不匹配:onnx_inferences方法返回的是numpy.ndarray类型数组,而FastAPI的response_model=List[int]要求返回Python原生int组成的列表。Pydantic无法直接序列化numpy数值类型,导致抛出ValidationError。
解决方案
1. 转换numpy数组为Python原生列表
修改onnx_inferences方法的返回逻辑,将numpy数组转为Python原生列表:
def onnx_inferences(self, bytes): inputs = np.array([self.load_onnx_image(path) for path in bytes]) outputs = self.ort_sess.run([self.output_name], {self.input_name: inputs})[0] logits = np.array(outputs) probabilities = np.exp(logits) / np.sum(np.exp(logits), axis=1, keepdims=True) predicted_classes = np.argmax(probabilities, axis=1) # 将numpy数组转为Python原生int列表 return predicted_classes.tolist()
2. 优化异步路由中的文件读取(可选但推荐)
在FastAPI异步路由里,同步调用image.file.read()可能阻塞事件循环,改为使用框架提供的异步读取方法:
@app.post('/prediction_multiple_pneumonia', response_model=List[int]) async def detect_pneumonia(images: List[UploadFile]=File(...)): """Pneumonia detection on single or multiple images Args: images (List[UploadFile], optional): List of images as bytes Returns: pred: List corresponding to images diagnostic (0 : no pneumonia, 1 : pneumonia) """ images_bytes = [] for image in images : # 使用异步读取方法 images_bytes.append(await image.read()) pred = inf.onnx_inferences(images_bytes) return pred
3. 避免同步推理阻塞异步事件循环(可选)
如果ONNX推理耗时较长,同步调用会阻塞FastAPI事件循环,建议用asyncio.to_thread把推理逻辑放到单独线程执行:
import asyncio @app.post('/prediction_multiple_pneumonia', response_model=List[int]) async def detect_pneumonia(images: List[UploadFile]=File(...)): images_bytes = [] for image in images : images_bytes.append(await image.read()) # 将同步推理任务放到线程中执行 pred = await asyncio.to_thread(inf.onnx_inferences, images_bytes) return pred
验证
修改后,接口返回的是Python原生int组成的列表,完全符合response_model的要求,FastAPI可正常序列化返回结果,不会再抛出ValidationError。
内容的提问来源于stack exchange,提问作者chipauris
相关产品推荐
相关产品推荐

