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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:33:24