当前位置: 首页 > news >正文

graido学习记录

为了将来部署!学tmd!

首先简单的打个招呼

import gradio as gr

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()

表示输入输出都是文本“text”。

Interface 类可以用用户接口包装任意的Python函数。在上面的示例中,我们使用了一个基于文本的简单函数,但这个函数可以是任何东西。

Interface 类核心需要三个参数初始化:

  • fn : 被UI包装的函数
  • inputs : 作为输入的组件 (例如: "text""image" or "audio")
  • outputs : 作为输出的组件 (例如: "text""image" or "label")

如果希望它更大并有一个文本占位符。如果我们使用 Textbox 的实际类,而不是使用字符串快捷方式,就可以通过组件属性实现个性化。

import gradio as gr

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(
    fn=greet,
    inputs=gr.Textbox(lines=2, placeholder="Name Here..."),
    outputs="text",
)
demo.launch()

一个更复杂的函数,有多个输入和输出。比如下面例子,三个输入,两个输出,

输入:第一个为名字(text),第二个是选择项is_morning(checkbox),第三个是滑动条,范围0-100(slider)

输出:第一个为打招呼方式(text),第二个为数字,保留两位小数。

import gradio as gr

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中的每个组件都对应于函数的一个返回值,两者均按顺序对应。

如何处理图像?

简单的处理~sepia

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(), gr.Image())
demo.launch()

当使用Image组件作为输入时,您的函数将接收一个形状为 (height, width, 3) 的NumPy数组,其中最后一个维度表示RGB值。我们还将以NumPy数组的形式返回一张图像。你也可用 type= 关键字参数设置组件使用的数据类型。例如,如果你想让你的函数获取一个图像的文件路径,而不是一个NumPy数组时,输入 Image 组件可以写成:

gr.Image(type="filepath", shape=...)
import numpy as np
import gradio as gr
from PIL import Image

def sepia(input_img):
    input_img = Image.open(input_img)
    input_img = np.array(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(type="filepath",sources="upload"), gr.Image())
demo.launch()

需要有些修改,传的是图片地址,需要转成np.array()

Blocks: 更加灵活且可控

Gradio 提供了两个类来构建应用程序

1. Interface,一个高级抽象。

2. Blocks,一个用于设计具有更灵活布局和数据流的web应用程序的初级API。block可以做许多事,比如特征化多个数据流和演示,控制组件在页面上出现的位置,处理复杂的数据流(例如,输出可以作为其他函数的输入),以及根据用户交互更新组件的属性/可见性,且仍然在Python中。

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

不用像interface一样一次性就所有输入都输入,可以有中间状态,可读性和灵活性增加。

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("Flip text or image files using this demo.")
    with gr.Tabs():
        with gr.TabItem("Flip Text"):
            text_input = gr.Textbox()
            text_output = gr.Textbox()
            text_button = gr.Button("Flip")
        with gr.TabItem("Flip Image"):
            with gr.Row():
                image_input = gr.Image()
                image_output = gr.Image()
            image_button = gr.Button("Flip")

    text_button.click(flip_text, inputs=text_input, outputs=text_output)
    image_button.click(flip_image, inputs=image_input, outputs=image_output)

demo.launch()

作用就是对输入的字符串反转,对输入的图像翻转,也就是镜像。

你可以通过设置的参数来控制单次处理的请求数queue()

demo = gr.Interface(...).queue(default_concurrency_limit=5)
demo.launch()
with gr.Blocks().queue(default_concurrency_limit=5) as demo:
    pass

demo.launch()

流式输出

如若希望传输一系列输出,而不是一次显示单个输出。例如,您可能有一个图像生成模型,并且想要显示在每个步骤生成的图像,直至最终图像。或者您可能有一个聊天机器人,它一次流式传输一个令牌的响应,而不是一次返回所有令牌。

在这种情况下,您可以向 Gradio 提供一个生成器函数,而不是常规函数。在 Python 中创建生成器非常简单:return函数应该是yield一个一系列值,而不是单个值。通常,yield语句放在某种循环中。下面是一个简单地计数到给定数字的生成器示例

def my_generator(x):
    for i in range(x):
        yield i

直接看例子,伪diffusion()

import gradio as gr
import numpy as np
import time
def fake_diffusion(steps):
    rng = np.random.default_rng()
    for i in range(steps):
        time.sleep(1)
        image = rng.random(size=(600, 600, 3))
        yield image
    image = np.ones(shape=(600, 600, 3), dtype=np.uint8)
    image[:] = [255, 0, 255]
    yield image
with gr.Blocks() as demo:
    input = gr.Slider(1, 10,3,step=1)
    ouput = gr.Image()
    diffusion_btn = gr.Button("fake_diffusion")
    diffusion_btn.click(fake_diffusion, inputs=input, outputs=ouput)
demo.launch()

伪扩散模型,希望模拟扩散模型的一个过程,输入扩散有多少步, 输出图像

输入图像随机,使用rng = np.random.default_rng()

                                image = rng.random(size = (600, 600, 3)) 生成随机图像。

相关文章:

  • 【图论】判断图中有环的两种方法及实现
  • vi的常见操作命令
  • [数据结构] - - - 链表
  • 面试题02.01.移除重复节点
  • 【计算机网络03】网络层协议IP(详细)
  • 苹果的 AI 紧急情况
  • KMP算法!
  • Linux 基础---sudo权限 修改文件所属人、用户所属组
  • 【论文阅读笔记】用于恶劣天气条件下的目标检测的IA-YOLO(Image-Adaptive YOLO) | 适合雾天和低光照场景
  • 爱吃蟠桃的孙悟空
  • Deepseek API+Python测试用例一键生成与导出
  • JavaWeb(Day8)-登录校验(JWT令牌,Filter过滤器,Interceptor拦截器)
  • MySQL零基础教程14—子查询
  • Mybatis 的代理开发方式
  • golang接口
  • JS逆向获取算法 使用算法逻辑进行爆破
  • 晨控CK-FR03与汇川H5U系列PLC配置EtherCAT通讯连接手册
  • 蓝桥杯真题解题思路——因数计数
  • [免费]微信小程序(校园)二手交易系统(uni-app+SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
  • C++小课堂——构造函数与析构函数
  • 明查|哈佛大学批改美教育部长来信,红笔标出语法错误?
  • 王受文已任全国工商联党组成员
  • 国家税务总局泰安市税务局:山东泰山啤酒公司欠税超536万元
  • 成都公积金新政征求意见:购买保障性住房最高贷款额度上浮50%
  • 少年中国之少年的形塑
  • 万里云端遇见上博--搭乘“上博号”主题飞机体验记