【深度学习】【部署】Flask快速部署深度学习模型【入门】

news2024/9/24 19:14:23

【深度学习】【部署】Flask快速部署深度学习模型【入门】

提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论

文章目录

  • 【深度学习】【部署】Flask快速部署深度学习模型【入门】
  • 前言
  • 搭建简单的Web服务
  • 搭建深度学习的Web服务
  • win10下打包成exe(选看)
  • 总结


前言

Django和Flask都是python的服务框架,Flask相较于Django的优势是更加轻量级,因此尝试用Flask构建API服务,Flask快速部署深度学习模型再打包exe与深度学习模型直接打包exe相比,前者模型只需要加载一次权重就可以一直使用,而后者每一次预测都需要重新加载一次模型权重,严重浪费了时间和资源。
【打包exe参考】
【环境安装参考】

# 安装flask
pip install flask 
# 安装pytorch环境
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117

搭建简单的Web服务

将以下代码段保存在名为app.py的文件中,并运行代码。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello World!'

if __name__ == "__main__":
	app.run()

在web浏览器中访问http://127.0.0.1:5000/时,查看到Hello World的文本!


搭建深度学习的Web服务

博主以人脸检测之Retinaface算法为例讲解代码:【retinaface-pytorch代码】。有兴趣的朋友可以看看完整的代码,这里博主只保留了与预测相关的代码,并做了部分修改。
app.py中与Web服务相关的部分,博主设置了俩个路由路径:

  1. 一个是/http://127.0.0.1:5000/setmodel–用于修改模型的主干网络及其权重,因为一个检测模型可能有多个backbone,本例是有resnet50和alpha不同的多个mobilenetV1作为backbone。
  2. 另一个是/http://127.0.0.1:5000/predict–用于检测,这里博主保留了源码中图片单一和批量俩种预测方式。
# 初始化模型 默认mobilenetX1.00
Model = retinaface("mobilenetX1.00")
from flask import Flask, request
app = Flask(__name__)
# /setmodel用于修改模型
@app.route('/setmodel', methods=['POST'])
def initialization():
    if request.method == 'POST':
        model_mold = request.form
        Model.setModel(model_mold["model_mold"])
    return "initialization " + model_mold["model_mold"] + " finish"

# /predict用于预测
@app.route('/predict', methods=['POST'])
def predict():
    if request.method == 'POST':
        file = request.form
        keys_Points = Model.detect_image(file['mode'], file['path'])
        return keys_Points

if __name__ == '__main__':
    app.run()

app.py中与Retinaface算法相关的部分,用retinaface类进一步封装了Retinaface模型,设置了俩个方法,detect_image方法对于flask中的predict,setModel方法对应flask中的initialization。

class retinaface(object):
    def __init__(self, model_mold):
        if model_mold == "mobilenetX1.00":
            model_path= r"model_save/mobilenetX1.00.pth"
        elif model_mold == "mobilenetX0.75":
            model_path = r"model_save/mobilenetX0.75.pth"
        elif model_mold == "mobilenetX0.50":
            model_path = r"model_save/mobilenetX0.50.pth"
        elif model_mold == "mobilenetX0.25":
            model_path = r"model_save/mobilenetX0.25.pth"
        else:
            model_path = r"model_save/resnet50.pth"
        self.retinaface = Retinaface(model_path=model_path, backbone=model_mold)

    def detect_image(self, mode, path):
        import os
        if mode == "predict" and (path.lower().endswith(('.bmp', '.dib', '.png', '.jpg', '.jpeg', '.pbm', '.pgm', '.ppm', '.tif', '.tiff'))):
            while True:
                image = cv2.imread(path)
                if image is None:
                    print('Open Error! Try again!')
                    continue
                else:
                    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
                    r_image_points = self.retinaface.detect_image(image).tolist()

        elif mode == "dir_predict" and os.path.isdir(path):
            import os
            import time
            r_image_points = []
            img_names = os.listdir(path)
            for img_name in img_names:
                t = time.time()
                if img_name.lower().endswith(('.bmp', '.dib', '.png', '.jpg', '.jpeg', '.pbm', '.pgm', '.ppm', '.tif', '.tiff')):
                    image_path = os.path.join(path, img_name)
                    image = cv2.imread(image_path)
                    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
                    r_image_points.append(self.retinaface.detect_image(image).tolist())
        else:
            return []
        return r_image_points

    def setModel(self,model_mold):
        if model_mold == "mobilenetX1.00":
            model_path= r"model_save/mobilenetX1.00.pth"
        elif model_mold == "mobilenetX0.75":
            model_path = r"model_save/mobilenetX0.75.pth"
        elif model_mold == "mobilenetX0.50":
            model_path = r"model_save/mobilenetX0.50.pth"
        elif model_mold == "mobilenetX0.25":
            model_path = r"model_save/mobilenetX0.25.pth"
        else:
            model_path = r"model_save/resnet50.pth"
        self.retinaface = Retinaface(model_path=model_path, backbone=model_mold)

test.py用于HTTP Post请求过程模拟。
"http://localhost:5000/setmodel"加载指定backbone,假设不指定backbone,默认加载mobilenetX1.00。

import requests
resp = requests.post("http://localhost:5000/setmodel",
                     data={'model_mold': 'mobilenetX0.25'})
print(resp.text)

"http://localhost:5000/predict"指定模式mode(单张图片或批量图片)和图片路径path。

import requests
resp = requests.post("http://localhost:5000/predict",
                     data={'mode': 'dir_predict', 'path': 'img'})
print(resp.text)

启动服务后,post发送http请求,默认backbone加载mobilenetX1.00,path指定批量图片的文件夹地址,dir_predict(批量预测图片)mode方式预测所以图片的五个关键点(双眼、鼻子和俩边嘴角)xy像素坐标,源码其实还有框的坐标和高宽,博主不需要就去掉了。
多张图片,每张图片数据保存在一个list里–5个关键点xy像素坐标共10个值。

【代码上传】,只保留预测相关文件,功能如下图所示,不做过多讲解,主要讲解部署和使用。

win10下打包成exe(选看)

零基础先参考python程序打包成可执行文件【进阶篇】

# 安装PyInstaller包,5.4.0版本
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Pyinstaller==5.4.0
# 生成spec文件
pyi-makespec -w app.py

安装了5.7.0及以后版本的Pyinstaller,打包部署启动的时候会报如下错误:

解决方式:pip指定5.4.0版本的安装包安装。
修改app.spec内容:由于打包的主文件是app.py,因此生成的spec文件名称为app.spec,俩者在同一个目录下。

    ['app.py',
    "E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/retinaface.py",
    "E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/nets/layers.py",
    "E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/nets/mobilenet.py",
    "E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/nets/resnet.py",
    "E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/nets/retinaface.py",
    "E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/nets/retinaface_training.py",
    "E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/utils/anchors.py",
    "E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/utils/callbacks.py",
    "E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/utils/config.py",
    "E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/utils/dataloader.py",
    "E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/utils/utils.py",
    "E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/utils/utils_bbox.py",
    "E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/utils/utils_fit.py",
    "E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/utils/utils_map.py",
    ],
    pathex=["E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface"],
    binaries=[  ("E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/model_save/mobilenetX0.25.pth", "model_save"),
                ("E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/model_save/mobilenetX0.50.pth", "model_save"),
                ("E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/model_save/mobilenetX0.75.pth", "model_save"),
                ("E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/model_save/mobilenetX1.00.pth", "model_save"),
                ("E:/deep-learning-for-image-processing-master/face_detector/flask-retinaface/model_save/resnet50.pth", "model_save"),
    ],
# 运行spec文件进行打包
pyinstaller app.spec

完成打包后在pathex指定文件夹下产生build(可以删除)和dist文件夹,所需的可执行文件在dist目录内

双击运行exe,运行test.py进行Post请求,测试结果如下图:


总结

尽可能简单、详细的介绍Flask快速部署深度学习模型的过程。

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

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

相关文章

web后端-请求响应

概述 我们之前在Spring写的 Java类,因为没有继承任何的接口 所以tomcat其实是不识别的,也不能直接运行 但是tomcat识别JavaEE的一项规范-Servlet,因为tomcat就相当于一个Servlet容器 SpringBoot底层提供了一个DisPatcherServlet类(实现了servlet接口)…

C++入门篇(一)

目录 一、C关键字汇总二、命名空间2.1 命名空间的定义2.2 命名空间的使用 三、C的输入和输出四、缺省参数五、函数重载5.1 函数重载的概念5.2 C支持函数重载的原理是什么? 一、C关键字汇总 在C98标准下,C一共有63个关键字,C语言一共有32个关…

第二章 设计模式七大原则

文章目录 前言一、单一职责 🍧1、单一职责原则注意事项和细节2、代码实现2、1 错误示例2、2 正确示例但有缺陷2、3 最终形态 二、接口隔离原则 🥩1、代码示例 三、依赖倒转原则 🥥1、代码示例2、依赖关系传递的三种方式 四、里氏替换原则 &am…

【C 语言】习题 1 - 用代码将二进制转换为十进制

目录 1、缘起 2、算法描述 3、代码清单 4、相关知识点 5、总结 1、缘起 我以前计算二进制转换为十进制的时候,喜欢用笔算,或者电脑在手旁的时候,用电脑自带的程序员计算器进行计算。今天兴起,突然想写一个代码用于计算…

Bootstrap框架实战:轻松搭建响应式网站

Bootstrap 是一款非常受欢迎的前端开发框架,它可以帮助我们轻松地搭建响应式网站。在这篇文章中,我们将介绍如何使用 Bootstrap 框架创建一个简单的响应式网站,并了解其核心概念和组件。 1. Bootstrap 简介 Bootstrap 是由 Twitter 公司的开…

字节码插桩:从分析class文件结构开始

作者:小马快跑 Class字节码 Java 能做到 一次编译,到处运行,主要就是靠 class字节码 文件,也就是 java 文件经过编译之后 .java -> .class,然后再被 JVM 虚拟机加载。其实,不仅是 java 语言&#xff0c…

每日做题总结——day02

目录 字符串处理函数,strcpy,strcat 数组指针 函数缺省值 初始化列表​编辑 友元函数 new与delete 静态成员变量 new与构造函数 delete与析构函数 拷贝构造函数的特点 常成员函数 初始化列表 编程题 字符串中找出连续最长的数字串 数组中超过…

字节的面试,你能扛住几道?

C , Python 哪一个更快? 读者答:这个我不知道从哪方面说,就是 C 的话,它其实能够提供开发者非常多的权限,就是说它能涉及到一些操作系统级别的一些操作,速度应该挺快。然后 Python 实现功能还…

从数据到应用 Web3不再纸上谈兵

继宣布拨款5000万港元加速推动Web3生态圈发展后,香港再次明确对Web3产业创新的支持。近日,香港Web3协会正式成立,创立Web3Hub基金,“东方之珠”正在大力推进第三代互联网的生态建设。 不仅仅是政策红利,ChatGPT等人工…

Web服务器配置(Tomcat)【Centos】

Tomcat 是一个轻量化服务器,理论上支持 20,000 个用户 LNMP:Linux Nginx MySQL LTMP:Linux Tomcat MySQL 1.Apache Tomcat 从版本7开始,若仅仅只需要部署HTML静态页面,Apache就可以完全够用 查看Apache是否安装 rpm -…

Ajax的特性以及用法

一、什么是Ajax 1、jQuery的Ajax ①:get方法​编辑 ②:post方法 ③:Ajax(这个重要,jQuery的ajax最常用) PS:一定要注意,数据类型是 json !!! …

google breakpad中minidump_stackwalk的编译(Windows)

接上一篇的内容: breakpad编译指南(Windows)_我的胖是因为太膨胀的博客-CSDN博客 1、获取 googletest 放进 breakpad/src 目录下,并把目录名重命名为testing git clone https://github.com/google/googletest.git 如下图 2、把…

ROS2安装教程(virtualbox7.0.6+ROS2)

整个过程分两步:先安装Virtualbox,再安装ROS2 一、安装virtualbox7.0.6 网址:https://www.virtualbox.org/wiki/Downloads 问题1 安装时报错:缺少python core 、win32api依赖(下图网上拷贝的图,版本忽略…

这份完整WhatsApp营销方案请收好!

WhatsApp是什么? WhatsApp是一种跨平台的即时通讯应用程序,可以在手机、平板电脑和电脑上使用。它允许用户发送文字消息、语音消息、图片、视频和文件等内容,同时还可以进行语音通话和视频通话。 WhatsApp拥有多种功能,包括但不…

Windows下通过CMake编译hiredis及应用

1、 在下载的redis-6.2.12.tar.gz的压缩包中,解压后有个deps文件夹,里面有个hiredis文件夹,是我们访问redis的C接口,需要我们手动编译后才能使用。(redis: https://redis.io/download/) 2、打开CMake软件&…

日本PSE认证日本的電気用品安全法METI备案

日本的電気用品安全法(PSE认证)法规要求日本的采购商在购进商品后一个月内必须向日本METI注册申报,并必须将采购商名称或ID标在产品上,以便在今后产品销售过程中进行监督管理,完成后将获得電気用品製造事業届出書&…

全球化背景下,如何利用内容营销促进跨境电商业务增长

随着全球跨境电商市场的迅速发展,越来越多的企业开始将注意力转向跨境电商。然而,随着竞争的激烈化,企业不再能够仅仅依靠产品本身来吸引消费者的注意。因此,内容营销成为了跨境电商企业在吸引、留住消费者方面的关键。在这篇文章…

【Spring】— Spring AOP

目录 一、Spring AOP简介1.什么是AOP2.AOP术语 二、AspectJ开发1.基于XML的声明式AspectJ1.1 配置切面1.2 配置切入点1.3 配置通知 2.基于注解的声明式AspectJ 一、Spring AOP简介 1.什么是AOP AOP的全称是Aspect-Oriented Programming,即面向切面编程(…

芴甲氧羰酰基-氨基-聚乙二醇-巯基吡啶Fmoc-NH-PEG-OPSS

修饰性PEG芴甲氧羰基-氨基-聚乙二醇-巯基吡啶Fmoc-NH-PEG-OPSS是保护氨基的PEG衍生物之一 结构式: 芴甲氧羰酰基-氨基-聚乙二醇-巯基吡啶Fmoc-NH-PEG-OPSS聚乙二醇化可以提高聚乙二醇分子的稳定性,降低其免疫原性,仅用于科研实验。 FMOC-NH…

骨传导风靡蓝牙耳机市场 AI赋能有望打破行业技术桎梏

一、骨传导耳机行业概述 骨传导耳机是运用骨传导技术应用制造的耳机,听到的大部分声音都是声波经过空气到达骨膜振动进而将声音传入内耳,另一种方式是声波通过骨震动可以直接传至内耳。骨传导耳机可分为骨传导扬声器技术应用耳机、骨传导麦克风技术应用…