Gradio
快速实现一个算法交互界面
Gradio是一个开源的Python库,用于快速创建自定义的机器学习和数据科学演示。它允许你将任何机器学习模型转换为一个web应用程序,用户可以通过网页界面与模型交互。
以下是一个简单的例子,展示了如何使用Gradio来创建一个图像分类应用。假设你已经有一个预训练的图像分类模型,例如使用PyTorch或TensorFlow训练的模型。
首先,你需要安装Gradio库:
pip install gradio
然后,你可以使用以下代码来创建一个简单的图像分类应用:
import gradio as gr
import torch
from torchvision import transforms
from PIL import Image
# 假设你有一个预训练的PyTorch模型
model = torch.load('your_model.pth')
model.eval() # 设置为评估模式
# 定义图像预处理函数
def preprocess_image(pil_image):
transform = transforms.Compose([
transforms.Resize((224, 224)), # 调整图像大小
transforms.ToTensor(), # 转换为张量
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 标准化
])
return transform(pil_image).unsqueeze(0) # 添加一个额外的维度以匹配模型的输入
# 定义预测函数
def predict(inp):
inp = preprocess_image(inp)
with torch.no_grad():
prediction = model(inp)
probabilities = torch.nn.functional.softmax(prediction[0], dim=0)
return {class_names[i]: probabilities[i].item() for i in range(len(class_names))}
# 假设你有一个类别名称列表
class_names = ['class1', 'class2', 'class3', 'class4', 'class5']
# 创建Gradio界面
iface = gr.Interface(
fn=predict,
inputs=gr.Image(shape=(224, 224)),
outputs=gr.Label(num_top_classes=5),
examples=[['image1.jpg'], ['image2.jpg']], # 示例图像
title="Image Classification",
description="Upload an image and the model will classify it."
)
# 启动应用
iface.launch()
在这个例子中,我们定义了一个predict
函数,它接受一个PIL图像作为输入,预处理它,然后通过模型进行预测。预测结果是一个包含每个类别概率的字典,然后Gradio界面将显示概率最高的几个类别。
多个输出
Gradio 支持一个接口有多个输出。这在某些情况下非常有用,比如在一个模型中同时进行分类和分割任务。你可以通过返回一个包含多个元素的元组或者列表来实现这一点。
以下是一个示例,展示了如何在一个接口中返回多个输出:
import gradio as gr
def process_image(img):
# 这里应该是你的图像处理代码
# 返回一个包含多个元素的元组
return "分类结果", "分割结果"
iface = gr.Interface(
fn=process_image,
inputs=gr.Image(shape=(224, 224)),
outputs=[
gr.Textbox(label="分类"),
gr.Image(label="分割")
],
title="图像处理接口",
description="上传图像,返回分类结果和分割结果。"
)
iface.launch()
在这个例子中,process_image
函数返回一个包含两个元素的元组:一个文本字符串和一个 PIL 图像。Gradio 会自动将这些输出映射到相应的输出组件上。
你可以根据你的需求添加更多的输出组件。例如,如果你有一个语义分割模型,你可能还想返回一个热力图,你可以添加一个 gr.outputs.Image
组件来显示热力图。
iface = gr.Interface(
fn=process_image,
inputs=gr.Image(shape=(224, 224)),
outputs=[
gr.Textbox(label="分类"),
gr.Image(label="分割"),
gr.Image(label="热力图")
],
title="图像处理接口",
description="上传图像,返回分类结果、分割结果和热力图。"
)
iface.launch()
process_image
函数需要能够返回与你在 outputs
列表中定义的输出组件相对应的数据类型。例如,如果你有一个分类模型,它返回的是一个字典,那么你应该在 outputs
列表中使用 gr.outputs.Label
组件来显示这个字典。
多个函数
在Gradio中,如果你有多个函数需要执行并且每个函数都有自己的输出,你可以创建多个接口,并将它们组合成一个主接口。这样,用户可以选择运行不同的函数,并且每个函数的输出都会显示在相应的输出区域。
以下是一个示例,展示了如何创建多个接口并将它们组合成一个主接口:
import gradio as gr
# 假设这是你的图像分类函数
def classify_image(img):
# 这里应该是你的图像分类模型的代码
# 返回分类结果
return {"class1": 0.8, "class2": 0.1, "class3": 0.1}
# 假设这是你的图像分割函数
def segment_image(img):
# 这里应该是你的图像分割模型的代码
# 返回分割结果的图像
return img # 这里应该是分割后的图像
# 创建分类接口
classify_interface = gr.Interface(
fn=classify_image,
inputs=gr.Image(shape=(224, 224)),
outputs=gr.Label(num_top_classes=3),
title="图像分类接口"
)
# 创建分割接口
segment_interface = gr.Interface(
fn=segment_image,
inputs=gr.Image(shape=(224, 224)),
outputs=gr.Image(),
title="图像分割接口"
)
# 创建主接口,包含分类和分割接口
main_interface = gr.TabbedInterface([classify_interface, segment_interface], ["分类", "分割"])
# 启动应用
main_interface.launch()
在这个例子中,我们创建了两个接口:classify_interface
和 segment_interface
,分别用于图像分类和图像分割。然后,我们使用 gr.TabbedInterface
将这两个接口组合成一个主接口,用户可以通过标签页来切换执行不同的函数。
这样,用户可以选择运行分类接口或分割接口,并且每个接口的输出都会显示在相应的输出区域。这样做的好处是,你可以为不同的任务创建独立的接口,使得用户可以根据需要选择不同的任务来执行。