akaUNik commited on
Commit
41efa6c
·
verified ·
1 Parent(s): 594af40

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +348 -0
  2. ДЗ_6.md +22 -0
app.py ADDED
@@ -0,0 +1,348 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import numpy as np
3
+ import random
4
+ import torch
5
+ from PIL import Image
6
+
7
+ from diffusers import (
8
+ DiffusionPipeline,
9
+ StableDiffusionControlNetPipeline,
10
+ ControlNetModel
11
+ )
12
+ from peft import PeftModel
13
+
14
+ device = "cuda" if torch.cuda.is_available() else "cpu"
15
+
16
+ LORA_MODEL = "akaUNik/hw5-homm3-lora-15"
17
+ LORA_BASE_MODEL = "runwayml/stable-diffusion-v1-5"
18
+
19
+ # Model list including LoRA model
20
+ MODEL_LIST = [
21
+ "runwayml/stable-diffusion-v1-5",
22
+ "stabilityai/sdxl-turbo",
23
+ "stabilityai/stable-diffusion-2-1",
24
+ LORA_MODEL, # LoRA model option
25
+ ]
26
+
27
+ # ControlNet modes list with aliases
28
+ CONTROLNET_MODES = {
29
+ "Canny Edge Detection": "lllyasviel/control_v11p_sd15_canny",
30
+ "Pixel to Pixel": "lllyasviel/control_v11e_sd15_ip2p",
31
+ "Inpainting": "lllyasviel/control_v11p_sd15_inpaint",
32
+ "Multi-Level Line Segments": "lllyasviel/control_v11p_sd15_mlsd",
33
+ "Depth Estimation": "lllyasviel/control_v11f1p_sd15_depth",
34
+ "Surface Normal Estimation": "lllyasviel/control_v11p_sd15_normalbae",
35
+ "Image Segmentation": "lllyasviel/control_v11p_sd15_seg",
36
+ "Line Art Generation": "lllyasviel/control_v11p_sd15_lineart",
37
+ "Anime Line Art": "lllyasviel/control_v11p_sd15_lineart_anime",
38
+ "Human Pose Estimation": "lllyasviel/control_v11p_sd15_openpose",
39
+ "Scribble-Based Generation": "lllyasviel/control_v11p_sd15_scribble",
40
+ "Soft Edge Generation": "lllyasviel/control_v11p_sd15_softedge",
41
+ "Image Shuffling": "lllyasviel/control_v11e_sd15_shuffle",
42
+ "Image Tiling": "lllyasviel/control_v11f1e_sd15_tile",
43
+ }
44
+
45
+ if torch.cuda.is_available():
46
+ torch_dtype = torch.float16
47
+ else:
48
+ torch_dtype = torch.float32
49
+
50
+ # Cache to avoid re-initializing pipelines repeatedly
51
+ model_cache = {}
52
+
53
+ MAX_SEED = np.iinfo(np.int32).max
54
+ MAX_IMAGE_SIZE = 512
55
+
56
+ def infer(
57
+ model_id,
58
+ prompt,
59
+ negative_prompt,
60
+ seed,
61
+ randomize_seed,
62
+ width,
63
+ height,
64
+ guidance_scale,
65
+ num_inference_steps,
66
+ lora_scale,
67
+ controlnet_enable,
68
+ controlnet_mode,
69
+ controlnet_strength,
70
+ controlnet_image,
71
+ ip_adapter_enable,
72
+ ip_adapter_scale,
73
+ ip_adapter_image,
74
+ progress=gr.Progress(track_tqdm=True),
75
+ ):
76
+ if randomize_seed:
77
+ seed = random.randint(0, MAX_SEED)
78
+ generator = torch.Generator(device=device).manual_seed(seed)
79
+
80
+ # Cache
81
+ # if (model_id, controlnet_enable, controlnet_image, controlnet_mode) in model_cache:
82
+ # pipe = model_cache[(model_id, controlnet_enable, controlnet_image, controlnet_mode)]
83
+ # else:
84
+
85
+ pipe = None
86
+ if controlnet_enable and controlnet_image:
87
+ controlnet_model = ControlNetModel.from_pretrained(
88
+ CONTROLNET_MODES.get(controlnet_mode),
89
+ torch_dtype=torch_dtype
90
+ )
91
+ if model_id == LORA_MODEL:
92
+ pipe = StableDiffusionControlNetPipeline.from_pretrained(
93
+ LORA_BASE_MODEL,
94
+ controlnet=controlnet_model,
95
+ torch_dtype=torch_dtype
96
+ )
97
+ else:
98
+ pipe = StableDiffusionControlNetPipeline.from_pretrained(
99
+ model_id,
100
+ controlnet=controlnet_model,
101
+ torch_dtype=torch_dtype
102
+ )
103
+ else:
104
+ if model_id == LORA_MODEL:
105
+
106
+ # Use the specified base model for your LoRA adapter.
107
+ pipe = DiffusionPipeline.from_pretrained(
108
+ LORA_BASE_MODEL,
109
+ torch_dtype=torch_dtype
110
+ )
111
+
112
+ # Load the LoRA weights
113
+ pipe.unet = PeftModel.from_pretrained(
114
+ pipe.unet,
115
+ model_id,
116
+ subfolder="unet",
117
+ torch_dtype=torch_dtype
118
+ )
119
+ pipe.text_encoder = PeftModel.from_pretrained(
120
+ pipe.text_encoder,
121
+ model_id,
122
+ subfolder="text_encoder",
123
+ torch_dtype=torch_dtype
124
+ )
125
+ else:
126
+ pipe = DiffusionPipeline.from_pretrained(
127
+ model_id,
128
+ torch_dtype=torch_dtype
129
+ )
130
+
131
+ if ip_adapter_enable:
132
+ pipe.load_ip_adapter(
133
+ "h94/IP-Adapter",
134
+ subfolder="models",
135
+ weight_name="ip-adapter-plus_sd15.bin"
136
+ )
137
+ pipe.set_ip_adapter_scale(ip_adapter_scale)
138
+
139
+ pipe.safety_checker = None
140
+ pipe.to(device)
141
+ # model_cache[(model_id, controlnet_enable, controlnet_image, controlnet_mode)] = pipe
142
+
143
+ image = pipe(
144
+ prompt=prompt,
145
+ image=controlnet_image if controlnet_enable else None,
146
+ negative_prompt=negative_prompt,
147
+ guidance_scale=guidance_scale,
148
+ num_inference_steps=num_inference_steps,
149
+ width=width,
150
+ height=height,
151
+ generator=generator,
152
+ cross_attention_kwargs={"scale": lora_scale},
153
+ controlnet_conditioning_scale=controlnet_strength,
154
+ ip_adapter_image=ip_adapter_image if ip_adapter_enable else None
155
+ ).images[0]
156
+
157
+ return image, seed
158
+
159
+ # @title Gradio
160
+ examples = [
161
+ "homm3_spell_icon midivial sticker of a cartoon character of a man in a lab coat and glasses, old lady screaming and laughing",
162
+ "homm3_spell_icon midivial sticker of a cartoon man with a mustache and a hat on, portrait bender from futurama, telegram sticker",
163
+ "homm3_spell_icon midivial sticker of a cartoon character with a gun in his hand",
164
+ ]
165
+
166
+ css = """
167
+ #col-container {
168
+ margin: 0 auto;
169
+ max-width: 640px;
170
+ }
171
+ """
172
+
173
+ with gr.Blocks(css=css) as demo:
174
+ with gr.Column(elem_id="col-container"):
175
+ gr.Markdown(" # Text-to-Image Gradio Template")
176
+
177
+ with gr.Row():
178
+ # Dropdown to select the model from Hugging Face
179
+ model_id = gr.Dropdown(
180
+ label="Model",
181
+ choices=MODEL_LIST,
182
+ value=MODEL_LIST[0], # Default model
183
+ )
184
+
185
+ with gr.Row():
186
+ prompt = gr.Text(
187
+ label="Prompt",
188
+ show_label=False,
189
+ max_lines=1,
190
+ placeholder="Enter your prompt",
191
+ container=False,
192
+ )
193
+ run_button = gr.Button("Run", scale=0, variant="primary")
194
+
195
+ result = gr.Image(label="Result", show_label=False)
196
+
197
+ with gr.Accordion("Advanced Settings", open=False):
198
+ negative_prompt = gr.Text(
199
+ label="Negative prompt",
200
+ max_lines=1,
201
+ placeholder="Enter a negative prompt",
202
+ )
203
+
204
+ seed = gr.Slider(
205
+ label="Seed",
206
+ minimum=0,
207
+ maximum=MAX_SEED,
208
+ step=1,
209
+ value=42, # Default seed
210
+ )
211
+
212
+ randomize_seed = gr.Checkbox(label="Randomize seed", value=True)
213
+
214
+ with gr.Row():
215
+ width = gr.Slider(
216
+ label="Width",
217
+ minimum=256,
218
+ maximum=MAX_IMAGE_SIZE,
219
+ step=32,
220
+ value=512,
221
+ )
222
+ height = gr.Slider(
223
+ label="Height",
224
+ minimum=256,
225
+ maximum=MAX_IMAGE_SIZE,
226
+ step=32,
227
+ value=512,
228
+ )
229
+
230
+ with gr.Row():
231
+ guidance_scale = gr.Slider(
232
+ label="Guidance scale",
233
+ minimum=0.0,
234
+ maximum=20.0,
235
+ step=0.5,
236
+ value=7.0,
237
+ )
238
+ num_inference_steps = gr.Slider(
239
+ label="Number of inference steps",
240
+ minimum=1,
241
+ maximum=100,
242
+ step=1,
243
+ value=20,
244
+ )
245
+
246
+ # New slider for LoRA scale.
247
+ lora_scale = gr.Slider(
248
+ label="LoRA Scale",
249
+ minimum=0.0,
250
+ maximum=2.0,
251
+ step=0.1,
252
+ value=1.0,
253
+ info="Adjust the influence of the LoRA weights",
254
+ )
255
+
256
+ # --- ControlNet Settings ---
257
+ with gr.Accordion("ControlNet Settings", open=False):
258
+ controlnet_enable = gr.Checkbox(
259
+ label="Enable ControlNet",
260
+ value=False
261
+ )
262
+ with gr.Group(visible=False) as controlnet_group:
263
+ controlnet_mode = gr.Dropdown(
264
+ label="ControlNet Mode",
265
+ choices=list(CONTROLNET_MODES.keys()),
266
+ value=list(CONTROLNET_MODES.keys())[0],
267
+ )
268
+ controlnet_strength = gr.Slider(
269
+ label="ControlNet Conditioning Scale",
270
+ minimum=0.0,
271
+ maximum=1.0,
272
+ step=0.1,
273
+ value=0.7,
274
+ )
275
+ controlnet_image = gr.Image(
276
+ label="ControlNet Image",
277
+ type="pil"
278
+ )
279
+
280
+ def show_controlnet_options(enable):
281
+ return {controlnet_group: gr.update(visible=enable)}
282
+
283
+ controlnet_enable.change(
284
+ fn=show_controlnet_options,
285
+ inputs=controlnet_enable,
286
+ outputs=controlnet_group,
287
+ )
288
+
289
+ # --- IP-adapter Settings ---
290
+ with gr.Accordion("IP-adapter Settings", open=False):
291
+ ip_adapter_enable = gr.Checkbox(
292
+ label="Enable IP-adapter",
293
+ value=False
294
+ )
295
+
296
+ with gr.Group(visible=False) as ip_adapter_group:
297
+ ip_adapter_scale = gr.Slider(
298
+ label="IP-adapter Scale",
299
+ minimum=0.0,
300
+ maximum=2.0,
301
+ step=0.1,
302
+ value=1.0
303
+ )
304
+ ip_adapter_image = gr.Image(
305
+ label="IP-adapter Image",
306
+ type="pil"
307
+ )
308
+
309
+ # Show/hide IP-adapter parameters when checkbox is toggled
310
+ def show_ip_adapter_options(enable):
311
+ return {ip_adapter_group: gr.update(visible=enable)}
312
+
313
+ ip_adapter_enable.change(
314
+ fn=show_ip_adapter_options,
315
+ inputs=ip_adapter_enable,
316
+ outputs=ip_adapter_group,
317
+ )
318
+
319
+ gr.Examples(examples=examples, inputs=[prompt])
320
+ gr.on(
321
+ triggers=[run_button.click, prompt.submit],
322
+ fn=infer,
323
+ inputs=[
324
+ model_id,
325
+ prompt,
326
+ negative_prompt,
327
+ seed,
328
+ randomize_seed,
329
+ width,
330
+ height,
331
+ guidance_scale,
332
+ num_inference_steps,
333
+ lora_scale,
334
+ controlnet_enable,
335
+ controlnet_mode,
336
+ controlnet_strength,
337
+ controlnet_image,
338
+ ip_adapter_enable,
339
+ ip_adapter_scale,
340
+ ip_adapter_image,
341
+ ],
342
+ outputs=[result, seed],
343
+ )
344
+
345
+ # @title Run
346
+
347
+ if __name__ == "__main__":
348
+ demo.launch(debug=True) # show errors in colab notebook
ДЗ_6.md ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Добавляем больше опций для контроля генерации стикеров.
2
+
3
+ #### Цель:
4
+
5
+ Добавить в пользовательский интерфейс Gradio опции, позволяющие использовать ControlNet и IP-adapter для управления генерацией стикеров, а также обеспечить возможность загрузки изображений, необходимых для их работы.
6
+
7
+ #### Задача:
8
+
9
+ В ваш интерфейс на HuggingFace добавьте новые элементы управления:
10
+ - Чекбокс для включения/отключения использования ControlNet. При активации ControlNet отобразите дополнительные опции:
11
+ - Слайдер для настройки интенсивности влияния (`control_strength`).
12
+ - Выпадающий список для выбора режима работы ControlNet (например, `edge_detection`, `pose_estimation` другие из [репозитория](https://github.com/lllyasviel/ControlNet)).
13
+ - Окно для загрузки изображений, используемых для настройки ControlNet.
14
+ - Чекбокс для включения/отключения IP-adapter. При активации IP-adapter добавьте возможность регулировки его параметров:
15
+ - Слайдер для настройки `ip_adapter_scale`.
16
+ - Окно для загрузки изображений для IP-adapter.
17
+
18
+ Проверьте работу интерфейса, запустив тестовые генерации с разными комбинациями настроек, чтобы убедиться, что изменения отражаются корректно. Отдельно проверьте, что можно включать и отключать ControlNet и IP-adapter как по отдельности, так и вместе.
19
+
20
+
21
+ #### Как сдать домашнее задание
22
+ Для сдачи домашнего задания загрузите в ваш репозиторий код вашего Space из HuggingFace и публичную ссылку на него.