Gradio入门详细教程

常用的两款AI可视化交互应用比较:

  • Gradio
    Gradio的优势在于易用性,代码结构相比Streamlit简单,只需简单定义输入和输出接口即可快速构建简单的交互页面,更轻松部署模型。适合场景相对简单,想要快速部署应用的开发者。便于分享:gradio可以在启动应用时设置share=True参数创建外部分享链接,可以直接在微信中分享给用户使用。

  • Streamlit
    Streamlit的优势在于可扩展性,相比Gradio复杂,完全熟练使用需要一定时间。可以使用Python编写完整的包含前后端的交互式应用。适合场景相对复杂,想要构建丰富多样交互页面的开发者。

Gradio官网链接:https://gradio.app/
Streamlit官网链接:https://streamlit.io/

1. 安装&基本用法

Python第三方库Gradio快速上手,当前版本V3.27.0

  • python版本要求3.7及以上
pip install gradio#为了更快安装,可以使用清华镜像源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gradio

安装完直接在IDE上启动快速,

1.1 快速入门

import gradio as gr
#输入文本处理程序
def greet(name):return "Hello " + name + "!"
#接口创建函数
#fn设置处理函数,inputs设置输入接口组件,outputs设置输出接口组件
#fn,inputs,outputs都是必填函数
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()

运行程序后,打开 http://localhost:7860 即可看到网页效果。左边是文本输入框,右边是结果展示框。Clear按钮用于重置网页状态,Submit按钮用于执行处理程序,Flag按钮用于保存结果到本地。

#执行结果
Running on local URL:  http://127.0.0.1:7860To create a public link, set `share=True` in `launch()`.

打开浏览器使用即可:

在这里插入图片描述

在本地开发时,如果你想将代码作为Python脚本运行,你可以使用Gradio CLI在重载模式下启动应用程序,这将提供无缝和快速的开发。

gradio app.py

Note:你也可以做python app.py,但它不会提供自动重新加载机制。

2.基本参数|支持的接口

2.1 Interface类以及基础模块

Gradio 可以包装几乎任何 Python 函数为易于使用的用户界面。从上面例子我们看到,简单的基于文本的函数。但这个函数还可以处理很多类型。

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(列布局)

1.2.1 自定义输入组件

import gradio as gr
def greet(name):return "Hello " + name + "!"
demo = gr.Interface(fn=greet,# 自定义输入框# 具体设置方法查看官方文档inputs=gr.Textbox(lines=3, placeholder="Name Here...",label="my input"),outputs="text",
)
demo.launch()

在这里插入图片描述

Interface.launch()方法返回三个值

  • app,为 Gradio 演示提供支持的 FastAPI 应用程序
    l- ocal_url,本地地址
  • share_url,公共地址,当share=True时生成
import gradio as grdef greet(name):return "Hello " + name + "!"iface = gr.Interface(fn=greet,inputs=gr.inputs.Textbox(lines=2, placeholder="Name Here..."),outputs="text",
)
if __name__ == "__main__":app, local_url, share_url = iface.launch()

1.2.2 多个输入和输出

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

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 / 9return greeting, round(celsius, 2)
demo = gr.Interface(fn=greet,#按照处理程序设置输入组件inputs=["text", "checkbox", gr.Slider(0, 100)],#按照处理程序设置输出组件outputs=["text", "number"],
)
demo.launch()

在这里插入图片描述

inputs列表里的每个字段按顺序对应函数的每个参数,outputs同理。

1.2.3 图像组件

Gradio支持许多类型的组件,如image、dataframe、video。使用示例如下:

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
#shape设置输入图像大小
demo = gr.Interface(sepia, gr.Image(shape=(200, 200)), "image")
demo.launch()

在这里插入图片描述

当使用Image组件作为输入时,函数将收到一个维度为(w,h,3)的numpy数组,按照RGB的通道顺序排列。要注意的是,我们的输入图像组件带有一个编辑按钮,可以对图像进行裁剪和放大。以这种方式处理图像可以帮助揭示机器学习模型中的偏差或隐藏的缺陷。

此外对于输入组件有个shape参数,指的设置输入图像大小。但是处理方式是保持长宽比的情况下,将图像最短边缩放为指定长度,然后按照中心裁剪方式裁剪最长边到指定长度。

当图像不大的情况,一种更好的方式是不设置shape,这样直接传入原图。输入组件Image也可以设置输入类型type,比如type=filepath设置传入处理图像的路径。具体可以查看官方文档,文档写的很清楚。

1.2.4 动态界面接口:简单计算器模板实时变化

在Interface添加live=True参数,只要输入发生变化,结果马上发生改变。

import gradio as grdef calculator(num1, operation, num2):if operation == "add":return num1 + num2elif operation == "subtract":return num1 - num2elif operation == "multiply":return num1 * num2elif operation == "divide":return num1 / num2iface = gr.Interface(calculator,["number", gr.inputs.Radio(["add", "subtract", "multiply", "divide"]), "number"],"number",live=True,
)iface.launch()

在这里插入图片描述

import gradio as gr
#一个简单计算器,含实例说明
def calculator(num1, operation, num2):if operation == "add":return num1 + num2elif operation == "subtract":return num1 - num2elif operation == "multiply":return num1 * num2elif operation == "divide":if num2 == 0:# 设置报错弹窗raise gr.Error("Cannot divide by zero!")return num1 / num2
demo = gr.Interface(calculator,# 设置输入["number",gr.Radio(["add", "subtract", "multiply", "divide"]),"number"],# 设置输出"number",# 设置输入参数示例examples=[[5, "add", 3],[4, "divide", 2],[-4, "multiply", 2.5],[0, "subtract", 1.2],],# 设置网页标题title="Toy Calculator",# 左上角的描述文字description="Here's a sample toy calculator. Enjoy!",# 左下角的文字article = "Check out the examples",
)
demo.launch()

在这里插入图片描述

2.2 interface进阶使用

2.2.1 interface状态

全局变量

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

import gradio as gr
scores = []
def track_score(score):scores.append(score)#返回分数top3top_scores = sorted(scores, reverse=True)[:3]return top_scores
demo = gr.Interface(track_score,gr.Number(label="Score"),gr.JSON(label="Top Scores")
)
demo.launch()

在这里插入图片描述

会话状态

Gradio支持的另一种数据持久性是会话状态,数据在一个页面会话中的多次提交中持久存在。然而,数据不会在你模型的不同用户之间共享。会话状态的典型例子就是聊天机器人,你想访问用户之前提交的信息,但你不能将聊天记录存储在一个全局变量中,因为那样的话,聊天记录会在不同的用户之间乱成一团。注意该状态会在每个页面内的提交中持续存在,但如果您在另一个标签页中加载该演示(或刷新页面),该演示将不会共享聊天历史。

要在会话状态下存储数据,你需要做三件事:

  • 在你的函数中传入一个额外的参数,它代表界面的状态。
  • 在函数的最后,将状态的更新值作为一个额外的返回值返回。
  • 在添加输入和输出时添加state组件。
import random
import gradio as gr
def chat(message, history):history = history or []message = message.lower()if message.startswith("how many"):response = random.randint(1, 10)elif message.startswith("how"):response = random.choice(["Great", "Good", "Okay", "Bad"])elif message.startswith("where"):response = random.choice(["Here", "There", "Somewhere"])else:response = "I don't know"history.append((message, response))return history, history
#设置一个对话窗
chatbot = gr.Chatbot().style(color_map=("green", "pink"))
demo = gr.Interface(chat,# 添加state组件["text", "state"],[chatbot, "state"],# 设置没有保存数据的按钮allow_flagging="never",
)
demo.launch()

在这里插入图片描述

2.2.2 interface交互

实时变化

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

同1.2.4

流模式

在许多情形下,我们的输入是实时视频流或者音频流,那么意味这数据不停地发送到后端,这是可以采用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
)
demo.launch()

2.3自定制组件:Blocks构建应用

相比Interface,Blocks提供了一个低级别的API,用于设计具有更灵活布局和数据流的网络应用。Blocks允许控制组件在页面上出现的位置,处理复杂的数据流(例如,输出可以作为其他函数的输入),并根据用户交互更新组件的属性可见性。可以定制更多组件,更多详细定制可查看文档

2.3.1 简单演示

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()

在这里插入图片描述

Blocks方式需要with语句添加组件,如果不设置布局方式,那么组件将按照创建的顺序垂直出现在应用程序中,运行界面

2.3.2 多模块应用☆

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:#用markdown语法编辑输出一段话gr.Markdown("Flip text or image files using this demo.")# 设置tab选项卡with gr.Tab("Flip Text"):#Blocks特有组件,设置所有子组件按垂直排列#垂直排列是默认情况,不加也没关系with gr.Column():text_input = gr.Textbox()text_output = gr.Textbox()text_button = gr.Button("Flip")with gr.Tab("Flip Image"):#Blocks特有组件,设置所有子组件按水平排列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()

在这里插入图片描述

在这里插入图片描述

2.3.3 Flagging标记

相信有小伙伴已经注意到,输出框下有个Flag按钮。当测试您的模型的用户看到某个输入导致输出错误或意外的模型行为,他们可以标记这个输入让开发者知道。

这个文件夹由Interfaceflagging_dir参数指定,默认为’flagged’。将这些会导致错误的输入保存到一个csv文件。如果Interface包含文件数据,文件夹也会创建来保存这些标记数据。

打开log.csv展示如下:

在这里插入图片描述

2.3.4 样式、队列、生成器

样式

Gradio官方文档,搜索不同的组件加.style(如image.style),可以获取该组件的样式参数设置样例。例如image组件的设置如下:

img = gr.Image("lion.jpg").style(height='24', rounded=False)
队列

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

demo = gr.Interface(...).queue()
demo.launch()
#或
with gr.Blocks() as demo:#...
demo.queue()
demo.launch()
生成器

在某些情况下,你可能想显示一连串的输出,而不是单一的输出。例如,你可能有一个图像生成模型,如果你想显示在每个步骤中生成的图像,从而得到最终的图像。在这种情况下,你可以向Gradio提供一个生成器函数,而不是一个常规函数。下面是一个生成器的例子,每隔1秒返回1张图片。

import gradio as gr
import numpy as np
import time
#生成steps张图片,每隔1秒钟返回
def fake_diffusion(steps):for _ in range(steps):time.sleep(1)image = np.random.randint(255, size=(300, 600, 3))yield image
demo = gr.Interface(fake_diffusion,#设置滑窗,最小值为1,最大值为10,初始值为3,每次改动增减1位inputs=gr.Slider(1, 10, value=3, step=1),outputs="image")
#生成器必须要queue函数
demo.queue()
demo.launch()

2.4 Blocks进阶使用

2.4.1 Blocks事件

可交互设置

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

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")# 可交互output = gr.Textbox(label="Output", interactive=True)greet_btn = gr.Button("Greet")greet_btn.click(fn=greet, inputs=name, outputs=output)
demo.launch()
事件设置

我们可以为不同的组件设置不同事件,如为输入组件添加change事件。可以进一步查看官方文档,看看组件还有哪些事件。

import gradio as gr
def welcome(name):return f"Welcome to Gradio, {name}!"
with gr.Blocks() as demo:gr.Markdown("""# Hello World!Start typing below to see the output.""")inp = gr.Textbox(placeholder="What is your name?")out = gr.Textbox()#设置change事件inp.change(fn = welcome, inputs = inp, outputs = out)
demo.launch()
多个数据流

如果想处理多个数据流,只要设置相应的输入输出组件即可。

import gradio as gr
def increase(num):return num + 1
with gr.Blocks() as demo:a = gr.Number(label="a")b = gr.Number(label="b")# 要想b>a,则使得b = a+1atob = gr.Button("b > a")atob.click(increase, a, b)# 要想a>b,则使得a = b+1btoa = gr.Button("a > b")btoa.click(increase, b, a)
demo.launch()

在这里插入图片描述

多输出值处理

下面的例子展示了输出多个值时,以列表形式表现的处理方式。

import gradio as gr
with gr.Blocks() as demo:food_box = gr.Number(value=10, label="Food Count")status_box = gr.Textbox()def eat(food):if food > 0:return food - 1, "full"else:return 0, "hungry"gr.Button("EAT").click(fn=eat,inputs=food_box,#根据返回值改变输入组件和输出组件outputs=[food_box, status_box])
demo.launch()

下面的例子展示了输出多个值时,以字典形式表现的处理方式。

组件配置修改

事件监听器函数的返回值通常是相应的输出组件的更新值。有时我们也想更新组件的配置,比如说可见性。在这种情况下,我们可以通过返回update函数更新组件的配置。

import gradio as gr
def change_textbox(choice):#根据不同输入对输出控件进行更新if choice == "short":return gr.update(lines=2, visible=True, value="Short story: ")elif choice == "long":return gr.update(lines=8, visible=True, value="Long story...")else:return gr.update(visible=False)
with gr.Blocks() as demo:radio = gr.Radio(["short", "long", "none"], label="Essay Length to Write?")text = gr.Textbox(lines=2, interactive=True)radio.change(fn=change_textbox, inputs=radio, outputs=text)
demo.launch()

在这里插入图片描述

2.4.2 Blocks布局

Blocks应用的是html中的flexbox模型布局,默认情况下组件垂直排列。

组件水平排列

使用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()
组件垂直排列与嵌套

组件通常是垂直排列,我们可以通过Row函数Column函数生成不同复杂的布局。

import gradio as gr
with gr.Blocks() as demo:with gr.Row():text1 = gr.Textbox(label="t1")slider2 = gr.Textbox(label="s2")drop3 = gr.Dropdown(["a", "b", "c"], label="d3")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 1")text5 = gr.Textbox(label="prompt 2")with gr.Column(scale=1, min_width=600):img1 = gr.Image("test.jpg")btn = gr.Button("Go")
demo.launch()
组件可视化:输出可视化从无到有

如下所示,我们可以通过visibleupdate函数构建更为复杂的应用。

import gradio as gr
with gr.Blocks() as demo:# 出错提示框error_box = gr.Textbox(label="Error", visible=False)# 输入框name_box = gr.Textbox(label="Name")age_box = gr.Number(label="Age")symptoms_box = gr.CheckboxGroup(["Cough", "Fever", "Runny Nose"])submit_btn = gr.Button("Submit")# 输出不可见with gr.Column(visible=False) as output_col:diagnosis_box = gr.Textbox(label="Diagnosis")patient_summary_box = gr.Textbox(label="Patient Summary")def submit(name, age, symptoms):if len(name) == 0:return {error_box: gr.update(value="Enter name", visible=True)}if age < 0 or age > 200:return {error_box: gr.update(value="Enter valid age", visible=True)}return {output_col: gr.update(visible=True),diagnosis_box: "covid" if "Cough" in symptoms else "flu",patient_summary_box: f"{name}, {age} y/o"}submit_btn.click(submit,[name_box, age_box, symptoms_box],[error_box, diagnosis_box, patient_summary_box, output_col],)
demo.launch()

在这里插入图片描述

组件渲染:点击作为输入

在某些情况下,您可能希望在实际在UI中呈现组件之前定义组件。

例如,您可能希望在相应的gr.Textbox输入上方显示使用gr.examples的示例部分。由于gr.Examples需要输入组件对象作为参数,因此您需要先定义输入组件,然后在定义gr.Exmples对象后再进行渲染。解决方法是在gr.Blocks()范围外定义gr.Textbox,并在UI中希望放置的任何位置使用组件的.render()方法

import gradio as gr
input_textbox = gr.Textbox()
with gr.Blocks() as demo:#提供示例输入给input_textbox,示例输入以嵌套列表形式设置gr.Examples(["hello", "bonjour", "merhaba"], input_textbox)# render函数渲染input_textboxinput_textbox.render()
demo.launch()

在这里插入图片描述

2.4.3 样式修改

自定义css

要获得额外的样式功能,您可以设置行内css属性将任何样式给应用程序。如下所示。

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

在这里插入图片描述

元素选择

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

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

在这里插入图片描述

3. 应用分享

3.1 互联网分享

如果运行环境能够连接互联网,在launch函数中设置share参数为True,那么运行程序后。Gradio的服务器会提供XXXXX.gradio.app地址。通过其他设备,比如手机或者笔记本电脑,都可以访问该应用。这种方式下该链接只是本地服务器的代理,不会存储通过本地应用程序发送的任何数据。这个链接在有效期内是免费的,好处就是不需要自己搭建服务器,坏处就是太慢了,毕竟数据经过别人的服务器。

demo.launch(share=True)

3.2 huggingface托管

为了便于向合作伙伴永久展示我们的模型App,可以将gradio的模型部署到 HuggingFace的 Space托管空间中,完全免费的哦。

方法如下:

  1. 注册huggingface账号:https://huggingface.co/join

  2. space空间中创建项目:https://huggingface.co/spaces

  3. 创建好的项目有一个Readme文档,可以根据说明操作,也可以手工编辑app.py和requirements.txt文件。

3.3 局域网分享

通过设置server_name=‘0.0.0.0’(表示使用本机ip),server_port(可不改,默认值是7860)。那么可以通过本机ip:端口号在局域网内分享应用。

#show_error为True表示在控制台显示错误信息。
demo.launch(server_name='0.0.0.0', server_port=8080, show_error=True)

这里host地址可以自行在电脑查询,C:\Windows\System32\drivers\etc\hosts 修改一下即可 127.0.0.1再制定端口号

3.4 密码验证

在首次打开网页前,可以设置账户密码。比如auth参数为(账户,密码)的元组数据。这种模式下不能够使用queue函数。

demo.launch(auth=("admin", "pass1234"))

如果想设置更为复杂的账户密码和密码提示,可以通过函数设置校验规则。

#账户和密码相同就可以通过
def same_auth(username, password):return username == password
demo.launch(auth=same_auth,auth_message="username and password must be the same")

4.案例升级展示

4.1 文本分类

#!pip install gradio, ultralytics, transformers, torchkeras
import gradio as gr 
from transformers import pipelinepipe = pipeline("text-classification")def clf(text):result = pipe(text)label = result[0]['label']score = result[0]['score']res = {label:score,'POSITIVE' if label=='NEGATIVE' else 'NEGATIVE': 1-score}return res demo = gr.Interface(fn=clf, inputs="text", outputs="label")
gr.close_all()
demo.launch(share=True)

4.2 图像分类

import gradio as gr 
import pandas as pd 
from ultralytics import YOLO
from skimage import data
from PIL import Imagemodel = YOLO('yolov8n-cls.pt')
def predict(img):result = model.predict(source=img)df = pd.Series(result[0].names).to_frame()df.columns = ['names']df['probs'] = result[0].probsdf = df.sort_values('probs',ascending=False)res = dict(zip(df['names'],df['probs']))return res
gr.close_all() 
demo = gr.Interface(fn = predict,inputs = gr.Image(type='pil'), outputs = gr.Label(num_top_classes=5), examples = ['cat.jpeg','people.jpeg','coffee.jpeg'])
demo.launch()

4.3 目标检测

import gradio as gr 
import pandas as pd 
from skimage import data
from ultralytics.yolo.data import utils model = YOLO('yolov8n.pt')#load class_names
yaml_path = str(Path(ultralytics.__file__).parent/'datasets/coco128.yaml') 
class_names = utils.yaml_load(yaml_path)['names']def detect(img):if isinstance(img,str):img = get_url_img(img) if img.startswith('http') else Image.open(img).convert('RGB')result = model.predict(source=img)if len(result[0].boxes.boxes)>0:vis = plots.plot_detection(img,boxes=result[0].boxes.boxes,class_names=class_names, min_score=0.2)else:vis = imgreturn viswith gr.Blocks() as demo:gr.Markdown("# yolov8目标检测演示")with gr.Tab("捕捉摄像头喔"):in_img = gr.Image(source='webcam',type='pil')button = gr.Button("执行检测",variant="primary")gr.Markdown("## 预测输出")out_img = gr.Image(type='pil')button.click(detect,inputs=in_img, outputs=out_img)gr.close_all() 
demo.queue(concurrency_count=5)
demo.launch()

4.4 图片筛选器

尽管gradio的设计初衷是为了快速创建机器学习用户交互页面。但实际上,通过组合gradio的各种组件,用户可以很方便地实现非常实用的各种应用小工具。

例如: 数据分析展示dashboard, 数据标注工具, 制作一个小游戏界面等等。

本范例我们将应用 gradio来构建一个图片筛选器,从百度爬取的一堆猫咪表情包中刷选一些我们喜欢的出来。

#!pip install -U torchkeras
import torchkeras 
from torchkeras.data import download_baidu_pictures 
download_baidu_pictures('猫咪表情包',100)import gradio as gr
from PIL import Image
import time,os
from pathlib import Path 
base_dir = '猫咪表情包'
selected_dir = 'selected'
files = [str(x) for x in Path(base_dir).rglob('*.jp*g') if 'checkpoint' not in str(x)]
def show_img(path):return Image.open(path)
def fn_before(done,todo):...return done,todo,path,img
def fn_next(done,todo):...return done,todo,path,img
def save_selected(img_path):...return msg 
def get_default_msg():...return msgwith gr.Blocks() as demo:with gr.Row():total = gr.Number(len(files),label='总数量')with gr.Row(scale = 1):bn_before = gr.Button("上一张")bn_next = gr.Button("下一张")with gr.Row(scale = 2):done = gr.Number(0,label='已完成')todo = gr.Number(len(files),label='待完成')path = gr.Text(files[0],lines=1, label='当前图片路径')feedback_button = gr.Button("选择图片",variant="primary")msg = gr.TextArea(value=get_default_msg,lines=3,max_lines = 5)img = gr.Image(value = show_img(files[0]),type='pil')bn_before.click(fn_before,inputs= [done,todo], outputs=[done,todo,path,img])bn_next.click(fn_next,inputs= [done,todo], outputs=[done,todo,path,img])feedback_button.click(save_selected,inputs = path,outputs = msg)demo.launch()

参考链接:
Gradio官方仓库

基于Gradio可视化部署机器学习应用

gradio官方文档

Gradio让你的机器学习模型性感起来

Gradio搭建演示系统

Gradio上手教程

Gradio:轻松实现AI算法可视化部署

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/223470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法小技巧】如何判断奇偶

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

FRP 内网穿透工具部署

FRP 介绍 frp 是一个专注于内网穿透的高性能反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c;且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 官方网站&#xff1a;https://gofrp.org/zh-cn/ 项目地…

YOLOv8优化策略:UniRepLKNetBlock 助力检测 | UniRepLKNet,通用感知大内核卷积网络,2023.12

🚀🚀🚀本文改进: UniRepLKNet,通用感知大内核卷积网络,ImageNet-22K预训练,精度 和速度SOTA,ImageNet达到88%, COCO达到56.4 box AP,ADE20K达到55.6 mIoU UniRepLKNetBlock 与C2f进行结合使用 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学…

文献阅读(15)Griffin

文章目录 题目&#xff1a;Griffin: Rethinking Sparse Optimization for Deep Learning Architectures时间&#xff1a;2022会议&#xff1a;HPCA研究机构&#xff1a;三星 本篇论文最大的贡献我认为是用统一的表示方法规范表示了各种稀疏计算的类型&#xff0c;并针对不同稀…

Go实现http同步文件操作 - 增删改查

http同步文件操作 - 增删改查 http同步文件操作 - 增删改查1. 前置要求1.1. 构建结构体 文件名 文件内容1.1.1. 页面结构体1.1.2. 为Page结构体绑定方法&#xff1a;Save1.1.3. 对Page结构体支持页面内容查看方法&#xff0c;同时提供页面文件是否存在的方法 1.2. 简单验证上面…

Axure动态面板的应用与ERP系统登录界面、主页左侧菜单栏、公告栏的绘制

目录 一、动态面板 1.1 简介 1.2 使用动态面板的原因 二、动态面板之轮播图实现案例 2.1 完成步骤 2.2 最终效果 三、动态面版之多方式登录案例 四、动态面板之后台主界面左侧菜单栏 五、ERP登录界面 六、ERP主界面菜单栏 七、ERP公告栏 八、登录页面跳转公告栏 一…

【密码学】群的证明(习题)

0.前置知识 1.习题 记录一次密码学作业~群的判定 2.求解

简洁高效的 NLP 入门指南: 200 行实现 Bert 文本分类 (Pytorch 版)

简洁高效的 NLP 入门指南: 100 行实现 Bert 文本分类 Pytorch 版 概述NLP 的不同任务Bert 概述MLM 任务 (Masked Language Modeling)TokenizeMLM 的工作原理为什么使用 MLM NSP 任务 (Next Sentence Prediction)NSP 任务的工作原理NSP 任务栗子NSP 任务的调整和局限性 安装和环…

MQ入门—centos 7安装RabbitMQ 安装

三&#xff1a;RabbitMQ 安装 1.环境准备 Linux 的 CentOS 7.x 版本。Xftp 传输安装包到 Linux。Xshell 连接 Linux&#xff0c;进行解压安装。 RabbitMQ安装包 链接&#xff1a;https://pan.baidu.com/s/1ZYVI4YZlvMrj458jakla9A 提取码&#xff1a;dyto xshell安装包 链接&…

HPM6750系列--第八篇 Segger Embedded Studio for RISC-V查看外设寄存器

一、目的 在博客《HPM6750系列--第五篇 使用Segger Embedded Studio for RISC-V开发环境》中我们详细介绍了在SES中进行开发调试的相关步骤&#xff0c;但是在调试过程中发现未找到外设寄存器窗口&#xff0c;本篇就此问题指导大家进行设置查看寄存器信息。 二、介绍 请务必先阅…

PPT插件-超好用的插件-统一尺寸、裁剪、分布-大珩助手

超级对齐-统一尺寸、裁剪、分布 操作方法 先选中1个或多个形状&#xff0c;然后最后选择目标形状&#xff0c;若希望形状的位置也改变&#xff0c;则需要在对齐幻灯下选中对齐对象。 等比缩放 将选中的1个或多个形状的外形尺寸设置为目标形状大小&#xff0c;图像的纵横比可…

厨房革命@2023:新时代与旧观念的“互搏”

【潮汐商业评论/原创】 你家的厨房电器&#xff0c;多久没换了&#xff1f; 张姐家的灶最近彻底报废了&#xff0c;之前也找人来修过几次&#xff0c;缝缝补补算是用了八年有余。要不是这次彻底坏了&#xff0c;张姐怎么也不会买台新的。 “上次见邻居搬新房装了一台集成灶&…

【数组Array】力扣-304 二维区域和检索 - 矩阵不可变

目录 题目描述 解题过程 labuladong题解 题目描述 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的 左上角 为 (row1, col1) &#xff0c;右下角 为 (row2, col2) 。 实现 NumMatrix 类&#xf…

win10环境下git安装和基础操作

简述 关于git的作用就不多赘述了&#xff0c;配合GitHub&#xff0c;达到方便人们日常项目维护和管理&#xff0c;每一次项目增删改查都可以看的清清楚楚&#xff0c;方便团队协作和个人项目日常维护。 下载git 首先我们自然是要到官网下载git&#xff0c;下载地址为https:/…

电脑录制高清视频文件是怎么设置的

在当今数字化的时代&#xff0c;电脑已经成为我们生活中不可或缺的工具。除了处理文档、浏览网页等常见功能外&#xff0c;它还可以轻松录制高清视频文件。那么&#xff0c;具体如何设置电脑才可以录制高清视频呢&#xff1f; 首先&#xff0c;要确保电脑的硬件配置是否能够支…

IEEE Transactions on Industrial Electronics工业电子TIE论文投稿须知

一、背景 IEEE TIE作为控制领域的TOP期刊&#xff0c;接收机器人、控制、自动驾驶、仪器和传感等方面的论文&#xff0c;当然范围不止这些&#xff0c;感兴趣的可以自行登录TIE官网查看。所投稿论文必须经过实验验证&#xff0c;偏工程应用类&#xff0c;当然也必须有方法上的…

关于“Python”的核心知识点整理大全21

9.3.2 Python 2.7 中的继承 在Python 2.7中&#xff0c;继承语法稍有不同&#xff0c;ElectricCar类的定义类似于下面这样&#xff1a; class Car(object):def __init__(self, make, model, year):--snip-- class ElectricCar(Car):def __init__(self, make, model, year):supe…

overleaf 加载pdf格式的矢量图时,visio 图片保存为pdf格式,如何确保pdf页面大小和图片一致

Overleaf支持多种矢量图形格式&#xff0c;其中一些常见的包括&#xff1a; PDF&#xff08;Portable Document Format&#xff09;&#xff1a; PDF是一种常见的矢量图形格式&#xff0c;Overleaf可以直接加载和显示PDF文件。许多绘图工具和LaTeX生成的图形都可以导出为PDF格式…

算法的四大思想之一:回溯思想

回溯是最重要的算法思想之一&#xff0c;主要解决一些暴力枚举也搞不定的问题&#xff08;组合、子集、分割、排列、棋盘等等&#xff09;。性能并不高&#xff0c;但是那些暴力枚举都无法ko的问题能解出来就可以了&#x1f923;。 一、回溯思想 定义 是一个种基于深度优先搜…

免担心!如果你的处理器不支持TPM 2.0,配置一下就可以安装Windows 11了

这篇文章解释了如何使用Windows注册表编辑器将你的电脑设置为Windows 11,即使你没有支持TPM 2.0的处理器。 如何在不支持的处理器中安装Windows 11 要使你的电脑即使有不受支持的处理器也能安装Windows 11,你需要对Windows注册表进行一些更改。这并不像看上去那么复杂,但也…