基于Flask的模型部署

基于Flask的模型部署

一、背景

Flask:一个使用Python编写的轻量级Web应用程序框架;

首先需要明确模型部署的两种方式:在线和离线;

在线:就是将模型部署到类似于服务器上,调用需要通过网络传输数据,再将结果返回;

离线:就是将模型直接部署在终端设备上,不需要联网,数据传输上比较快;

二、Flask简单部署分类模型

通过一个实际的分类案例,来说明整个实现的流程;

首先Flask分为服务端和设备端,服务端就是接受数据并处理,应用端只负责发送数据和展示结果;

实现步骤:

------服务端-------

1、初始化Flask app

可以理解为初始化一个服务器对象;

app = flask.Flask(__name__)

2、加载模型

def load_model():
    global model
    model = resnet50(pretrained=True)	# 这里模型可以替换成自己的模型
    model.eval()
    if use_gpu:
        model.cuda()

这里是所有模型通用的,如果是一些模型需要将模型结构的代码和模型文件都准备好;

3、数据预处理

推理部分的数据处理应该与模型训练前的处理保持一致,否则可能导致结果出现较大偏差;

def prepare_image(image, target_size):
    if image.mode != 'RGB':
    image = image.convert("RGB")	# 转换图像为RGB类型
	
	# 缩放图像
    image = T.Resize(target_size)(image)
    image = T.ToTensor()(image)

    # 归一化
    image = T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])(image)

    # 这里表示可以配置多个图像作为一个batch
    image = image[None]
    if use_gpu:
        image = image.cuda()	# 使用GPU
    return Variable(image, volatile=True) 	#不需要求导

上述的数据处理是最基本并且简单的数据处理,在很多任务中的数据预处理会复杂很多;

4、开启服务

# 注意这里的predict可以自行修改,但需要和后面的端口后缀保持一致
@app.route("/predict", methods=["POST"])	# 这里是python的装饰器
def predict():
    # 初始化一个返回列表,并且用一个变量表示是否调用成功
    data = {"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)) #二进制数据

            # 数据预处理
            image = prepare_image(image, target_size=(224, 224))

            # 得到模型输出的结果,取出前K个结果
            preds = F.softmax(model(image), dim=1)
            results = torch.topk(preds.cpu().data, k=3, dim=1)
            results = (results[0].cpu().numpy(), results[1].cpu().numpy())
		   
		   # 结果保存到要传回的列表中
            data['predictions'] = list()

            # 根据标签值找到对应对象的实际类别
            for prob, label in zip(results[0][0], results[1][0]):
                label_name = idx2label[label]
                r = {"label": label_name, "probability": float(prob)}
                data['predictions'].append(r)

            # 设置返回列表调用成功
            data["success"] = True

    # 将数据转为json并返回
    return flask.jsonify(data)

这里是服务的具体执行程序,也就是接收数据和处理数据,并将结果返回;

这里可以做UI的可视化界面,本次只是演示效果就不进行设计;

执行该程序后,出现一个访问地址和端口号,如下图所示:

在这里插入图片描述

这里是部署到本地的服务器上,在实际工程中,一般是部署到一台公共服务器上,将服务开放为接口供但部分应用使用;

------应用端-------

1、初始化服务接口

PyTorch_REST_API_URL = 'http://127.0.0.1:5000/predict'

2、请求服务并展示结果

def predict_result(image_path):
    # 读取图像数据,保存到数组中
    image = open(image_path, 'rb').read()
    payload = {'image': image}

    # 请求服务
    r = requests.post(PyTorch_REST_API_URL, files=payload).json()

    # 确保服务返回成功
    if r['success']:
        # 遍历结果,并打印出来
        for (i, result) in enumerate(r['predictions']):
            print('{}. {}: {:.4f}'.format(i + 1, result['label'],
                                          result['probability']))
    # 如果服务请求失败,返回失败
    else:
        print('Request failed')

在这里插入图片描述

上面就是传入一张狗狗图像后打印的结果,可以看出服务能够正常运行;

总结:

虽然是一个简单的分类项目,但整体部署的流程以及一些代码的模板是不变的,换成别的任务可能会复杂一些,主要还是前后处理相对复杂一些,并且做UI界面的话也会相对复杂一些;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型的数据隐私问题有解了,浙江大学提出联邦大语言模型

作者 | 小戏、Python 理想化的 Learning 的理论方法作用于现实世界总会面临着诸多挑战,从模型部署到模型压缩,从数据的可获取性到数据的隐私问题。而面对着公共领域数据的稀缺性以及私有领域的数据隐私问题,联邦学习(Federated Le…

AI:02-基于深度学习的动物图像检索算法的研究

文章目录 一、算法原理二、代码实现三、实验结果四、总结深度学习在计算机视觉领域中的应用越来越广泛,其中动物图像检索算法是一个重要的应用场景。本文将介绍一种基于深度学习的动物图像检索算法,并提供相应的代码实现。 一、算法原理 本算法采用卷积神经网络(Convolutio…

如何将maven部署在Idea的教学,和idea介绍

目录 一.idea介绍,以及一些基本特点! 1.1idea介绍 1.2idea特点 1.3.idea和eclipse区别 1.4idea安装 4.1下载网址 4.2下载后安装(见图片) 1.5 Idea的一些操作更改 5.1主题颜色 5.2设置鼠标悬浮提示 5.3显示方法分隔符 5.4忽…

架构设计第八讲:架构 - 理解架构的模式2 (重点)

架构设计第八讲:架构 - 理解架构的模式2 (重点) 本文是架构设计第8讲:架构 - 理解架构的模式2,整理自朱晔的互联网架构实践心得, 他是结合了 微软给出的云架构的一些模式的基础上加入他自己的理解来总结互联网架构中具体的一些模式。我在此基…

Databend 开源周报第 105 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 Databend 轻量级…

netty面试题2

1、一次完整的HTTP请求的所经历的步骤 1、首先进行DNS域名解析(本地浏览器缓存、操作系统缓存或者DNS服务器),首先会搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存&#xff…

C语言案例 分数列求和-11

题目:有一分数列:2 / 1,3 / 2,5 / 3,8 / 5,13 / 8,21 / 13 …求出这个数列的前20项之和。 程序分析 这是一个典型的分数列数学逻辑题,考究这类题目是需要从已知的条件中找到它们的分布规律 我们把前6荐的分子与分母分别排列出来,…

知识图谱实战应用23-【知识图谱的高级用法】Neo4j图算法的Cypher查询语句实例

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用23-【知识图谱的高级用法】Neo4j图算法的Cypher查询语句实例,Neo4j图算法是一套在Neo4j图数据库上运行的算法集合。这些算法专门针对图数据结构进行设计,用于分析、查询和处理图数据。图算法可以帮助我们发现图中的模…

Anaconda Prompt使用pip安装PyQt5-tools后无法打开Spyder或闪退

艹!MLGBZD! 真TMD折腾人! 出现原因: 首次安装完Anaconda3-2023.07-1-Windows-x86_64.exe后首次打开Spyder,此时是没有问题的,然后打开Anaconda Prompt,查看有哪些包,pip list 这时候开始首次安…

C语言学习笔记 使用vscode外部console出现闪退-12

前言 在使用vscode的外部console时,会出现闪退现象,这是因为程序运行结束后,系统自动退出了终端(终端机制决定的)。我们可以在C程序结束后,使用system函数来暂停DOS终端系统,这样就可以完整地看…

6-Ngnix配置反向代理

1.前提 虚拟机能连接外网 仿真http应用需在本虚拟机启用(原因:只有一台虚拟机做测试) http_8080和http_8081要启用(http测试应用) [rootcent79-2 ~]# ls -l http_* -rwxr-xr-x 1 root root 6391676 Jul 19 13:39 http_8080 -rwxr-xr-x 1 …

监控Kubernetes 控制面组件的关键指标

控制面组件的监控,包括 APIServer、Controller-manager(简称 CM)、Scheduler、etcd 四个组件。 1、APIServer APIServer 的核心职能是 Kubernetes 集群的 API 总入口,Kube-Proxy、Kubelet、Controller-Manager、Scheduler 等都需…

系列六、Redis中的五大数据类型及相关操作

一、五大数据类型 String类型、List类型、Set类型、ZSet类型、hash类型。 二、String类型 2.1、内存储存模型 2.2、常用操作命令 三、List类型 3.1、概述 list列表,相当于Java中的list集合。特点:元素有序 且 可以重复。 3.2、内存存储模型 3.3、常用…

MySQL——Mysql安装教程- Windows

一、Mysql安装 1、下载mysql安装包 下载链接: 链接: https://pan.baidu.com/s/1rFpMqOCApiQQEwYSs9XSmg https://pan.baidu.com/s/1rFpMqOCApiQQEwYSs9XSmg 提取码:zt88 2、 安装 1)选择电脑磁盘空闲的路径: 2&…

springboot+mybatis+mybatis-plus对crud项目进行改进

springbootmybatis实现简单的增、删、查、改https://blog.csdn.net/heyl163_/article/details/132197201上一篇文章,已经详细地介绍了怎么通过springboot项目整合mybatis实现简单的数据库表的增删改查功能,是最简单的springboot项目的结构。所以有很多问…

UDP服务器—实现数据通信

目录 前言 1.接口介绍 2.编写服务器 3.编写客户端 4.测试 总结 前言 在这篇文章中为大家介绍如何通过编码实现数据通信,实现思路是根据前面介绍的网络编程函数编写一个服务端和客户端,实现客户端和服务端双方通信 1.接口介绍 创建套接字 #include…

三平面映射的技术

大家好,我是阿赵。   之前在做护盾的时候,使用过一种叫做三平面映射的技术,这里来详细的说一下。 一、效果说明 在做场景的时候,很多美工都会遇到一个问题,想把一个通用的材质贴图赋予给一个经过拉伸的模型&#xf…

分布式应用:Zabbix自定义监控模板

目录 一、理论 1.zabbix监控模板 2.在客户端创建自定义 key 3.在 Web 页面创建自定义监控项模板 4.设置邮件报警 二、实验 1.在客户端创建自定义 key 2.在 Web 页面创建自定义监控项模板 3.设置邮件报警 三、问题 1.查看动作发送邮件失败 四、总结 一、理论 1.zab…

日常BUG——SpringBoot模糊映射

😜作 者:是江迪呀✒️本文关键词:日常BUG、BUG、问题分析☀️每日 一言 :存在错误说明你在进步! 一、问题描述 SpringBoot在启动时报出如下错误: Caused by: java.lang.IllegalStateExceptio…

【数学建模】--因子分析模型

因子分析有斯皮尔曼在1904年首次提出,其在某种程度上可以被看成时主成分分析的推广和扩展。 因子分析法通过研究变量间的相关稀疏矩阵,把这些变量间错综复杂的关系归结成少数几个综合因子,由于归结出的因子个数少于原始变量的个数&#xff0c…