Flask实现Web服务调用Python程序

Flask实现Web服务调用Python程序

通过Web服务调用Python写的手写数字识别算法模型,得到手写数字识别结果。

项目场景:

项目需求:将客户端的请求经由Web服务器转发给Flask程序实例。
示例:通过Web服务调用Python写的手写数字识别算法模型,得到手写数字识别结果。

环境准备:

  1. Python环境不多说了
  2. 安装 flask
    pip install flask
  3. 安装 waitress
    pip install waitress

代码:

main.py

from flask import Flask
from predictNumber import predict
app=Flask(__name__)

@app.route('/predictNumber/', methods=['POST'])
def predict_number():
    image = request.form["image"]
    result = predict(image)
    return {
        "result": result
    }

if __name__=='__main__':
    app.debug=True
    app.run(host='127.0.0.1',port=5000)

其中,手写数字识别的代码 predictNumber.py 赠送如下:

from __future__ import print_function
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.optim.lr_scheduler import StepLR
from PIL import Image
import numpy as np
import base64
from io import BytesIO

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 3, 1)
        self.conv2 = nn.Conv2d(32, 64, 3, 1)
        self.dropout1 = nn.Dropout(0.25)
        self.dropout2 = nn.Dropout(0.5)
        self.fc1 = nn.Linear(9216, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = self.conv2(x)
        x = F.relu(x)
        x = F.max_pool2d(x, 2)
        x = self.dropout1(x)
        x = torch.flatten(x, 1)
        x = self.fc1(x)
        x = F.relu(x)
        x = self.dropout2(x)
        x = self.fc2(x)
        output = F.log_softmax(x, dim=1)
        return output

def predict(image):

    model = Net()
    model.load_state_dict(torch.load("demo/model/mnist_cnn.pt"))
    model.eval()

    img = Image.open(image).convert('L')
    img = img.resize((28, 28))
    npimg1 = np.array(img)
    flatten_img = npimg1.reshape(1, 1, 28, 28)

    new_flatten_img = (255-flatten_img)/255.0
    new_flatten_img = new_flatten_img.reshape(1, 1, 28, 28)

    test_kwargs = {'batch_size': 1}
    test_loader = torch.utils.data.DataLoader(new_flatten_img, **test_kwargs)
    for data in test_loader:
        data = data.to(torch.float32)
        output = model(data)
        pred = output.argmax(dim=1, keepdim=True)
        print(pred)
        print(pred.item())
        return pred.item()

启动该服务有两种方式

方式一:

通过运行Python脚本启动服务, run.py 代码如下:

from waitress import serve
import main
serve(main.app, host='127.0.0.1',port=5000)

直接运行 run.py 即可

python run.py

验证我们可通过postman发送请求,得到如下结果:

Flask实现Web服务调用Python程序

方式二:

通过 cmd 设置 mian.py 路径,我的 main.py 放在E:\pythonProject\下面,大家自行调整。

set  FLASK_APP=E:\pythonProject\main.py

然后使用以下指令启动服务:

[En]

Then start the service with the following directive:

flask run

效果如下:

Flask实现Web服务调用Python程序
以上是简单版的完整流程。在下面添加一些其他说明。
[En]

The above is the complete process of the simple version. Add some additional instructions below.

Flask程序必须创建一个程序实例。参见上面第一个代码 main.pyapp = Flask(__name__) 即为实例。

Web服务器把接收到的所有客户端请求,转交给Web服务器网关接口对象处理。需要提供的参数只有一个,就是程序主模块或包的名字,一般就是Python的name变量。

客户端的请求经由Web服务器转发给Flask程序实例。程序实例需要URL到具体代码的映射关系。这个映射关系称为路由。
Flask中最简单的路由定义方式是app.route修饰器。

上面的路由定义,把根路径和predictNumber函数关联起来,如果部署程序的服务器域名是 http://127.0.0.1:5000/,那么浏览器中输入 http://127.0.0.1:5000/predictNumber/ 就会触发这个函数。

函数的返回值称为响应,是客户端接收到的内容。这样如果客户端是Web浏览器,响应就是给客户看的文档。

在下面的博客文章中有一个非常详细和完整的介绍以供参考。

[En]

There is a very detailed and complete introduction in the following blog post for reference.

一个简单的Flask Web服务器

有关多个并发呼叫业务,请参阅:

[En]

For more than one concurrent call service, please see:

Flask+gunicorn实现web服务并发调用Python程序,解决多线程/多进程问题

多并发调用Pytorch的坑:

Flask+gunicorn部署深度学习报错gunicorn: error: argument -b: invalid int value ‘0.0.0.0:8000’

Original: https://blog.csdn.net/qq_39691492/article/details/122088475
Author: 小白白程序员
Title: Flask实现Web服务调用Python程序



相关阅读

Title: Python根据csv绘制多折线图(内含批量读取+自定义坐标标签+阴影处理)

实现功能

1.从csv中读取数据

2.数据清洗(大小超出范围的异常值处理)

3.数据累积处理(将每日数据处理为历史累积值)

4.绘制多折线图

0.导入相关包import os

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

1.从csv格式文件中读取数据


site='3'
band="NDVI"
sentinel="2-L2A"

path= '../data/dataset/Train_region_csv/S{}/csv/{}-{}.csv'.format(sentinel,site, band)

pixel_csv =  pd.read_csv(path, index_col = 0)

拓展:批量读取csv文件,存储为DataFrame格式

(1)从文件夹中读取 全部 / 指定部分文件名 的文件

import glob

sentinel = "2-L2A"
site = '3'
path= '../data/dataset/Train_region_csv/S{}/csv/'.format(sentinel)

file = glob.glob(os.path.join(path,"*.csv"))
file_3 = glob.glob(os.path.join(path,"3-*.csv"))
file_x = glob.glob(os.path.join(path,"{}-*.csv".format(site)))
print("file length:",len(file))
print(file)

(2)批量读取

list2dataframe=[]
for path_file in file:
    list2dataframe.append(pd.read_csv(path_file,index_col = 0))

(3)整合(1)(2),封装为函数

def Dataloading_csv (folder_path):

    site='3'
    file = glob.glob(os.path.join(folder_path,"{}-*.csv".format(site)))
    list2dataframe=[]
    for path_file in file:
        list2dataframe.append(pd.read_csv(path_file,index_col = 0))
    return list2dataframe

2.数据清洗-删除超过范围的异常值

for j in range(pixel_csv.shape[1]):
    for i in range(pixel_csv.shape[0]):

        if (pixel_csv.iloc[i,j]> 1 or pixel_csv.iloc[i,j] < 0):
            pixel_csv.iloc[i,:]=np.nan

3.数据处理-将每日数据处理为历史累积值


 for j in range(1,pixel_csv.shape[1]):
    for i in range(pixel_csv.shape[0]):
        x=pixel_sum.iloc[i,j]
        pixel_sum.iloc[i,j]=x+pixel_sum.iloc[i,j-1]

4.绘制多折线图

对DataFrame使用describe函数,获得DataFrame的初步统计信息,其中包含min,max,mean

Flask实现Web服务调用Python程序
def plot_min_max_mean(data_desc):
    fig=plt.figure()
    ax=fig.add_subplot(1,1,1)
    ax.plot(data_desc.index, data_desc.iloc[:,7],color='crimson',label='Max')
    ax.plot(data_desc.index, data_desc.iloc[:,1],color='c',label='Mean')
    ax.plot(data_desc.index, data_desc.iloc[:,3],color='royalblue',label='Min')

    ax.set_xticks([0,12,25,37,49,62,74,84])
    ax.set_xticklabels(['04-01', '05-01', '06-01', '07-01', '08-01', '09-01','10-01','11-01'],rotation=45,fontsize=12)

    plt.title('Site-3',fontsize=16)
    plt.xlabel('Dates',fontsize=14)
    plt.ylabel('EVI',fontsize=14)
    plt.fill_between(data_desc.index, data_desc.iloc[:,7], data_desc.iloc[:,3], facecolor="orange",alpha=0.1)
    plt.legend()
    plt.show()

Original: https://blog.csdn.net/weixin_44114632/article/details/119856671
Author: 雨霁夜白
Title: Python根据csv绘制多折线图(内含批量读取+自定义坐标标签+阴影处理)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/299436/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【机器学习】李宏毅——线性降维

    降维可以简单地用下图来描述。是将不同的、复杂的树抽象成最简单的树描述,也就是说,我们不在乎树看起来是什么特殊的特征。我们只需要降维,并知道它是一棵树。 [En] Dimension…

    Python 2023年2月1日
    011
  • 用Flask+Element+Vue搭建md5、sha加密网站

    目录 * – 一、绘制网站页面 – + * 1.1 绘制输入框 * 1.2 绘制表单 – 二、flask后端接口 – 三、前后端数据…

    Python 2023年1月3日
    049
  • topy库的安装(拓扑优化软件)

    本人的py27文件夹放到了网盘,可以直接下载下来然后直接创建环境变量链接:https://pan.baidu.com/s/13aj58_VDdYxyRxuwGxRUoA提取码:k3…

    Python 2023年1月12日
    087
  • 支付宝支付&内网穿透

    支付宝支付&内网穿透 一 沙箱环境 二 python第三方模块python-alipay-sdk 三 python-alipay-sdk二次封装 四 支付接口 五 内网穿透…

    Python 2023年1月19日
    043
  • 人脸识别框

    运行效果: 这是拿着手机识别的 真人应该更清晰一点 源码: import cv2 as cv from PIL import Image, ImageDraw, ImageFont…

    Python 2023年1月11日
    060
  • 数据分析(一)

    目录 数据加载 一、加载数据 载入数据: 逐块读取 更改表头、索引 初步观察数据 保存数据 pandas基础 Series DataFrame 筛选 探索性数据分析 数据加载 一、…

    Python 2023年1月9日
    019
  • Django深入研究3(表单与模型、后台系统)

    Django表单与模型、后台系统 一、Django表单与模型 * 1、初识表单 2、表单的定义 3、表单与模型 二、后台系统 * 1、走进Admin 2、Admin的基本配置 一、…

    Python 2022年12月27日
    035
  • python量化相关资料

    Original: https://www.cnblogs.com/dion-90/p/8586521.htmlAuthor: dion至君Title: python量化相关资料

    Python 2022年8月18日
    0136
  • Python使用EasyOCR库对行程码图片进行OCR文字识别介绍与实践

    关注「WeiyiGeek」点我,点我 设为「特别关注」,每天带你在B站玩转网络安全运维、应用开发、物联网IOT学习! 我希望你能看着你的朋友们[关注,点赞,评论,收藏,投币],帮助…

    Python 2022年9月3日
    0181
  • 利用 Python 只连接一次 MySQL

    最近做个项目,需要进行试驾分析,所谓”试驾”,是指顾客在 4S 店指定人员的陪同下,沿着指定的路线驾驶车辆,从而了解这款汽车的行驶性能和操控性能。通常,无论…

    Python 2022年8月17日
    0179
  • 阿里云基于边缘云业务场景的 “前端智能化” 实践

    “前端智能化”存在的价值和意义,被不断拷问。 一部分人对”前端智能化”持拥抱态度,认为这是前端领域的一种革命性技术。 另一部分人则认…

    Python 2023年1月31日
    017
  • pytest基础学习第一课

    pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1、简单灵活,容易上手,文档丰富; 注意:以下示例确实很容易使用,但它们简单、灵活且包含丰富的文档。…

    Python 2023年1月17日
    041
  • pandas库的Series结构和DataFrame结构

    【高心星出品】 Pandas series 是像数组一样的一维对象,可以存储很多类型的数据。Pandas series 和 Numpy array之间的主要区别之一是你可以为Pan…

    Python 2023年1月9日
    037
  • Tensorflow2.0(一):Tensor记录

    前言:Tensorflow2.0是2019年10月份正式发布的,本人在2019年寒假开始接触Tensorflow2.0,直至近日,对它的学习断断续续,对它的使用还不是特别熟练。为此…

    Python 2023年1月11日
    021
  • pytest第一版 入门学习

    一、pytest 简介 pytest是一个非常成熟的单元框架,比unittest更灵活,容易上手。 pytest可以和selenium,request,appium结合实现web自…

    Python 2023年1月19日
    037
  • Flask项目使用MVC思想进行重构

    目录 前言 MVC简介 项目架构图: 系统工作原理 服务层级统一包装结果 事务控制原理和代码 前言 最近Boss有需求说要重构后端的web项目,之前是用flask+celery+m…

    Python 2023年1月3日
    041
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载