# 部署深度学习模型:Flask API 服务端与客户端通信实战

部署深度学习模型:Flask API 服务端与客户端通信实战

在这篇文章中,我们将探讨如何使用 Flask 框架部署一个深度学习模型,并通过客户端与服务端进行通信。我们将通过一个实际的例子,展示如何构建服务端和客户端,以及如何处理图像预测请求。
在这里插入图片描述

环境准备

首先,确保你已经安装了以下库:

  • Flask
  • PyTorch
  • torchvision
  • Pillow

如果尚未安装,可以通过以下命令安装:

pip install flask torch torchvision pillow

服务端代码

服务端代码的主要功能是加载预训练的深度学习模型,接收客户端发送的图像数据,进行预测,并将结果返回给客户端。

# 导入所需的库
import io  # 用于处理二进制数据
import flask  # Flask框架,用于搭建Web服务
import torch  # PyTorch库,用于深度学习模型的加载和推理
import torch.nn.functional as F  # PyTorch的神经网络函数模块,用于softmax等操作
from PIL import Image  # Python图像处理库,用于图像的读取和预处理
from torch import nn  # PyTorch的神经网络模块
from torchvision import transforms, models  # torchvision库,用于图像预处理和加载预训练模型# 初始化Flask app
app = flask.Flask(__name__)  # 创建一个新的Flask应用程序实例
# __name__参数通常被传递给Flask应用程序来定位应用程序的根路径,这样Flask就可以知道在哪里找到模板、静态文件等。
# 总体来说app = flask.Flask(__name__)是FLasK应用程序的起点。它初始化了一个新的FLasK应用程序实例。
model = None  # 初始化模型变量为None
use_gpu = False  # 初始化是否使用GPU的标志为False# 定义加载模型的函数
def load_model():# """Load the pre-trained model, you can use your model just as easily."""global model  # 声明使用全局变量model# 加载resnet18网络model = models.resnet18()  # 加载预训练的resnet18模型num_ftrs = model.fc.in_features  # 获取全连接层的输入特征数量model.fc = nn.Sequential(nn.Linear(num_ftrs, 102))  # 修改全连接层,输出为102个类别(根据具体任务修改类别数)# print(model)checkpoint = torch.load('best.pth')  # 加载训练好的模型权重model.load_state_dict(checkpoint['state_dict'])  # 将权重加载到模型中# 将模型指定为测试格式model.eval()  # 将模型设置为评估模式# 是否使用gpuif use_gpu:model.cuda()  # 如果使用GPU,则将模型移动到GPU上# 定义数据预处理函数
def prepare_image(image, target_size):"""Do image preprocessing before prediction on any data.param image    :     original imageparam target_size     :     target image sizereturn     :     preprocessed image"""# 针对不同模型,image的格式不同,但需要统一到RGB格式if image.mode != 'RGB':image = image.convert('RGB')  # 如果图像不是RGB格式,则转换为RGB格式# Resize the input image and preprocess it.(按照所使用的模型将输入图片的尺寸修改)image = transforms.Resize(target_size)(image)  # 调整图像大小为目标尺寸image = transforms.ToTensor()(image)  # 将图像转换为Tensor# Convert to Torch. Tensor and normalize. mean与stdimage = transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])(image)  # 对图像进行标准化处理# Add batch size axis 增加一个维度,用于按batch测试image = image[None]  # 增加一个维度if use_gpu:image = image.cuda()  # 如果使用GPU,则将图像移动到GPU上return torch.tensor(image)  # 返回预处理后的图像Tensor# 定义一个装饰器,用于将指定的URL路径与一个函数关联起来,并指定该函数响应的HTTP方法
@app.route('/predict', methods=['POST'])
def predict():  # 当客户端发送请求时# 做一个标志,刚开始无图像传入时为false,传入图像时为truedata = {'success': False}  # 初始化返回数据字典,初始值为Falseif flask.request.method == 'POST':  # 如果收到POST请求if flask.request.files.get('image'):  # 判断是否有图像文件image = flask.request.files['image'].read()  # 将收到的图像进行读取,内容为二进制image = Image.open(io.BytesIO(image))  # 将二进制图像数据转换为PIL图像对象# 利用上面的预处理函数将读入的图像进行预处理image = prepare_image(image, target_size=(224, 224))  # 对图像进行预处理,目标尺寸为224x224preds = F.softmax(model(image), dim=1)  # 得到各个类别的概率results = torch.topk(preds.cpu().data, k=3, dim=1)  # 概率最大的前3个结果# torch.topk用于返回输入张量中每行最大的k个元素及其对应的索引results = (results[0].cpu().numpy(), results[1].cpu().numpy())  # 将结果转换为numpy数组# 将data字典增加一个key,value,其中value为list格式data['prediction'] = list()  # 初始化预测结果列表for prob, label in zip(results[0][0], results[1][0]):  # 遍历概率和标签# Label name = idx2labellstr(label)]r = {'label': str(label), 'probability': float(prob)}  # 创建一个字典,包含标签和概率# 将预测结果添加至data字典data['prediction'].append(r)  # 将预测结果添加到列表中# Indicate that the request was a success.data['success'] = True  # 将请求成功的标志设置为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')  # 启动Flask应用,监听5012端口

客户端代码

客户端代码负责发送图像数据到服务端,并接收预测结果。

import requests  # 导入requests库,用于发送HTTP请求# 定义Flask服务的URL地址
flask_url = 'http://127.0.0.1:5012/predict'  # Flask服务的地址,运行在本地主机的5012端口# 定义一个函数,用于发送图像到Flask服务并获取预测结果
def predict_result(image_path):# 打开图像文件并读取其内容image = open(image_path, 'rb').read()  # 以二进制模式打开图像文件并读取内容payload = {'image': image}  # 将图像内容封装为一个字典,作为请求的文件数据# 使用requests库发送POST请求到Flask服务r = requests.post(flask_url, files=payload).json()  # 发送POST请求,并将返回的JSON数据解析为字典# 检查请求是否成功if r['success']:# 如果请求成功,遍历预测结果并打印for (i, result) in enumerate(r['prediction']):print('{}. 预测类别为{}的概率:{}'.format(i + 1, result['label'], result['probability']))else:# 如果请求失败,打印失败信息print('request failed')# 主程序入口
if __name__ == '__main__':# 定义要预测的图像路径image_path = r'D:\Users\妄生\PycharmProjects\人工智能\深度学习\模型部署\flower_data\flower_data\val_filelist\image_00059.jpg'# 调用predict_result函数,对指定图像进行预测predict_result(image_path)

运行与测试

  1. 启动服务端:
    在这里插入图片描述

  2. 启动客户端:
    在这里插入图片描述

网络问题处理

如果在运行过程中遇到网络问题,例如无法访问 http://127.0.0.1:5012/predict,这可能是由于以下原因:

  • 服务端未正确启动或端口被占用。
  • 本地网络配置问题。

解决方法:

  • 确保服务端正确启动,并监听在正确的端口上。
  • 检查防火墙或安全软件设置,确保没有阻止访问该端口。
  • 尝试重新启动服务端或计算机。

总结

通过这篇文章,我们展示了如何使用 Flask 部署一个深度学习模型,并通过客户端与服务端进行通信。我们详细解释了服务端和客户端的代码,并提供了运行和测试的步骤。希望这能帮助你理解如何将深度学习模型部署为 Web 服务,并处理可能遇到的网络问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/79052.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/79052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物理服务器紧急救援:CentOS系统密码重置全流程实战指南

前言 在企业IT运维实践中,物理服务器密码丢失是典型的"低概率高风险"事件。某金融科技公司曾因核心服务器密码遗失导致业务中断36小时,直接损失超过800万元。这起真实案例揭示了系统密码管理的关键性——当承载重要业务的物理服务器遭遇密码丢…

【学习心得】好用算力平台推荐OpenBayes“贝式计算”

好用是有定义的,我之前用过AutoDL和DAMODEL(丹摩智算),我这里就不扯哪些我觉得不关键的因素。先不废话直接给出导航链接以及CSDN上的官方主页: OpenBayes官方网站https://openbayes.com/ OpenBayes官方CSDN账号主页h…

政务浏览器 一站式首页功能配置说明

一、政务浏览器自定义首页目的和意义 政务综合窗口,通常需要打开诸多的业务系统进行受理和查询;反复的录入系统地址或者在收藏夹查找系统入口,影响办事效率。政务浏览器为该场景设计了一款可定制的“首页”。 “首页”可以根据需要&#xff0…

linux nginx配置访问目录,访问文件直接下载,linux配置nginx直链下载

很简单的一个配置,不指定为啥,别人写的都好麻烦,而且很多配置了也不行,明明就是几句话的事啊,唉。 话不多说,直接上配置 worker_processes 1; events {worker_connections 1024; } http {include …

驱动开发硬核特训 · Day 28(上篇):pinctrl 子系统详解与实战分析

📚 技术平台:嵌入式Jerry(B站) 一、引言 在嵌入式系统中,SoC 芯片的引脚通常具有多种功能,如 GPIO、UART、I2C、SPI 等。为了在不同的应用场景中灵活配置引脚功能,Linux 内核引入了 pinctrl&am…

图漾相机——Sample_V2示例程序(待补充)

文章目录 1.SDK支持的平台类型1.1 Windows 平台1.2 Linux平台 2.Sample_V2编译流程2.1 Windows环境2.2 Linux环境编译 3.Sample_V2示例程序测试3.1 ListDevice_v23.2 DepthStream_v23.3 ExposureTimeSetting_v23.4 ForceDeviceIP_v23.5 GetCalibData_v23.6 NetStatistic_v23.7 …

Google-chrome版本升级后sogou输入法不工作了

背景: 笔记本Thinkpad E450,操作系统Ubuntu 24.04.2 LTS,Chrome浏览器版本135.0.7049.114-1,Edge浏览器版本131.0.2903.99-1,输入法Sogou版本4.2.1.145 现象: - **正常场景**:Edge中可通过Ctrl…

7系列 之 OSERDESE2

背景 《ug471_7Series_SelectIO.pdf》介绍了Xilinx 7 系列 SelectIO 的输入/输出特性及逻辑资源的相关内容。 第 1 章《SelectIO Resources》介绍了输出驱动器和输入接收器的电气特性,并通过大量实例解析了各类标准接口的实现。 第 2 章《SelectIO Logic Resource…

Ansible 流程控制

条件语句(判断) 当满足什么条件时,就执行那些tasks when 当...时ansible获取主机名 # 主机名中,不包含.没有区别 ansible_hostname # 包含.只显示第一个.前面的名字 ansible_fqdn # 包含.显示完整的主机名不管是shell还是各大编程语言中&#xf…

git命令积累(个人学习)

如何将docx文件不上传? 创建或编辑 .gitignore 文件 打开 .gitignore 文件,添加以下内容来忽略所有 .docx 文件: *.docx清除已追踪的 .docx 文件 git rm --cached "*.docx"这将从 Git 仓库中删除 .docx 文件,但不会删…

springboot应用大批量导出excel产生oom处理措施实践(适用于poieasyexcel)

一、背景: 在某些信息管理场景中,存在大批量导出需求,例如一次性导出10~100w行excel数据,如果不做特殊的处理,很容易导致Out Of Memory,特别是堆内存溢出。 oom复现 例如修改IDEA运行配置,VM…

谷歌在即将举行的I/O大会之前,意外泄露了其全新设计语言“Material 3 Expressive”的细节

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

深入理解负载均衡:传输层与应用层的原理与实战

目录 前言1. 传输层(Layer 4)负载均衡1.1 工作层级与核心机制1.2 实现方式详解1.3 优缺点分析1.4 典型实现工具 2. 应用层(Layer 7)负载均衡2.1 工作层级与核心机制2.2 实现方式解析2.3 优缺点分析2.4 常用实现工具 3. Layer 4 与…

PyTorch 版本、torchvision 版本和 Python 版本的对应关系

PyTorch 版本、torchvision 版本和 Python 版本的对应关系 在深度学习领域,PyTorch 及其配套库 torchvision 的使用极为广泛。但不同版本的 PyTorch、torchvision 与 Python 之间存在严格的对应关系,若版本搭配不当,会导致代码运行出错…

【hadoop】Hbase java api 案例

代码实现: HBaseConnection.java package com.peizheng.bigdata;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client…

荣耀A8互动娱乐组件部署实录(第3部分:控制端结构与房间通信协议)

作者:曾在 WebSocket 超时里泡了七天七夜的苦命人 一、控制端总体架构概述 荣耀A8控制端主要承担的是“运营支点”功能,也就是开发与运营之间的桥梁。它既不直接参与玩家行为,又控制着玩家的行为逻辑和游戏规则触发机制。控制端的主要职责包…

Vue3路由模式为history,使用nginx部署上线后刷新404的问题

一、问题 在使用nginx部署vue3的项目后,发现正常时可以访问的,但是一旦刷新,就是出现404的情况 二、解决方法 1.vite.config.js配置 在vite.config.js中加入以下配置 export default defineConfig(({ mode }) > {const isProduction …

企业级UI测试的“双保险”:TestComplete的智能对象识别与详细报告功能

企业级UI测试真是让人头疼!界面元素变来变去,测试脚本动不动就报错,测试工作根本没法顺利推进。而且,测试结果的管理和共享也麻烦得很,团队协作效率大打折扣。别急!TestComplete的智能对象识别和详细测试报…

SpringBoot的自动配置和起步依赖原理

关于Spring Boot的自动配置和起步依赖,我想结合最新的实现机制来展开说明。先说自动配置——这是Spring Boot最核心的"约定优于配置"思想的落地体现。举个例子,当我们创建一个新的Spring Boot项目时,只要在pom.xml里添加了spring-b…

《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》

《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-5G通信速成:MATLAB毫米波信道建模仿真指南 🚀📡 大家好!今天我将带大家进入5G通信的奇妙世界,我们一起探索5G通信中最激动人心的部分之一——毫米波信…