0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

gradio はじめてのWEB UI作成 (入門者)

Last updated at Posted at 2024-11-12

gradio入門

はじめてのWEB UI作成

gradioをインストール

pip install gradio

シンプルなWEB UIを作成して起動

( 名前を入力して名前へのあいさつを出力するWEB UI )

import gradio as gr

# あいさつの関数
def greet(name):
    return "Hello " + name + "!"
    
# Interfaceの作成
demo = gr.Interface(
    fn=greet,
    inputs="text",
    outputs="text"
)

# 起動
demo.launch()

実行

image 1.png

Interface

interface は関数をUIでラップするためのクラス

主なパラメータは以下の通り

  • fn : ラップする関数
  • inputs : 入力コンポーネント ( “text” “image” “audio”など )
  • outputs : 出力コンポーネント ( “text” “image” “label”など )

コンポーネント

「inputs」と「outputs」には「コンポーネント」を指定することができる。

コンポーネントは、コンポーネント属性でカスタマイズできる。

以下では、inputs にコンポーネント「TextBox」を指定し、行数に2、プレースホルダーに ”Name Here…” を指定している。

import gradio as gr

# あいさつの関数
def greet(name):
    return "Hello " + name + "!"
    
# Interfaceの作成
demo = gr.Interface(
    fn=greet,
    inputs=gr.Textbox(
        lines=2, #行数
        placeholder="Name Here..." # プレースホルダ
    ),
    outputs="text",
)

# 起動
demo.launch()

実行

image 2.png

複数の入出力

「inputs」と「outputs」には複数のコンポーネントを指定することもできる。

これによって複数の入出力を持つ関数をラップすることができる。

以下では複数の入出力を行っている。

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)

# Interfaceの作成
demo = gr.Interface(
    fn=greet,
    inputs=["text", "checkbox", gr.Slider(0, 100)],
    outputs=["text", "number"]
)

# 起動
demo.launch()

** temperature = 温度

実行

image 3.png

画像の入出力

「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

# Interfaceの作成
demo = gr.Interface(
    fn=sepia,
    inputs=gr.Image(shape=(200, 200)),
    outputs="image"
)

# 起動
demo.launch()
import numpy as np
import gradio as gr
from PIL import Image

# セピア化の関数
def sepia(input_img):
    # 入力画像をリサイズ200x200する
    input_img = input_img.resize((200, 200))
    
    sepia_filter = np.array([
        [0.393, 0.769, 0.189], 
        [0.349, 0.686, 0.168], 
        [0.272, 0.534, 0.131]
    ])
    
    # 画像をNumPy配列に変換してフィルタを適用
    input_np = np.array(input_img)
    sepia_img = input_np.dot(sepia_filter.T)
    
    # ピクセル値を0255の範囲にスケーリング
    sepia_img = np.clip(sepia_img, 0, 255).astype(np.uint8)
    
    return Image.fromarray(sepia_img)

# Interfaceの作成
demo = gr.Interface(
    fn=sepia, 
    inputs=gr.Image(image_mode="RGB"),  # shapeではなくimage_modeを指定
    outputs="image"
)

# 起動
demo.launch()

実行

image 4.png

Blocks

gradioはアプリを構築するため、「Interface」の他に「Blocks」も提供する。

  • Interface : 関数をUIでラップするための高レベルクラス
  • Blocks : より柔軟なレイアウトとデータフローを実現するための低レベルクラス

以下では、「はじめてのWEB UIの作成」を「Blocks」で書き直す。

import gradio as gr

# あいさつの関数
def greet(name):
    return "Hello " + name + "!"

# Blocksの作成
with gr.Blocks() as demo:
    # UI
    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()

実行

image 5.png

複雑なBlocksの例

以下はより複雑な「Blocks」の例

import numpy as np
import gradio as gr

# テキストフリップの関数
def flip_text(x):
    return x[::-1]

# 画像フリップの関数
def flip_image(x):
    return np.fliplr(x)

# Blocksの作成
with gr.Blocks() as demo:
    # UI
    gr.Markdown("Flip text or image files using this demo.")
    with gr.Tabs():
        # Flip Textタブ
        with gr.TabItem("Flip Text"):
            text_input = gr.Textbox()
            text_output = gr.Textbox()
            text_button = gr.Button("Flip")

        # Flip Imageタブ
        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()

** flip = 反転

実行

image 6.png

image.png

参照元

gradio 入門 (1) - 事始め|npaka

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?