🤗

GradioでImageを使うときの3つのtype

2023/12/16に公開

はじめに

Gradio で Image を使うとき、numpy.array, PIL.Image or str filepathの 3 タイプがあります(デフォルトではnumpy.array)。
それぞれ、使い所がありそうなので必要に応じてタイプを選ぶ必要がありそうです。
また、タイプによって画像の扱い方が違うので注意が必要です。
ここでは、画像をサーバー側で保存する方法について、コードを踏まえて説明します。

https://www.gradio.app/docs/image

コードと画面

Gradio のシンプルな画面を作って、3 つのタイプでそれぞれ保存しています。
filepathを指定すると一時的に保存されているファイルのパスを文字列として取得できます。

main.py
import os
import shutil
import numpy as np
import gradio as gr
from PIL import Image

def save_image_pil(image: Image):
    # イメージを保存
    image.save("image.jpeg")
    pass

def save_image_numpy(image_array: np.array):
    # numpy配列からPillowイメージに変換
    image = Image.fromarray(np.uint8(image_array)).convert('RGB')
    # イメージを保存
    image.save("pil.jpeg")
    pass

def save_image_filepath(filepath: str):
    print(filepath)
    # イメージを保存
    _, file_extension = os.path.splitext(filepath)
    shutil.copy(filepath, './filepath{}'.format(file_extension))
    pass

with gr.Blocks() as demo:
    gr.Markdown("Image types.")
    with gr.Row():
        # pil: pillowのImageクラスとして入力。デフォルトはnupy。
        with gr.Column():
            image_input_pil = gr.Image(type='pil')
            image_button_pil = gr.Button("pil")
        with gr.Column():
            image_input_numpy = gr.Image(type='numpy')
            image_button_numpy = gr.Button("numpy")
        with gr.Column():
            image_input_filepath = gr.Image(type='filepath')
            image_button_filepath = gr.Button("filepath")

    image_button_pil.click(save_image_pil, inputs=image_input_pil)
    image_button_numpy.click(save_image_numpy, inputs=image_input_numpy)
    image_button_filepath.click(save_image_filepath, inputs=image_input_filepath)

demo.launch()

必要なパッケージをインストールして、下記コマンドで実行します。

pip install gradio pillow
python main.py

ブラウザで以下のような画面が表示されます。3 種類の方法で保存できるようにしてみました。
画像をアップロードしそれぞれのボタンを押すと保存されます。

アップロード前

アップロード後

短いですが、コードをみると、それぞれのタイプに応じた処理をイメージできるかと思います。画像(Image)だけに。

おわりに

書いてみると、ものすごくシンプルなコードですが、あまり情報見つからなかったので、同じような人のためになればと思います。
Gradio 色々できて便利そうなので、もっと理解して色々試したいなと思います。

GitHubで編集を提案

Discussion