【Python深度学习系列】基于Flask将深度学习模型部署到web应用上(完整案例)

这是我的第356篇原创文章。

一、引言

使用 Flask 在 10 分钟内将您自己训练的模型或预训练的模型(VGG、ResNet、Densenet)部署到网络应用程序中。以图像分类模型为例,本地直接部署和本地使用docker部署两种方式实现。

二、实现过程

2.1 准备模型

这里我们使用tf.keras.applications.MobileNetV2 作为基础模型,MobileNet V2模型由Google开发,此模型已基于 ImageNet 数据集进行预训练,ImageNet 数据集是一个包含 140 万个图像和 1000 个类的大型数据集。ImageNet 是一个研究训练数据集,具有各种各样的类别,例如 jackfruit 和 syringe。此知识库将帮助我们对特定数据集中的猫和狗进行分类。

实例化一个已预加载基于 ImageNet 训练的权重的 MobileNet V2 模型:

from keras.applications.mobilenet_v2 import MobileNetV2
model = MobileNetV2(weights='imagenet')
print('Model loaded. Check http://127.0.0.1:5000/')

当然,你也可以用你自己训练好的模型,训练好的模型放在项目的models文件夹下面:

图片

然后采用下面的代码进行加载模型:

MODEL_PATH = 'models/cats_and_dogs_small.h5'
model = load_model(MODEL_PATH)
model._make_predict_function()          # Necessary
print('Model loaded. Start serving...')

2.2 本地部署

app.py:

import os
import sys# Flask
from flask import Flask, redirect, url_for, request, render_template, Response, jsonify, redirect
from werkzeug.utils import secure_filename
from gevent.pywsgi import WSGIServer# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import kerasfrom keras.applications.imagenet_utils import preprocess_input, decode_predictions
from keras.models import load_model
from keras.preprocessing import image# Some utilites
import numpy as np
from util import base64_to_pil# Declare a flask app
app = Flask(__name__)# You can use pretrained model from Keras
# Check https://keras.io/applications/
# or https://www.tensorflow.org/api_docs/python/tf/keras/applicationsfrom keras.applications.mobilenet_v2 import MobileNetV2
model = MobileNetV2(weights='imagenet')
print('Model loaded. Check http://127.0.0.1:5000/')# Model saved with Keras model.save()
# MODEL_PATH = 'models/cats_and_dogs_small.h5'# Load your own trained model
# model = load_model(MODEL_PATH)
# model._make_predict_function()          # Necessary
# print('Model loaded. Start serving...')def model_predict(img, model):img = img.resize((224, 224))# Preprocessing the imagex = image.image_utils.img_to_array(img)# x = np.true_divide(x, 255)x = np.expand_dims(x, axis=0)# Be careful how your trained model deals with the input# otherwise, it won't make correct prediction!x = preprocess_input(x, mode='tf')preds = model.predict(x)return preds@app.route('/', methods=['GET'])
def index():# Main pagereturn render_template('index.html')@app.route('/predict', methods=['GET', 'POST'])
def predict():if request.method == 'POST':# Get the image from post requestimg = base64_to_pil(request.json)# Save the image to ./uploads# img.save("./uploads/image.png")# Make predictionpreds = model_predict(img, model)# Process your result for humanpred_proba = "{:.3f}".format(np.amax(preds))    # Max probabilitypred_class = decode_predictions(preds, top=1)   # ImageNet Decoderesult = str(pred_class[0][0][1])               # Convert to stringresult = result.replace('_', ' ').capitalize()# Serialize the result, you can add additional fieldsreturn jsonify(result=result, probability=pred_proba)return Noneif __name__ == '__main__':# app.run(port=5002, threaded=False)# Serve the app with geventhttp_server = WSGIServer(('0.0.0.0', 5000), app)http_server.serve_forever()

2.2 docker部署

编写dockerfile:

FROM python:3.9.0COPY . D:/workspace/github_proj/Data-Miscellany-Forum/src/深度学习模型部署-RESTfulAPI/keras-flask-deploy-webapp
WORKDIR D:/workspace/github_proj/Data-Miscellany-Forum/src/深度学习模型部署-RESTfulAPI/keras-flask-deploy-webapp
# Install dependencies
RUN pip install -r requirements.txt
# Run the application on port 5000
EXPOSE 5000
CMD ["python", "app.py"]

创建镜像:

docker build -t keras_flask_app .

图片

启动容器:

docker run -it --rm -p 5000:5000 keras_flask_app

图片

三、小结

打开浏览器,输入127.0.0.1:5000,导入一张图片进行分类预测:

图片

作者简介:

读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。

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

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

相关文章

go webapi上传文件

一、导入依赖 import "net/http" 我这里用到了Guid所以安装依赖 go get github.com/google/uuid 二、main.go package mainimport ("fmt""github.com/jmoiron/sqlx""github.com/tealeg/xlsx""log""path/filepath&q…

深度学习的新突破:Difformer模型

人工智能咨询培训老师叶梓 转载标明出处 在现实世界中,数据之间的复杂相互依赖性是一个普遍存在的现象。这种错综复杂的依赖关系,对于传统的机器学习算法来说,是一个巨大的挑战。因为它们通常假设数据是独立同分布的,这使得算法难…

JS在线加密解密工具

快捷工具网得JS加密解密工具为您提供JS加密解密,js加解密工具,JS在线加解密,JS代码在线加解密,该工具基于eval方法的加密与解密功能,用户可将js代码加密成eval方法执行形式的代码,也可将eval方法加密过的代码进行解密操作。是一款非常简便实用的在线Java…

AC自动机详解,原理、优化分析,代码实现

零、前言 对于模式串匹配问题,在很多基础的数据结构课程中都有涉及到,如 KMP 算法,BM算法,Trie。 但是给定文本串,我们有多个模式串要去查询。难道要多次调用KMP / BM,或者在Trie上多次查询吗&#xff1f…

2024 研究生数学建模竞赛(F题)建模秘籍|X射线脉冲星光子到达时间建模|文章代码思路大全

铛铛!小秘籍来咯! 小秘籍团队独辟蹊径,运用轨道动力学模型,脉冲轮廓折叠,几何传播时延模型,相对论修正计算,泊松分布模拟等强大工具,构建了这一题的详细解答哦! 为大家量…

数据预处理方法—数据标准化和数据归一化

1.数据标准化 1.1 概念: 标准化是将数据转化为均值为0,标准差为1的分布。通过标准化处理,所有特征在同一个尺度上,使得模型更加稳定和高效,尤其适用于正态(高斯)分布的数据。 1.2 原理 标准化…

【HTTP】构造HTTP请求和状态码

状态码 用于响应中,表示响应的结果如何 正确?错误?什么原因? HTTP 中的状态码都是标准约定好的 200 OK 成功了,一切顺利 在抓包到的响应中 404 Not Found 访问的资源(URL 中的路径)没找…

【已解决】编译报错:fatal error: Eigen/Core: 没有那个文件或目录 #include <Eigen/Core>

1、如果没有安装过Eigen,可以使用以下git指令进行下载,或者也可以通过以下网址下载 git clone https://gitlab.com/libeigen/eigen.git网址1:https://eigen.tuxfamily.org/index.php?titleMain_Page 网址2: https://gitlab.com/libeigen/ei…

BeautifulSoup与lxml解析网页:技术详解与实战案例

目录 一、引言 1.1 网页解析的重要性 1.2 BeautifulSoup与lxml简介 二、安装BeautifulSoup和lxml 三、BeautifulSoup基础 3.1 创建BeautifulSoup对象 3.2 基本元素 3.3 遍历和搜索文档树 3.4 CSS选择器 四、lxml基础 4.1 解析HTML 4.2 XPath选择器 4.3 CSS选择器 …

简单多状态dp第二弹 leetcode -删除并获得点数 -粉刷房子

740. 删除并获得点数 删除并获得点数 分析: 使用动态规划解决 这道题依旧是 打家劫舍I 问题的变型。 我们注意到题目描述,选择 x 数字的时候, x - 1 与 x 1 是不能被选择的。像不像 打家劫舍 问题中,选择 i 位置的金额之后,就不…

C++速通LeetCode中等第20题-随机链表的复制(三步简单图解)

方法图解: class Solution { public:Node* copyRandomList(Node* head) {if ( !head ) {return nullptr;}Node *cur head;// 1. 在原节点的每个节点后创建一个节点while ( cur ) {Node *newNode new Node(cur -> val);newNode -> next cur -> next;cur …

大小端字节序 和 内存高低地址顺序

目录 1. 大小端字节序 1.1 什么是大小端字节序? 1.2 为什么有大小端字节序? 1.3 习题:用程序结果判断大端小端 2. 各种易混淆的高低地址顺序 2.1 监视窗口的地址表示【计算机标准展示方式】 2.2 横向地址表示 2.3 一个字节 与 多个字节 的地址…

g1:基于 Llama,用提示工程实现类似 o1 的深度推理

开源项目 g1 利用巧妙的提示策略,在 Groq 硬件上使用 Llama-3.1 70b 模型实现了类似 OpenAI o1 的推理链能力。g1 将推理过程可视化,并结合多种技巧引导 LLM 进行深度思考,显著提升了其在逻辑问题上的准确率,为 LLM 推理能力的提升…

Win10 安装Node.js 以及 Vue项目的创建

一、Node.js和Vue介绍 1. Node.js Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。它允许你在服务器端运行 JavaScript,使得你能够使用 JavaScript 来编写后端代码。以下是 Node.js 的一些关键特点: 事件驱动和非阻塞 I/O:Node…

【24华为杯数模研赛赛题思路已出】国赛F题第二套思路丨附参考代码丨免费分享

2024年数模研赛E题解题思路 X 射线脉冲星光子到达时间建模思路分析 该题目是天文学背景的数学建模题目,其涉及到物理学中关于光线传播过程受多种因素的共同干扰的复合模型,以及天体和卫星的坐标变换和运动模型,首先我们要,建立卫…

JavaScript使用leaflet库显示信息窗口

前言 我们可千万不能忘记我们之前花的流程图哦,我们所有的计划都按照我们的流程图来去构建; 我们已经完成了,页面的加载,也已经完成获取用户当前的位置坐标,并且我们通过地图的API将当前的位置在地图中渲染出来&…

基于协同过滤推荐算法的影视推荐系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏:Java精选实战项目源码、Python精…

缓存数据和数据库数据一致性问题

根据以上的流程没有问题,但是当数据变更的时候,如何把缓存变到最新,使我们下面要讨论的问题 1. 更新数据库再更新缓存 场景:数据库更新成功,但缓存更新失败。 问题: 当缓存失效或过期时,读取…

【C++】C++库:如何链接外部库、静态链接和动态链接,以及如何自建库并使用

十三、C库:如何链接外部库、静态链接和动态链接,以及如何自建库并使用 本篇讲C库,先讲如何在项目中使用外部库,包括静态链接和动态链接的实现;再讲如何在VisualStudio中自建模块或库项目,让所有项目都能使…

Java-数据结构-排序-(一) (。・ω・。)

文本目录: ❄️一、排序的概念及引用: ➷ 排序的概念: ➷ 常见的排序算法: ❄️二、插入排序的实现: ➷ 1、直接插入排序: ☞ 直接插入排序的基本思想: ☞ 直接插入排序的实现: ▶…