如何在Web服务器托管ML图像分类函数并向客户端返回预测结果
实现方案
你可以通过把预测函数封装为HTTP接口的方式实现服务端托管,客户端上传图片后服务端返回预测结果,不需要把大体积模型打包到安卓端。
第一步:安装服务端依赖
你需要先安装接口框架和模型运行所需的依赖:
pip install fastapi uvicorn pillow tensorflow numpy
第二步:编写服务端接口代码
你可以直接基于你现有的预测函数改造,新建main.py文件写入以下内容:
from keras.models import load_model from PIL import Image, ImageOps import numpy as np from fastapi import FastAPI, File, UploadFile import io # 初始化FastAPI应用 app = FastAPI() # 模型和标签全局加载,只在服务启动时运行一次,提升性能 labels= ["Banana", "Fan", "Clock","Coin","Leaf","Paper_airplane","Pen","Phone","Spoon","Tomato"] model = load_model('keras_model.h5') data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32) def RunPrediction(img): image = img size = (224, 224) image = ImageOps.fit(image, size, Image.ANTIALIAS) image_array = np.asarray(image) normalized_image_array = (image_array.astype(np.float32) / 127.0) - 1 data[0] = normalized_image_array prediction = model.predict(data) return prediction # 预测接口,接收上传的图片文件 @app.post("/predict") async def predict(image: UploadFile = File(...)): # 读取上传的图片内容 image_content = await image.read() img = Image.open(io.BytesIO(image_content)).convert("RGB") # 调用预测函数 prediction = RunPrediction(img)[0] # 取置信度最高的分类结果 max_idx = np.argmax(prediction) result = { "label": labels[max_idx], "confidence": float(prediction[max_idx]), "all_probabilities": prediction.tolist() } return result
第三步:启动服务
在代码和keras_model.h5模型文件所在目录下运行以下命令启动服务:
uvicorn main:app --host 0.0.0.0 --port 8000
- 本地测试时可以直接用
http://127.0.0.1:8000访问接口 - 部署到云服务器后,将
127.0.0.1替换为服务器公网IP即可供外部设备调用
客户端调用示例
Python脚本调用
安装requests依赖:
pip install requests
调用代码:
import requests url = "http://你的服务IP:8000/predict" # 替换为你要预测的图片路径 files = {"image": open("test.jpg", "rb")} response = requests.post(url, files=files) print(response.json())
安卓端调用
安卓端可以用OkHttp或Retrofit框架构造POST请求,把图片作为文件参数上传到上述接口,解析返回的JSON数据即可拿到预测结果,无需在本地加载大体积模型文件。
注意事项
- 生产环境部署建议添加接口鉴权逻辑,避免接口被恶意调用占用资源
- 高并发场景下可以用Gunicorn结合Uvicorn启动服务,提升稳定性和并发处理能力
- 如果不需要返回所有分类的概率,可以只返回置信度最高的标签和置信度,减少传输数据量
内容的提问来源于stack exchange,提问作者CatCoder
相关产品推荐
相关产品推荐

