FastAPI图像分类API如何解码base64图片并返回对应分类标签
错误原因
你使用的base64转PIL图片的代码存在逻辑错误:base64_img_bytes = base64.encode("utf-8") 这行代码误调用了base64模块的encode方法,该方法需要传入输入、输出两个字节流参数,因此触发了参数缺失报错。你实际需要的是将传入的base64字符串转成UTF-8编码的字节,应该调用字符串对象自身的encode方法。
修复后的转换代码
import base64 import io from PIL import Image def base64str_to_PILImage(base64str): # 兼容处理部分前端携带的base64前缀,比如data:image/jpeg;base64, if "base64," in base64str: base64str = base64str.split("base64,")[1] # 把base64字符串转成utf-8字节 base64_img_bytes = base64str.encode("utf-8") # 解码base64得到图片原始字节 image_bytes = base64.b64decode(base64_img_bytes) # 转成PIL对象,统一转RGB避免PNG透明通道导致后续预测异常 bytes_obj = io.BytesIO(image_bytes) img = Image.open(bytes_obj).convert("RGB") return img
FastAPI集成与返回值调整参考
- 先定义分类结果映射关系,和你模型训练时的标签顺序保持一致即可:
# 示例:模型输出0对应狗,1对应猫就按这个顺序写 LABELS = ["dog", "cat"]
- 接口逻辑示例:
from pydantic import BaseModel from fastapi import FastAPI app = FastAPI() # 定义请求体结构 class ImageClassifyRequest(BaseModel): base64_str: str @app.post("/classify_animal") def classify_image(req: ImageClassifyRequest): # 转成PIL图片 img = base64str_to_PILImage(req.base64_str) # 这里复用你之前已经调试好的模型预处理、预测逻辑,得到预测的数值索引pred_idx # pred_idx = 你的原有模型预测代码(img) # 映射成分类名称返回 return {"classify_result": LABELS[pred_idx]}
常见排查点
- 转换后预测结果不准时,检查图片预处理逻辑(resize、归一化、维度调整等)和训练阶段完全一致
- 传入的base64如果有换行、空格等多余字符,建议先清洗再传入接口
内容的提问来源于stack exchange,提问作者IsntMeBosss
相关产品推荐
相关产品推荐

