graido学习记录
为了将来部署!学tmd!
首先简单的打个招呼
import gradio as gr
def greet(name):
return "Hello " + name + "!"
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()
表示输入输出都是文本“text”。
Interface
类可以用用户接口包装任意的Python函数。在上面的示例中,我们使用了一个基于文本的简单函数,但这个函数可以是任何东西。
Interface
类核心需要三个参数初始化:
fn
: 被UI包装的函数inputs
: 作为输入的组件 (例如:"text"
,"image"
or"audio"
)outputs
: 作为输出的组件 (例如:"text"
,"image"
or"label"
)
如果希望它更大并有一个文本占位符。如果我们使用 Textbox
的实际类,而不是使用字符串快捷方式,就可以通过组件属性实现个性化。
import gradio as gr
def greet(name):
return "Hello " + name + "!"
demo = gr.Interface(
fn=greet,
inputs=gr.Textbox(lines=2, placeholder="Name Here..."),
outputs="text",
)
demo.launch()
一个更复杂的函数,有多个输入和输出。比如下面例子,三个输入,两个输出,
输入:第一个为名字(text),第二个是选择项is_morning(checkbox),第三个是滑动条,范围0-100(slider)
输出:第一个为打招呼方式(text),第二个为数字,保留两位小数。
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()
输入列表inputs
中的每个组件依次对应函数的一个参数。输出列表outputs
中的每个组件都对应于函数的一个返回值,两者均按顺序对应。
如何处理图像?
简单的处理~sepia
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(), gr.Image())
demo.launch()
当使用Image
组件作为输入时,您的函数将接收一个形状为 (height, width, 3)
的NumPy数组,其中最后一个维度表示RGB值。我们还将以NumPy数组的形式返回一张图像。你也可用 type=
关键字参数设置组件使用的数据类型。例如,如果你想让你的函数获取一个图像的文件路径,而不是一个NumPy数组时,输入 Image
组件可以写成:
gr.Image(type="filepath", shape=...)
import numpy as np
import gradio as gr
from PIL import Image
def sepia(input_img):
input_img = Image.open(input_img)
input_img = np.array(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(type="filepath",sources="upload"), gr.Image())
demo.launch()
需要有些修改,传的是图片地址,需要转成np.array()
Blocks: 更加灵活且可控
Gradio 提供了两个类来构建应用程序
1. Interface,一个高级抽象。
2. Blocks,一个用于设计具有更灵活布局和数据流的web应用程序的初级API。block可以做许多事,比如特征化多个数据流和演示,控制组件在页面上出现的位置,处理复杂的数据流(例如,输出可以作为其他函数的输入),以及根据用户交互更新组件的属性/可见性,且仍然在Python中。
import gradio as gr
def greet(name):
return "Hello " + name + "!"
with gr.Blocks() as demo:
name = gr.Textbox(label="Name")
output = gr.Textbox(label="Output Box")
greet_btn = gr.Button("Greet")
greet_btn.click(fn=greet, inputs=name, outputs=output)
demo.launch()
不用像interface一样一次性就所有输入都输入,可以有中间状态,可读性和灵活性增加。
blocks可以有更多的可能性
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.Tabs():
with gr.TabItem("Flip Text"):
text_input = gr.Textbox()
text_output = gr.Textbox()
text_button = gr.Button("Flip")
with gr.TabItem("Flip Image"):
with gr.Row():
image_input = gr.Image()
image_output = gr.Image()
image_button = gr.Button("Flip")
text_button.click(flip_text, inputs=text_input, outputs=text_output)
image_button.click(flip_image, inputs=image_input, outputs=image_output)
demo.launch()
作用就是对输入的字符串反转,对输入的图像翻转,也就是镜像。
你可以通过设置的参数来控制单次处理的请求数queue()
demo = gr.Interface(...).queue(default_concurrency_limit=5)
demo.launch()
with gr.Blocks().queue(default_concurrency_limit=5) as demo:
pass
demo.launch()
流式输出
如若希望传输一系列输出,而不是一次显示单个输出。例如,您可能有一个图像生成模型,并且想要显示在每个步骤生成的图像,直至最终图像。或者您可能有一个聊天机器人,它一次流式传输一个令牌的响应,而不是一次返回所有令牌。
在这种情况下,您可以向 Gradio 提供一个生成器函数,而不是常规函数。在 Python 中创建生成器非常简单:return
函数应该是yield
一个一系列值,而不是单个值。通常,yield
语句放在某种循环中。下面是一个简单地计数到给定数字的生成器示例
def my_generator(x):
for i in range(x):
yield i
直接看例子,伪diffusion()
import gradio as gr
import numpy as np
import time
def fake_diffusion(steps):
rng = np.random.default_rng()
for i in range(steps):
time.sleep(1)
image = rng.random(size=(600, 600, 3))
yield image
image = np.ones(shape=(600, 600, 3), dtype=np.uint8)
image[:] = [255, 0, 255]
yield image
with gr.Blocks() as demo:
input = gr.Slider(1, 10,3,step=1)
ouput = gr.Image()
diffusion_btn = gr.Button("fake_diffusion")
diffusion_btn.click(fake_diffusion, inputs=input, outputs=ouput)
demo.launch()
伪扩散模型,希望模拟扩散模型的一个过程,输入扩散有多少步, 输出图像
输入图像随机,使用rng = np.random.default_rng()
image = rng.random(size = (600, 600, 3)) 生成随机图像。