基于Gradio的快速搭建AI算法可视化Web界面部署教程

news2024/11/18 22:37:01

基于Gradio的快速搭建AI算法可视化Web界面部署教程

  • 1 Gradio简介
    • 1.1 视图框架
    • 1.2 Gradio介绍
  • 2 功能模块
    • 2.1 概述
    • 2.2 模块介绍
      • 2.2.1 gradio.File() 上传文件
      • 2.2.2 gradio.Slider() 配置滑动条
      • 2.2.3 gr.Textbox() 文本框
      • 2.2.4 gradio.Dropdown() 建立下拉列表
      • 2.2.5 gradio.interface()搭建简易界面:
      • 2.2.6 gradio.Markdown() 编写 Markdown 模块
      • 2.2.7 gradio.Row() 和 gradio.Column() 调整布局
      • 2.2.8 gradio.Blocks(定制化场景)
      • 2.2.9 demo.lunch()
  • 3 构建简单Gradio应用
      • 3.1 安装gradio:
    • 3.2 简单应用:
      • 3.2.1 快速入门textbox:
      • 3.2.2 多UI控件输入、输出
      • 3.2.3 图像组件
  • 4 实例进阶:深度学习模型部署示例
    • 4.1 基于 resnet50 的分类:
    • 4.2 2D图片分割
  • 参考:

1 Gradio简介

1.1 视图框架

视图框架:快速构建针对人工智能的 python 的 webApp 库,封装前端页面 + 后端接口 + AI 算法模型推理,方便 AI 算法工程师快速展示成果,常用的两个展示层框架:
Gradio:
优势在于易用性,代码结构相比 Streamlit 简单,只需简单定义输入和输出接口即可快速构建简单的交互页面,更轻松部署模型。适合场景相对简单,想要快速部署应用的开发者;
Streamlit:
优势在于可扩展性,相比 Gradio 复杂。适合场景相对复杂,想要构建丰富多样交互页面的开发者。

1.2 Gradio介绍

Gradio是一个开源的Python库,用于快速构建机器学习和数据科学演示的应用。它可以帮助你快速创建一个简单漂亮的用户界面,以便向客户、合作者、用户或学生展示你的机器学习模型。此外,还可以通过自动共享链接快速部署模型,并获得对模型性能的反馈。在开发过程中,你可以使用内置的操作和解释工具来交互式地调试模型。
Gradio的优势在于易用性,代码结构简单,只需简单定义输入和输出接口即可快速构建简单的交互页面,更轻松部署模型。但Gradio适合场景相对简单,更容易快速部署应用的开发者。此外,Gradio还提供便利的分享功能,在启动应用时设置share=True参数创建外部分享链接,还可以直接在微信等平台上分享给用户使用。
官方网站:https://www.gradio.app/
image.png
官方文档:https://www.gradio.app/docs/interface
各个功能模块的介绍,以及一些代码示例
image.png

以及一个AI 开源社区 SwanHub,有许多的基于gradio在线demo,有AI应用,计算机视觉,多模态等等demo可以进行尝试。
https://swanhub.co/models
image.png
image.png

2 功能模块

2.1 概述

Gradio 可以包装几乎任何 Python 函数为易于使用的用户界面。
常用的基础模块构成如下:

  • 应用界面:gradio.Interface(简易场景), gradio.Blocks(定制化场景)
  • 输入输出:gradio.Image(图像), gradio.Textbox(文本框), gradio.DataFrame(数据框), gradio.Dropdown(下拉选项), gradio.Number(数字), gradio.Markdown(Markdown), gradio.Files(文件)
  • 控制组件:gradio.Button(按钮)
  • 布局组件:gradio.Tab(标签页), gradio.Row(行布局), gradio.Column(列布局)

大部分功能模块都可以通过以下三个参数进行初始化:

  • fn:包装的函数
  • inputs:输入组件类型,(例如:“text”、"image)
  • ouputs:输出组件类型,(例如:“text”、"image)

2.2 模块介绍

2.2.1 gradio.File() 上传文件

当用户想要在前端页面上传自己的文件生成新的数据库时,gradio.File 可以很方便的完成这部分功能。
File 用于创建一个文件组件,允许用户上传通用文件(用作输入)或显示通用文件(用作输出)。

  • 作为输入时,File 模块文件按照 file_count 以 tempfile._TemporaryFileWrapper 或 List[tempfile._TemporaryFileWrapper] 的格式传递给绑定的函数,或者按照 type 的值转化为 bytes/List[bytes]。
  • 作为输出时,File 模块希望函数返回一个文件的路径/包含文件路径的列表(str / List[str])。

file_count 允许用户上传文件的数量,返回类型将根据 “multiple” 或 “directory” 的情况为每个文件返回一个列表。

  • “single”,允许用户上传一个文件。
  • “multiple”,允许用户上传多个文件。
  • “directory”,允许用户上传所选目录中的所有文件。

file_types: 要上传的文件扩展名或文件类型的列表(例如[‘image’,‘.json’,‘.mp4’])。字符串表示支持上传的文件类型,格式后缀表示支持上传的文件格式。

  • “file”: 允许上传任何文件
  • “image”: 仅允许上传图像文件
  • “audio”: 仅允许上传音频文件
  • “video”: 仅允许上传视频文件
  • “text”: 仅允许上传文本文件
  • “.pdf”: 仅允许上传 pdf 文件
  • “.md”: 仅允许上传 txt 文件

注意:当 file_count 为 “directory” 时,会忽略 “file_types” 的参数配置。
举例

gr.File(label='请选择知识库目录',file_count='directory',
                file_types=['.txt', '.md', '.docx', '.pdf'])

2.2.2 gradio.Slider() 配置滑动条

可交互控制的滑动条,通过前端来进行参数的配置,但同时希望将参数限制在一个区间内,这时 gr.text 无法满足我们的需求。gradio.Slider 是可以胜任这个任务的组件。

gradio.Slider 允许用户通过滑动滑块在指定的范围内选择一个值

  • minimum:滑块的最小值,默认为 0。
  • maximum:滑块的最大值,默认为 100。
  • value: 滑块的默认值,即作为可调用对象时的默认值。
  • step:滑块的步长,即每次滑动的增量,默认为None。
  • label:组件在界面中显示的名称,默认为None。
  • interactive: 滑块是否可调节。如果未提供,则根据组件是用作输入还是输出进行推断。

举例

temperature = gr.Slider(0,
        1,
        value=0.00,
        step=0.01,
        label="llm temperature",
        interactive=True)

2.2.3 gr.Textbox() 文本框

gradio.inputs.Textbox(self, lines=1, placeholder=None, default=“”, label=None, optional=False)
该组件为用户提供一个输入框,需提供一个字符串为参数的包装函数
输入类型:str(字符型)

参数:

  • lines (int) - 输入区域行数
  • placeholder (str) - placeholder学过前端的应该都知道,就是在输入框中的一个提示文本。
  • default (str) - 默认文本
  • label (str) - 在接口中的该输入组件的组件名(下面所有组件同理)

2.2.4 gradio.Dropdown() 建立下拉列表

刚刚我们介绍了 gradio 对于连续值的选择方法,现在我们来介绍下对于离散值的选择方法。
我们可以切换不同的模型,尝试不同模型的效果。我们用 gradio.Dropdown 来建立一个下拉列表,让用户从提供的模型中选择一个模型。

  • choices:可供选择的选项列表。
  • value:默认选中的值。如果为 None,则没有默认选中值。如果为可调用对象,则在应用程序加载时调用该函数以设置组件的初始值。
  • type:组件返回的值的类型。"value(返回选择的字符串),“index”(返回选择的索引)。
  • multiselect:是否可以选择多个选项。
  • max_choices:可选择的最大选项数。如果为None,则不限制数量。
  • interactive: 滑块是否可调节。如果未提供,则根据组件是用作输入还是输出进行推断。
llm = gr.Dropdown(
    llm_model_list,
    label="large language model",
    value=init_llm,
    interactive=True)

同样,我们可以对生成 Embedding 的模型进行对应的配置。
将组件作为输入绑定在对应的函数中,即可完成对应参数的切换。

2.2.5 gradio.interface()搭建简易界面:

固定化输入和输出:
举例子:

import gradio as gr

def quickstart(name):
    return "welcome!, " + name + "!!!"
demo = gr.Interface(fn=quickstart, inputs="text", outputs="text")


demo.launch()

image.png
核心 Interface 类需要使用三个参数进行初始化:

  • fn:被 UI 装饰的函数
  • inputs:输入组件。如"text"、“image”、"audio"等
  • outputs:输出组件。如"text"、“image”、"label"等

Interface.launch()方法返回三个值:

  • app,为 Gradio 演示提供支持的 FastAPI 应用程序
  • local_url,本地地址
  • share_url,公共地址,当share=True时生成还可以生成公共链接,只需要在launch函数里面指定share=True即可
interface.launch(share=True)

这样就除了一个本地URL之外还有一个72小时有效期的公共外链,很方便的让不同地区的用户来体验。

2.2.6 gradio.Markdown() 编写 Markdown 模块

之前介绍的都是交互式组件,我们可以用 markdown 为我们的界面加一些说明,使整个界面看起来更加美观。同时可以增加一些辅助信息。

  • value:要在Markdown组件中显示的值。如果可调用,则每当加载应用程序以设置组件的初始值时,都会调用该函数。
  • rtl(bool):是否从右到左呈现文本。如果为True,则将渲染文本的方向设置为从右到左。默认值为False,它从左到右呈现文本。
  • latex_delimiters(list[dict[str,str|bool]]):将用于呈现 LaTeX 表达式的形式{“left”:打开分隔符(str)、“right”:关闭分隔符(str)、“display”:是否以换行符(bool)显示}形式的dict列表。如果未提供,则将latex_delimitters’设置为[{ “left”: “”,“𝑟𝑖𝑔ℎ𝑡”“:”", “display”: False }]`,因此只有包含在 $ 分隔符中且在同一行中的表达式才会呈现为 latex。传入一个空列表以禁用 LaTeX 渲染。有关更多信息,请参阅KaTeX文档。
gr.Markdown("""<h1><center>Chat Robot</center></h1>
<center>Local Knowledge Base Q&A with llm</center>
""")

2.2.7 gradio.Row() 和 gradio.Column() 调整布局

现在我们已经有了足够多的组件,是时候将他们按照一定的布局格式进行调整了。
gradio.Row() 和 gradio.Column() 分别是新建一行和新建一列的组件。我们将界面划分成不同的行列区域,将所需组件摆放在对应位置即可。
gradio.Row() 的常用参数:

  • equal_height(bool): 是否将每个子元素的高度设置为相等。
  • variant(Literal[(‘default’, ‘panel’, ‘compact’)]): 行类型。“default”(无背景)、“panel”(灰色背景色和圆角)或“compact”(圆角和无内部间隙)。

gradio.Column() 的常用参数:

  • scale:与相邻列相比的相对宽度。例如,如果列 A 的 scale 为 2,而列 B 的 scale 为1,则 A 的宽度将是 B 的两倍。
  • min_width: Column 的最小像素宽度,如果没有足够的屏幕空间,则将换行。如果某个 scale 值导致列比 min_width 窄,则首先考虑 min_widght 参数。
  • variant: 同 gradio.Row()

例如,我们可以将所有的对话组件放在一行中。将所有参数配置放在一列, 并将 chatBot 和参数配置以 4:1 的比例进行布置。

with gr.Row():
# 创建提交按钮。
db_with_his_btn = gr.Button("Chat db with history")
db_wo_his_btn = gr.Button("Chat db without history")
llm_btn = gr.Button("Chat with llm")
with gr.Column(scale=4):
    chatbot = gr.Chatbot(height=480) 
    ...
with gr.Column(scale=1):
    ...
    model_argument = gr.Accordion("参数配置", open=False)
    with model_argument:
        ...
    model_select = gr.Accordion("模型选择")
    with model_select:
        ...

2.2.8 gradio.Blocks(定制化场景)

举例子

import gradio as gr

def welcome(name):
    return f"Welcome to Gradio, {name}!"

with gr.Blocks() as demo:
    gr.Markdown(
    """
    # Hello World!
    Start typing below to see the output.
    """)
    inp = gr.Textbox(placeholder="What is your name?")
    out = gr.Textbox()
    inp.change(welcome, inp, out)

if __name__ == "__main__":
    demo.launch()

image.png

2.2.9 demo.lunch()

当项目部署时,可能同一时间有多个用户进行访问,这时我们可以将 demo.queue(concurrency_count=3) 进行配置,表示用三个线程来并行。现在是时候将我们的界面分享给别人了.
下面是 demo.launch() 的几种场景分享配置

  • 如果你的运行环境是在容器中运行,需要指定与当初创建容器时的端口一致,才能将端口映射出来 假设容器端口是8080,
demo.launch(server_name="0.0.0.0", server_port=8080)
  • 如果是外部环境,非容器内部,则任意端口均可。
demo.launch(server_name="0.0.0.0", server_port="任意端口")
  • 若想分享给局域网之外的其他人,则设置 share=True,可免费分享3天
demo.launch(share=True)

3 构建简单Gradio应用

3.1 安装gradio:

pip install gradio

指定源安装,版本是会指定的:

pip install gradio==3.50.2 -i  https://pypi.python.org/pypi

3.2 简单应用:

3.2.1 快速入门textbox:

import gradio as gr
#输入文本处理程序
def greet(name):
    return "Hello " + name + "!"
#接口创建函数
#fn设置处理函数,inputs设置输入接口组件,outputs设置输出接口组件
#fn,inputs,outputs都是必填函数
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()

运行程序后,打开 http://localhost:7860 即可看到网页效果。左边是文本输入框,右边是结果展示框。Clear按钮用于重置网页状态,Submit按钮用于执行处理程序,Flag按钮用于保存结果到本地。

image.png

3.2.2 多UI控件输入、输出

3个UI控件作为输入,2个输出,
输入名字,是否是早晨,今天的温度,
自动输入问候以及华氏温度与摄氏温度的转换

import gradio as gr

def greet(name, is_morning, temperature):
    # salutation表示致意、问候
    salutation = "Good morning" if is_morning else "Good evening"
    greeting = f"{salutation} {name}. It is {temperature} degrees today"
    # 摄氏温度 = (华氏温度 – 32) ÷ 1.8
    celsius = (temperature - 32) * 5 / 9
    return greeting, round(celsius, 2)

demo = gr.Interface(
    fn=greet,
    inputs=["text", "checkbox", gr.Slider(0, 100,label="华氏温度")],
    outputs=["text", "number"],
)
demo.launch()

image.png

3.2.3 图像组件

RDB转 灰度图

import gradio as gr
import cv2

def to_black(image):
    output = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    return output

interface = gr.Interface(fn=to_black, inputs="image", outputs="image")
interface.launch()

image.png

4 实例进阶:深度学习模型部署示例

4.1 基于 resnet50 的分类:

参考项目:
https://swanhub.co/ZeYiLin/ResNet50/tree/main
演示:
image.png

image.png

代码地址:https://swanhub.co/ZeYiLin/ResNet50/tree/main
image.png

4.2 2D图片分割

https://swanhub.co/ZeYiLin/U-2-Net-onnxruntime
演示:
image.png

代码项目地址:
image.png

参考:

[swanhub]
https://swanhub.co/

[AI模型部署】基于gradio和python的网页交互界面(web-ui)——简易使用方法]
https://blog.csdn.net/imwaters/article/details/131400571

【Gradio详细文档——快速部署可视化人工智能应用】
原文链接:https://blog.csdn.net/matt45m/article/details/131772468

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

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

相关文章

分享80个菜单导航JS特效,总有一款适合您

分享80个菜单导航JS特效&#xff0c;总有一款适合您 80个菜单导航JS特效下载链接&#xff1a;https://pan.baidu.com/s/1NgNc759Kg1of_8vR7kaj6A?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…

面向对象及编程

C语言是一门面向过程的编程语言&#xff0c; C、Java这些编程语言都是面向对象。 分门别类&#xff1a;抽取事物的共性&#xff0c;将相似事物归纳为一个类别 面向的对象的核心概念&#xff1a; 类&#xff1a;就是一个事物的类别 |--属性 …

数据结构和算法专题---1、数据结构和算法概述

本文会系统性的介绍算法的概念、复杂度&#xff0c;后续会更新算法思想以及常见的失效算法、限流算法、调度算法、定时算法等&#xff0c;辅助大家快速学习算法和数据结构知识。 概念 数据结构 概述 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或…

Ubuntu之Sim2Real环境配置(坑居多)

不要一上来就复制哦&#xff0c;因为很多下面的步骤让我走了很多弯路&#xff0c;如果可能的话&#xff0c;我会重新整理再发出来 前提&#xff1a; 参考教程 Docs 创建工作空间(不用跟着操作&#xff0c;无用&#xff09; 1.创建sim2real server container 1.尝试创建sim2r…

Python 解析JSON实现主机管理

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它以易于阅读和编写的文本形式表示数据。JSON 是一种独立于编程语言的数据格式&#xff0c;因此在不同的编程语言中都有对应的解析器和生成器。JSON 格式的设计目标是易于理解、…

防火墙规则保存及自定义链

目录 防火墙规则保存 备份工具 iptables services 自定义链 自定义链实现方式 删除自定义链 重命名自定义链 防火墙规则保存 命令&#xff1a;iptables -save 工具&#xff1a;iptables services [rootlocalhost ~]# iptables-save > /opt/iptables.bak #将文件保存…

科普类软文怎么写才能提高用户接受度?媒介盒子分享

科普类软文以干货为主&#xff0c;可以给用户带来实用价值&#xff0c;但是相应会比较枯燥。如何才能把科普内容讲得专业又有趣&#xff0c;从而提高用户接受度呢&#xff1f;媒介盒子接下来就分享三大技巧&#xff1a; 一、 联系产品选题 科普类软文想要写好就需要做好选题&…

【数据结构】手撕排序NO.1

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、排序的概念及其运用1.1 排序的概念1.2 常见的算法排序 二、 冒泡排序三、直接插入排…

2023年「全球化新品牌」与品牌出海路径洞察分析

观点&#xff1a;全球化品牌是未来品牌发展的最优选择 什么是全球化品牌&#xff1f; •多市场:在全球多个市场均有业务布局&#xff0c;既包括传统市场&#xff0c;也包括新兴市场。 •全渠道:线上第三方平台品牌独立站社交网络线下实体店&#xff0c;从2C扩展到2B。 •本土…

SSM项目实战-前端-在Index.vue中展示第一页数据

1、util/request.js import axios from "axios";let request axios.create({baseURL: "http://localhost:8080",timeout: 50000 });export default request 2、api/schedule.js import request from "../util/request.js";export let getSchedu…

开关电源调试时,常见的10个问题:

1、变压器饱和 变压器饱和现象 在高压或低压输入下开机(包含轻载&#xff0c;重载&#xff0c;容性负载)&#xff0c;输出短路&#xff0c;动态负载&#xff0c;高温等情况下&#xff0c;通过变压器(和开关管)的电流呈非线性增长&#xff0c;当出现此现象时&#xff0c;电流的…

SpringBoot2.x整合WebService实现远程接口调用

一、添加依赖 <!-- SpringBoot 2.4 以下版本--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web-services</artifactId> </dependency><dependency><groupId>org.apach…

java日历功能

java 日历功能 功能概述java代码打印结果 功能概述 输入年份和月份&#xff0c;打印该月份所有日期&#xff0c;头部信息为星期一至星期日 java代码 package com.java.core.demoTest; import java.util.Calendar; import java.util.Scanner;// 打印日历 public class Calend…

接口测试很难?1分钟带你入门接口自动化测试

1、什么是接口&#xff1f; 接口是连接前台和后台的桥梁&#xff0c;前台通过接口调用后端已完成的功能&#xff0c;而无需关注内部的实现细节。借助于接口&#xff0c;可以实现前后台分离&#xff0c;各自完成开发工作后&#xff0c;进行联调&#xff0c;提高工作效率 2、接…

navicate16 2059 plugin http could not be loaded

plugin http could not be loaded 乱码 library path http.dll 今天新装一台机子的navicate遇到这个问题。 查了半天都是说 caching_sha2_password’的解决办法。 然后是咋解决的呢&#xff0c;真是丢脸 由于我是直接从浏览器复制下来的ip&#xff0c;所以虽然我只复制了ip地…

MacOS M芯片 安装MySQL5.7教程

目录 1. 安装Homebrew1.1 快速安装1.2 检查是否安装成功 2. 通过Homebrew安装MySQL2.1 搜索 MySQL 版本2.2 安装MySQL 5.72.3 位置说明2.4 启动MySQL服务2.5 检查服务状态2.6 设置环境变量2.7 重置密码 3. 测试安装 1. 安装Homebrew 1.1 快速安装 /bin/bash -c "$(curl …

YOLOv8改进有效涨点 | 2023 | SPD-Conv空间深度转换卷积(高效空间编码技术)

一、本文介绍 本文给大家带来的改进内容是SPD-Conv&#xff08;空间深度转换卷积&#xff09;技术。SPD-Conv是一种创新的空间编码技术&#xff0c;它通过更有效地处理图像数据来改善深度学习模型的表现。SPD-Conv的基本概念&#xff1a;它是一种将图像空间信息转换为深度信息…

qiankun: 关于ElementUI字体图标加载不出来的问题

问题描述&#xff1a; 子应用使用的是vueelementUI&#xff0c;在项目main.js中需要引入elementUI的样式文件。elementUI的样式文件中有字体文件的引用&#xff0c;是以相对路径的形式写在css文件中的&#xff0c; 本来独立部署项目访问是没问题的&#xff0c;问题出现在以qi…

d3dx9_43.dll如何修复?d3dx9_43.dll文件缺失的多种解决方法指南

d3dx9_43.dll如何修复&#xff1f;d3dx9_43.dll文件丢失是一种常见的计算机问题&#xff0c;它会导致运行某些软件时出现错误。本文将详尽地介绍如何修复这一问题&#xff0c;并对比各种方法的优缺点&#xff0c;以及深入解析该DLL文件的由来及其重要性。 一.多种d3dx9_43.dll修…