• 1、【gradio】快速开始,构建自己的机器学习的应用



    先决条件:Gradio 需要 Python 3.8 或更高版本。

    Gradio能做什么

    与他人分享你的机器学习模型、API或数据科学工作流的最佳方式之一是创建一个交互式应用,让你的用户或同事可以在他们的浏览器中尝试这个演示。

    Gradio 允许你构建并分享演示,所有这些都是用 Python 完成的。通常只需几行代码!那么,让我们开始吧。

    Hello, World

    要使用一个简单的“Hello, World”示例来运行 Gradio,请按照以下三个步骤操作:

    1. 使用 pip 安装 Gradio:
    pip install gradio
    
    • 1
    1. 将下面的代码作为 Python 脚本运行,或在 Jupyter Notebook (或 Google Colab) 中运行:
    import gradio as gr
    
    def greet(name):
        return "Hello " + name + "!"
    
    demo = gr.Interface(fn=greet, inputs="text", outputs="text")
        
    demo.launch()   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    我们将导入的名字缩写为 gr,以便更好地阅读使用 Gradio 的代码。这是一个广泛采用的约定,你应该遵循,以便任何使用你的代码的人都能轻松理解它。

    1. 下面的演示将自动出现在 Jupyter Notebook 中,或者如果从脚本运行,将在 http://localhost:7860 上弹出浏览器:
      Hello
    gradio app.py
    
    • 1

    当在本地开发时,如果你想将代码作为 Python 脚本运行,你可以使用 Gradio CLI 来启动应用程序在重新加载模式,这将提供无缝和快速的开发。在自动重新加载指南中了解更多关于重新加载的信息。

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

    Interface类

    你会注意到,为了制作演示,我们创建了一个 gr.Interface。这个 Interface 类可以将任何 Python 函数包装成一个用户界面。在上面的例子中,我们看到了一个简单的基于文本的函数,但这个函数可以是从音乐生成器到税务计算器,再到预训练机器学习模型的预测函数。

    核心 Interface 类在初始化时需要三个必需的参数:

    • fn: 需要围绕其构建 UI 的函数
    • inputs: 用于输入的组件(例如 “text”、“image” 或 “audio”)
    • outputs: 用于输出的组件(例如 “text”、“image” 或 “label”)

    让我们更仔细地看看这些用于提供输入和输出的组件。

    组件属性

    在前面的示例中,我们看到了一些简单的文本框组件,但是如果你想改变 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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    更新

    多个输入和输出组件

    假设你有一个更复杂的函数,具有多个输入和输出。在下面的例子中,我们定义了一个函数,它接受一个字符串、布尔值和数字,并返回一个字符串和数字。看看你是如何传递一组输入和输出组件的。

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    早上好

    你只需将组件放在一个列表中。输入列表中的每个组件按顺序对应于函数的一个参数。输出列表中的每个组件按顺序对应于函数返回的一个值。

    一个图片的Example

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    图片的Example
    在使用 Image 组件作为输入时,你的函数将接收一个形状为 (height, width, 3) 的 NumPy 数组,其中最后一个维度表示 RGB 值。我们也将以 NumPy 数组的形式返回一个图像。

    你还可以通过 type= 关键字参数设置组件使用的数据类型。例如,如果你希望你的函数接受一个图像的文件路径,而不是一个 NumPy 数组,那么输入的 Image 组件可以写成:

    gr.Image(type="filepath", shape=...)
    
    • 1

    还要注意,我们的输入 Image 组件带有一个编辑按钮 🖉,它允许裁剪和缩放图像。以这种方式操作图像可以帮助揭示机器学习模型中的偏见或隐藏的缺陷!

    Chatbot(聊天机器人)

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    chatbot

    Blocks:更多的灵活性和控制

    Gradio 提供了两种构建应用程序的方法:

    1. 接口和聊天接口(Interface 和 ChatInterface),这提供了创建我们迄今为止讨论过的演示的高级抽象。
    2. Blocks,一个用于设计具有更灵活布局和数据流的网络应用程序的低级 API。模块允许你做一些像特定多个数据流和演示、控制组件在页面上的位置、处理复杂的数据流(例如,输出可以作为其他函数的输入),以及基于用户交互更新组件的属性/可见性的事情 —— 还都是在 Python 中。如果你需要这种定制性,尝试使用模块!

    Hello, Blocks

    让我们看一个简单的例子。注意这里的 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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Blocks
    需要注意的事项:

    1. 模块(Blocks)是通过 with 语句创建的,任何在此语句内创建的组件都会自动添加到应用程序中。
    2. 组件将按照创建顺序在应用程序中垂直显示。(稍后我们将介绍如何自定义布局!)
    3. 创建了一个按钮,然后为这个按钮添加了一个点击事件监听器。这个 API 的设计应该看起来很熟悉!就像接口(Interface)一样,click 方法接受一个 Python 函数,输入组件和输出组件。

    更复杂一点的实现

    通过以下应用程序,让你体验一下 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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

  • 相关阅读:
    codeforces 1572B. Xor of 3 (div1)
    【pandas小技巧】--列值的映射
    Mysql事务日志
    vue3 api笔记
    Alvaria宣布客户体验行业资深人士Jeff Cotten担任新首席执行官
    百分点科技|怎样做数据运营,才能让数据中台真正用起来?
    破浪前行:互联网行业浪潮中的一心人攻略
    项目管理软件dhtmlxGantt配置教程(十六):如何设置动态化比例
    Linux安装JDK和Tomcat
    Linux进程通信:命名管道,System V共享内存
  • 原文地址:https://blog.csdn.net/song19891121/article/details/133618033