File size: 5,298 Bytes
e4e5c86
 
 
d11ef48
 
42806d6
 
 
e4e5c86
d3384a1
d11ef48
d3384a1
d11ef48
d3384a1
d11ef48
d3384a1
e4e5c86
d3384a1
e4e5c86
 
d3384a1
d11ef48
d3384a1
e4e5c86
 
d3384a1
 
e4e5c86
d3384a1
 
d11ef48
 
 
 
 
 
 
d3384a1
d11ef48
 
 
 
d3384a1
d11ef48
42806d6
d3384a1
e4e5c86
42806d6
 
 
e4e5c86
 
d3384a1
42806d6
e4e5c86
 
 
 
 
 
d3384a1
e4e5c86
 
 
d3384a1
e4e5c86
42806d6
e4e5c86
 
d3384a1
e4e5c86
42806d6
 
e4e5c86
 
42806d6
e4e5c86
 
 
d3384a1
e4e5c86
d3384a1
 
e4e5c86
d3384a1
42806d6
 
 
e4e5c86
42806d6
e4e5c86
 
 
 
42806d6
e4e5c86
 
 
 
 
 
d3384a1
e4e5c86
d3384a1
e4e5c86
 
42806d6
e4e5c86
d3384a1
e4e5c86
42806d6
e4e5c86
 
 
42806d6
e4e5c86
d3384a1
e4e5c86
42806d6
e4e5c86
 
d3384a1
e4e5c86
 
42806d6
e4e5c86
 
 
42806d6
e4e5c86
 
 
42806d6
e4e5c86
 
 
42806d6
e4e5c86
 
d3384a1
e4e5c86
42806d6
 
e4e5c86
42806d6
d3384a1
e4e5c86
 
42806d6
 
 
e4e5c86
 
d3384a1
e4e5c86
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import gradio as gr
import numpy as np
import random
from diffusers import DiffusionPipeline
import torch
from PIL import Image
import requests
from io import BytesIO

# デバイスを設定(CUDAが利用可能ならGPUを使用)
device = "cuda" if torch.cuda.is_available() else "cpu"
model_repo_id = "dalle-mini/dalle-mini"  # 使用するモデルのリポジトリID

# モデルをロード
pipe = DiffusionPipeline.from_pretrained(model_repo_id)
pipe = pipe.to(device)  # モデルを選択したデバイスに移動

# 最大のシード値を定義
MAX_SEED = np.iinfo(np.int32).max

# 画像生成関数
def infer(prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps):
    # シードをランダム化するオプションの処理
    if randomize_seed:
        seed = random.randint(0, MAX_SEED)

    # シードを指定して画像生成のための乱数生成器を作成
    generator = torch.Generator().manual_seed(seed)

    # プロンプトから画像を生成
    image = pipe(
        prompt=prompt,
        guidance_scale=guidance_scale,
        num_inference_steps=num_inference_steps,
        width=width,
        height=height,
        generator=generator
    ).images[0]  # 生成された画像のリストから最初の画像を取得
    
    # 画像を保存
    image.save("generated_image.png")
    
    # 生成された画像とダウンロードリンク、シードを返す
    return image, "generated_image.png", seed

# サンプルプロンプトのリスト
examples = [
    "ジャングルの中の宇宙飛行士、寒色のパレット、 muted colors、詳細、8k",
    "緑の馬に乗った宇宙飛行士",
    "美味しそうなセビーチェチーズケーキスライス",
]

# スタイルシートの設定
css = """
#col-container {
    margin: 0 auto;
    max-width: 640px;
}
"""

# Gradioのインターフェースを構築
with gr.Blocks(css=css) as demo:
    
    with gr.Column(elem_id="col-container"):
        # タイトルの表示
        gr.Markdown(f"""
        # テキストから画像への生成器
        """)
        
        # プロンプト入力と実行ボタン
        with gr.Row():
            prompt = gr.Textbox(
                label="プロンプト",
                show_label=False,
                max_lines=1,
                placeholder="プロンプトを入力してください",
                container=False,
            )
            
            run_button = gr.Button("生成", scale=0)  # 画像生成ボタン
        
        result = gr.Image(label="結果", show_label=False)  # 生成された画像を表示するための領域
        download_link = gr.File(label="生成された画像をダウンロード")  # 画像をダウンロードするリンク

        # 詳細設定のアコーディオン
        with gr.Accordion("詳細設定", open=False):
            negative_prompt = gr.Textbox(
                label="ネガティブプロンプト",
                max_lines=1,
                placeholder="ネガティブプロンプトを入力してください",
                visible=False,
            )
            
            seed = gr.Slider(
                label="シード",
                minimum=0,
                maximum=MAX_SEED,
                step=1,
                value=0,
            )
            
            randomize_seed = gr.Checkbox(label="シードをランダム化", value=True)  # シードのランダム化オプション
            
            # 画像の幅と高さを設定するスライダー
            with gr.Row():
                width = gr.Slider(
                    label="幅",
                    minimum=256,
                    maximum=1024,
                    step=32,
                    value=1024,
                )
                
                height = gr.Slider(
                    label="高さ",
                    minimum=256,
                    maximum=1024,
                    step=32,
                    value=1024,
                )
            
            # ガイダンススケールと推論ステップ数を設定するスライダー
            with gr.Row():
                guidance_scale = gr.Slider(
                    label="ガイダンススケール",
                    minimum=0.0,
                    maximum=10.0,
                    step=0.1,
                    value=7.5,
                )
                
                num_inference_steps = gr.Slider(
                    label="推論ステップ数",
                    minimum=1,
                    maximum=50,
                    step=1,
                    value=20,
                )
        
        # サンプルプロンプトを提供する機能
        gr.Examples(
            examples=examples,
            inputs=[prompt]
        )

    # ボタンをクリックまたはプロンプトを送信すると画像生成をトリガー
    gr.on(
        triggers=[run_button.click, prompt.submit],
        fn=infer,
        inputs=[prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps],
        outputs=[result, download_link, seed]
    )

# Gradioアプリを起動
demo.queue().launch()