基于FastAPI构造一个AI模型部署应用

前言

fastapi是目前一个比较流行的python web框架,在大模型日益流行的今天,其云端部署和应用大多数都是基于fastapi框架。所以掌握和理解fastapi框架基本代码和用法尤显重要。

   需要注意的是,fastapi主要是通过app对象提供了web服务端的实现代码,对于一个完整应用来说,还需要uvicorn组件来启动web服务,如果想要可视化UI的话,可以考虑使用streamlit前端。

代码

   大家可以基于下面这个简单代码例子(参考GitHub - markthink/streamlit-fastapi-model,稍有修改)来加深理解。一共三个python源文件: segmentation.py(获取pytorch deeplabv3模型和推理该模型实现图像分割), ui.py(基于streamlit构造webUI供用户来选择图片并显示结果)和server.py(基于fastapi编写服务端函数来响应前端UI发来的/segmentation消息)。

segmentation.py:


import io, torch
from PIL import Image
from torchvision import transforms

def get_segmentator():
    model = torch.hub.load('pytorch/vision:v0.10.0', 'deeplabv3_mobilenet_v3_large', pretrained=True)
    model.eval()
    return model

def get_segments(model, binary_image, max_size=512):
    input_image = Image.open(io.BytesIO(binary_image)).convert("RGB")
    width, height = input_image.size
    resize_factor = min(max_size/width,max_size/height)
    resize_image = input_image.resize((int(input_image.width * resize_factor),int(input_image.height*resize_factor)))
    preprocess = transforms.Compose(
        [
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225])
        ]
    )
    input_tensor = preprocess(resize_image)
    input_batch = input_tensor.unsqueeze(0)
    with torch.no_grad():
        output = model(input_batch)['out'][0]
      
    output_predictions = output.argmax(0)
    # create a color pallette, selecting a color for each class
    palette = torch.tensor([2 ** 25 - 1, 2 ** 15 - 1, 2 ** 21 - 1])
    colors = torch.as_tensor([i for i in range(21)])[:, None] * palette
    colors = (colors % 255).numpy().astype("uint8")

    r = Image.fromarray(output_predictions.byte().cpu().numpy()).resize(
        input_image.size
    )
    r.putpalette(colors)
    return r

ui.py:

import io, requests
import streamlit as st
from PIL import Image
from requests_toolbelt.multipart.encoder import MultipartEncoder

#backend = "http://fastapi:8000/segmentation"
backend = "http://0.0.0.0:8000/segmentation"

def process(image, server_url:str):
    m = MultipartEncoder(fields={"file": ("filename", image, "image/jpeg")})
    r = requests.post(server_url, data=m, headers={"Content-Type":m.content_type}, timeout=8000)
    return r

st.title("DeepLabV3 image segmentation")
st.write("AI inference demo for fastapi calling pytorch model")

input_image = st.file_uploader("pls input one image")
if st.button("get image segmentation"):
    col1, col2 = st.columns(2)
    if input_image:
        segments = process(input_image, backend)
        original_image = Image.open(input_image).convert("RGB")
        segmented_image = Image.open(io.BytesIO(segments.content)).convert("RGB")
        col1.header("original version")
        col1.image(original_image, use_column_width=True)
        col2.header("segmentation version")
        col2.image(segmented_image, use_column_width=True)
    else:
        st.write("pls input one image")

server.py:

import io
from segmentation import get_segmentator, get_segments
from starlette.responses import Response
from fastapi import FastAPI, File

model = get_segmentator()

app = FastAPI(
    title="Deeplabv3 image segmentation",
    description="demo for deploying pytorch models with fastapi",
    version="0.1.0"
)

@app.post('/segmentation')
def get_segmentation(file:bytes=File(...)):
    print("hello post")
    segmented_img = get_segments(model, file)
    bytes_io = io.BytesIO()
    segmented_img.save(bytes_io, format='PNG')
    return Response(bytes_io.getvalue(), media_type='image/png')

这三个文件放在一个目录下面,启动两个terminal窗口分别输入命令: 

uvicorn server:app --host 0.0.0.0 --port 8000
streamlit run ui.py

 

全部代码在CPU+ubuntu20.04上运行成功,无需GPU加速。

webui如下图所示

首先点击Browse file按钮,选择待分割图片,然后点击get image segmentation按钮就可以看到原始图片和分割结果。

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java+SpringBoot+Vue+MySQL实战:打造智能餐厅点餐系统

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

图机器学习(3)-连接层面的特征工程

0 问题定义 通过已经连接去猜未知连接: 有两个思路:

基于FPGA加速的bird-oid object算法实现

导语 今天继续康奈尔大学FPGA 课程ECE 5760的典型案例分享——基于FPGA加速的bird-oid object算法实现。 (更多其他案例请参考网站: Final Projects ECE 5760) 1. 项目概述 项目网址 ECE 5760 Final Project 模型说明 Bird-oid object …

基于springboot实现大学生兼职网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现大学生兼职系统演示 摘要 现代化的市场中,人们日常的工作、生活都在不断的提速,而人们在工作与生活中与互联网的结合也越来越紧密,通过与互联网紧密的结合可以更好地实现日常工作的线上化、信息化、便捷化。现如今的各行各…

案例研究|辛格林电梯借助DataEase实现数据整合与智能展示

辛格林电梯(SIGLEN)于2012年创立,是电梯领域的领军品牌之一。该公司总部位于广东佛山,是全国首批获得A1级电梯制造资质的企业,拥有省级工程技术研究中心。辛格林电梯专注于研发和生产高品质电梯产品,涵盖别…

Spring Security认证授权流程详解

认证的工作原理 过滤链 Spring Security框架的作用就是安全访问控制即对所有进入系统的请求进行拦截, 校验每个请求是否能够访问到它所期望的资源 通过Filter或AOP等技术可以实现安全访问控制功能,而Spring Security对Web资源的保护是靠Filter实现的,Spring Security有一个过…

Linux运维工程师不可或缺的10款工具

运维工程师在日常工作中频繁运用的10款工具,并细致阐述每款工具的功能、适用场景以及其卓越之处。 1. Shell脚本: 功能:主要用于自动化任务和批处理作业。 适用场景:频繁用于文件处理、系统管理、简单的网络管理等操作。 优势&…

【学习教程】Vision Pro:开发学习资源

unity 官方网站上线了一款课程,准备好迎接 Apple Vision Pro:免费学习资源汇总。 本合集则是为想要探索 Apple Vision Pro 的创作者提供全方位指导, 由浅入深,与你一同创造前所未有的 沉浸式空间交互体验 的新奇内容。 合集包含最新的开发技术文档。从入门的基础知识核心…

基于vue的联通积分商城数据可视化APP设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 前端技术介绍 3 1.1 前端开发语言 3 1.1.1 HTML5 3 1.1.2 CSS3 3 1.1.3 JavaScript 3 1.2 MVVM开发模式 4 1.3 Vue框架 4 1.4 Axios技术 5 1.5 ECharts 5 1.6 数据库技术 5 1.7 本章小结 6 2 前端开发的分析 7 2.1 功能性需求分析 7 2.2 …

Navicat连接数据库出现的问题

Navicat使用教程——连接/新建数据库、SQL实现表的创建/数据插入、解决报错【2059-authentication plugin‘caching_sha2_password’……】_2059authentication plugin-CSDN博客

灭火新选择:恒峰便携式森林灭火泵,轻松应对火情

森林中火灾是一种常见且危害巨大的自然灾害。一旦发生,如果没有及时、有效的扑救手段,后果将不堪设想。然而,传统的消防设备往往体积庞大、重量不轻,操作复杂,难以在森林中迅速有效地发挥作用。而现在,我们…

专题一 - 双指针 - leetcode 1089. 复写零 - 简单难度

leetcode 1089. 复写零 leetcode 1089. 复写零 | 简单难度1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 1089. 复写零 | 简单难度 1. 题目详情 给你一个长度固定的整数数组 arr ,请你将…

大白话说---“消息队列”

目录 一、什么是消息队列? 二、消息队列的作用 1.解耦 2.削峰 3.异步 三、消息队列的使用场景 1.传统设计 2.加入消息队列后的优化 四、常见的消息队列 一、什么是消息队列? 从名称上,我们就可以得到两个关键信息,即“消息”和…

ODI报错

三月 08, 2024 1:20:09 下午 oracle.odi.mapping 信息: Start generation of map physical design: MapPhysicalDesign New_Mapping.物理 三月 08, 2024 1:20:09 下午 oracle.odi.mapping 信息: Finished generation of map physical design: MapPhysicalDesign New_Mapping.物…

Word背景图片设置,提升文章美观度的4个小技巧!

“我才刚开始使用Word,想问问大家Word中背景图片应该怎么设置呢?有什么比较好用的设置方法可以分享一下吗?” 在日常办公中,我们经常需要使用Word来对文件进行处理。在编写Word时,如果给文档加入背景图片,会…

用云手机进行舆情监测有什么作用?

在信息爆炸的时代,舆情监测成为企业和政府决策的重要工具。通过结合云手机技术,舆情监测系统在品牌形象维护、市场竞争、产品研发、政府管理以及市场营销等方面发挥着关键作用,为用户提供更智能、高效的舆情解决方案。 1. 品牌形象维护与危机…

猫冻干价格差距大,定价合理吗?价位合适的主食冻干推荐

随着养猫知识的普及,主食冻干喂养受到越来越多铲屎官的欢迎。然而,价格仍是部分铲屎官的考虑因素。事实上,像我这样的资深铲屎官,早已开始主食冻干喂养。虽然主食冻干价格稍高,但其为猫咪带来的好处是无法替代的。 对于…

【动态规划.2】5292. 跳台阶

承接上一篇 升级版&#xff0c;别怕&#xff0c;上一篇弄会了&#xff0c;这个就是 豆芽菜✌️ https://www.acwing.com/problem/content/description/5295/ f1.递归 #include <bits/stdc.h> // 2024-03-08 Come on ! using namespace std; #define ll long l…

git克隆过程报错

设置 git config 来强制 git 使用 HTTP 1.1 git config --global http.version HTTP/1.1想将其设置回 HTTP2&#xff0c;你可以这样做 git config --global http.version HTTP/2

金相显微镜(金相镜)主要用于材料金相分析 我国市场集中度较低

金相显微镜&#xff08;金相镜&#xff09;主要用于材料金相分析 我国市场集中度较低 金相显微镜又称为金相镜&#xff0c;是指通过光学放大&#xff0c;对材料显微组织、低倍组织和断口组织等进行分析研究和表征的光学显微镜。金相显微镜通常由目镜、物镜、照明系统、旋转台等…