Gradio小记

Gradio小记

安装Gradio

#清华镜像源
pip install gradio -i https://pypi.tuna.tsinghua.edu.cn/simple

接口创建函数

import gradio as gr
demo = gr.Interface(fn=文本处理程序,inputs="text",outputs="text")
#fn设置处理函数,inputs设置输入接口组件,outputs设置输出接口组件这三个必填
#launch()勉强看作调用
demo.launch()

Interface类以及基础模块

三个参数

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

我们可以创建一个接口并发布

可以定义多个输入和输出

import gradio as gr
#该函数有3个输入参数和2个输出参数
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()

其中Slider是滑动条,中的数字是范围

最常用的基础模块构成

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

gr.Textbox(lines=行数,placeholder=“提示文字’’,label=”标签名称”)

launch()方法的三个返回值

  • app, 为Gradio演示提供支持的FastAPI应用程序
  • local_url,本地地址
  • share_url,公共地址,当share=True时生成

小知识

设置报错弹窗
raise gr.Error("弹窗文字")
#设置网页标题
title = "标题"
#左上角描述文字
description = "描述信息"
#左下角文字
article = "描述文字"
#输入参数示例
examples = [例子]

interface状态及交互

全局变量

全局变量的好处就是在调用函数后仍然能够保存,例如在机器学习中通过全局变量从外部加载一个大型模型,并在函数内部使用它,一边每次函数调用都不需要重新加载模型。

全局变量的使用

import gradio as gr
scores = []
def attack_sorted(score):
scores.append(score)
top_scores = sorted(scores,reverse=True)[:3]
return top_scores

iface = gr.Interface(attack_sorted,
gr.Number(label="Sorce"),
gr.JSON(label='Top scores')
)
iface.launch()

状态

会话状态

#简易聊天机器人
import gradio as gr
import random

def messa(message,history):
history = history or []
message = message.lower()
if message == "how many":
response = random.randint(20,30)
elif message == "how":
response = random.choice(['yes','no','happy'])
elif message == "where":
response = random.choice(['beijing','shanghai','guangdong'])
else:
response = "I don't know"

history.append((message,response))
return history,history

#设置一个对话窗
#gr.Chatbot()是gradio提供的用于创建聊天机器人的类,style是设置样式
chatbot = gr.Chatbot()


#State 组件用于存储和跟踪用户与界面交互的状态。它允许你在用户与界面进行交互时保持一些信息的持久性,以便在后续交互中使用。这可以是用户的选择、输入或其他状态信息。
iface = gr.Interface(fn = messa,
inputs=["text","state"],
outputs = [chatbot,"state"],
# 设置没有保存数据的按钮
allow_flagging = "never",
)
iface.launch()

allow_flagging 设置没有保存数据的按钮

gr.Chatbot()是创建聊天机器人类

交互

实时变化

在Interface 中设置live=True ,则输出回跟随输入实时变化。这个时候界面不会有submit按钮,因为不需要手动提交输入。

流模式

在许多情况下,我们的输入是实时视频流或者音频流,那么意味这数据不停地发送到后端,这是可以采用streaming模式处理数据

import gradio as gr
import numpy as np
def flip(im):
return np.flipud(im)
demo = gr.Interface(
flip,
gr.Image(source="webcam", streaming=True),
"image",
live=True
#在Gradio中,‘live'参数用于指定是否在界面上实时更新并显示函数的输出,而不是等待用户交互后才显示结果
)
demo.launch()
#gr.Image(source="webcam",streaming=True)
#gr.Image用于创建图像输入组件。
#source="webcam"是Image的一个参数,指定图像的来源,在这里,source被设置为字符串"webcam",表示图像来源是网络摄像头
#streaming=True: 也是 Image 类的一个参数,用于控制图像的流式传输。当 streaming 设置为 True 时,表示图像将以流的形式传输,而不是一次性加载。这对于实时视频或网络摄像头的图像非常有用,因为它允许图像随着时间的推移不断更新。

numpy.flipud()用于翻转列表,将矩阵进行上下翻转

numpy.fliplr()用于翻转列表,左右翻转

自定制组件:Blocks构建应用

切片时第三个参数为负数是从后往前

将图片左右翻转,文字前后翻转

import gradio as gr
import numpy as np
def text_f(text):
return text[::-1]
def image_f(image):
#numpy.fliplr()用于左右翻转
return np.fliplr(image)
#通过with 来连接各种内部控件
with gr.Blocks() as demo:
gr.Markdown("掌握现在,通往过去,预取未来")
with gr.Tab("假世真界预取身"):
#最小的控件框架内部直接写东西
with gr.Column():
text = gr.Textbox()
text_out = gr.Textbox()
text_bu = gr.Button("夺时光而花开")

with gr.Tab("此刻彼时之人"):
with gr.Row():
image = gr.Image()
image_out = gr.Image()
image_bu = gr.Button("花造物而养命")
#Accordion()用于折叠东西
with gr.Accordion("当年假设,山海图"):
gr.Markdown("羽化道尊")

text_bu.click(text_f,text,text_out)
image_bu.click(image_f,image,image_out)

demo.launch()

Flagging标记

在 Gradio 中,Flagging 标记通常是指使用参数或属性来配置 Gradio 接口的行为,使其能够满足你的需求。Flagging 在 Gradio 中主要体现在 Interface 对象的各种设置上。

以下是一些在 Gradio 中常见的 Flagging 标记的例子:

  1. live 标志:

    import gradio as gr

    iface = gr.Interface(
    fn=my_function,
    inputs="text",
    outputs="text",
    live=True # 设置 live 标志,使界面实时更新
    )

    在这个例子中,live 标志设置为 True,表示界面会实时更新,而不是等到用户点击按钮或发出请求后才刷新。

  2. share 标志:

    import gradio as gr

    iface = gr.Interface(
    fn=my_function,
    inputs="text",
    outputs="text",
    share=True # 设置 share 标志,生成一个可以共享的链接
    )

    通过将 share 标志设置为 True,你可以创建一个可分享的链接,使其他人能够访问你的 Gradio 接口。

  3. 其他设置:

    Gradio 的 Interface 对象还有许多其他可以配置的标志,如 title(标题)、description(描述)、examples(示例输入)等。这些标志允许你定制接口的外观和行为。

    import gradio as gr

    iface = gr.Interface(
    fn=my_function,
    inputs="text",
    outputs="text",
    title="My Interface",
    description="This is a custom interface.",
    examples=[["input example 1", "input example 2"]],
    live=True,
    share=True
    )

这里只是一些 Flagging 的示例,你可以根据 Gradio 的文档和你的需求查找更多可用的标志和配置选项。标记的使用使 Gradio 接口的定制变得非常灵活,使你能够通过简单地调整参数来改变界面的外观和行为。

队列

如果函数推理事件较长,比如目标检测,或者应用程序处理流量过大,则需要使用queue方法进行排队。queue方法使用websockets,可以防止网络超时。

demo = gr.Interface(...).queue()
demo.launch()

可交互设置

任何输入的组件内容都是可编辑的,而输出组件默认是不能编辑的。如果想要使得输出组件内容可编辑,设置interacitve=True即可。

#不可交互
output = gr.Textbox(label="outputbox")
#可交互
output = gr.Textbox(label= "outputbox",interactive = True)