import gradio as gr
from PIL import Image
import os
import spaces
from OmniGen import OmniGenPipeline
# OmniGenモデルの初期化
pipe = OmniGenPipeline.from_pretrained(
"Shitao/OmniGen-v1"
)
@spaces.GPU(duration=180)
# 画像生成の主要機能
def generate_image(text, img1, img2, img3, height, width, guidance_scale, img_guidance_scale, inference_steps, seed, separate_cfg_infer):
# 入力画像の処理
input_images = [img1, img2, img3]
# Noneの画像を除外
input_images = [img for img in input_images if img is not None]
if len(input_images) == 0:
input_images = None
# モデルを使用して画像生成
output = pipe(
prompt=text,
input_images=input_images,
height=height,
width=width,
guidance_scale=guidance_scale,
img_guidance_scale=1.6,
num_inference_steps=inference_steps,
separate_cfg_infer=True, # Falseにすると推論が高速化
use_kv_cache=False,
seed=seed,
)
img = output[0]
return img
# テストケース用のサンプルデータを取得
def get_example():
case = [
[
"A curly-haired man in a red shirt is drinking tea.",
None,
None,
None,
1024,
1024,
2.5,
1.6,
50,
0,
True,
],
[
"The woman in <|image_1|> waves her hand happily in the crowd",
"./imgs/test_cases/zhang.png",
None,
None,
1024,
1024,
2.5,
1.9,
50,
128,
True,
],
[
"A man in a black shirt is reading a book. The man is the right man in <|image_1|>.",
"./imgs/test_cases/two_man.jpg",
None,
None,
1024,
1024,
2.5,
1.6,
50,
0,
True,
],
[
"Two woman are raising fried chicken legs in a bar. A woman is <|image_1|>. The other woman is <|image_2|>.",
"./imgs/test_cases/mckenna.jpg",
"./imgs/test_cases/Amanda.jpg",
None,
1024,
1024,
2.5,
1.8,
50,
168,
True,
],
[
"A man and a short-haired woman with a wrinkled face are standing in front of a bookshelf in a library. The man is the man in the middle of <|image_1|>, and the woman is oldest woman in <|image_2|>",
"./imgs/test_cases/1.jpg",
"./imgs/test_cases/2.jpg",
None,
1024,
1024,
2.5,
1.6,
50,
60,
True,
],
[
"A man and a woman are sitting at a classroom desk. The man is the man with yellow hair in <|image_1|>. The woman is the woman on the left of <|image_2|>",
"./imgs/test_cases/3.jpg",
"./imgs/test_cases/4.jpg",
None,
1024,
1024,
2.5,
1.8,
50,
66,
True,
],
[
"The flower <|image_1|><\/img> is placed in the vase which is in the middle of <|image_2|><\/img> on a wooden table of a living room",
"./imgs/test_cases/rose.jpg",
"./imgs/test_cases/vase.jpg",
None,
1024,
1024,
2.5,
1.6,
50,
0,
True,
],
[
"<|image_1|>\n Remove the woman's earrings. Replace the mug with a clear glass filled with sparkling iced cola.",
"./imgs/demo_cases/t2i_woman_with_book.png",
None,
None,
1024,
1024,
2.5,
1.6,
50,
222,
True,
],
[
"Detect the skeleton of human in this image: <|image_1|>.",
"./imgs/test_cases/control.jpg",
None,
None,
1024,
1024,
2.0,
1.6,
50,
0,
True,
],
[
"Generate a new photo using the following picture and text as conditions: <|image_1|>\n A young boy is sitting on a sofa in the library, holding a book. His hair is neatly combed, and a faint smile plays on his lips, with a few freckles scattered across his cheeks. The library is quiet, with rows of shelves filled with books stretching out behind him.",
"./imgs/demo_cases/skeletal.png",
None,
None,
1024,
1024,
2,
1.6,
50,
42,
True,
],
[
"Following the pose of this image <|image_1|>, generate a new photo: A young boy is sitting on a sofa in the library, holding a book. His hair is neatly combed, and a faint smile plays on his lips, with a few freckles scattered across his cheeks. The library is quiet, with rows of shelves filled with books stretching out behind him.",
"./imgs/demo_cases/edit.png",
None,
None,
1024,
1024,
2.0,
1.6,
50,
123,
True,
],
[
"Following the depth mapping of this image <|image_1|>, generate a new photo: A young girl is sitting on a sofa in the library, holding a book. His hair is neatly combed, and a faint smile plays on his lips, with a few freckles scattered across his cheeks. The library is quiet, with rows of shelves filled with books stretching out behind him.",
"./imgs/demo_cases/edit.png",
None,
None,
1024,
1024,
2.0,
1.6,
50,
1,
True,
],
[
"<|image_1|><\/img> What item can be used to see the current time? Please remove it.",
"./imgs/test_cases/watch.jpg",
None,
None,
1024,
1024,
2.5,
1.6,
50,
0,
True,
],
[
"According to the following examples, generate an output for the input.\nInput: <|image_1|>\nOutput: <|image_2|>\n\nInput: <|image_3|>\nOutput: ",
"./imgs/test_cases/icl1.jpg",
"./imgs/test_cases/icl2.jpg",
"./imgs/test_cases/icl3.jpg",
1024,
1024,
2.5,
1.6,
50,
1,
True,
],
]
return case
# サンプル実行用の関数
def run_for_examples(text, img1, img2, img3, height, width, guidance_scale, img_guidance_scale, inference_steps, seed, separate_cfg_infer,):
return generate_image(text, img1, img2, img3, height, width, guidance_scale, img_guidance_scale, inference_steps, seed, separate_cfg_infer,)
# アプリケーションの説明文
description = """
OmniGenは、以下のような様々なタスクを実行できる統合画像生成モデルです:
- テキストから画像への生成
- 被写体主導の生成
- アイデンティティを保持した生成
- 画像条件付き生成
マルチモーダルから画像を生成する場合:
- プロンプトには文字列を入力
- 入力画像はリストとして渡す
- プロンプト内の画像プレースホルダーは `<|image_*|>` 形式で指定
(1番目の画像は <|image_1|>、2番目は <|image_2|>)
使用上のヒント:
- 色が過飽和な場合:`guidance_scale` を下げてください
- 画質が低い場合:より詳細なプロンプトを使用してください
- アニメ調の場合:プロンプトに `photo` を追加してみてください
- 生成済み画像の編集:同じseedは使用できません(例:生成時seed=0なら、編集時はseed=1など)
- 画像編集タスクでは、画像を編集指示の前に配置することを推奨
(例:`<|image_1|> remove suit` を使用し、`remove suit <|image_1|>` は避ける)
"""
separate_cfg_infer_arg = False
# Gradio インターフェースの構築
with gr.Blocks() as demo:
gr.Markdown("# OmniGen: 統合画像生成モデル [論文](https://arxiv.org/abs/2409.11340) [コード](https://github.com/VectorSpaceLab/OmniGen)")
gr.Markdown(description)
with gr.Row():
with gr.Column():
# プロンプト入力
prompt_input = gr.Textbox(
label="プロンプトを入力してください(i番目の入力画像は<|image_i|>で指定)",
placeholder="ここにプロンプトを入力..."
)
with gr.Row(equal_height=True):
# 画像入力
image_input_1 = gr.Image(label="画像1: <|image_1|>", type="filepath")
image_input_2 = gr.Image(label="画像2: <|image_2|>", type="filepath")
image_input_3 = gr.Image(label="画像3: <|image_3|>", type="filepath")
# 画像サイズ設定
height_input = gr.Slider(
label="画像の高さ", minimum=256, maximum=2048, value=1024, step=16
)
width_input = gr.Slider(
label="画像の幅", minimum=256, maximum=2048, value=1024, step=16
)
# 各種パラメータ設定
guidance_scale_input = gr.Slider(
label="ガイダンススケール", minimum=1.0, maximum=5.0, value=2.5, step=0.1
)
img_guidance_scale_input = gr.Slider(
label="画像ガイダンススケール", minimum=1.0, maximum=2.0, value=1.6, step=0.1
)
num_inference_steps = gr.Slider(
label="推論ステップ数", minimum=1, maximum=100, value=50, step=1
)
seed_input = gr.Slider(
label="シード値", minimum=0, maximum=2147483647, value=42, step=1
)
separate_cfg_infer = gr.Checkbox(
label="CFG推論を分離", info="分離CFG推論を有効にする"
)
# 生成ボタン
generate_button = gr.Button("画像を生成")
with gr.Column():
# 出力画像表示
output_image = gr.Image(label="生成された画像")
# ボタンクリックイベントの設定
generate_button.click(
generate_image,
inputs=[
prompt_input,
image_input_1,
image_input_2,
image_input_3,
height_input,
width_input,
guidance_scale_input,
img_guidance_scale_input,
num_inference_steps,
seed_input,
separate_cfg_infer,
],
outputs=output_image,
)
# サンプル例の設定
gr.Examples(
examples=get_example(),
fn=run_for_examples,
inputs=[
prompt_input,
image_input_1,
image_input_2,
image_input_3,
height_input,
width_input,
guidance_scale_input,
img_guidance_scale_input,
num_inference_steps,
seed_input,
separate_cfg_infer,
],
outputs=output_image,
)
# アプリケーションの起動
demo.launch()