基于 Flask 与 PyTorch 的图像分类 API 服务搭建
在深度学习项目落地时,将训练好的模型封装成可远程调用的 API 接口是核心环节。本文将完整讲解如何基于 Flask(轻量级 Web 框架)和 PyTorch(深度学习框架),实现图像分类服务端 API 开发 + 客户端调用的全流程,让训练好的模型通过 HTTP 接口对外提供预测服务。
一、服务端开发:搭建图像分类 API 接口
服务端的核心职责是:加载预训练模型、接收客户端上传的图片、预处理图片、执行预测、返回 JSON 格式的预测结果。
1. 完整服务端代码
import io
import flask
import torch
import torch.nn.functional as F
from PIL import Image
from torch import nn
from torchvision import transforms, models
# 初始化 Flask 应用
app = flask.Flask(__name__)
# 全局变量:模型实例、是否使用 GPU
model = None
use_gpu = False
# 测试阶段建议关闭 GPU,避免环境问题
def load_model():
"""加载预训练的 ResNet18 模型(可替换为自定义模型)"""
global model
# 1. 加载 ResNet18 主干网络
model = models.resnet18(pretrained=False)
# 不加载默认预训练权重
# 2. 修改全连接层,适配自定义分类任务(示例为 102 分类)
num_ftrs = model.fc.in_features
model.fc = nn.Sequential(nn.Linear(num_ftrs, 102))
# 3. 加载训练好的权重文件
checkpoint = torch.load('best.pth', map_location='cpu')
# 强制使用 CPU,避免 GPU/CPU 不匹配
model.load_state_dict(checkpoint['state_dict'])
# 4. 设置模型为评估模式(禁用 Dropout/BatchNorm 更新)
model.eval()
# 5. 可选:使用 GPU(需确保环境有 CUDA)
if use_gpu and torch.cuda.is_available():
model.cuda()
():
image.mode != :
image = image.convert()
transform = transforms.Compose([
transforms.Resize(target_size),
transforms.ToTensor(),
transforms.Normalize([, , ], [, , ])
])
image = transform(image)
image = image.unsqueeze()
use_gpu torch.cuda.is_available():
image = image.cuda()
image
():
data = {: }
flask.request.method == :
flask.request.files.get():
:
image_bytes = flask.request.files[].read()
image = Image.(io.BytesIO(image_bytes))
image = prepare_image(image)
torch.no_grad():
preds = F.softmax(model(image), dim=)
top3_probs, top3_labels = torch.topk(preds.cpu(), k=, dim=)
data[] = []
prob, label (top3_probs.numpy()[], top3_labels.numpy()[]):
data[].append({
: (label),
: (prob)
})
data[] =
Exception e:
()
flask.jsonify(data)
__name__ == :
()
load_model()
()
app.run(host=, port=, debug=)


