Rooni commited on
Commit
dcf0c01
·
verified ·
1 Parent(s): c4825f9

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +163 -0
app.py ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import os
3
+ import random
4
+ import requests
5
+ from PIL import Image
6
+ from io import BytesIO
7
+ from gradio_client import Client, handle_file
8
+
9
+ # Constants
10
+ MAX_SEED = 2**32 - 1
11
+ MAX_IMAGE_SIZE = 1024
12
+
13
+ def get_random_api_key():
14
+ import gradio as gr
15
+ import os
16
+ import random
17
+ from gradio_client import Client, handle_file
18
+ from PIL import Image
19
+ import tempfile
20
+
21
+ # Constants
22
+ MAX_SEED = 2**32 - 1
23
+ MAX_IMAGE_SIZE = 1024
24
+
25
+ def get_random_api_key():
26
+ keys = os.getenv("KEYS", "").split(",")
27
+ return random.choice(keys).strip()
28
+
29
+ def resize_img(image, max_size=1024):
30
+ width, height = image.size
31
+ scaling_factor = min(max_size / width, max_size / height)
32
+ new_width = int(width * scaling_factor)
33
+ new_height = int(height * scaling_factor)
34
+ return image.resize((new_width, new_height), Image.LANCZOS)
35
+
36
+ def process_image(
37
+ image,
38
+ prompt,
39
+ scale,
40
+ seed,
41
+ randomize_seed,
42
+ width,
43
+ height,
44
+ ):
45
+ api_key = get_random_api_key()
46
+ client = Client("InstantX/SD35-IP-Adapter", hf_token=api_key)
47
+
48
+ if randomize_seed:
49
+ seed = random.randint(0, MAX_SEED)
50
+
51
+ if image is None:
52
+ return None, seed
53
+
54
+ # Convert to PIL Image if needed
55
+ if not isinstance(image, Image.Image):
56
+ image = Image.fromarray(image)
57
+
58
+ # Resize image
59
+ resized_image = resize_img(image)
60
+
61
+ # Save the resized image to a temporary file
62
+ with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as temp_file:
63
+ resized_image.save(temp_file.name)
64
+ image_path = temp_file.name
65
+
66
+ try:
67
+ result = client.predict(
68
+ image=handle_file(image_path),
69
+ prompt=prompt,
70
+ scale=scale,
71
+ seed=seed,
72
+ randomize_seed=randomize_seed,
73
+ width=width,
74
+ height=height,
75
+ api_name="/process_image"
76
+ )
77
+ generated_image_url = result[0]['url']
78
+ finally:
79
+ # Удаляем временный файл после использования
80
+ os.remove(image_path)
81
+
82
+ return generated_image_url, result[1]
83
+
84
+ # UI CSS
85
+ css = """
86
+ #col-container {
87
+ margin: 0 auto;
88
+ max-width: 960px;
89
+ }
90
+ """
91
+
92
+ # Create the Gradio interface
93
+ with gr.Blocks(css=css) as demo:
94
+ with gr.Column(elem_id="col-container"):
95
+ gr.Markdown("# InstantX's SD3.5 IP Adapter")
96
+
97
+ with gr.Row():
98
+ with gr.Column():
99
+ input_image = gr.Image(
100
+ label="Input Image",
101
+ type="pil"
102
+ )
103
+ scale = gr.Slider(
104
+ label="Image Scale",
105
+ minimum=0.0,
106
+ maximum=1.0,
107
+ step=0.1,
108
+ value=0.7,
109
+ )
110
+ prompt = gr.Text(
111
+ label="Prompt",
112
+ max_lines=1,
113
+ placeholder="Введите ваш запрос",
114
+ )
115
+ run_button = gr.Button("Сгенерировать", variant="primary")
116
+
117
+ with gr.Column():
118
+ result = gr.Image(label="Результат")
119
+
120
+ with gr.Accordion("Дополнительные настройки", open=False):
121
+ seed = gr.Slider(
122
+ label="Сид",
123
+ minimum=0,
124
+ maximum=MAX_SEED,
125
+ step=1,
126
+ value=42,
127
+ )
128
+
129
+ randomize_seed = gr.Checkbox(label="Случайный сид", value=True)
130
+
131
+ with gr.Row():
132
+ width = gr.Slider(
133
+ label="Ширина",
134
+ minimum=256,
135
+ maximum=MAX_IMAGE_SIZE,
136
+ step=32,
137
+ value=1024,
138
+ )
139
+
140
+ height = gr.Slider(
141
+ label="Высота",
142
+ minimum=256,
143
+ maximum=MAX_IMAGE_SIZE,
144
+ step=32,
145
+ value=1024,
146
+ )
147
+
148
+ run_button.click(
149
+ fn=process_image,
150
+ inputs=[
151
+ input_image,
152
+ prompt,
153
+ scale,
154
+ seed,
155
+ randomize_seed,
156
+ width,
157
+ height,
158
+ ],
159
+ outputs=[result, seed],
160
+ )
161
+
162
+ if __name__ == "__main__":
163
+ demo.launch()