首页 > 其他分享 >使用Flask实现本机的模型部署

使用Flask实现本机的模型部署

时间:2024-10-21 22:17:12浏览次数:9  
标签:__ predict Flask 模型 flask model 本机 image

前言

        模型部署是指将大模型运行在专属的计算资源上,使模型在独立的运行环境中高效、可靠地运行,并为业务应用提供推理服务。其目标是将机器学习模型应用于实际业务中,使最终用户或系统能够利用模型的输出,从而发挥其作用。

一、设置客户端

  1. 运行之前要先运行服务端
  2. url里写入本机ip和端口,后面跟上端口名
  3. 以二进制形式读取图片创建payload字典
  4. 向上面的url服务器发送post请求,传入字典文件
  5. 将返回的json文件解析成字典
import requests

# url和端口写成自己的端口
flask_url = "http://192.168.24.39: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响应解析为一个字典。
    # print(r)
    if r["success"]:
        # 输出结果
        for (i, result) in enumerate(r['predictions']):
            print(f"{i + 1}.预测类别为{result['label']}:{result['probability']}")
    else:
        print('Request failed')


if __name__ == '__main__':
    predict_result('./35/image_06975.jpg')

输出:

二、设置服务端

  1. 服务端初始化一个Flask对象,命名app
  2. @app.route("/predict", methods=["POST"]) 定义了一个路由 以POST方式发送到/predict的请求都会进入下方的函数
  3. 下方函数处理完之后返回flask.jsonify(data),json文件
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__参数通常被传递给FasK应用程序来定位应用程序的根路径,这样Flask就可以知道在哪里找到模板、静态文件等。
# 总体来说app = flask.Flask(__name__)是FLaSK应用程序的起点。它初始化了一个新的Flask应用程序实例。为后续添加路由、配置等奠定了基础

model = None
use_gpu = False


# 加载模块进来
def load_model():
    global model
    # 加载resnet18网络
    model = models.resnet18()
    num_ftrs = model.fc.in_features
    model.fc = nn.Sequential(nn.Linear(num_ftrs, 102))  # 输出神经元为类别数

    checkpoint = torch.load('best.pth')
    model.load_state_dict(checkpoint['state_dict'])
    model.eval()

    if 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]  # torch 的写法
    if use_gpu:
        image = image.cuda()
    return torch.tensor(image)


@app.route("/predict", methods=["POST"])
# @app.route("/predict"):
# 这部分定义了一个路由,表示当客户端发送请求到 /predict URL 时,Flask 应用会执行下方的处理函数。也就是说,任何访问 /predict 的请求都会被这个函数处理。
# methods=["POST"]:
# 这部分指定了允许的 HTTP 请求方法。methods=["POST"] 表示这个路由只接受 POST 请求。
def predict():
    # 做一个标志 刚开始无图像传入时为false 传入图像时为true
    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))  # 将接收到的二进制图片转换成16进制  # 将二进制数据转换为图像对象

            # 利用上面的预处理函数将读入的图像进行预处理
            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)  # 概率最大的前3个结果
            # torch.topk用于返回输入张量中每行最大的k个元素及其对应的索引

            results = (results[0].cpu().numpy(), results[1].cpu().numpy())

            # 将data字典增加一个key,value,其中value为ist格式
            data['predictions'] = list()

            for prob, label in zip(results[0][0], results[1][0]):
                r = {"label": str(label), "probability": float(prob)}
                # 将预测结果添加至data字典
                data['predictions'].append(r)

            data["success"] = True
    return flask.jsonify(data)  # 将最后结果以json格式文件传出


if __name__ == '__main__':
    load_model()  # 先加载模型
    app.run(host='192.168.24.41', port='5012')  # 开启服务   服务器进入监听状态 等待用户发送信息
    # host 参数指定 IP 地址:
    # host = '127.0.0.1': 仅能从本机访问。
    # host = '0.0.0.0': 允许来自任何设备(网络)访问。
    # host = '192.168.24.41': 仅允许来自该特定IP地址的请求(通常是局域网内的某台设备)。

    # host = '127.0.0.1': 这表示Flask应用仅能在本机上访问。例如,只有在同一台计算机上打开浏览器,才能通过http: // 127.0.0.1: 5012 / 访问Flask应用。其他计算机无法通过这个IP访问。
    # host = '0.0.0.0': 这表示Flask应用会监听来自任何网络接口的请求,适用于让其他设备(比如局域网内的其他设备)也能访问该应用。通过局域网访问时,其他设备可以使用http: // < 你的局域网IP >: 5012 / 访问。
    # host = '192.168.24.41': 这意味着Flask仅监听来自该特定IP地址(通常是局域网IP)的请求。如果你在局域网中,其他设备可以使用http: // 192.168.24.41: 5012 / 访问。

输出:

如果最后的状态码是200,证明请求成功

标签:__,predict,Flask,模型,flask,model,本机,image
From: https://blog.csdn.net/weixin_65047977/article/details/143134962

相关文章

  • 图像去雨+图像去噪+图像去模糊一体化模型(图像处理-图像复原-代码+部署运行教程)
    本文主要讲述了一体化模型进行去噪、去雨、去模糊,也就是说,一个模型就可以完成上述三个任务。实现了良好的图像复原功能!先来看一下美女复原.jpg具体的完整代码文章底部推广获取:在图像恢复任务中,需要在恢复图像的过程中保持空间细节和高级上下文信息之间的复杂平衡。在......
  • HarmonyOS:应用程序包结构(1)Stage模型应用程序包结构
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(MaoistLearning)➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/......
  • Llama Factory :百种以上语言模型的统一高效微调框架
     人工智能咨询培训老师叶梓转载标明出处大模型适应到特定下游任务时,传统的全参数微调方法成本高昂,因此,研究者们一直在探索更高效的微调技术。由北京航空航天大学和北京大学的研究团队提出了一个名为LlamaFactory的统一框架,旨在解决大模型高效微调的问题。该框架整合了一系......
  • python+flask计算机毕业设计高校实验室安全应急管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于高校实验室安全应急管理系统的研究,现有研究多侧重于实验室安全管理的常规方面,如设备管理、人员管理等。专门针对高校实验室安全应......
  • python+flask计算机毕业设计高校实验室管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于高校实验室管理的研究,现有研究主要集中在设备管理或人员管理等单一模块为主1(山东大学实验耗材管理服务系统)。专门针对涵盖学生......
  • 大模型agent开发之基于知识库的聊天机器人
    1. 文本知识库的加载和分割实现一个智能文档助手,基于已有知识库给向ai发起提问使ai能够基于知识库回答更加准确的答案,首先需要加载对应的文档,文档类型可以是docx,xlsx,md等格式。并且对文档进行分割,将其分割成一块一块的Document类型并转成list类型方便后续处理。defgetFi......
  • 【WOA-CNN-LSTM】基于鲸鱼算法优化深度学习预测模型的超参数研究(Matlab代码实现)
     ......
  • 大模型的检索增强生成综述研究
    人工智能咨询培训老师叶梓转载标明出处大模型(LLMs)在处理特定领域或知识密集型任务时,它们仍面临挑战,例如产生“幻觉”、知识过时以及推理过程不透明、难以追溯等问题。为了解决这些问题,检索增强生成(Retrieval-AugmentedGeneration,RAG)作为一种有前景的解决方案应运而生,它通......
  • 分享一个大模型在请求api接口上的巧用
    前言自从Chatgpt横空出世以来,各种智能工具层出不穷,聊天、绘画、视频等各种工具帮助很多人高效的工作。作为一个开发者,目前常用应用包括代码自动填充,聊天助手等。这些是工具层面的使用,有没有将大模型和日常编码的前后端流程相结合使用的切入点呢?今天分享一个使用大模型自动调用a......
  • 星海智算:英伟达再放大招!重磅开源Nemotron大模型:击败GPT-4o、仅次于o1!
    AI新闻资讯 英伟达开源了Nemotron-70B,模型一经发布就超越了GPT-4o和Claude3.5Sonnet,仅次于OpenAIo1!全球AI领导者英伟达(Nvidia)开源了超强大模型——Llama-3.1-Nemotron-70B-Instruct。根据测试数据显示,该模型已经击败了GPT-4o、GPT-4turbo、Gemma-2、Gemini-1.5......