Gradio快速入门

简介: 上一次分享中,我们创建了一个对话机器人,但是只能通过终端的方式进行交互。今天介绍一个 Python 库,可以快速搭建一套 UI 界面,不需要去学习 JavaScript、TypeScript 以及相关的前端技术了。并且,Gradio 渲染出来的界面可以直接在 Jupyter Notebook 里面显示出来,适合场景相对简单,想要快速部署应用的开发者快速体验产品效果。如果你已经在 AI 领域深入多年,可以略过哈。

嗨,你好哈,今天介绍一个可以快速搭建一套 UI 界面 Python 库,为快速搭建一个有界面的聊天机器人做准备。

Gradio 是什么


上一次分享中,我们创建了一个对话机器人,但是只能通过终端的方式进行交互。今天介绍一个 Python 库,可以快速搭建一套 UI 界面,不需要去学习 JavaScript、TypeScript 以及相关的前端技术了。并且,Gradio 渲染出来的界面可以直接在 Jupyter Notebook 里面显示出来,适合场景相对简单,想要快速部署应用的开发者快速体验产品效果。

如果你已经在 AI 领域深入多年,可以略过哈。

Hello World


每一个应用程序,快速体验一下,使用 https://colab.research.google.com/

安装 gradio 库

pip install gradio

image-20230426235814422

import gradio as gr
def greet(name):
    return "Hello " + name + "!"
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()

image-20230427000040696

创建了两个文本框,输入一个 name,输出内容为:Hello xxx !如下图:

image-20230427000449941

从上面例子我们看到,简单的基于文本创建的 demo。但这个函数还可以处理很多类型。

Interface 类通过以下三个参数进行初始化:

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

组件介绍


最常用的基础模块由以下几部分构成:

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

Textbox 组件

输入框为多行,使用占位符提示用户输入,并且设置了输入框的标签名称。

import gradio as gr
def greet(name):
    return "Hello " + name + "!"
demo = gr.Interface(
    fn=greet,
    inputs=gr.Textbox(lines=2, placeholder="Name Here...", label="Input Your Name"),
    outputs="text",
)
demo.launch()

image-20230427002010216

多个输入和输出


对于复杂程序,输入列表中的每个组件按顺序对应于函数的一个参数。输出列表中的每个组件按顺序排列对应于函数返回的一个值。

import gradio as gr
def greet(name, is_morning, temperature):
    salutation = "Good morning" if is_morning else "Good evening"
    greeting = f"{salutation} {name}. It is {temperature} degrees today"
    celsius = (temperature - 32) * 5 / 9
    return greeting, round(celsius, 2)
demo = gr.Interface(
    fn=greet,
    inputs=["text", "checkbox", gr.Slider(0, 100)],
    outputs=["text", "number"],
)
demo.launch(debug=True)

image-20230427002852835

greet 函数有3个输入参数和2个输出参数,与 inputs 、 outputs 相对应。

图像组件


用图像生成图像的功能

import numpy as np
import gradio as gr
def sepia(input_img):
    sepia_filter = np.array([
        [0.393, 0.769, 0.189], 
        [0.349, 0.686, 0.168], 
        [0.272, 0.534, 0.131]
    ])
    sepia_img = input_img.dot(sepia_filter.T)
    sepia_img /= sepia_img.max()
    return sepia_img
demo = gr.Interface(sepia, gr.Image(shape=(200, 200)), "image")
demo.launch()

image-20230427003302912

更多的灵活性和控制


Grdio 提供了两个类来构建应用程序:

  1. Interface,一个高级抽象的 API,我们到目前为止一直在用它在演示。
  2. Blocks,用于设计具有更灵活布局和数据流的 Web 应用程序的低级 API。Blocks 可以让我们做一些事情,比如提供多个数据流和演示,控制组件出现在页面的哪个位置,处理复杂的数据流(例如输出可以作为其他函数的输入) ,以及基于用户交互更新组件的属性/可见性ーー仍然全部使用 Python。

如果您需要这种可定制性,请尝试使用 Block!

相对复杂点的示例


import numpy as np
import gradio as gr
def flip_text(x):
    return x[::-1]
def flip_image(x):
    return np.fliplr(x)
with gr.Blocks() as demo:
    gr.Markdown("Flip text or image files using this demo.")
    with gr.Tab("Flip Text"):
        text_input = gr.Textbox()
        text_output = gr.Textbox()
        text_button = gr.Button("Flip")
    with gr.Tab("Flip Image"):
        with gr.Row():
            image_input = gr.Image()
            image_output = gr.Image()
        image_button = gr.Button("Flip")
    with gr.Accordion("Open for More!"):
        gr.Markdown("Look at me...")
    text_button.click(flip_text, inputs=text_input, outputs=text_output)
    image_button.click(flip_image, inputs=image_input, outputs=image_output)
demo.launch()

image-20230427004521739

  • Blocks 是用 with 子句创建的,在这个子句中创建的任何组件都会自动添加到应用程序中。
  • 组件按照创建的顺序垂直出现在应用程序中。
  • 创建了一个 Button,然后向该按钮添加了一个 click 事件监听器。这个 API 应该看起来很熟悉!与 Interface 类似,click 方法接受 Python 函数、输入组件和输出组件。
  • 任何输入的组件内容都是可编辑的,而输出组件默认是不能编辑的。如果想要使得输出组件内容可编辑,设置interactive=True 即可。

布局


Blocks 默认情况下组件垂直排列。

组件水平排列:使用 Row 函数会将组件按照水平排列,但是在Row函数块里面的组件都会保持同等高度。

import gradio as gr
with gr.Blocks() as demo:
    with gr.Row():
        img1 = gr.Image()
        text1 = gr.Text()
    btn1 = gr.Button("button")
demo.launch()

image-20230427005547995

组件垂直排列与嵌套:组件通常是垂直排列,可以通过 Row 函数和 Column 函数生成不同复杂的布局。

import gradio as gr
with gr.Blocks() as demo:
    with gr.Row():
        text1 = gr.Textbox(label="Textbox1")
        slider2 = gr.Textbox(label="Textbox2")
        drop3 = gr.Dropdown(["选项一", "选项二", "选项三"], label="Dropdown")
    with gr.Row():
        # scale与相邻列相比的相对宽度。例如,如果列A的比例为2,列B的比例为1,则A的宽度将是B的两倍。
        # min_width设置最小宽度,防止列太窄
        with gr.Column(scale=2, min_width=600):
            text1 = gr.Textbox(label="prompt 1")
            text2 = gr.Textbox(label="prompt 2")
            inbtw = gr.Button("Between")
            text4 = gr.Textbox(label="prompt 4")
            text5 = gr.Textbox(label="prompt 5")
        with gr.Column(scale=1, min_width=600):
            img1 = gr.Image()
            btn = gr.Button("Go")
demo.launch()

image-20230427010326263

修改样式


可以设置行内 css 属性将任何样式给应用程序

import gradio as gr
#修改blocks的背景颜色
with gr.Blocks(css=".gradio-container {background-color: black}") as demo:
    box1 = gr.Textbox(value="Good Job")
demo.launch()

image-20230427010653014

可以向任何组件添加HTML元素。通过 elem_id 选择对应的 css 元素。

import gradio as gr
# 这里用的是id属性设置
with gr.Blocks(css="#warning{background-color: yellow} #sucess{background-color: green} #failure{background-color: red}") as demo:
    box1 = gr.Textbox(value="Good Job", elem_id="sucess")
    box2 = gr.Textbox(value="Failure", elem_id="failure")
    box3 = gr.Textbox(value="None", elem_id="warning")
demo.launch()

image-20230427011142695

下步计划


相关文章
|
IDE API 开发工具
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之XComponent组件
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之XComponent组件
1114 2
|
数据建模 计算机视觉
SiMBA:基于Mamba的跨图像和多元时间序列的预测模型
微软研究者提出了SiMBA,一种融合Mamba与EinFFT的新架构,用于高效处理图像和时间序列。SiMBA解决了Mamba在大型网络中的不稳定性,结合了卷积、Transformer、频谱方法和状态空间模型的优点。在ImageNet 1K上表现优越,达到84.0%的Top-1准确率,并在多变量长期预测中超越SOTA,降低了MSE和MAE。代码开源,适用于复杂任务的高性能建模。[[论文链接]](https//avoid.overfit.cn/post/c21aa5ca480b47198ee3daefdc7254bb)
2434 3
|
机器学习/深度学习 自然语言处理 达摩院
Modelscope 工程介绍及实战演示| 学习笔记
快速学习 Modelscope 工程介绍及实战演示
Modelscope 工程介绍及实战演示| 学习笔记
|
12月前
|
人工智能 分布式计算 自然语言处理
多智能体系统设计:5种编排模式解决复杂AI任务
本文探讨了多AI智能体协作中的关键问题——编排。文章指出,随着系统从单体模型向多智能体架构演进,如何设计智能体之间的通信协议、工作流程和决策机制,成为实现高效协作的核心。文章详细分析了五种主流的智能体编排模式:顺序编排、MapReduce、共识模式、分层编排和制作者-检查者模式,并分别介绍了它们的应用场景、优势与挑战。最后指出,尽管大模型如GPT-5提升了单体能力,但在复杂任务中,合理的智能体编排仍不可或缺。选择适合的编排方式,有助于在系统复杂度与实际效果之间取得平衡。
2332 10
多智能体系统设计:5种编排模式解决复杂AI任务
|
9月前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:十、开箱即见 Gradio:大模型的“魔法画布”,让每一个想法清晰可见
Gradio是一个快速构建机器学习演示界面的Python库,能够将需要数天开发工作的模型展示缩短为几分钟的脚本编写。它通过简单的Python代码即可生成完整的Web应用界面,支持文本、图像、音频等多种交互组件,适用于模型展示、教学演示和原型测试等场景。文章详细介绍了Gradio的核心功能、基础语法和组件使用方法,并通过情感分析和聊天机器人两个实际案例展示了如何快速部署AI模型交互界面。Gradio大幅降低了将模型转化为可交互应用的门槛,使开发者能更专注于模型本身而非界面开发。
1912 8
|
9月前
|
JSON 监控 数据挖掘
从零到一:淘宝店铺订单API接入全流程指南
淘宝订单API通过订单号获取完整交易数据,支持实时查询买家信息、商品明细及物流状态,适用于订单同步、物流监控与数据分析。采用RESTful设计,JSON格式响应,安全高效,助力电商自动化运营。
1283 4
|
机器学习/深度学习 自然语言处理 数据可视化
LlamaFactory可视化微调大模型 - 参数详解
LlamaFactory可视化微调大模型 - 参数详解
6978 4
|
JSON API 数据格式
淘宝天猫店铺订单列表、订单详情、订单物流 API 接口全攻略
淘宝天猫订单API接口简介:支持订单列表查询、订单详情获取及物流轨迹追踪功能。通过taobao.trades.sold.get等接口批量查询订单,按状态/时间筛选;taobao.trade.fullinfo.get获取订单详细信息;taobao.logistics.trade.trackget实时跟踪物流状态。开发者需注册账号、申请权限,并使用编程语言调用API,传递必要参数(如App Key、订单ID),处理JSON返回数据。适用于多场景订单管理与物流同步。
1654 5
|
Python
Python如何给视频添加音频和字幕
通过以上方法和代码示例,你可以在Python中成功实现视频的音频和字幕添加。确保理解每一步的实现细节,应用到实际项目中时能有效地处理各种视频编辑需求。
983 20