🤗
GradioでImageを使うときの3つのtype
はじめに
Gradio で Image を使うとき、numpy.array, PIL.Image or str filepath
の 3 タイプがあります(デフォルトではnumpy.array
)。
それぞれ、使い所がありそうなので必要に応じてタイプを選ぶ必要がありそうです。
また、タイプによって画像の扱い方が違うので注意が必要です。
ここでは、画像をサーバー側で保存する方法について、コードを踏まえて説明します。
コードと画面
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 色々できて便利そうなので、もっと理解して色々試したいなと思います。
Discussion