当前位置: 首页 > news >正文

《模型部署》—— 客户端与服务端之间的交互实现模型的输出结果

客户端

  • 采用PyCharm的requests库中的方法实现客户端向服务端发送请求

  • 完整代码如下:

    import requests# 127.0.0.1:5012 ——> 127.0.0.1 ——> 自己电脑发送给自己的ip, 5012 ——> 端口号
    # predict 为服务端下返回请求结果的函数名
    flask_url = 'http://127.0.0.1:5012/predict'# 定义发送请求内容的函数
    def predict_result(image_path):image = open(image_path, 'rb').read()payload = {'image': image}r = requests.post(flask_url, files=payload).json()# 向flask_url服务端发送一个POST请求,并将返回的JSON响应解析为一个Python字典if r['success']:# 输出结果for (i, result) in enumerate(r['predictions']):print('{}.预测类别为{}:的概率:{}'.format(i + 1, result['label'], result['probability']))# 失败了就打印else:print('Request failed')if __name__ == '__main__':predict_result('./train/6/image_07162.jpg')
    

服务端

  • 此案例中,服务端的功能是对花朵的识别,当客户端发送一张花朵的图片给服务端,服务端将返回这张花朵图片的类别,以及置信度。

  • 通过PyCharm中的 flask 方法创建一个服务端应用程序

  • 注意:在客户端发送请求之前,服务端需提前启动程序,确保服务程序处在一个等待请求的状态

  • 完整代码如下

    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, datasets# 初始化 Flask app
    app = flask.Flask(__name__)  # 创建一个新的flask应用程序实例
    # __name__ 参数通常被传递给flask应用程序的根路径,这样Flask就可以知道在哪里找到模板、静态文件等
    # 总体来说 app = flask.Flask(__name__) 是Flask应用程序的起点,它初始化了一个新的Flask应用程序实例。为后续添加路由、配置等奠定基础model = None
    use_gpu = False# 部署resnet18网络对花朵识别训练后的最优模型
    def load_model():global model# 加载 resnet18 网络model = models.resnet18()num_ftrs = model.fc.in_featuresmodel.fc = nn.Sequential(nn.Linear(num_ftrs, 102))  # 类别数根据实际要求定义# 调用最优模型checkpoint = torch.load('best.pth')model.load_state_dict(checkpoint['state_dict'])# 将模型指定为测试模式model.eval()# 是否使用GPUif use_gpu:model.cuda()# 数据预处理
    def prepare_image(image, target_size):# 针对不同模型,image的格式不同,但需要统一为RGB格式if image.mode != 'RGB':image = image.convert('RGB')# 按照所使用的模型输入图片的尺寸修改,并转为 tensor 类型image = transforms.Resize(target_size)(image)image = transforms.ToTensor()(image)# 数据均衡化,这里的参数和数据中是对应的image = transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])(image)# 增加一个维度,用于按 batch 测试  本次这里一次测试一张image = image[None]if use_gpu:image = image.cuda()return torch.tensor(image)# 是一个装饰器,用于将指定的 URL 路径(在这个例子中是 /predict)与一个函数关联起来, 并指定该函数响应的HTTP方法(在这个例子中是POST方法)
    @app.route("/predict", methods=["POST"])
    def predict():# 做一个标志,刚开始无图像传入时为 False 传入图片时为 Truedata = {"success": False}if flask.request.method == 'POST':  # 如果收到请求if flask.request.files.get("image"):  # 判断是否是图像image = flask.request.files["image"].read()  # 将收到的图像进行读取,内容为二进制image = Image.open(io.BytesIO(image))  # io.BytesIO# 图像预处理image = prepare_image(image, target_size=(224, 224))preds = F.softmax(model(image), dim=1)  # 得到各个类别的概率results = torch.topk(preds.cpu().data, k=3, dim=1)  # 获取概率最大的前三个结果# torch.topk 用于返回输入张量中每行最大的k个元素及对应的索引results = (results[0].cpu().numpy(), results[1].cpu().numpy())# 将data字典增加一个key, value,其中value为list格式data['predictions'] = list()for prob, label in zip(results[0][0], results[1][0]):r = {"label": str(label), "probability": float(prob)}data['predictions'].append(r)data['success'] = Truereturn flask.jsonify(data)  # 最后结果以json格式文件输出,为了能让客户端以多种不同的编程语言来解析获取if __name__ == '__main__':print('Loading PyTorch model and Flask starting server ...')print('Please wait until server has fully started')# 调用部署模型的函数load_model()# 当客户端与服务端在同一台设备上时,只需给出端口号app.run(port='5012')    # 给出端口号,为了能让客户端从指定的端口发送请求# 当客户端与服务端不在同一台设备上时,给定服务端的 IPv4 地址,并指定端口号# 客户端通过服务端的 IPv4 地址,和端口号来发送请求# app.run(host='192.168.24.68', port='5012')
    

http://www.mrgr.cn/news/59909.html

相关文章:

  • React 中组件通信的几种主要方式
  • 10_ Linux软件安装指南:RPM、YUM、源码安装
  • uniapp 底部导航栏tabBar设置后不显示的问题——已解决
  • Java——字符串的比较
  • Pytorch学习--卷积操作
  • Spring 全家桶版本更新
  • 第十一部分 Java 数据结构及集合
  • 动态规划 —— 斐波那契数列模型-解码方法
  • HarmonyOS NEXT 应用开发实战(八、知乎日报List列表下拉刷新及上滑加载更多分页的实现)
  • 【笔记】Diffusion Model 扩散过程(熵增过程:从有序变为无序):在原始分布上逐步的加高斯噪声,加到最后这个分布就变成一个各项独立的高斯分布
  • 常用 Web 框架
  • 我的电脑问题
  • 使用openssl验证https配置的ssl证书是否可以正常访问
  • Mybatis-plus-扩展功能
  • linux中级(NFS服务器)
  • Linux TCP CC状态机
  • Puppeteer 与浏览器版本兼容性:自动化测试的最佳实践
  • uniapp实现与webview之间的相互通讯
  • Vue项目GET请求正常,POST请求却失效?揭秘Mock服务背后的故事
  • 创建WBS项目管理过程
  • 不小心drop column了一个列,真的凉凉了吗?
  • linux驱动-引入pinctrl子系统
  • 离散化步骤
  • 群控系统服务端开发模式-应用开发-业务架构逻辑开发BaseAPI
  • 企业信息化与数字化 - 信息化是基础,数字化是未来
  • 动态规划-子序列问题——1218.最长定差子序列