基于Flask的模型部署

2023-10-26

基于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界面的话也会相对复杂一些;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Flask的模型部署 的相关文章

随机推荐

  • 【vue2】data中数据赋值失败找不到、data数据不声明的影响

    博主 初映CY的前说 前端领域 本文核心 vue2data作用 前言 当你看到这篇文章相比你已经对vue有了一定的了解 对data的有了一个基本的认识 data是存放我们当前页面数据地方 是的 没一点毛病 具体的来说是存放响应式数据地方 那
  • android中通过代码实现文件权限修改(chmod)

    在Unix和Linux的各种操作系统下 每个文件 文件夹也被看作是文件 都按读 写 运行设定权限 读 写 运行三项权限可以用数字表示 就是r 4 w 2 x 1 所以 rw r r 用数字表示成644 反过来说777就是rwxrwxrwx
  • php的协程

    在php中 实现协程主要由两种方式 1 yield生成器的实现 2 swoole扩展实现 协程不是进程或线程 其执行过程更类似于子例程 或者说不带返回值的函数调用 一个程序可以包含多个协程 可以对比与一个进程包含多个线程 因而下面我们来比较
  • 全光组网是什么?有什么优点优势

    去年底回山西老家了 在当地的某个运营商公司找了一份工作 最近接触到了全光组网Fttr全屋宽带覆盖方案 就研究了一下 任何方案都是适用一种类型的人群 这个Fttr应该是华为给运营商提供的技术方案 整个方案因为有移动的维护做售后 所以比自己找安
  • eclipse启动了tomcat正常,可页面还是404

    eclipse启动了tomcat正常 可页面还是404 这两天看到Eclipse 3 7 代号Indigo 正式版发布了 于是心想也试试看最新版有什么变动 于是就开始准备尝试下 终于在今天下载好也解压完 一切很正常 随便写了个web工程 在
  • 学习笔记(01):go快速入门-iota用法

    立即学习 https edu csdn net course play 26897 344142 utm source blogtoedu
  • Kubernetes:(七)k8s优化大法(江湖失传已久的武林秘籍)

    目录 一 内核参数优化 1 1增大内核选项配置 etc sysctl conf 1 2其他的内核参数 二 Etcd性能优化 2 1磁盘 2 2etcd进程设置优先级 2 3增大etcd的存储限制 2 4提高etcd对于对等网络流量优先级 2
  • C++57个入门知识点_番外2_C++中指针函数、函数指针和返回值为函数指针的函数

    文章目录 1 引言 2 指针函数 3 函数指针 4 返回值为函数指针的函数 5 从底层理解返回值为函数指针的函数 5 1 指针函数的定义 5 2 用函数指针作为函数的返回值 5 3 总结 1 引言 函数指针 指针函数是C中重要而容易混淆的概
  • 【深度学习】一分钟速学

    非极大抑制 NMS的英文是Non maximum suppression的缩写 简单的说 就是模型给出了多个重叠在一起的候选框 我们只需要保留一个就可以了 其他的重叠的候选框就删掉了 效果可见下图 交并比 IoU的英文全称Interp ov
  • 远程控制医疗行业应用解析:如何满足医院合规需求?

    远程控制医疗行业应用解析 如何满足医院合规需求 作为一个起源于IT行业的技术 以远程桌面为基础的远程控制技术目前在医疗领域也已经有了比较广阔的应用前景 尤其是在医疗数字化系统 设备的远程运维场景 已经有了一些成功案例 可以说是一个成熟的技术
  • 超详细

    早在去年的十二月份 也就是2020年12月 CentOS 官方发文宣称 CentOS项目的未来是 CentOS Stream 明年我们会将重点从CentOS Linux 转移到CentOS Stream 它紧随当前 RHEL 版本之前 Ce
  • 查找器(Finger)--网络大典

    查找器 Finger 属于用户信息协议 提供了一个与远程用户信息程序接口 RUIP 的界面 Finger 是一种基于传输控制协议 TCP 使用 TCP 端口 79 交换用户信息的协议 在 Finger 端口本机对远程机建立一个 TCP 连接
  • 使用IDEA2021上传代码到Gitee

    1 创建gitee项目仓库 2 复制项目地址 也可以用下面的命令行操作 3 创建本地项目 创建git本地仓库 4 选择目录初始化git 4 1 选择你要上传的项目 4 2 变红说明已经到本地仓库 5 选中项目名先将项目add到缓冲区 再co
  • 【JS逆向】之某条sign算法解析(一)

    声明 本文只作学习研究 禁止用于非法用途 否则后果自负 如有侵权 请告知删除 谢谢 前言 其实这算法网上的解析挺多 但是我感觉大多数不愿意讲的太详细 但是我刚开始玩逆向的时候 我也研究得似懂非懂的 后来还是花了很多时间去研究和调试吧 其实逆
  • 重写了Servlet的init方法后一定要记得调用父类的init方法

    Override public void init ServletConfig config throws ServletException 重写了Servlet的init方法后一定要记得调用父类的init方法 否则在service doG
  • 我开游戏要用什么服务器比较好

    随着互联网的高速发展 游戏行业也随之火爆 那么该怎么选择服务器来保障自身的游戏业务正常运转呢 市场上的服务器大致分为云服务器和物理服务器 云服务器是由大型功能强大的物理设备中分割出来的 是一种简单高效 安全可靠 处理能力可弹性伸缩的计算服务
  • 使用 FPGA 评估板学习 VHDL

    特点 使用 Arrow 经济实惠且适合面包板的 FPGA 开发板 BeMicro MAX 10 创建光传感器 温度传感器 运动传感器和汽车显示器 学习 FPGA 和电子学背后的理论 包括理解正在发生的事情所需的数学和逻辑 了解什么是 FPG
  • 写一个0-10000偶数和

    以下是一个计算0到10000的所有偶数的和的程序 sum 0 for i in range 0 10001 2 sum i print 0 10000的偶数和为 sum 答案为 250050
  • C++ 用libcurl库进行http通讯网络编程

    目录索引 一 LibCurl基本编程框架 二 一些基本的函数 三 curl easy setopt函数部分选项介绍 四 curl easy perform 函数说明 error 状态码 五 libcurl使用的HTTP消息头六 获取http
  • 基于Flask的模型部署

    基于Flask的模型部署 一 背景 Flask 一个使用Python编写的轻量级Web应用程序框架 首先需要明确模型部署的两种方式 在线和离线 在线 就是将模型部署到类似于服务器上 调用需要通过网络传输数据 再将结果返回 离线 就是将模型直