与他人分享你的机器学习模型、API或数据科学工作流的最佳方式之一是创建一个交互式应用,让你的用户或同事可以在他们的浏览器中尝试这个演示。
Gradio 允许你构建并分享演示,所有这些都是用 Python 完成的。通常只需几行代码!那么,让我们开始吧。
要使用一个简单的“Hello, World”示例来运行 Gradio,请按照以下三个步骤操作:
pip install gradio
import gradio as gr
def greet(name):
return "Hello " + name + "!"
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()
我们将导入的名字缩写为 gr,以便更好地阅读使用 Gradio 的代码。这是一个广泛采用的约定,你应该遵循,以便任何使用你的代码的人都能轻松理解它。
gradio app.py
当在本地开发时,如果你想将代码作为 Python 脚本运行,你可以使用 Gradio CLI 来启动应用程序在重新加载模式,这将提供无缝和快速的开发。在自动重新加载指南中了解更多关于重新加载的信息。
注意:你也可以执行python app.py,但它不会提供自动重新加载机制。
你会注意到,为了制作演示,我们创建了一个 gr.Interface。这个 Interface 类可以将任何 Python 函数包装成一个用户界面。在上面的例子中,我们看到了一个简单的基于文本的函数,但这个函数可以是从音乐生成器到税务计算器,再到预训练机器学习模型的预测函数。
核心 Interface 类在初始化时需要三个必需的参数:
让我们更仔细地看看这些用于提供输入和输出的组件。
在前面的示例中,我们看到了一些简单的文本框组件,但是如果你想改变 UI 组件的外观或行为怎么办?
假设你想自定义输入文本字段 —— 例如,你想让它更大并且有一个文本占位符。如果我们使用 Textbox 的实际类而不是使用字符串快捷方式,你可以通过组件属性获得更多的定制化选项。
import gradio as gr
def greet(name):
return "Hello " + name + "!"
demo = gr.Interface(
fn=greet,
inputs=gr.Textbox(lines=2, placeholder="在这里输入名字..."),
outputs="text",
)
demo.launch()
假设你有一个更复杂的函数,具有多个输入和输出。在下面的例子中,我们定义了一个函数,它接受一个字符串、布尔值和数字,并返回一个字符串和数字。看看你是如何传递一组输入和输出组件的。
import gradio as gr
def greet(name, is_morning, temperature):
salutation = "早上好" if is_morning else "晚上好"
greeting = f"{salutation} {name}. 今天温度为 {temperature}"
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()
你只需将组件放在一个列表中。输入列表中的每个组件按顺序对应于函数的一个参数。输出列表中的每个组件按顺序对应于函数返回的一个值。
Gradio 支持许多类型的组件,例如 Image、DataFrame、Video 或 Label。让我们尝试一个图像到图像的函数,以便对这些组件有个感觉!
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 组件作为输入时,你的函数将接收一个形状为 (height, width, 3) 的 NumPy 数组,其中最后一个维度表示 RGB 值。我们也将以 NumPy 数组的形式返回一个图像。
你还可以通过 type= 关键字参数设置组件使用的数据类型。例如,如果你希望你的函数接受一个图像的文件路径,而不是一个 NumPy 数组,那么输入的 Image 组件可以写成:
gr.Image(type="filepath", shape=...)
还要注意,我们的输入 Image 组件带有一个编辑按钮 🖉,它允许裁剪和缩放图像。以这种方式操作图像可以帮助揭示机器学习模型中的偏见或隐藏的缺陷!
Gradio包括一个高级类,gr.ChatInterface,它类似于gr.Interface,但是专为聊天机器人用户界面设计。 gr.ChatInterface类也封装了一个函数,但是这个函数必须具有特定的签名。 函数应该接受两个参数:消息(message)然后是历史记录(history)(参数可以命名为任何内容,但必须按此顺序)
消息(message):表示用户输入的字符串
历史记录(history):表示到那时为止的对话的列表。每个内部列表都由两个字符串组成,代表一对:[用户输入,机器人回应]。
您的函数应返回一个字符串响应,该响应是机器人对特定用户输入消息的回应。
除此之外,gr.ChatInterface没有必需的参数(尽管有很多可用于自定义用户界面)。
这是一个玩具示例:
import random
import gradio as gr
def random_response(message, history):
return random.choice(["Yes", "No"])
demo = gr.ChatInterface(random_response)
demo.launch()
Gradio 提供了两种构建应用程序的方法:
让我们看一个简单的例子。注意这里的 API 与接口(Interface)有何不同。
import gradio as gr
def greet(name):
return "你好 " + name + "!"
with gr.Blocks() as demo:
name = gr.Textbox(label="姓名")
output = gr.Textbox(label="输出")
greet_btn = gr.Button("欢迎")
greet_btn.click(fn=greet, inputs=name, outputs=output, api_name="greet")
demo.launch()
需要注意的事项:
通过以下应用程序,让你体验一下 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("使用此演示来翻转文本或图像文件")
with gr.Tab("翻转文本"):
text_input = gr.Textbox()
text_output = gr.Textbox()
text_button = gr.Button("翻转")
with gr.Tab("翻转图像"):
with gr.Row():
image_input = gr.Image()
image_output = gr.Image()
image_button = gr.Button("翻转")
with gr.Accordion("展开更多!"):
gr.Markdown("看我...")
text_button.click(flip_text, inputs=text_input, outputs=text_output)
image_button.click(flip_image, inputs=image_input, outputs=image_output)
demo.launch()