乐趣区

关于challenge:Gradio入门到进阶全网最详细教程一快速搭建AI算法可视化部署演示侧重项目搭建和案例分享

Gradio 入门到进阶全网最具体教程[一]:疾速搭建 AI 算法可视化部署演示(偏重我的项目搭建和案例分享)

罕用的两款 AI 可视化交互利用比拟:

  • Gradio

    Gradio 的劣势在于易用性,代码构造相比 Streamlit 简略,只需简略定义输出和输入接口即可疾速构建简略的交互页面,更轻松部署模型。适宜场景绝对简略,想要疾速部署利用的开发者。便于分享:gradio 能够在启动利用时设置 share=True 参数创立内部分享链接,能够间接在微信中分享给用户应用。

不便调试:gradio 能够在 jupyter 中间接展现页面,更加不便调试。

  • Streamlit

    Streamlit 的劣势在于可扩展性,相比 Gradio 简单,齐全纯熟应用须要肯定工夫。能够应用 Python 编写残缺的蕴含前后端的交互式利用。适宜场景绝对简单,想要构建丰盛多样交互页面的开发者。

Gradio 官网链接:https://gradio.app/

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:7860

To 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 应用程序
    • local_url,本地地址
    • share_url,公共地址,当 share=True 时生成
import gradio as gr

def 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 / 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 同理。

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 gr

def calculator(num1, operation, num2):
    if operation == "add":
        return num1 + num2
    elif operation == "subtract":
        return num1 - num2
    elif operation == "multiply":
        return num1 * num2
    elif operation == "divide":
        return num1 / num2

iface = 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 + num2
    elif operation == "subtract":
        return num1 - num2
    elif operation == "multiply":
        return num1 * num2
    elif 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)
    #返回分数 top3
    top_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 按钮。当测试您的模型的用户看到某个输出导致输入谬误或意外的模型行为,他们能够标记这个输出让开发者晓得。这个文件夹由 Interface 的 flagging_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+1
    atob = gr.Button("b > a")
    atob.click(increase, a, b)
    # 要想 a >b,则使得 a = b+1
    btoa = 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()
组件可视化:输入可视化从无到有

如下所示,咱们能够通过 visible 和 update 函数构建更为简单的利用。

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_textbox
    input_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 pipeline
 
pipe = 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 Image
 
model = 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].probs
    df = 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 = img
    return vis
    
with 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 msg
    
    
with 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 官网文档

本文参加了 SegmentFault 思否写作挑战赛,欢送正在浏览的你也退出。

退出移动版