John6666 commited on
Commit
184d241
1 Parent(s): a409c90

Upload 57 files

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
README.md CHANGED
@@ -1,12 +1,13 @@
1
- ---
2
- title: Testl1
3
- emoji:
4
- colorFrom: indigo
5
- colorTo: blue
6
- sdk: gradio
7
- sdk_version: 4.42.0
8
- app_file: app.py
9
- pinned: false
10
- ---
11
-
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
1
+ ---
2
+ title: test
3
+ emoji: 🤢
4
+ colorFrom: red
5
+ colorTo: yellow
6
+ sdk: gradio
7
+ sdk_version: 4.41.0
8
+ app_file: app.py
9
+ pinned: false
10
+ license: mit
11
+ ---
12
+
13
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,678 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import spaces
2
+ import gradio as gr
3
+ import json
4
+ import logging
5
+ import torch
6
+ from PIL import Image
7
+ from diffusers import DiffusionPipeline
8
+ from diffusers import FluxControlNetPipeline, FluxControlNetModel, FluxMultiControlNetModel
9
+ from huggingface_hub import hf_hub_download, HfFileSystem, ModelCard, snapshot_download
10
+ import copy
11
+ import random
12
+ import time
13
+
14
+ from mod import (models, clear_cache, get_repo_safetensors, is_repo_name, is_repo_exists,
15
+ description_ui, num_loras, compose_lora_json, is_valid_lora, fuse_loras,
16
+ get_trigger_word, enhance_prompt, deselect_lora, num_cns, set_control_union_image,
17
+ get_control_union_mode, set_control_union_mode, get_control_params)
18
+ from flux import (search_civitai_lora, select_civitai_lora, search_civitai_lora_json,
19
+ download_my_lora, get_all_lora_tupled_list, apply_lora_prompt,
20
+ update_loras, get_t2i_model_info)
21
+ from tagger.tagger import predict_tags_wd, compose_prompt_to_copy
22
+ from tagger.fl2flux import predict_tags_fl2_flux
23
+
24
+ # Initialize the base model
25
+ base_model = models[0]
26
+ controlnet_model_union_repo = 'InstantX/FLUX.1-dev-Controlnet-Union'
27
+ #controlnet_model_union_repo = 'InstantX/FLUX.1-dev-Controlnet-Union-alpha'
28
+ pipe = DiffusionPipeline.from_pretrained(base_model, torch_dtype=torch.bfloat16)
29
+ controlnet_union = None
30
+ controlnet = None
31
+ last_model = models[0]
32
+ last_cn_on = False
33
+
34
+ # https://huggingface.co/InstantX/FLUX.1-dev-Controlnet-Union
35
+ # https://huggingface.co/spaces/jiuface/FLUX.1-dev-Controlnet-Union
36
+ def change_base_model(repo_id: str, cn_on: bool):
37
+ global pipe
38
+ global controlnet_union
39
+ global controlnet
40
+ global last_model
41
+ global last_cn_on
42
+ dtype = torch.bfloat16
43
+ #dtype = torch.float8_e4m3fn
44
+ try:
45
+ if (repo_id == last_model and cn_on is last_cn_on) or not is_repo_name(repo_id) or not is_repo_exists(repo_id): return gr.update(visible=True)
46
+ if cn_on:
47
+ #progress(0, desc=f"Loading model: {repo_id} / Loading ControlNet: {controlnet_model_union_repo}")
48
+ print(f"Loading model: {repo_id} / Loading ControlNet: {controlnet_model_union_repo}")
49
+ clear_cache()
50
+ controlnet_union = FluxControlNetModel.from_pretrained(controlnet_model_union_repo, torch_dtype=dtype)
51
+ controlnet = FluxMultiControlNetModel([controlnet_union])
52
+ pipe = FluxControlNetPipeline.from_pretrained(repo_id, controlnet=controlnet, torch_dtype=dtype)
53
+ last_model = repo_id
54
+ last_cn_on = cn_on
55
+ #progress(1, desc=f"Model loaded: {repo_id} / ControlNet Loaded: {controlnet_model_union_repo}")
56
+ print(f"Model loaded: {repo_id} / ControlNet Loaded: {controlnet_model_union_repo}")
57
+ else:
58
+ #progress(0, desc=f"Loading model: {repo_id}")
59
+ print(f"Loading model: {repo_id}")
60
+ clear_cache()
61
+ pipe = DiffusionPipeline.from_pretrained(repo_id, torch_dtype=dtype)
62
+ last_model = repo_id
63
+ last_cn_on = cn_on
64
+ #progress(1, desc=f"Model loaded: {repo_id}")
65
+ print(f"Model loaded: {repo_id}")
66
+ except Exception as e:
67
+ print(f"Model load Error: {e}")
68
+ raise gr.Error(f"Model load Error: {e}")
69
+ return gr.update(visible=True)
70
+
71
+ change_base_model.zerogpu = True
72
+
73
+ # Load LoRAs from JSON file
74
+ with open('loras.json', 'r') as f:
75
+ loras = json.load(f)
76
+
77
+ MAX_SEED = 2**32-1
78
+
79
+ class calculateDuration:
80
+ def __init__(self, activity_name=""):
81
+ self.activity_name = activity_name
82
+
83
+ def __enter__(self):
84
+ self.start_time = time.time()
85
+ return self
86
+
87
+ def __exit__(self, exc_type, exc_value, traceback):
88
+ self.end_time = time.time()
89
+ self.elapsed_time = self.end_time - self.start_time
90
+ if self.activity_name:
91
+ print(f"Elapsed time for {self.activity_name}: {self.elapsed_time:.6f} seconds")
92
+ else:
93
+ print(f"Elapsed time: {self.elapsed_time:.6f} seconds")
94
+
95
+ def update_selection(evt: gr.SelectData, width, height):
96
+ selected_lora = loras[evt.index]
97
+ new_placeholder = f"Type a prompt for {selected_lora['title']}"
98
+ lora_repo = selected_lora["repo"]
99
+ updated_text = f"### Selected: [{lora_repo}](https://huggingface.co/{lora_repo}) ✨"
100
+ if "aspect" in selected_lora:
101
+ if selected_lora["aspect"] == "portrait":
102
+ width = 768
103
+ height = 1024
104
+ elif selected_lora["aspect"] == "landscape":
105
+ width = 1024
106
+ height = 768
107
+ else:
108
+ width = 1024
109
+ height = 1024
110
+ return (
111
+ gr.update(placeholder=new_placeholder),
112
+ updated_text,
113
+ evt.index,
114
+ width,
115
+ height,
116
+ )
117
+
118
+ @spaces.GPU(duration=70)
119
+ def generate_image(prompt_mash, steps, seed, cfg_scale, width, height, lora_scale, cn_on, progress=gr.Progress(track_tqdm=True)):
120
+ global pipe
121
+ global controlnet
122
+ global controlnet_union
123
+ try:
124
+ pipe.to("cuda")
125
+ generator = torch.Generator(device="cuda").manual_seed(seed)
126
+
127
+ with calculateDuration("Generating image"):
128
+ # Generate image
129
+ modes, images, scales = get_control_params()
130
+ if not cn_on or len(modes) == 0:
131
+ progress(0, desc="Start Inference.")
132
+ image = pipe(
133
+ prompt=prompt_mash,
134
+ num_inference_steps=steps,
135
+ guidance_scale=cfg_scale,
136
+ width=width,
137
+ height=height,
138
+ generator=generator,
139
+ joint_attention_kwargs={"scale": lora_scale},
140
+ ).images[0]
141
+ else:
142
+ progress(0, desc="Start Inference with ControlNet.")
143
+ if controlnet is not None: controlnet.to("cuda")
144
+ if controlnet_union is not None: controlnet_union.to("cuda")
145
+ image = pipe(
146
+ prompt=prompt_mash,
147
+ control_image=images,
148
+ control_mode=modes,
149
+ num_inference_steps=steps,
150
+ guidance_scale=cfg_scale,
151
+ width=width,
152
+ height=height,
153
+ controlnet_conditioning_scale=scales,
154
+ generator=generator,
155
+ joint_attention_kwargs={"scale": lora_scale},
156
+ ).images[0]
157
+ except Exception as e:
158
+ print(e)
159
+ raise gr.Error(f"Inference Error: {e}")
160
+ return image
161
+
162
+ def run_lora(prompt, cfg_scale, steps, selected_index, randomize_seed, seed, width, height,
163
+ lora_scale, lora_json, cn_on, progress=gr.Progress(track_tqdm=True)):
164
+ global pipe
165
+ if selected_index is None and not is_valid_lora(lora_json):
166
+ gr.Info("LoRA isn't selected.")
167
+ # raise gr.Error("You must select a LoRA before proceeding.")
168
+ progress(0, desc="Preparing Inference.")
169
+
170
+ prompt_mash = prompt
171
+ if is_valid_lora(lora_json):
172
+ with calculateDuration("Loading LoRA weights"):
173
+ fuse_loras(pipe, lora_json)
174
+ trigger_word = get_trigger_word(lora_json)
175
+ prompt_mash = f"{prompt} {trigger_word}"
176
+ if selected_index is not None:
177
+ selected_lora = loras[selected_index]
178
+ lora_path = selected_lora["repo"]
179
+ trigger_word = selected_lora["trigger_word"]
180
+ if(trigger_word):
181
+ if "trigger_position" in selected_lora:
182
+ if selected_lora["trigger_position"] == "prepend":
183
+ prompt_mash = f"{trigger_word} {prompt}"
184
+ else:
185
+ prompt_mash = f"{prompt} {trigger_word}"
186
+ else:
187
+ prompt_mash = f"{trigger_word} {prompt}"
188
+ else:
189
+ prompt_mash = prompt
190
+ # Load LoRA weights
191
+ with calculateDuration(f"Loading LoRA weights for {selected_lora['title']}"):
192
+ if "weights" in selected_lora:
193
+ pipe.load_lora_weights(lora_path, weight_name=selected_lora["weights"])
194
+ else:
195
+ pipe.load_lora_weights(lora_path)
196
+
197
+ # Set random seed for reproducibility
198
+ with calculateDuration("Randomizing seed"):
199
+ if randomize_seed:
200
+ seed = random.randint(0, MAX_SEED)
201
+
202
+ progress(0, desc="Running Inference.")
203
+
204
+ image = generate_image(prompt_mash, steps, seed, cfg_scale, width, height, lora_scale, cn_on, progress)
205
+ if is_valid_lora(lora_json):
206
+ pipe.unfuse_lora()
207
+ pipe.unload_lora_weights()
208
+ if selected_index is not None: pipe.unload_lora_weights()
209
+ pipe.to("cpu")
210
+ if controlnet is not None: controlnet.to("cpu")
211
+ if controlnet_union is not None: controlnet_union.to("cpu")
212
+ clear_cache()
213
+ return image, seed
214
+
215
+ def get_huggingface_safetensors(link):
216
+ split_link = link.split("/")
217
+ if(len(split_link) == 2):
218
+ model_card = ModelCard.load(link)
219
+ base_model = model_card.data.get("base_model")
220
+ print(base_model)
221
+ if((base_model != "black-forest-labs/FLUX.1-dev") and (base_model != "black-forest-labs/FLUX.1-schnell")):
222
+ raise Exception("Not a FLUX LoRA!")
223
+ image_path = model_card.data.get("widget", [{}])[0].get("output", {}).get("url", None)
224
+ trigger_word = model_card.data.get("instance_prompt", "")
225
+ image_url = f"https://huggingface.co/{link}/resolve/main/{image_path}" if image_path else None
226
+ fs = HfFileSystem()
227
+ try:
228
+ list_of_files = fs.ls(link, detail=False)
229
+ for file in list_of_files:
230
+ if(file.endswith(".safetensors")):
231
+ safetensors_name = file.split("/")[-1]
232
+ if (not image_url and file.lower().endswith((".jpg", ".jpeg", ".png", ".webp"))):
233
+ image_elements = file.split("/")
234
+ image_url = f"https://huggingface.co/{link}/resolve/main/{image_elements[-1]}"
235
+ except Exception as e:
236
+ print(e)
237
+ gr.Warning(f"You didn't include a link neither a valid Hugging Face repository with a *.safetensors LoRA")
238
+ raise Exception(f"You didn't include a link neither a valid Hugging Face repository with a *.safetensors LoRA")
239
+ return split_link[1], link, safetensors_name, trigger_word, image_url
240
+
241
+ def check_custom_model(link):
242
+ if(link.startswith("https://")):
243
+ if(link.startswith("https://huggingface.co") or link.startswith("https://www.huggingface.co")):
244
+ link_split = link.split("huggingface.co/")
245
+ return get_huggingface_safetensors(link_split[1])
246
+ else:
247
+ return get_huggingface_safetensors(link)
248
+
249
+ def add_custom_lora(custom_lora):
250
+ global loras
251
+ if(custom_lora):
252
+ try:
253
+ title, repo, path, trigger_word, image = check_custom_model(custom_lora)
254
+ print(f"Loaded custom LoRA: {repo}")
255
+ card = f'''
256
+ <div class="custom_lora_card">
257
+ <span>Loaded custom LoRA:</span>
258
+ <div class="card_internal">
259
+ <img src="{image}" />
260
+ <div>
261
+ <h3>{title}</h3>
262
+ <small>{"Using: <code><b>"+trigger_word+"</code></b> as the trigger word" if trigger_word else "No trigger word found. If there's a trigger word, include it in your prompt"}<br></small>
263
+ </div>
264
+ </div>
265
+ </div>
266
+ '''
267
+ existing_item_index = next((index for (index, item) in enumerate(loras) if item['repo'] == repo), None)
268
+ if(not existing_item_index):
269
+ new_item = {
270
+ "image": image,
271
+ "title": title,
272
+ "repo": repo,
273
+ "weights": path,
274
+ "trigger_word": trigger_word
275
+ }
276
+ print(new_item)
277
+ existing_item_index = len(loras)
278
+ loras.append(new_item)
279
+
280
+ return gr.update(visible=True, value=card), gr.update(visible=True), gr.Gallery(selected_index=None), f"Custom: {path}", existing_item_index, trigger_word
281
+ except Exception as e:
282
+ gr.Warning(f"Invalid LoRA: either you entered an invalid link, or a non-FLUX LoRA")
283
+ return gr.update(visible=True, value=f"Invalid LoRA: either you entered an invalid link, a non-FLUX LoRA"), gr.update(visible=True), gr.update(), "", None, ""
284
+ else:
285
+ return gr.update(visible=False), gr.update(visible=False), gr.update(), "", None, ""
286
+
287
+ def remove_custom_lora():
288
+ return gr.update(visible=False), gr.update(visible=False), gr.update(), "", None, ""
289
+
290
+ run_lora.zerogpu = True
291
+
292
+ css = '''
293
+ #gen_btn{height: 100%}
294
+ #title{text-align: center}
295
+ #title h1{font-size: 3em; display:inline-flex; align-items:center}
296
+ #title img{width: 100px; margin-right: 0.5em}
297
+ #gallery .grid-wrap{height: 10vh}
298
+ #lora_list{background: var(--block-background-fill);padding: 0 1em .3em; font-size: 90%}
299
+ .card_internal{display: flex;height: 100px;margin-top: .5em}
300
+ .card_internal img{margin-right: 1em}
301
+ .styler{--form-gap-width: 0px !important}
302
+ #model-info {text-align: center; !important}
303
+ '''
304
+ with gr.Blocks(theme='Nymbo/Nymbo_Theme', fill_width=True, css=css) as app:
305
+ with gr.Tab("FLUX LoRA the Explorer"):
306
+ title = gr.HTML(
307
+ """<h1><img src="https://huggingface.co/spaces/multimodalart/flux-lora-the-explorer/resolve/main/flux_lora.png" alt="LoRA">FLUX LoRA the Explorer Mod</h1>""",
308
+ elem_id="title",
309
+ )
310
+ selected_index = gr.State(None)
311
+ with gr.Row():
312
+ with gr.Column(scale=3):
313
+ with gr.Group():
314
+ with gr.Accordion("Generate Prompt from Image", open=False):
315
+ tagger_image = gr.Image(label="Input image", type="pil", sources=["upload", "clipboard"], height=256)
316
+ with gr.Accordion(label="Advanced options", open=False):
317
+ tagger_general_threshold = gr.Slider(label="Threshold", minimum=0.0, maximum=1.0, value=0.3, step=0.01, interactive=True)
318
+ tagger_character_threshold = gr.Slider(label="Character threshold", minimum=0.0, maximum=1.0, value=0.8, step=0.01, interactive=True)
319
+ neg_prompt = gr.Text(label="Negative Prompt", lines=1, max_lines=8, placeholder="", visible=False)
320
+ v2_character = gr.Textbox(label="Character", placeholder="hatsune miku", scale=2, visible=False)
321
+ v2_series = gr.Textbox(label="Series", placeholder="vocaloid", scale=2, visible=False)
322
+ v2_copy = gr.Button(value="Copy to clipboard", size="sm", interactive=False, visible=False)
323
+ tagger_algorithms = gr.CheckboxGroup(["Use WD Tagger", "Use Florence-2-Flux"], label="Algorithms", value=["Use WD Tagger"])
324
+ tagger_generate_from_image = gr.Button(value="Generate Prompt from Image")
325
+ prompt = gr.Textbox(label="Prompt", lines=1, max_lines=8, placeholder="Type a prompt")
326
+ prompt_enhance = gr.Button(value="Enhance your prompt", variant="secondary")
327
+ with gr.Column(scale=1, elem_id="gen_column"):
328
+ generate_button = gr.Button("Generate", variant="primary", elem_id="gen_btn")
329
+ with gr.Row():
330
+ with gr.Column():
331
+ selected_info = gr.Markdown("")
332
+ gallery = gr.Gallery(
333
+ [(item["image"], item["title"]) for item in loras],
334
+ label="LoRA Gallery",
335
+ allow_preview=False,
336
+ columns=3,
337
+ elem_id="gallery"
338
+ )
339
+ with gr.Group():
340
+ custom_lora = gr.Textbox(label="Custom LoRA", info="LoRA Hugging Face path", placeholder="multimodalart/vintage-ads-flux")
341
+ gr.Markdown("[Check the list of FLUX LoRas](https://huggingface.co/models?other=base_model:adapter:black-forest-labs/FLUX.1-dev)", elem_id="lora_list")
342
+ custom_lora_info = gr.HTML(visible=False)
343
+ custom_lora_button = gr.Button("Remove custom LoRA", visible=False)
344
+ deselect_lora_button = gr.Button("Deselect LoRA", variant="secondary")
345
+ with gr.Column():
346
+ result = gr.Image(label="Generated Image", format="png", show_share_button=False)
347
+ with gr.Group():
348
+ model_name = gr.Dropdown(label="Base Model", info="You can enter a huggingface model repo_id to want to use.", choices=models, value=models[0], allow_custom_value=True)
349
+ model_info = gr.Markdown(elem_id="model-info")
350
+ with gr.Row():
351
+ with gr.Accordion("Advanced Settings", open=False):
352
+ with gr.Column():
353
+ with gr.Row():
354
+ cfg_scale = gr.Slider(label="CFG Scale", minimum=1, maximum=20, step=0.5, value=3.5)
355
+ steps = gr.Slider(label="Steps", minimum=1, maximum=50, step=1, value=28)
356
+ with gr.Row():
357
+ width = gr.Slider(label="Width", minimum=256, maximum=1536, step=64, value=1024)
358
+ height = gr.Slider(label="Height", minimum=256, maximum=1536, step=64, value=1024)
359
+ with gr.Row():
360
+ randomize_seed = gr.Checkbox(True, label="Randomize seed")
361
+ seed = gr.Slider(label="Seed", minimum=0, maximum=MAX_SEED, step=1, value=0, randomize=True)
362
+ lora_scale = gr.Slider(label="LoRA Scale", minimum=-3, maximum=3, step=0.01, value=0.95)
363
+ with gr.Accordion("External LoRA", open=True):
364
+ with gr.Column():
365
+ lora_repo_json = gr.JSON(value=[{}] * num_loras, visible=False)
366
+ lora_repo = [None] * num_loras
367
+ lora_weights = [None] * num_loras
368
+ lora_trigger = [None] * num_loras
369
+ lora_wt = [None] * num_loras
370
+ lora_info = [None] * num_loras
371
+ lora_copy = [None] * num_loras
372
+ lora_md = [None] * num_loras
373
+ lora_num = [None] * num_loras
374
+ with gr.Row():
375
+ for i in range(num_loras):
376
+ with gr.Column():
377
+ lora_repo[i] = gr.Dropdown(label=f"LoRA {int(i+1)} Repo", choices=get_all_lora_tupled_list(), info="Input LoRA Repo ID", value="", allow_custom_value=True)
378
+ with gr.Row():
379
+ lora_weights[i] = gr.Dropdown(label=f"LoRA {int(i+1)} Filename", choices=[], info="Optional", value="", allow_custom_value=True)
380
+ lora_trigger[i] = gr.Textbox(label=f"LoRA {int(i+1)} Trigger Prompt", lines=1, max_lines=4, value="")
381
+ lora_wt[i] = gr.Slider(label=f"LoRA {int(i+1)} Scale", minimum=-3, maximum=3, step=0.01, value=1.00)
382
+ with gr.Row():
383
+ lora_info[i] = gr.Textbox(label="", info="Example of prompt:", value="", show_copy_button=True, interactive=False, visible=False)
384
+ lora_copy[i] = gr.Button(value="Copy example to prompt", visible=False)
385
+ lora_md[i] = gr.Markdown(value="", visible=False)
386
+ lora_num[i] = gr.Number(i, visible=False)
387
+ with gr.Accordion("From URL", open=True, visible=True):
388
+ with gr.Row():
389
+ lora_search_civitai_query = gr.Textbox(label="Query", placeholder="flux", lines=1)
390
+ lora_search_civitai_submit = gr.Button("Search on Civitai")
391
+ lora_search_civitai_basemodel = gr.CheckboxGroup(label="Search LoRA for", choices=["Flux.1 D", "Flux.1 S"], value=["Flux.1 D", "Flux.1 S"])
392
+ with gr.Row():
393
+ lora_search_civitai_json = gr.JSON(value={}, visible=False)
394
+ lora_search_civitai_desc = gr.Markdown(value="", visible=False)
395
+ lora_search_civitai_result = gr.Dropdown(label="Search Results", choices=[("", "")], value="", allow_custom_value=True, visible=False)
396
+ lora_download_url = gr.Textbox(label="URL", placeholder="http://...my_lora_url.safetensors", lines=1)
397
+ with gr.Row():
398
+ lora_download = [None] * num_loras
399
+ for i in range(num_loras):
400
+ lora_download[i] = gr.Button(f"Get and set LoRA to {int(i+1)}")
401
+ with gr.Accordion("ControlNet (🚧Under construction...🚧)", open=False):
402
+ with gr.Column():
403
+ cn_on = gr.Checkbox(False, label="Use ControlNet")
404
+ cn_mode = [None] * num_cns
405
+ cn_scale = [None] * num_cns
406
+ cn_image = [None] * num_cns
407
+ cn_image_ref = [None] * num_cns
408
+ cn_res = [None] * num_cns
409
+ cn_num = [None] * num_cns
410
+ with gr.Row():
411
+ for i in range(num_cns):
412
+ with gr.Column():
413
+ with gr.Row():
414
+ cn_mode[i] = gr.Dropdown(label=f"ControlNet {int(i+1)} Mode", choices=get_control_union_mode(), value=get_control_union_mode()[0], allow_custom_value=False)
415
+ cn_scale[i] = gr.Slider(label=f"ControlNet {int(i+1)} Weight", minimum=0.0, maximum=1.0, step=0.01, value=0.75)
416
+ cn_res[i] = gr.Slider(label=f"ControlNet {int(i+1)} Preprocess resolution", minimum=128, maximum=512, value=384, step=1)
417
+ cn_num[i] = gr.Number(i, visible=False)
418
+ with gr.Row():
419
+ cn_image_ref[i] = gr.Image(label="Image Reference", type="pil", format="png", height=256, sources=["upload", "clipboard"], show_share_button=False)
420
+ cn_image[i] = gr.Image(label="Control Image", type="pil", format="png", height=256, show_share_button=False, interactive=False)
421
+
422
+ gallery.select(
423
+ update_selection,
424
+ inputs=[width, height],
425
+ outputs=[prompt, selected_info, selected_index, width, height],
426
+ queue=False,
427
+ show_api=False,
428
+ )
429
+ custom_lora.input(
430
+ add_custom_lora,
431
+ inputs=[custom_lora],
432
+ outputs=[custom_lora_info, custom_lora_button, gallery, selected_info, selected_index, prompt],
433
+ queue=False,
434
+ show_api=False,
435
+ )
436
+ custom_lora_button.click(
437
+ remove_custom_lora,
438
+ outputs=[custom_lora_info, custom_lora_button, gallery, selected_info, selected_index, custom_lora],
439
+ queue=False,
440
+ show_api=False,
441
+ )
442
+ gr.on(
443
+ triggers=[generate_button.click, prompt.submit],
444
+ fn=change_base_model,
445
+ inputs=[model_name, cn_on],
446
+ outputs=[result],
447
+ queue=False,
448
+ show_api=False,
449
+ ).success(
450
+ fn=run_lora,
451
+ inputs=[prompt, cfg_scale, steps, selected_index, randomize_seed, seed, width, height,
452
+ lora_scale, lora_repo_json, cn_on],
453
+ outputs=[result, seed],
454
+ queue=True,
455
+ show_api=True,
456
+ )
457
+
458
+ deselect_lora_button.click(deselect_lora, None, [prompt, selected_info, selected_index, width, height], queue=False, show_api=False)
459
+ gr.on(
460
+ triggers=[model_name.change, cn_on.change],
461
+ fn=change_base_model,
462
+ inputs=[model_name, cn_on],
463
+ outputs=[result],
464
+ queue=True,
465
+ show_api=False,
466
+ ).then(get_t2i_model_info, [model_name], [model_info], queue=False, show_api=False)
467
+ prompt_enhance.click(enhance_prompt, [prompt], [prompt], queue=False, show_api=False)
468
+
469
+ gr.on(
470
+ triggers=[lora_search_civitai_submit.click, lora_search_civitai_query.submit],
471
+ fn=search_civitai_lora,
472
+ inputs=[lora_search_civitai_query, lora_search_civitai_basemodel],
473
+ outputs=[lora_search_civitai_result, lora_search_civitai_desc, lora_search_civitai_submit, lora_search_civitai_query],
474
+ scroll_to_output=True,
475
+ queue=True,
476
+ show_api=False,
477
+ )
478
+ lora_search_civitai_json.change(search_civitai_lora_json, [lora_search_civitai_query, lora_search_civitai_basemodel], [lora_search_civitai_json], queue=True, show_api=True) # fn for api
479
+ lora_search_civitai_result.change(select_civitai_lora, [lora_search_civitai_result], [lora_download_url, lora_search_civitai_desc], scroll_to_output=True, queue=False, show_api=False)
480
+
481
+ for i, l in enumerate(lora_repo):
482
+ deselect_lora_button.click(lambda: ("", 1.0), None, [lora_repo[i], lora_wt[i]], queue=False, show_api=False)
483
+ gr.on(
484
+ triggers=[lora_download[i].click],
485
+ fn=download_my_lora,
486
+ inputs=[lora_download_url, lora_repo[i]],
487
+ outputs=[lora_repo[i]],
488
+ scroll_to_output=True,
489
+ queue=True,
490
+ show_api=False,
491
+ )
492
+ gr.on(
493
+ triggers=[lora_repo[i].change, lora_wt[i].change],
494
+ fn=update_loras,
495
+ inputs=[prompt, lora_repo[i], lora_wt[i]],
496
+ outputs=[prompt, lora_repo[i], lora_wt[i], lora_info[i], lora_md[i]],
497
+ queue=False,
498
+ trigger_mode="once",
499
+ show_api=False,
500
+ ).success(get_repo_safetensors, [lora_repo[i]], [lora_weights[i]], queue=False, show_api=False
501
+ ).success(apply_lora_prompt, [lora_info[i]], [lora_trigger[i]], queue=False, show_api=False
502
+ ).success(compose_lora_json, [lora_repo_json, lora_num[i], lora_repo[i], lora_wt[i], lora_weights[i], lora_trigger[i]], [lora_repo_json], queue=False, show_api=False)
503
+
504
+ for i, m in enumerate(cn_mode):
505
+ gr.on(
506
+ triggers=[cn_mode[i].change, cn_scale[i].change],
507
+ fn=set_control_union_mode,
508
+ inputs=[cn_num[i], cn_mode[i], cn_scale[i]],
509
+ outputs=[cn_on],
510
+ queue=True,
511
+ show_api=False,
512
+ ).success(set_control_union_image, [cn_num[i], cn_mode[i], cn_image_ref[i], height, width, cn_res[i]], [cn_image[i]], queue=False, show_api=False)
513
+ cn_image_ref[i].upload(set_control_union_image, [cn_num[i], cn_mode[i], cn_image_ref[i], height, width, cn_res[i]], [cn_image[i]], queue=False, show_api=False)
514
+
515
+ tagger_generate_from_image.click(lambda: ("", "", ""), None, [v2_series, v2_character, prompt], queue=False, show_api=False,
516
+ ).success(
517
+ predict_tags_wd,
518
+ [tagger_image, prompt, tagger_algorithms, tagger_general_threshold, tagger_character_threshold],
519
+ [v2_series, v2_character, prompt, v2_copy],
520
+ show_api=False,
521
+ ).success(predict_tags_fl2_flux, [tagger_image, prompt, tagger_algorithms], [prompt], show_api=False,
522
+ ).success(compose_prompt_to_copy, [v2_character, v2_series, prompt], [prompt], queue=False, show_api=False)
523
+
524
+ with gr.Tab("FLUX Prompt Generator"):
525
+ from prompt import (PromptGenerator, HuggingFaceInferenceNode, florence_caption,
526
+ ARTFORM, PHOTO_TYPE, ROLES, HAIRSTYLES, LIGHTING, COMPOSITION, POSE, BACKGROUND,
527
+ PHOTOGRAPHY_STYLES, DEVICE, PHOTOGRAPHER, ARTIST, DIGITAL_ARTFORM, PLACE,
528
+ FEMALE_DEFAULT_TAGS, MALE_DEFAULT_TAGS, FEMALE_BODY_TYPES, MALE_BODY_TYPES,
529
+ FEMALE_CLOTHING, MALE_CLOTHING, FEMALE_ADDITIONAL_DETAILS, MALE_ADDITIONAL_DETAILS, pg_title)
530
+
531
+ prompt_generator = PromptGenerator()
532
+ huggingface_node = HuggingFaceInferenceNode()
533
+
534
+ gr.HTML(pg_title)
535
+
536
+ with gr.Row():
537
+ with gr.Column(scale=2):
538
+ with gr.Accordion("Basic Settings"):
539
+ pg_custom = gr.Textbox(label="Custom Input Prompt (optional)")
540
+ pg_subject = gr.Textbox(label="Subject (optional)")
541
+ pg_gender = gr.Radio(["female", "male"], label="Gender", value="female")
542
+
543
+ # Add the radio button for global option selection
544
+ pg_global_option = gr.Radio(
545
+ ["Disabled", "Random", "No Figure Rand"],
546
+ label="Set all options to:",
547
+ value="Disabled"
548
+ )
549
+
550
+ with gr.Accordion("Artform and Photo Type", open=False):
551
+ pg_artform = gr.Dropdown(["disabled", "random"] + ARTFORM, label="Artform", value="disabled")
552
+ pg_photo_type = gr.Dropdown(["disabled", "random"] + PHOTO_TYPE, label="Photo Type", value="disabled")
553
+
554
+ with gr.Accordion("Character Details", open=False):
555
+ pg_body_types = gr.Dropdown(["disabled", "random"] + FEMALE_BODY_TYPES + MALE_BODY_TYPES, label="Body Types", value="disabled")
556
+ pg_default_tags = gr.Dropdown(["disabled", "random"] + FEMALE_DEFAULT_TAGS + MALE_DEFAULT_TAGS, label="Default Tags", value="disabled")
557
+ pg_roles = gr.Dropdown(["disabled", "random"] + ROLES, label="Roles", value="disabled")
558
+ pg_hairstyles = gr.Dropdown(["disabled", "random"] + HAIRSTYLES, label="Hairstyles", value="disabled")
559
+ pg_clothing = gr.Dropdown(["disabled", "random"] + FEMALE_CLOTHING + MALE_CLOTHING, label="Clothing", value="disabled")
560
+
561
+ with gr.Accordion("Scene Details", open=False):
562
+ pg_place = gr.Dropdown(["disabled", "random"] + PLACE, label="Place", value="disabled")
563
+ pg_lighting = gr.Dropdown(["disabled", "random"] + LIGHTING, label="Lighting", value="disabled")
564
+ pg_composition = gr.Dropdown(["disabled", "random"] + COMPOSITION, label="Composition", value="disabled")
565
+ pg_pose = gr.Dropdown(["disabled", "random"] + POSE, label="Pose", value="disabled")
566
+ pg_background = gr.Dropdown(["disabled", "random"] + BACKGROUND, label="Background", value="disabled")
567
+
568
+ with gr.Accordion("Style and Artist", open=False):
569
+ pg_additional_details = gr.Dropdown(["disabled", "random"] + FEMALE_ADDITIONAL_DETAILS + MALE_ADDITIONAL_DETAILS, label="Additional Details", value="disabled")
570
+ pg_photography_styles = gr.Dropdown(["disabled", "random"] + PHOTOGRAPHY_STYLES, label="Photography Styles", value="disabled")
571
+ pg_device = gr.Dropdown(["disabled", "random"] + DEVICE, label="Device", value="disabled")
572
+ pg_photographer = gr.Dropdown(["disabled", "random"] + PHOTOGRAPHER, label="Photographer", value="disabled")
573
+ pg_artist = gr.Dropdown(["disabled", "random"] + ARTIST, label="Artist", value="disabled")
574
+ pg_digital_artform = gr.Dropdown(["disabled", "random"] + DIGITAL_ARTFORM, label="Digital Artform", value="disabled")
575
+
576
+ pg_generate_button = gr.Button("Generate Prompt")
577
+
578
+ with gr.Column(scale=2):
579
+ with gr.Accordion("Image and Caption", open=False):
580
+ pg_input_image = gr.Image(label="Input Image (optional)")
581
+ pg_caption_output = gr.Textbox(label="Generated Caption", lines=3)
582
+ pg_create_caption_button = gr.Button("Create Caption")
583
+ pg_add_caption_button = gr.Button("Add Caption to Prompt")
584
+
585
+ with gr.Accordion("Prompt Generation", open=True):
586
+ pg_output = gr.Textbox(label="Generated Prompt / Input Text", lines=4)
587
+ pg_t5xxl_output = gr.Textbox(label="T5XXL Output", visible=True)
588
+ pg_clip_l_output = gr.Textbox(label="CLIP L Output", visible=True)
589
+ pg_clip_g_output = gr.Textbox(label="CLIP G Output", visible=True)
590
+
591
+ with gr.Column(scale=2):
592
+ with gr.Accordion("Prompt Generation with LLM", open=False):
593
+ pg_happy_talk = gr.Checkbox(label="Happy Talk", value=True)
594
+ pg_compress = gr.Checkbox(label="Compress", value=True)
595
+ pg_compression_level = gr.Radio(["soft", "medium", "hard"], label="Compression Level", value="hard")
596
+ pg_poster = gr.Checkbox(label="Poster", value=False)
597
+ pg_custom_base_prompt = gr.Textbox(label="Custom Base Prompt", lines=5)
598
+ pg_generate_text_button = gr.Button("Generate Prompt with LLM (Llama 3.1 70B)")
599
+ pg_text_output = gr.Textbox(label="Generated Text", lines=10)
600
+
601
+ description_ui()
602
+
603
+ def create_caption(image):
604
+ if image is not None:
605
+ return florence_caption(image)
606
+ return ""
607
+
608
+ pg_create_caption_button.click(
609
+ create_caption,
610
+ inputs=[pg_input_image],
611
+ outputs=[pg_caption_output]
612
+ )
613
+
614
+ def generate_prompt_with_dynamic_seed(*args):
615
+ # Generate a new random seed
616
+ dynamic_seed = random.randint(0, 1000000)
617
+
618
+ # Call the generate_prompt function with the dynamic seed
619
+ result = prompt_generator.generate_prompt(dynamic_seed, *args)
620
+
621
+ # Return the result along with the used seed
622
+ return [dynamic_seed] + list(result)
623
+
624
+ pg_generate_button.click(
625
+ generate_prompt_with_dynamic_seed,
626
+ inputs=[pg_custom, pg_subject, pg_gender, pg_artform, pg_photo_type, pg_body_types, pg_default_tags, pg_roles, pg_hairstyles,
627
+ pg_additional_details, pg_photography_styles, pg_device, pg_photographer, pg_artist, pg_digital_artform,
628
+ pg_place, pg_lighting, pg_clothing, pg_composition, pg_pose, pg_background, pg_input_image],
629
+ outputs=[gr.Number(label="Used Seed", visible=False), pg_output, gr.Number(visible=False), pg_t5xxl_output, pg_clip_l_output, pg_clip_g_output]
630
+ ) #
631
+
632
+ pg_add_caption_button.click(
633
+ prompt_generator.add_caption_to_prompt,
634
+ inputs=[pg_output, pg_caption_output],
635
+ outputs=[pg_output]
636
+ )
637
+
638
+ pg_generate_text_button.click(
639
+ huggingface_node.generate,
640
+ inputs=[pg_output, pg_happy_talk, pg_compress, pg_compression_level, pg_poster, pg_custom_base_prompt],
641
+ outputs=pg_text_output
642
+ )
643
+
644
+ def update_all_options(choice):
645
+ updates = {}
646
+ if choice == "Disabled":
647
+ for dropdown in [
648
+ pg_artform, pg_photo_type, pg_body_types, pg_default_tags, pg_roles, pg_hairstyles, pg_clothing,
649
+ pg_place, pg_lighting, pg_composition, pg_pose, pg_background, pg_additional_details,
650
+ pg_photography_styles, pg_device, pg_photographer, pg_artist, pg_digital_artform
651
+ ]:
652
+ updates[dropdown] = gr.update(value="disabled")
653
+ elif choice == "Random":
654
+ for dropdown in [
655
+ pg_artform, pg_photo_type, pg_body_types, pg_default_tags, pg_roles, pg_hairstyles, pg_clothing,
656
+ pg_place, pg_lighting, pg_composition, pg_pose, pg_background, pg_additional_details,
657
+ pg_photography_styles, pg_device, pg_photographer, pg_artist, pg_digital_artform
658
+ ]:
659
+ updates[dropdown] = gr.update(value="random")
660
+ else: # No Figure Random
661
+ for dropdown in [pg_photo_type, pg_body_types, pg_default_tags, pg_roles, pg_hairstyles, pg_clothing, pg_pose, pg_additional_details]:
662
+ updates[dropdown] = gr.update(value="disabled")
663
+ for dropdown in [pg_artform, pg_place, pg_lighting, pg_composition, pg_background, pg_photography_styles, pg_device, pg_photographer, pg_artist, pg_digital_artform]:
664
+ updates[dropdown] = gr.update(value="random")
665
+ return updates
666
+
667
+ pg_global_option.change(
668
+ update_all_options,
669
+ inputs=[pg_global_option],
670
+ outputs=[
671
+ pg_artform, pg_photo_type, pg_body_types, pg_default_tags, pg_roles, pg_hairstyles, pg_clothing,
672
+ pg_place, pg_lighting, pg_composition, pg_pose, pg_background, pg_additional_details,
673
+ pg_photography_styles, pg_device, pg_photographer, pg_artist, pg_digital_artform
674
+ ]
675
+ )
676
+
677
+ app.queue()
678
+ app.launch()
cv_utils.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import numpy as np
3
+
4
+ MAX_IMAGE_SIZE = 512
5
+
6
+ def resize_image(input_image, resolution=MAX_IMAGE_SIZE, interpolation=None):
7
+ H, W, C = input_image.shape
8
+ H = float(H)
9
+ W = float(W)
10
+ k = float(resolution) / max(H, W)
11
+ H *= k
12
+ W *= k
13
+ H = int(np.round(H / 64.0)) * 64
14
+ W = int(np.round(W / 64.0)) * 64
15
+ if interpolation is None:
16
+ interpolation = cv2.INTER_LANCZOS4 if k > 1 else cv2.INTER_AREA
17
+ img = cv2.resize(input_image, (W, H), interpolation=interpolation)
18
+ return img
data/additional_details.json ADDED
@@ -0,0 +1,250 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "a purple iridescent suit",
3
+ "wearing a (necklace)",
4
+ "wearing ((earrings))",
5
+ "wearing a (bracelet)",
6
+ "wearing one or multiple (rings)",
7
+ "wearing a (brooch)",
8
+ "wearing (eyeglasses)",
9
+ "wearing (sunglasses)",
10
+ "wearing a (hat)",
11
+ "wearing a (scarf)",
12
+ "wearing a (headband)",
13
+ "wearing a (nose ring)",
14
+ "wearing a (lip ring)",
15
+ "wearing a (tongue ring)",
16
+ "wearing an (eyebrow ring)",
17
+ "wearing (face tattoos)",
18
+ "wearing a (wreath)",
19
+ "wearing a (crown)",
20
+ "wearing a (tiara)",
21
+ "wearing a (crown of thorns)",
22
+ "wearing a (crown of jewels)",
23
+ "wearing (bohemian clothes)",
24
+ "wearing (chic clothes)",
25
+ "wearing (glamorous clothes)",
26
+ "wearing (grunge clothes)",
27
+ "wearing (preppy clothes)",
28
+ "wearing (punk clothes)",
29
+ "wearing (retro clothes)",
30
+ "wearing (rockabilly clothes)",
31
+ "wearing (romantic clothes)",
32
+ "wearing (tomboy clothes)",
33
+ "wearing (urban clothes)",
34
+ "wearing (camo clothes)",
35
+ "wearing (robes)",
36
+ "wearing (excessive amount of jewellery)",
37
+ "wearing (vintage clothes)",
38
+ "wearing (western clothes)",
39
+ "wearing (minimalist clothes)",
40
+ "wearing (sportswear clothes)",
41
+ "wearing (flapper clothes)",
42
+ "wearing (pin-up clothes)",
43
+ "wearing (mid-century modern clothes)",
44
+ "wearing (art deco clothes)",
45
+ "wearing (victorian clothes)",
46
+ "wearing (edwardian clothes)",
47
+ "wearing (elizabethan clothes)",
48
+ "wearing (retro 70s clothes)",
49
+ "wearing (retro 80s clothes)",
50
+ "wearing (retro 90s clothes)",
51
+ "wearing (retro 00s clothes)",
52
+ "wearing (musical equipment)",
53
+ "wearing (leather)",
54
+ "wearing (bdsm leather)",
55
+ "wearing (shiny latex)",
56
+ "wearing (shiny latex suit)",
57
+ "wearing (silk)",
58
+ "wearing (full tweed set)",
59
+ "wearing (clothes made entirely of feathers)",
60
+ "wearing (clothes made entirely of fur)",
61
+ "wearing (clothes made entirely of leather)",
62
+ "wearing (clothes made entirely of metal)",
63
+ "wearing (clothes made entirely of plastic)",
64
+ "wearing (clothes adorned with shimmering jewels or crystals)",
65
+ "waring (clothes adorned with sequins)",
66
+ "wearing (clothes with exaggerated or extreme silhouettes)",
67
+ "wearing (clothes with exaggerated or extreme footwear)",
68
+ "wearing (clothes with exaggerated or extreme headwear)",
69
+ "wearing (clothes with exaggerated or extreme facial or body piercings or tattoos)",
70
+ "wearing (clothes with multiple layers or tiers)",
71
+ "wearing (clothes with exaggerated or extreme colors)",
72
+ "wearing (clothes with exaggerated or extreme patterns)",
73
+ "wearing (cloak)",
74
+ "wearing an astronaut armor",
75
+ "wearing a bio mechanical suit",
76
+ "wearing a bio hazard suit",
77
+ "(( working with laptop))",
78
+ "with Heat deformation",
79
+ "(((future soldier, full body armor, futuristic football, shoulder pads, guns, grenades, weapons, bullet proof vest, high tech, straps, belts, camouflage)))",
80
+ "((full body, zoomed out)) long slender legs 80mm",
81
+ "(((sci-fi, future war, cyberpunk, cyborg, future fashion, beautiful face, glowing tattoos)))",
82
+ "((angry expression, pretty face))",
83
+ "(((full body, athletic body, action pose, detailed black soldier outfit, slender long legs)))",
84
+ "playing epic electric guitar solo in front of a huge crowd",
85
+ "singing epic solo into a microphone in front of a huge crowd",
86
+ "as a ((gelatinous horror dripping alien creature))",
87
+ "in a tie or bowtie, lending a touch of formal elegance or quirky charm, knotted around the collar to elevate the outfit",
88
+ "with anklets, delicate chains or beads that gracefully encircle the ankle, adding a touch of femininity with every step",
89
+ "donning a belt, functional yet fashionable, cinching the waist or sitting low on the hips, often with a statement buckle",
90
+ "wearing gloves, either elegant satin for formal events or rugged leather for a tougher look, complementing the attire and mood",
91
+ "with a choker, snugly encircling the neck, often made of lace, velvet, or leather, exuding a mix of elegance and edge",
92
+ "in stockings or tights, sheer or opaque, enhancing the legs while adding a touch of sophistication or playful patterns",
93
+ "with a satchel or bag, a functional accessory that speaks volumes about personal style, be it a minimalist tote or an embellished clutch",
94
+ "wearing cufflinks, subtle symbols of elegance, adorning the sleeves of a formal shirt, showcasing attention to detail",
95
+ "with a pendant, a piece of jewelry that dangles gracefully from a necklace, often holding sentimental or symbolic value",
96
+ "in layered necklaces, a blend of chains of varying lengths, creating depth and showcasing multiple pendants or charms",
97
+ "sporting a watch, a timeless accessory that blends functionality with style, either minimalist or grand, reflecting personal tastes",
98
+ "wearing a veil, a delicate piece of fabric that adds mystery and allure, often seen in bridal or ceremonial attire",
99
+ "donning a cape or cloak, adding drama to the ensemble, flowing gracefully with every movement, evoking a sense of fantasy or regality",
100
+ "with a tiara or diadem, a jeweled headpiece that signifies royalty or celebration, resting gracefully atop the head",
101
+ "Adorned with a crown, symbolizing royalty and authority with gemstones and metals.",
102
+ "With a sparkling tiara, reminiscent of princesses or beauty queens.",
103
+ "With a poignant crown of thorns, symbolizing sacrifice and resilience.",
104
+ "With a jewel-encrusted crown, reflecting affluence and grandeur.",
105
+ "In bohemian attire, embodying the free spirits with patterns and fringes.",
106
+ "Dressed in chic fashion, blending comfort with high style.",
107
+ "In glamorous attire, shiny or sequined, perfect for red-carpet events.",
108
+ "Donning grunge wear, with flannels and combat boots, reflecting rebellion.",
109
+ "In preppy attire, sophisticated with collared shirts and blazers.",
110
+ "Wearing punk fashion, with studded accessories and band tees.",
111
+ "In retro attire, drawing from various iconic decades.",
112
+ "In rockabilly style, mixing rock 'n' roll with polka dots and swing dresses.",
113
+ "In romantic wear, with lace, ruffles, and pastel shades.",
114
+ "In tomboy attire, masculine pieces with a feminine flair.",
115
+ "Wearing urban fashion, blending street style with graphic tees and chunky sneakers.",
116
+ "In camo wear, military-inspired, blending in yet standing out.",
117
+ "Draped in mystic robes, evoking scholars or wizards.",
118
+ "Adorned in abundant jewelry, each piece showcasing unique style.",
119
+ "In vintage attire, echoing past eras with intricate designs.",
120
+ "In western wear, with cowboy hats and fringed jackets.",
121
+ "In minimalist fashion, elegant with clean lines and neutral tones.",
122
+ "Wearing sportswear, functional with athletic shoes.",
123
+ "In flapper style, evoking the lively 1920s jazz scene.",
124
+ "In pin-up attire, oozing sensuality with high-waists and red lipstick.",
125
+ "In mid-century modern fashion, reflecting post-war optimism.",
126
+ "In art deco style, fusing modern with lavish 20s embellishments.",
127
+ "Dressed in Victorian elegance, with corsets and intricate lacework.",
128
+ "In Edwardian attire, showcasing lighter fabrics, empire waistlines, and large hats.",
129
+ "Dressed in Elizabethan style, with ruffled collars, velvet gowns, and detailed embroidery.",
130
+ "In 70s retro, featuring psychedelic patterns, bell-bottoms, and platform shoes.",
131
+ "Wearing 80s retro, marked by neon colors, shoulder pads, and oversized tops.",
132
+ "In 90s attire, blending grunge, minimalism, and sportswear, with baggy jeans and crop tops.",
133
+ "Donning 00s style, with low-rise jeans, bedazzled tops, and chunky belts.",
134
+ "Adorned with musical accessories, like a harmonica necklace or drumstick earrings.",
135
+ "In leather, symbolizing toughness with studs or zippers.",
136
+ "In bold BDSM leather, featuring harnesses, chokers, and lace-up details.",
137
+ "In reflective latex, often seen in avant-garde fashion.",
138
+ "In a glossy latex suit, paired with high heels or boots.",
139
+ "Draped in luxurious silk, synonymous with opulence and elegance.",
140
+ "In a tweed ensemble, reflecting academia or British countryside charm.",
141
+ "Clothed in feathers, creating drama with each step.",
142
+ "In fur, a symbol of luxury and grandeur.",
143
+ "In metallic attire, with futuristic chains or mesh details.",
144
+ "In vibrant plastic wear, modern and edgy.",
145
+ "Adorned in dazzling jewels or crystals.",
146
+ "In sequined attire, perfect for parties or performances.",
147
+ "In exaggerated silhouettes, challenging fashion norms.",
148
+ "In layered clothing, adding depth and dimension.",
149
+ "In astronaut armor, representing space exploration.",
150
+ "In a bio-mechanical suit, blending organic and synthetic elements.",
151
+ "Wearing a protective biohazard suit.",
152
+ "Engaged with a laptop, reflecting a tech-savvy nature.",
153
+ "Surrounded by heat deformation or mirage effects.",
154
+ "As a futuristic soldier, equipped for dystopian warfare.",
155
+ "A translucent, amorphous alien creature, often found in horror or sci-fi.",
156
+ "Wearing a cloak, suggesting mystery, fantasy, or protection.",
157
+ "Playing a gripping electric guitar solo, immersed in the audience's energy.",
158
+ "Singing intensely, with the crowd hanging on every word.",
159
+ "A pulsating, translucent horror, invoking fear and intrigue.",
160
+ "Full-body view highlighting slender legs and distinctive footwear.",
161
+ "Futuristic, with glowing tattoos and cybernetic features.",
162
+ "Angry expression on a strikingly beautiful face.",
163
+ "In an action pose, dressed in a detailed black soldier outfit.",
164
+ "Lost in an electric guitar solo, resonating with listeners.",
165
+ "Singing powerfully, captivating the audience with deep emotion.",
166
+ "A shifting, glistening alien horror from the universe's dark corners.",
167
+ "Full body, focusing on 80mm slender legs emphasizing height.",
168
+ "Blending sci-fi, cyberpunk, and glowing tattoos with futuristic weapons.",
169
+ "Attire shimmering due to heat, creating a mirage effect.",
170
+ "A future soldier with body armor, high-tech gear, and camouflaged straps.",
171
+ "Guitar solo with a crowd backdrop, producing electrifying sounds.",
172
+ "Singing with passion, surrounded by lights and a massive audience's energy.",
173
+ "A shifting, oozing alien creature, invoking dread and curiosity.",
174
+ "Full-body focus on remarkable 80mm slender legs.",
175
+ "A future soldier with cyberpunk aesthetics and glowing tattoos.",
176
+ "Intense expression on a stunning face, showing raw emotion.",
177
+ "Athletic pose in a detailed black soldier outfit, emphasizing a fit physique.",
178
+ "Electrifying guitar solo before a massive cheering crowd.",
179
+ "Singing with raw emotion, captivating a vast audience.",
180
+ "A gelatinous, glowing alien creature; both feared and intriguing.",
181
+ "Full-body shot highlighting exaggerated 80mm slender legs.",
182
+ "Adorned in sci-fi, cyberpunk attire with glowing tattoos.",
183
+ "Heated demeanor causing mirage-like distortions around them.",
184
+ "Future soldier in body armor with high-tech gear.",
185
+ "Zoomed-out shot emphasizing 80mm long slender legs.",
186
+ "Sci-fi and cyberpunk blend with glowing tattoos.",
187
+ "Epic guitar solo captivating a vast audience.",
188
+ "Intense solo performance with a powerful voice.",
189
+ "Ever-changing gelatinous alien of horror.",
190
+ "Full-body shot, 80mm slender legs in focus.",
191
+ "Futuristic, cyberpunk with glow-emitting tattoos.",
192
+ "Heat-induced warping surroundings like a mirage.",
193
+ "Tech-equipped future soldier ready for battle.",
194
+ "Full-body view, 80mm legs as highlight.",
195
+ "Sci-fi blend with glow-in-the-dark tattoos.",
196
+ "Swift guitar solo resonating with a huge crowd.",
197
+ "Passionate vocal solo captivating listeners.",
198
+ "Dripping, amorphous alien creature.",
199
+ "Full-body stance, 80mm slender legs showcased.",
200
+ "a shimmering sequin dress",
201
+ "wearing studded (ankle boots)",
202
+ "donning a (velvet cape)",
203
+ "wearing a (choker)",
204
+ "sporting (platform shoes)",
205
+ "adorned with a (body chain)",
206
+ "wearing a (fringed jacket)",
207
+ "donning (fingerless gloves)",
208
+ "wearing (fishnet stockings)",
209
+ "draped in a (kimono)",
210
+ "wearing (combat boots)",
211
+ "adorned with a (belly chain)",
212
+ "wearing a (biker jacket)",
213
+ "donning (thigh-high boots)",
214
+ "wearing (steampunk goggles)",
215
+ "adorned with (arm cuffs)",
216
+ "wearing a (corset belt)",
217
+ "donning a (turban)",
218
+ "sporting a (feathered headdress)",
219
+ "wearing (holo sneakers)",
220
+ "adorned with (toe rings)",
221
+ "draped in a (sari)",
222
+ "wearing (futuristic visor)",
223
+ "sporting (peep-toe heels)",
224
+ "adorned with (upper arm bracelets)",
225
+ "wearing a (poncho)",
226
+ "donning (knee-high socks)",
227
+ "draped in a (toga)",
228
+ "wearing a (flapper dress)",
229
+ "sporting (winged shoes)",
230
+ "wearing a (ruffled blouse)",
231
+ "adorned with a (leg chain)",
232
+ "wearing (gladiator sandals)",
233
+ "draped in a (cloak)",
234
+ "sporting (suspenders)",
235
+ "donning a (beret)",
236
+ "wearing (cufflinks)",
237
+ "adorned with a (medallion)",
238
+ "wearing (spats)",
239
+ "sporting (elbow-length gloves)",
240
+ "donning (denim overalls)",
241
+ "wearing a (mesh top)",
242
+ "adorned with (ear cuffs)",
243
+ "draped in a (shawl)",
244
+ "wearing a (trilby hat)",
245
+ "sporting (stiletto heels)",
246
+ "wearing a (vest)",
247
+ "adorned with (hairpins)",
248
+ "wearing (espadrilles)",
249
+ "draped in a (trench coat)"
250
+ ]
data/artform.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ [
2
+ "photography",
3
+ "art"
4
+ ]
data/artist.json ADDED
@@ -0,0 +1,713 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "Akihito Tsukushi",
3
+ "Al Hirschfeld",
4
+ "Alan Lee",
5
+ "Albert Bierstadt",
6
+ "Albert Uderzo",
7
+ "Alberto Giacometti",
8
+ "Alberto Vargas",
9
+ "Albrecht Durer",
10
+ "Alejandro Burdisio",
11
+ "Aleksi Briclot",
12
+ "Alessio Albi",
13
+ "Alena Aenami",
14
+ "Alex Gard",
15
+ "Alex Grey",
16
+ "Alex Maleev",
17
+ "Alexander Jansson",
18
+ "Alexander Milne Calder",
19
+ "Alexandre Cabanel",
20
+ "Alexei Savrasov",
21
+ "Alexej von Jawlensky",
22
+ "Alfred Kubin",
23
+ "Alfredo Volpi",
24
+ "Alice Neel",
25
+ "Alice Rahon",
26
+ "Alphonse Mucha",
27
+ "Alyssa Monks",
28
+ "Amanda Clark",
29
+ "Amanda Sage",
30
+ "Amedeo Modigliani",
31
+ "Amelie Bernard",
32
+ "Anders Zorn",
33
+ "Andreas Achenbach",
34
+ "Andrew Wyeth",
35
+ "Andr\u00e9 Kert\u00e9sz",
36
+ "Andr\u00e9 Masson",
37
+ "Andy Fairhurst",
38
+ "Andy Singer",
39
+ "Andy Warhol",
40
+ "Anita Malfatti",
41
+ "Anna Dittmann",
42
+ "Anne Geddes",
43
+ "Anne Stokes",
44
+ "Anne-Louis Girodet",
45
+ "Annibale Carracci",
46
+ "Annie Leibovitz",
47
+ "Ansel Adams",
48
+ "Anthony van Dyck",
49
+ "Anton Fadeev",
50
+ "Anton Otto",
51
+ "Apollonia Saintclair",
52
+ "Arkhip Kuindzhi",
53
+ "Arnold B\u00f6cklin",
54
+ "Arshile Gorky",
55
+ "Art Spiegelman",
56
+ "Artemisia Gentileschi",
57
+ "Arthur Dove",
58
+ "Asaf Hanuka",
59
+ "Asher Brown Durand",
60
+ "Ashley Wood",
61
+ "Audrey Kawasaki",
62
+ "Austin Briggs",
63
+ "Balthus",
64
+ "Banksy",
65
+ "Barclay Shaw",
66
+ "Barry Blitt",
67
+ "Bastien Lecouffe Deharme",
68
+ "Beatrix Potter",
69
+ "Beauford Delaney",
70
+ "Beeple",
71
+ "Ben Shahn",
72
+ "Benoit B. Mandelbrot",
73
+ "Bernard Buffet",
74
+ "Bernd and Hilla Becher",
75
+ "Bernie Wrightson",
76
+ "Berthe Morisot",
77
+ "Bill Plympton",
78
+ "Bjarke Ingels",
79
+ "Bob Byerley",
80
+ "Bob Eggleton",
81
+ "Bob Ross",
82
+ "Boris Vallejo",
83
+ "Brandon Woelfel",
84
+ "Brian Despain",
85
+ "Brian Kesinger",
86
+ "Brothers Hildebrandt",
87
+ "Bruce Nauman",
88
+ "Bruce Pennington",
89
+ "Bruno Taut",
90
+ "Camille Claudel",
91
+ "Camille Corot",
92
+ "Camille Pissarro",
93
+ "Canaletto",
94
+ "Candido Portinari",
95
+ "Caravaggio",
96
+ "Carl Holsoe",
97
+ "Carl Larsson",
98
+ "Carne Griffiths",
99
+ "Caspar David Friedrich",
100
+ "Chaim Soutine",
101
+ "Charles Blackman",
102
+ "Charles Demuth",
103
+ "Charles E. Burchfield",
104
+ "Charles Eames",
105
+ "Charles Rennie Mackintosh",
106
+ "Chesley Bonestell",
107
+ "Chiharu Shiota",
108
+ "Childe Hassam",
109
+ "Chris Foss",
110
+ "Chris Mars",
111
+ "Chris Menges",
112
+ "Chris Moore",
113
+ "Christopher Doyle",
114
+ "Cindy Sherman",
115
+ "Clarence Holbrook Carter",
116
+ "Claude Cahun",
117
+ "Claude Lorrain",
118
+ "Claude Monet",
119
+ "Clive Barker",
120
+ "Clive Madgwick",
121
+ "Clovis Trouille",
122
+ "Clyde Caldwell",
123
+ "Coby Whitmore",
124
+ "Codex Seraphinianus",
125
+ "Coles Phillips",
126
+ "Conrad Roset",
127
+ "Craig Mullins",
128
+ "Cuno Amiet",
129
+ "Dale Chihuly",
130
+ "Damien Hirst",
131
+ "Dan Flavin",
132
+ "Dan Mumford",
133
+ "Daniel Gerhartz",
134
+ "Daniel Merriam",
135
+ "Daniel Ridgway Knight",
136
+ "Dave Gibbons",
137
+ "Dave McKean",
138
+ "David Alfaro Siqueiros",
139
+ "David B. Mattingly",
140
+ "David Burliuk",
141
+ "David Hockney",
142
+ "David Park",
143
+ "Dean Ellis",
144
+ "Dennis Stock",
145
+ "Di Cavalcanti",
146
+ "Diane Arbus",
147
+ "Diego Velazquez",
148
+ "Dion Beebe",
149
+ "Don Bluth",
150
+ "Don Maitz",
151
+ "Donato Giancola",
152
+ "Dora Maar",
153
+ "Dorothea Lange",
154
+ "Dorothea Tanning",
155
+ "Dorothy Lathrop",
156
+ "Doug Chiang",
157
+ "Dustin Nguyen",
158
+ "E.H. Shepard",
159
+ "Earl Norem",
160
+ "Ed Binkley",
161
+ "Ed Emshwiller",
162
+ "Ed Mell",
163
+ "Edgar Degas",
164
+ "Edmund Leighton",
165
+ "\u00c9douard Manet",
166
+ "Edvard Munch",
167
+ "Edward Weston",
168
+ "Edwin Austen Abbey",
169
+ "Edward Hopper",
170
+ "Egon Schiele",
171
+ "Eikoh Hosoe",
172
+ "El Greco",
173
+ "Elaine de Kooning",
174
+ "Ellen Jewett",
175
+ "Elliott Erwitt",
176
+ "Elsa Beskow",
177
+ "Emil Melmoth",
178
+ "Emil Nolde",
179
+ "Emily Carr",
180
+ "Emmanuel Lubezki",
181
+ "Enki Bilal",
182
+ "Eric Gill",
183
+ "Eric Lacombe",
184
+ "Erich Heckel",
185
+ "Erich Ludwig Kirchner",
186
+ "Ernst Fuchs",
187
+ "Ernst Haeckel",
188
+ "Esao Andrews",
189
+ "Eug\u00e8ne Delacroix",
190
+ "Eva Hesse",
191
+ "Evelyn De Morgan",
192
+ "Eyvind Earle",
193
+ "Fairfield Porter",
194
+ "Farel Dalrymple",
195
+ "Fernand L\u00e9ger",
196
+ "Fernando Botero",
197
+ "Filippo Lippi",
198
+ "Francis Bacon",
199
+ "Francis Picabia",
200
+ "Francisco Goya",
201
+ "Frank Auerbach",
202
+ "Frank Frazetta",
203
+ "Frank Lloyd Wright",
204
+ "Frank Miller",
205
+ "Frank Schoonover",
206
+ "Franklin Booth",
207
+ "Franz Kline",
208
+ "Franz Marc",
209
+ "Franz Sedlacek",
210
+ "Franz Xaver Winterhalter",
211
+ "Fred Tomaselli",
212
+ "Frederick Lord Leighton",
213
+ "Frida Kahlo",
214
+ "Friedensreich Regentag Dunkelbunt Hundertwasser",
215
+ "Frits Van den Berghe",
216
+ "F\u00e9lix Vallotton",
217
+ "Gabriel Pacheco",
218
+ "Garry Trudeau",
219
+ "Gary Larson",
220
+ "Gaston Bussiere",
221
+ "Gediminas Pranckevicius",
222
+ "Geof Darrow",
223
+ "George Cruikshank",
224
+ "George Frederic Watts",
225
+ "George Grosz",
226
+ "George Inness",
227
+ "George Luks",
228
+ "Georges Rouault",
229
+ "Georges Seurat",
230
+ "Georgia O'Keeffe",
231
+ "Gerald Brom",
232
+ "Gerhard Munthe",
233
+ "Gerhard Richter",
234
+ "Gertrude Abercrombie",
235
+ "Giacomo Balla",
236
+ "Giorgio de Chirico",
237
+ "Giuseppe Arcimboldo",
238
+ "Glenn Fabry",
239
+ "Go Nagai",
240
+ "Gottfried Helnwein",
241
+ "Graciela Iturbide",
242
+ "Grandma Moses",
243
+ "Greg Hildebrandt",
244
+ "Greg Rutkowski",
245
+ "Gregory Crewdson",
246
+ "Grzegorz Domaradzki",
247
+ "Guido Borelli da Caluso",
248
+ "Guillermo del Toro",
249
+ "Gustav Klimt",
250
+ "Gustav Vigeland",
251
+ "Gustave Caillebotte",
252
+ "Gustave Courbet",
253
+ "Gustave Dore",
254
+ "Gustave Moreau",
255
+ "H. R. Giger",
256
+ "Hal Foster",
257
+ "Hannah H\u00f6ch",
258
+ "Hans Baldung",
259
+ "Hans Bellmer",
260
+ "Harold Elliott",
261
+ "Harriet Backer",
262
+ "Harry Clarke",
263
+ "Harry Gruyaert",
264
+ "Heinrich Kley",
265
+ "Hendrik Kerstens",
266
+ "Henri Harpignies",
267
+ "Henri Matisse",
268
+ "Henri Rousseau",
269
+ "Henri de Toulouse-Lautrec",
270
+ "Henri-Edmond Cross",
271
+ "Henry Fuseli",
272
+ "Henry Ossawa Tanner",
273
+ "Herg\u00e9",
274
+ "Hieronymus Bosch",
275
+ "Hilma af Klint",
276
+ "Hirohiko Araki",
277
+ "Hiromu Arakawa",
278
+ "Hiroshi Nagai",
279
+ "Hiroshi Yoshida",
280
+ "Hokusai",
281
+ "Honor\u00e9 Daumier",
282
+ "Hope Gangloff",
283
+ "Howard Finster",
284
+ "Howard Hodgkin",
285
+ "Hubert Robert",
286
+ "Hugh Ferriss",
287
+ "Hugh Kretschmer",
288
+ "Hundertwasser",
289
+ "Ian McQue",
290
+ "Ian Miller",
291
+ "Igor Morski",
292
+ "Ilkka Uimonen",
293
+ "Ilya Repin",
294
+ "Irma Stern",
295
+ "Isaac Levitan",
296
+ "Isamu Noguchi",
297
+ "Ivan Aivazovsky",
298
+ "Ivan Albright",
299
+ "Ivan Bilibin",
300
+ "Ivan Generalic",
301
+ "Ivan Shishkin",
302
+ "J. J. Grandville",
303
+ "J.C. Leyendecker",
304
+ "J.M.W. Turner",
305
+ "Jacek Yerka",
306
+ "Jack Butler Yeats",
307
+ "Jack Davis",
308
+ "Jack Gaughan",
309
+ "Jack Kirby",
310
+ "Jackson Pollock",
311
+ "Jacob Lawrence",
312
+ "Jacob Riis",
313
+ "Jacques-Laurent Agasse",
314
+ "Jakub Rozalski",
315
+ "James Abbott McNeill Whistler",
316
+ "James C. Christensen",
317
+ "James Ensor",
318
+ "James Jean",
319
+ "James Turrell",
320
+ "Jamie Hewlett",
321
+ "Jan van Goyen",
322
+ "Jaroslaw Jasnikowski",
323
+ "Jasmine Becket-Griffith",
324
+ "Jason Edmiston",
325
+ "Jason Limon",
326
+ "Jean Arp",
327
+ "Jean Delville",
328
+ "Jean Giraud (Moebius)",
329
+ "Jean Leon Gerome",
330
+ "Jean Metzinger",
331
+ "Jean-Auguste-Dominique Ingres",
332
+ "Jean-Baptiste Carpeaux",
333
+ "Jean-Baptiste-Sim\u00e9on Chardin",
334
+ "Jean-Honore Fragonard",
335
+ "Jean-Michel Basquiat",
336
+ "Jean-Pierre Vasarely (Yvaral)",
337
+ "Jeff Easley",
338
+ "Jeff Koons",
339
+ "Jeff Lemire",
340
+ "Jeffrey Catherine Jones",
341
+ "Jeffrey Smith",
342
+ "Jeffrey T. Larson",
343
+ "Jeremy Geddes",
344
+ "Jeremy Lipking",
345
+ "Jeremy Mann",
346
+ "Jesper Ejsing",
347
+ "Jim Burns",
348
+ "Jim Fitzpatrick",
349
+ "Jim Lee",
350
+ "Jim Steranko",
351
+ "Jithesh",
352
+ "Joan Mir\u00f3",
353
+ "Joaquin Sorolla",
354
+ "Johan Christian Dahl",
355
+ "Johannes Vermeer",
356
+ "Johfra Bosschart",
357
+ "John Atkinson Grimshaw",
358
+ "John Bauer",
359
+ "John Berkey",
360
+ "John Blanche",
361
+ "John Carpenter",
362
+ "John Constable",
363
+ "John Duncan",
364
+ "John Frederick Kensett",
365
+ "John Harris",
366
+ "John Hoyland",
367
+ "John James Audubon",
368
+ "John Kenn Mortensen",
369
+ "John Kricfalusi",
370
+ "John Martin",
371
+ "John Perceval",
372
+ "John Philip Falter",
373
+ "John Romita Jr",
374
+ "John Singer Sargent",
375
+ "John Stephens",
376
+ "John William Waterhouse",
377
+ "Jonas Bendiksen",
378
+ "Josan Gonzalez",
379
+ "Joseph Cornell",
380
+ "Joseph Ducreux",
381
+ "Joseph Stella",
382
+ "Josephine Wall",
383
+ "Jules Bastien-Lepage",
384
+ "Jules Feiffer",
385
+ "Jules Pascin",
386
+ "Junji Ito",
387
+ "Justin Gerard",
388
+ "Kaethe Butcher",
389
+ "Kaja Foglio",
390
+ "Karel Thole",
391
+ "Karl Blossfeldt",
392
+ "Karl Schmidt-Rottluff",
393
+ "Karol Bak",
394
+ "Kate Greenaway",
395
+ "Kathe Kollwitz",
396
+ "Katsuhiro Otomo",
397
+ "Katsushika Hokusai",
398
+ "Kay Nielsen",
399
+ "Kay Sage",
400
+ "Kazimir Malevich",
401
+ "Kehinde Wiley",
402
+ "Kelly Freas",
403
+ "Kelly McKernan",
404
+ "Ken Sugimori",
405
+ "Kenojuak Ashevak",
406
+ "Kent Monkman",
407
+ "Kentaro Miura",
408
+ "Kilian Eng",
409
+ "Kim Jung Gi",
410
+ "Kuang Hong",
411
+ "Larry Elmore",
412
+ "Lasar Segall",
413
+ "Laurel Burch",
414
+ "Laurie Greasley",
415
+ "Laurie Lipton",
416
+ "Lawren Harris",
417
+ "Le caravaggesque",
418
+ "Lee Krasner",
419
+ "Lee Madgwick",
420
+ "Leiji Matsumoto",
421
+ "Leon Bankst",
422
+ "Leonardo da Vinci",
423
+ "Leonid Afremov",
424
+ "Liam Wong",
425
+ "Liniers",
426
+ "Lisa Frank",
427
+ "Louis Comfort Tiffany",
428
+ "Louis Wain",
429
+ "Lovis Corinth",
430
+ "Luc Schuiten",
431
+ "Lucian Freud",
432
+ "Luis Royo",
433
+ "Lyonel Feininger",
434
+ "Lyubov Popova",
435
+ "M.C. Escher",
436
+ "M.W. Kaluta",
437
+ "Mab Graves",
438
+ "Makoto Shinkai",
439
+ "Malcolm Liepke",
440
+ "Man Ray",
441
+ "Marc Chagall",
442
+ "Mark Lague",
443
+ "Marc Simonetti",
444
+ "Marco Mazzoni",
445
+ "Marek Okon",
446
+ "Margaret Boden",
447
+ "Margaret Bruce Wells",
448
+ "Margaret Brundage",
449
+ "Margaret Garland",
450
+ "Margaret Geddes",
451
+ "Margaret Graeme Niven",
452
+ "Margaret Keane",
453
+ "Margaret Macdonald Mackintosh",
454
+ "Maria Prymachenko",
455
+ "Maria Sibylla Merian",
456
+ "Marianne von Werefkin",
457
+ "Mario Testino",
458
+ "Marjorie Strider",
459
+ "Mark Brooks",
460
+ "Mark Catesby",
461
+ "Mark Rothko",
462
+ "Mark Ryden",
463
+ "Marsden Hartley",
464
+ "Martin Parr",
465
+ "Martin Johnson Heade",
466
+ "Martiros Saryan",
467
+ "Mary Blair",
468
+ "Mary Cassatt",
469
+ "Masamune Shirow",
470
+ "Masashi Kishimoto",
471
+ "Mat Collishaw",
472
+ "Mati Klarwein",
473
+ "Matt Groening",
474
+ "Matthias Grunewald",
475
+ "Matti Suuronen",
476
+ "Maurice Sendak",
477
+ "Max Beckmann",
478
+ "Max Ernst",
479
+ "Max Pechstein",
480
+ "Max Weber",
481
+ "Maxfield Parrish",
482
+ "Meret Oppenheim",
483
+ "Michael Deforge",
484
+ "Michael Whelan",
485
+ "Michelangelo",
486
+ "Mike Mignola",
487
+ "Mikhail Vrubel",
488
+ "Miles Aldridge",
489
+ "Milton Avery",
490
+ "Milton Glaser",
491
+ "Moebius (Jean Giraud)",
492
+ "Mort Drucker",
493
+ "Nan Goldin",
494
+ "Nao Emoto",
495
+ "Naoto Hattori",
496
+ "Natalia Goncharova",
497
+ "Neil Welliver",
498
+ "Nele Zirnite",
499
+ "Nell Dorr",
500
+ "Nicholas Roerich",
501
+ "Nick Knight",
502
+ "Nikos Economopoulos",
503
+ "Nobuyoshi Araki",
504
+ "Noriyoshi Ohrai",
505
+ "Norman Rockwell",
506
+ "Nychos",
507
+ "Odd Nerdrum",
508
+ "Odilon Redon",
509
+ "Oliver Jeffers",
510
+ "Oskar Kokoschka",
511
+ "Oskar Schlemmer",
512
+ "Otto Dix",
513
+ "Otto Marseus van Schrieck",
514
+ "Pablo Picasso",
515
+ "Pascal Campion",
516
+ "Patrick Henry Bruce",
517
+ "Patrick Heron",
518
+ "Patrick Nagel",
519
+ "Patrick Woodroffe",
520
+ "Paul Cezanne",
521
+ "Paul Delvaux",
522
+ "Paul Gauguin",
523
+ "Paul Gustav Fischer",
524
+ "Paul Klee",
525
+ "Paul Rand",
526
+ "Paula Modersohn-Becker",
527
+ "Pendleton Ward",
528
+ "Peter Bagge",
529
+ "Peter Elson",
530
+ "Peter Gric",
531
+ "Peter Kemp",
532
+ "Peter Max",
533
+ "Peter Paul Rubens",
534
+ "Phil Foglio",
535
+ "Philip Guston",
536
+ "Philip Pearlstein",
537
+ "Philip-Lorca diCorcia",
538
+ "Pierre Bonnard",
539
+ "Pierre-Auguste Renoir",
540
+ "Piet Mondrian",
541
+ "Pieter Claesz",
542
+ "Platon",
543
+ "Quentin Blake",
544
+ "Rachel Ignotofsky",
545
+ "Rafal Olbinski",
546
+ "Ralph McQuarrie",
547
+ "Ralph Steadman",
548
+ "Ram\u00f3n Casas",
549
+ "Randolph Caldecott",
550
+ "Raphael Lacoste",
551
+ "Raphaelite",
552
+ "Ray Caesar",
553
+ "Ray Earnes",
554
+ "Raymond Briggs",
555
+ "Raymond Swanland",
556
+ "Rebeca Saray",
557
+ "Rebecca Guay",
558
+ "Reginald Marsh",
559
+ "Remedios Varo",
560
+ "Ren\u00e9 Magritte",
561
+ "Richard Corben",
562
+ "Richard Dadd",
563
+ "Richard Diebenkorn",
564
+ "Richard Doyle",
565
+ "Richard Scarry",
566
+ "Ridley Scott",
567
+ "Rineke Dijkstra",
568
+ "Rob Gonsalves",
569
+ "Rob Liefeld",
570
+ "Robert Bechtle",
571
+ "Robert Capa",
572
+ "Robert Crumb",
573
+ "Robert Delaunay",
574
+ "Robert McCall",
575
+ "Robert McGinnis",
576
+ "Robert Motherwell",
577
+ "Robert Rauschenberg",
578
+ "Robert Williams",
579
+ "Roberto Ferri",
580
+ "Roberto Matta",
581
+ "Rockwell Kent",
582
+ "Rodney Matthews",
583
+ "Rodrigo Prieto",
584
+ "Roger Dean",
585
+ "Romare Bearden",
586
+ "Romero Britto",
587
+ "Ron Walotsky",
588
+ "Rosa Bonheur",
589
+ "Roy Lichtenstein",
590
+ "Rudolf Hausner",
591
+ "Rufino Tamayo",
592
+ "Russ Mills",
593
+ "Ruth Bernhard",
594
+ "Ryan Hewett",
595
+ "Ryo Takemasa",
596
+ "Ryohei Hase",
597
+ "Sally Mann",
598
+ "Salvador Dali",
599
+ "Sam Bosma",
600
+ "Sam Francis",
601
+ "Sam Guay",
602
+ "Sam Toft",
603
+ "Santiago Caruso",
604
+ "Satoshi Kon",
605
+ "Sebastian Kr\u00fcger",
606
+ "Sebasti\u00e3o Salgado",
607
+ "Sergio Toppi",
608
+ "Shaun Tan",
609
+ "Shepard Fairey",
610
+ "Shiki",
611
+ "Shinji Aramaki",
612
+ "Shotaro Ishinomori",
613
+ "Sidney Nolan",
614
+ "Sidney Prior Hall",
615
+ "Simon Bisley",
616
+ "Simon St\u00e5lenhag",
617
+ "Simone Martini",
618
+ "Sir James Guthrie",
619
+ "Sir Max Beerbohm",
620
+ "Sonia Delaunay",
621
+ "Stanley Donwood",
622
+ "Stefan Gesell",
623
+ "Stephanie Law",
624
+ "Stephen Gammell",
625
+ "Steve Argyle",
626
+ "Steve Dillon",
627
+ "Steve Ditko",
628
+ "Steve McCurry",
629
+ "Storm Thorgerson",
630
+ "Stuart Davis",
631
+ "Syd Mead",
632
+ "Sylvain Chomet",
633
+ "Taiyo Matsumoto",
634
+ "Takashi Murakami",
635
+ "Takato Yamamoto",
636
+ "Takehiko Inoue",
637
+ "Taro Okamoto",
638
+ "Tarsila do Amaral",
639
+ "Tatsuro Kiuchi",
640
+ "Ted Nasmith",
641
+ "Terry Oakes",
642
+ "Tex Avery",
643
+ "Theodor Seuss Geisel",
644
+ "Thomas Cole",
645
+ "Thomas Gainsborough",
646
+ "Thomas Kinkade",
647
+ "Tibor Nagy",
648
+ "Tillie Walden",
649
+ "Tim Burton",
650
+ "Tim Doyle",
651
+ "Tim Hildebrandt",
652
+ "Tim White",
653
+ "Tivadar Csontvary Kosztka",
654
+ "Todd McFarlane",
655
+ "Tom Bagshaw",
656
+ "Tom Lovell",
657
+ "Tom Thomson",
658
+ "Tom Whalen",
659
+ "Tomasz Alen Kopera",
660
+ "Tomasz Jedruszek",
661
+ "Tomek Setowski",
662
+ "Tomer Hanuka",
663
+ "Tomi Ungerer",
664
+ "Tomioka Tessai",
665
+ "Tommaso Dolabella",
666
+ "Tommaso Masaccio",
667
+ "Tommaso Redi",
668
+ "Tomokazu Matsuyama",
669
+ "Tom\u00e0s Barcel\u00f3",
670
+ "Tony DiTerlizzi",
671
+ "Tove Jansson",
672
+ "Tsutomu Nihei",
673
+ "Ub Iwerks",
674
+ "Van Herpen",
675
+ "Victo Ngai",
676
+ "Victor Brauner",
677
+ "Victor Moscoso",
678
+ "Victor Ngai",
679
+ "Victor Vasarely",
680
+ "Viktor Vasnetsov",
681
+ "Vilhelm Hammershoi",
682
+ "Vilmos Zsigmond",
683
+ "Vincent van Gogh",
684
+ "Virgil Finlay",
685
+ "Walter Crane",
686
+ "Walt Disney",
687
+ "Wassily Kandinsky",
688
+ "Wayne Barlowe",
689
+ "Weegee",
690
+ "Wes Anderson",
691
+ "Will Simpson",
692
+ "Wifredo Lam",
693
+ "William Blake",
694
+ "William Gropper",
695
+ "William Henry Hunt",
696
+ "William Hogarth",
697
+ "William Morris",
698
+ "William S Burroughs",
699
+ "William Stout",
700
+ "William-Adolphe Bouguereau",
701
+ "Winslow Homer",
702
+ "Wong Kar-Wai",
703
+ "Yaacov Agam",
704
+ "Yayoi Kusama",
705
+ "Yoshitaka Amano",
706
+ "Yousuf Karsh",
707
+ "Yuumei",
708
+ "Yves Klein",
709
+ "Yves Tanguy",
710
+ "Zack Snyder",
711
+ "Zaha Hadid",
712
+ "Zdzislaw Beksinski"
713
+ ]
data/background.json ADDED
@@ -0,0 +1,270 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "Eye-level shot, centered subject, direct perspective",
3
+ "Eye-level shot, centered subject, natural daylight",
4
+ "Eye-level shot, central framing, natural lighting",
5
+ "Eye-level shot, direct perspective, clear focus",
6
+ "Eye-level shot, shallow focus, soft lighting",
7
+ "Eye-level shot, straight angle, centered subject",
8
+ "Eye-level shot, straight angle, medium shot",
9
+ "Natural daylight, eye-level shot, soft focus",
10
+ "Rule of thirds, eye-level shot, straight angle, soft lighting",
11
+ "Soft focus, shallow depth of field, natural lighting",
12
+ "Vertical orientation, Eye-level shot, Straight angle, Centered subject",
13
+ "center focus, eye-level shot, shallow depth of field",
14
+ "center framed, eye-level shot, balanced perspective",
15
+ "center-focused, eye-level angle, shallow depth of field",
16
+ "centered subject, close-up shot, straight angle, eye-level perspective",
17
+ "centered subject, eye-level angle, frontal perspective",
18
+ "centered subject, eye-level angle, neutral perspective",
19
+ "centered subject, eye-level angle, tight framing",
20
+ "centered subject, eye-level shot, balanced framing",
21
+ "centered subject, eye-level shot, direct angle",
22
+ "centered subject, eye-level shot, direct angle, full body view",
23
+ "centered subject, eye-level shot, direct perspective",
24
+ "centered subject, eye-level shot, medium close-up",
25
+ "centered subject, eye-level shot, natural light",
26
+ "centered subject, eye-level shot, neutral perspective",
27
+ "centered subject, eye-level shot, portrait orientation",
28
+ "centered subject, eye-level shot, shallow depth of field",
29
+ "centered subject, eye-level shot, shallow depth of field, natural lighting",
30
+ "centered subject, eye-level shot, shallow depth-of-field",
31
+ "centered subject, eye-level shot, soft focus background",
32
+ "centered subject, eye-level shot, soft lighting",
33
+ "centered subject, eye-level shot, straight angle",
34
+ "centered subject, eye-level shot, straight angle, clear perspective",
35
+ "centered subject, eye-level shot, straight-on angle",
36
+ "centered subject, eye-level shot, straight-on angle, shallow depth of field",
37
+ "centered subject, eye-level shot, straightforward angle, natural lighting",
38
+ "centered subject, low camera angle, shallow depth of field",
39
+ "centered subject, low camera angle, studio lighting",
40
+ "centered subject, medium close-up, frontal angle, eye-level perspective",
41
+ "centered subject, medium shot, eye-level angle",
42
+ "centered subject, medium shot, natural light, shallow depth of field",
43
+ "centered subject, medium shot, straight angle",
44
+ "centered subject, natural lighting, eye-level angle",
45
+ "centered subject, natural lighting, eye-level shot",
46
+ "centered subject, shallow depth of field, eye-level shot",
47
+ "centered subject, shallow depth of field, natural light",
48
+ "centered subject, straight angle, eye-level perspective",
49
+ "centered subject, straight angle, neutral perspective",
50
+ "centered subject, straight-on angle, eye-level perspective",
51
+ "centered subject, straight-on angle, full-body shot",
52
+ "close-up shot, angled perspective, off-center framing",
53
+ "close-up shot, centered subject, eye-level angle",
54
+ "close-up shot, direct angle, eye-level perspective",
55
+ "close-up shot, direct angle, high perspective",
56
+ "close-up shot, direct angle, selfie perspective",
57
+ "close-up shot, eye-level angle, candid perspective",
58
+ "close-up shot, eye-level angle, center framed, natural daylight",
59
+ "close-up shot, eye-level angle, centered framing",
60
+ "close-up shot, eye-level angle, centered subject",
61
+ "close-up shot, eye-level angle, centered subject, natural lighting",
62
+ "close-up shot, eye-level angle, centered subject, portrait orientation",
63
+ "close-up shot, eye-level angle, centered subject, shallow depth of field",
64
+ "close-up shot, eye-level angle, centered subject, soft lighting",
65
+ "close-up shot, eye-level angle, centered subject, soft natural lighting",
66
+ "close-up shot, eye-level angle, central framing",
67
+ "close-up shot, eye-level angle, direct perspective",
68
+ "close-up shot, eye-level angle, direct perspective, centered framing",
69
+ "close-up shot, eye-level angle, direct perspective, soft lighting",
70
+ "close-up shot, eye-level angle, frontal perspective",
71
+ "close-up shot, eye-level angle, natural lighting",
72
+ "close-up shot, eye-level angle, outdoor lighting",
73
+ "close-up shot, eye-level angle, shallow depth of field",
74
+ "close-up shot, eye-level angle, soft lighting",
75
+ "close-up shot, eye-level angle, soft lighting, centered framing",
76
+ "close-up shot, eye-level angle, studio lighting",
77
+ "close-up shot, eye-level camera, direct angle, centered subject",
78
+ "close-up shot, front view, eye-level angle",
79
+ "close-up shot, front-facing camera, high angle",
80
+ "close-up shot, high angle, centered subject",
81
+ "close-up shot, high angle, direct perspective",
82
+ "close-up shot, high angle, direct perspective, selfie",
83
+ "close-up shot, high resolution, natural light, shallow depth of field",
84
+ "close-up shot, low angle, direct perspective",
85
+ "close-up shot, low angle, direct perspective, shallow depth of field",
86
+ "close-up shot, low angle, dramatic lighting",
87
+ "close-up shot, low camera angle, direct perspective",
88
+ "close-up shot, low camera angle, dynamic perspective",
89
+ "close-up shot, low camera angle, eye-level perspective, outdoor lighting",
90
+ "close-up shot, low camera angle, natural light",
91
+ "close-up shot, low camera angle, shallow depth of field",
92
+ "close-up shot, natural lighting, direct angle, eye-level perspective",
93
+ "close-up shot, natural lighting, shallow depth of field, three-quarter angle",
94
+ "close-up shot, off-center framing, natural light",
95
+ "close-up shot, selfie angle, natural light",
96
+ "close-up shot, selfie perspective, eye-level angle",
97
+ "close-up shot, selfie perspective, natural lighting",
98
+ "close-up shot, shallow depth of field, eye-level angle",
99
+ "close-up shot, shallow focus, eye-level angle",
100
+ "close-up shot, slight high angle, direct perspective",
101
+ "close-up shot, slightly angled view, eye-level perspective",
102
+ "close-up shot, soft lighting, shallow depth of field",
103
+ "close-up shot, straight angle, centered subject",
104
+ "close-up shot, straight angle, eye-level perspective",
105
+ "close-up shot, three-quarter view, shallow depth of field",
106
+ "close-up shot, warm lighting, direct angle",
107
+ "close-up, eye level, centered subject",
108
+ "close-up, eye-level shot, frontal perspective",
109
+ "close-up, eye-level, centered, shallow depth of field",
110
+ "close-up, eye-level, central framing",
111
+ "close-up, eye-level, frontal view",
112
+ "close-up, eye-level, shallow depth of field",
113
+ "close-up, eye-level, shallow focus",
114
+ "close-up, eye-level, soft light",
115
+ "close-up, eye-level, soft lighting",
116
+ "close-up, eye-level, studio lighting",
117
+ "close-up, selfie angle, eye-level perspective",
118
+ "close-up, selfie angle, high perspective",
119
+ "daylight shot, eye-level angle, centered framing",
120
+ "direct lighting, eye-level shot, centered subject",
121
+ "direct view, medium shot, neutral angle",
122
+ "eye-level shot, balanced framing, centered subject",
123
+ "eye-level shot, center frame, shallow depth of field",
124
+ "eye-level shot, center framed, clear focus",
125
+ "eye-level shot, center framed, natural light",
126
+ "eye-level shot, center framed, natural light, shallow depth of field, urban setting",
127
+ "eye-level shot, center framed, natural lighting",
128
+ "eye-level shot, center framing, soft lighting, shallow depth of field",
129
+ "eye-level shot, center-framed subject, soft lighting",
130
+ "eye-level shot, center-framed subject, soft natural lighting",
131
+ "eye-level shot, center-framed, natural daylight",
132
+ "eye-level shot, center-framed, natural lighting",
133
+ "eye-level shot, centered composition, natural light",
134
+ "eye-level shot, centered framing, natural light",
135
+ "eye-level shot, centered framing, shallow depth of field",
136
+ "eye-level shot, centered framing, shallow focus",
137
+ "eye-level shot, centered subject, direct gaze",
138
+ "eye-level shot, centered subject, direct perspective",
139
+ "eye-level shot, centered subject, natural daylight",
140
+ "eye-level shot, centered subject, natural light",
141
+ "eye-level shot, centered subject, natural light, shallow depth of field",
142
+ "eye-level shot, centered subject, natural lighting",
143
+ "eye-level shot, centered subject, natural lighting, shallow depth of field",
144
+ "eye-level shot, centered subject, neutral perspective",
145
+ "eye-level shot, centered subject, portrait orientation",
146
+ "eye-level shot, centered subject, shallow depth of field",
147
+ "eye-level shot, centered subject, shallow depth of field, natural lighting",
148
+ "eye-level shot, centered subject, shallow depth of field, soft lighting",
149
+ "eye-level shot, centered subject, soft background",
150
+ "eye-level shot, centered subject, soft focus",
151
+ "eye-level shot, centered subject, soft focus, natural lighting",
152
+ "eye-level shot, centered subject, soft lighting",
153
+ "eye-level shot, centered subject, straight angle",
154
+ "eye-level shot, centered subject, vivid colors",
155
+ "eye-level shot, centered subjects, shallow depth of field",
156
+ "eye-level shot, centered subjects, soft lighting",
157
+ "eye-level shot, central framing, natural lighting",
158
+ "eye-level shot, central framing, soft lighting",
159
+ "eye-level shot, central subject focus, natural lighting",
160
+ "eye-level shot, close-up framing, natural lighting",
161
+ "eye-level shot, close-up, soft lighting, centered subject",
162
+ "eye-level shot, direct angle, centered subject",
163
+ "eye-level shot, direct perspective, balanced framing",
164
+ "eye-level shot, medium close-up, centred subject",
165
+ "eye-level shot, medium close-up, direct perspective",
166
+ "eye-level shot, medium close-up, soft focus",
167
+ "eye-level shot, medium close-up, soft natural lighting",
168
+ "eye-level shot, medium shot, natural lighting",
169
+ "eye-level shot, natural lighting, center-framed subject",
170
+ "eye-level shot, natural lighting, centered subject",
171
+ "eye-level shot, natural lighting, clear focus",
172
+ "eye-level shot, natural lighting, shallow depth of field",
173
+ "eye-level shot, natural lighting, shallow depth of field, three-quarter view, centered subject",
174
+ "eye-level shot, natural lighting, soft focus background",
175
+ "eye-level shot, off-center framing, soft lighting",
176
+ "eye-level shot, portrait orientation, shallow depth of field",
177
+ "eye-level shot, portrait orientation, soft lighting",
178
+ "eye-level shot, shallow depth of field, blurred background",
179
+ "eye-level shot, shallow depth of field, natural lighting",
180
+ "eye-level shot, shallow depth of field, natural lighting, indoor setting",
181
+ "eye-level shot, shallow depth of field, soft lighting",
182
+ "eye-level shot, soft natural lighting, shallow depth of field",
183
+ "eye-level shot, straight angle, balanced framing",
184
+ "eye-level shot, straight angle, balanced symmetry, foreground focus",
185
+ "eye-level shot, straight angle, centered subject",
186
+ "eye-level shot, straight-on angle, centered subject",
187
+ "eye-level shot, straight-on angle, centered subject, shallow depth of field",
188
+ "eye-level shot, straight-on angle, shallow depth of field",
189
+ "eye-level shot, three-quarter view, natural lighting",
190
+ "eye-level view, natural daylight, shallow depth of field",
191
+ "frontal shot, eye-level angle, centered subject",
192
+ "frontal view, eye-level angle, centered subject",
193
+ "frontal view, eye-level angle, natural lighting",
194
+ "frontal view, eye-level angle, portrait orientation",
195
+ "frontal view, eye-level shot, center-framed",
196
+ "frontal view, eye-level shot, centered subject",
197
+ "frontal view, eye-level shot, centered subjects, close-up",
198
+ "frontal view, eye-level shot, soft focus",
199
+ "frontal view, eye-level shot, symmetrical stance",
200
+ "frontal view, eye-level, centered subject",
201
+ "frontal view, eye-level, centered subjects",
202
+ "frontal view, waist-up shot, soft lighting",
203
+ "high angle, close-up shot, central framing, soft lighting",
204
+ "high saturation, direct sunlight, eye-level shot",
205
+ "indoor lighting, eye-level shot, straight angle",
206
+ "indoor lighting, mirror reflection, eye-level shot, shallow depth of field",
207
+ "indoor lighting, selfie angle, close-up shot",
208
+ "indoor setting, eye-level shot, straight angle, centered subject, natural lighting",
209
+ "indoors, close-up, selfie perspective",
210
+ "low angle shot, sharp focus, bokeh effect",
211
+ "low angle, close-up, shallow depth of field",
212
+ "low angle, wide shot, diagonal lines",
213
+ "low angle, wide shot, dynamic perspective",
214
+ "medium close-up, eye-level angle, centered subject",
215
+ "medium close-up, eye-level shot, clear focus",
216
+ "medium shot, eye-level angle, centered subject, soft focus",
217
+ "medium shot, eye-level angle, natural lighting",
218
+ "medium shot, eye-level angle, soft focus background",
219
+ "medium shot, eye-level, direct perspective",
220
+ "medium shot, indoor lighting, eye-level angle, shallow depth of field",
221
+ "medium shot, off-center framing, shallow depth of field, natural light",
222
+ "mid-shot, street level, natural light, shallow depth of field",
223
+ "natural light, centered subject, shallow depth of field",
224
+ "natural light, close-up shot, eye-level angle",
225
+ "natural light, eye-level shot, shallow depth of field",
226
+ "natural lighting, close-up shot, eye-level angle",
227
+ "natural lighting, eye level shot, soft focus background",
228
+ "natural lighting, eye-level shot, centered subject",
229
+ "natural lighting, eye-level shot, medium shot",
230
+ "natural lighting, eye-level shot, soft focus background",
231
+ "natural lighting, medium close-up, eye-level angle",
232
+ "natural lighting, medium shot, shallow depth of field",
233
+ "natural lighting, mid shot, soft focus",
234
+ "natural lighting, shallow depth of field, eye-level angle, centered subject",
235
+ "natural lighting, shallow depth of field, eye-level shot",
236
+ "natural lighting, soft focus, eye-level shot",
237
+ "natural lighting, soft shadows, close-up shot, waist-up framing, eye-level angle, direct perspective",
238
+ "natural lighting, waist-up shot, blurred foreground",
239
+ "night shot, street lighting, sharp focus",
240
+ "outdoor lighting, close-up shot, low camera angle",
241
+ "outdoor lighting, eye-level shot, direct perspective",
242
+ "outdoor lighting, eye-level shot, natural background",
243
+ "outdoor lighting, eye-level shot, shallow depth of field, central framing",
244
+ "outdoor lighting, rear view, low angle, centered subject",
245
+ "outdoor shot, eye-level angle, centered framing",
246
+ "outdoor shot, eye-level angle, soft lighting",
247
+ "portrait orientation, eye-level shot, centered subject, natural lighting",
248
+ "portrait orientation, eye-level shot, close-up, frontal perspective",
249
+ "shallow depth of field, eye-level shot, background blur, centered subject",
250
+ "shallow depth of field, eye-level shot, natural lighting",
251
+ "shallow depth of field, eye-level shot, soft focus background",
252
+ "shallow depth of field, eye-level shot, soft natural lighting",
253
+ "shallow focus, eye-level shot, centered subject",
254
+ "shallow focus, eye-level shot, diagonal orientation",
255
+ "sharp focus, eye-level shot, direct perspective",
256
+ "soft backlighting, shallow depth of field, eye-level angle",
257
+ "soft backlighting, shallow depth of field, eye-level shot",
258
+ "soft lighting, eye-level shot, center-framed",
259
+ "soft lighting, indoor setting, eye-level shot, three-quarter framing",
260
+ "soft lighting, shallow depth of field, eye-level shot",
261
+ "soft lighting, shallow depth of field, three-quarter rear view",
262
+ "soft lighting, shallow focus, three-quarter shot",
263
+ "straight shot, medium close-up, eye-level perspective",
264
+ "street-level shot, medium close-up, eye-level angle",
265
+ "tight framing, eye-level angle, soft lighting",
266
+ "vertical orientation, eye-level shot, direct perspective",
267
+ "vertical orientation, eye-level shot, straightforward perspective",
268
+ "vertical orientation, natural lighting, eye-level shot",
269
+ "warm lighting, close-up shot, low angle"
270
+ ]
data/body_types.json ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "pretty",
3
+ "chubby",
4
+ "midweight",
5
+ "overweight",
6
+ "fat",
7
+ "flabby",
8
+ "buxom",
9
+ "voluptuous",
10
+ "hefty",
11
+ "pudgy",
12
+ "plump",
13
+ "obese",
14
+ "morbidly obese",
15
+ "stout",
16
+ "rotund",
17
+ "thick-bodied",
18
+ "thicc",
19
+ "thick",
20
+ "beefy",
21
+ "portly",
22
+ "tubby",
23
+ "overweight",
24
+ "(slightly overweight)",
25
+ "buff",
26
+ "burly",
27
+ "fit",
28
+ "well-built",
29
+ "well-endowed",
30
+ "muscular",
31
+ "stocky",
32
+ "big-boned",
33
+ "curvy",
34
+ "flabby",
35
+ "flyweight",
36
+ "skinny",
37
+ "too skinny",
38
+ "anorexic",
39
+ "not skinny",
40
+ "slender",
41
+ "lanky",
42
+ "slim",
43
+ "slight"
44
+ ]
data/clothing.json ADDED
@@ -0,0 +1,344 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "white crop top, denim shorts,silver bracelet,white texture,denim texture",
3
+ "white top, sleeveless, button-up, white bottoms, ribbed texture",
4
+ "white crop top, blue jeans, silver belt, textured fabric, denim texture",
5
+ "white tank top, black pants, pink and blue goalie pads, black belt, white skates",
6
+ "black long-sleeve dress, fishnet stockings",
7
+ "black bikini top, black bikini bottom, hoop earrings",
8
+ "white towel, white head wrap",
9
+ "gray crop top, black skirt, ribbed texture, v-neckline",
10
+ "black bodysuit, sheer texture, light wash jeans, golden bangles",
11
+ "pink dress, spaghetti straps, form-fitting, floor-length",
12
+ "black sports bra, black leggings, textured fabric, small white logo",
13
+ "black bikini, knit texture, gold accessories, aviator sunglasses",
14
+ "patterned crop top, green leather pants, silver necklaces, red bracelet, hoop earrings",
15
+ "black bikini top, striped pants, beige textures, open white shirt",
16
+ "pink dress, orange sash, gold heels, floral headpiece",
17
+ "pastel pink tank top, blue ripped jeans, black platform heels, neutral shoulder bag",
18
+ "white sleeveless top, ribbed texture, high-cut white bottoms",
19
+ "black dress, plunging neckline, satin texture, brown handbag, chain strap, diamond necklace, wristwatch, silver bracelet",
20
+ "brown crop top, brown skirt, smooth texture",
21
+ "black sports bra, black leggings, white sneakers, textured fabric",
22
+ "blue dress, bodycon fit, sleeveless, zipper detail, V-neckline, subtle sheen",
23
+ "beige tank top, black denim shorts, smooth fabric, ripped texture",
24
+ "black tube top, gold necklace, gold arm cuff, red headwrap",
25
+ "black jumpsuit, zipper detail, form-fitting, long-sleeved",
26
+ "white crop top, blue jeans, silver necklace",
27
+ "light blue crop top, ribbed texture, long sleeves, denim jeans",
28
+ "black swimsuit, plunging neckline, sleeveless",
29
+ "blue dress, strap sleeves, high slit, textured fabric, hoop earrings, wristwatch, bracelet",
30
+ "black sleeveless top, black leather pants, gold necklace",
31
+ "black tank top, chain belt, black shorts, patterned boots",
32
+ "pink hoodie, pink shorts, textured fabric",
33
+ "black bikini top, denim shorts, frayed hems",
34
+ "blue bikini, tie-up detail, vibrant prints, double-strap top, high-cut bottoms, textured fabric",
35
+ "tan crop top, tan high-waisted pants, ripped knee, checked shirt tied, white sneakers",
36
+ "brown tank top, plaid skirt, smooth texture, fitted top, flared skirt",
37
+ "white dress, black sandals, dark sunglasses, textured fabric, sheer sleeves, leather bag",
38
+ "black sports bra, black shorts, black arm band, dark wrist watch, clear eyeglasses",
39
+ "beige hoodie, matching pants, textured fabric",
40
+ "red satin dress, off-shoulder style, knotted front",
41
+ "white crop top, lace details, high-waisted skirt, pleated texture",
42
+ "black dress, sleeveless top, plunging neckline, white cross necklace, textured handbag, silver bracelet",
43
+ "pink halter-neck dress, ribbed texture, form-fitting",
44
+ "yellow lace-up top, white lace bralette, blue denim shorts, green handbag",
45
+ "white crop top, white jeans, glasses",
46
+ "red dress, sleeveless, v-neckline",
47
+ "white blouse, intricate lace, sheer sleeves",
48
+ "white bikini top, white mesh cover-up, white skirt, silver necklace",
49
+ "black oversized t-shirt, white sport socks",
50
+ "black strap top, lace trim, glossy texture",
51
+ "white crop top, ribbed texture, short sleeves, high-waisted shorts, elastic waistband",
52
+ "pink blazer, white top, pink trousers, silky fabric",
53
+ "green sports bra, green shorts, white sneakers, textured fabric",
54
+ "blue crop top, blue shorts, white sneakers, texture appears smooth",
55
+ "black tank top, denim shorts, textured fabric, light blue, frayed hems",
56
+ "green sports bra, green shorts, white socks, multicolored sneakers",
57
+ "straw hat, fringe bikini top, bikini bottom, earth tones",
58
+ "black dress, strap details, sheer textures",
59
+ "grey sweatshirt, soft texture, round neckline",
60
+ "white bikini top, ruffled edges, light fabric, headscarf with print, necklace",
61
+ "red bikini top, snakeskin pattern, textured fabric",
62
+ "white tank top, form-fitting, sleeveless",
63
+ "pink shiny dress, plunging neckline, sleeveless, textured fabric",
64
+ "strawberry-print top, white with red, matching shorts, silver loop earrings",
65
+ "pink crop-top, blue denim shorts, smooth texture, subtle sheen",
66
+ "textured fabric",
67
+ "white top, off-shoulder design, ruffled texture",
68
+ "beige strapless top, golden necklace",
69
+ "pink bikini top, shiny fabric, thin straps, pendant necklace, aviator sunglasses",
70
+ "white top, blue headband, black headphones",
71
+ "dark blue top, v-neckline, smooth texture, necklace with pendant",
72
+ "white top, black accents, mesh details, logo text",
73
+ "yellow crop top, yellow skirt, white high heels, gold necklace",
74
+ "white floral dress, off-shoulder design, sheer fabric",
75
+ "colorful bikini top, gold chain necklace, gold hoop earrings",
76
+ "denim jumpsuit, blue color, zipper front, sleeveless",
77
+ "white halter top, smooth texture",
78
+ "beige fedora, black bikini top, patterned cover-up, light-colored textures",
79
+ "green bikini top, white necklace",
80
+ "black halter top, glossy texture",
81
+ "black jacket, black crop top, black pants, various textures",
82
+ "black strapless top, golden necklace, golden bracelet",
83
+ "tie-dye bikini, blue-green-black hues, sports shorts, black with green and blue patterns",
84
+ "grey turtleneck, sleeveless, soft texture",
85
+ "beige tracksuit, zipper hoodie, matching pants, soft fabric",
86
+ "white tank top, blue jeans, black hair tie, gold necklace, blonde hair",
87
+ "satin top, silver color, strapless design, necklace, bracelet",
88
+ "red dress, plunging neckline, sleeveless, smooth texture, large hoop earrings",
89
+ "white floral dress, puff sleeves, low-cut neckline, butterfly pendant necklace",
90
+ "white fluffy robe, gold chain necklace, red lipstick",
91
+ "blue dress, sleeveless, plunging neckline, cinched waist, flowy texture",
92
+ "black jacket, purple shirt, denim overalls, white hair accessory, cream cardigan, simple necklace",
93
+ "sleeveless top, beige color, ribbed texture, high-waisted pants, black color, button details",
94
+ "white halter top, knotted center, sleeveless, smooth texture",
95
+ "cream crop top, beige striped shirt, blue ripped jeans",
96
+ "patterned white hat, large black glasses, denim jacket, red top, gold ring, white manicure",
97
+ "black rimmed glasses, beige blazer, black top, gold necklace",
98
+ "brown blouse, shoulder strap, gold necklace, stud earrings, eyeglasses, white manicure, gold rings",
99
+ "light green tank top, white drawstrings, ribbed texture, light green bottoms, fitted waistband, casual style",
100
+ "white strapless top, satin texture",
101
+ "white lace top, denim bottoms",
102
+ "camouflage crop top, camouflage shorts, brown boots, silver bracelets, sunglasses, hoop earrings",
103
+ "black top, sheer sleeves, black skirt, black boots, glasses",
104
+ "white ribbed top, plunging neckline, long sleeves, drawstring front, black jeans, distressed details",
105
+ "sleeveless top, beige color, snug fit, shorts, sitting",
106
+ "red dress, textured fabric, thin straps",
107
+ "yellow shirt, lace bralette, hoop earrings",
108
+ "white top, sheer sleeves, lace details, pastel pink bralette",
109
+ "black bodysuit, sheer gloves, patterned scarf, hoop earrings",
110
+ "black corset top, plaid skirt, glossy texture, lace details",
111
+ "beige bikini top, gold chain necklace",
112
+ "blue lace top, cleavage-revealing, long sleeves",
113
+ "black tank top, smooth texture",
114
+ "black halter top, white flower accessory",
115
+ "light pink hairband, green floral dress, gold earrings, light pink nail polish",
116
+ "white top, low neckline, soft texture",
117
+ "black tank top, black headband, headphones",
118
+ "black polka-dot bikini, thin necklace",
119
+ "black sleeveless top, textured fabric, shiny accessories",
120
+ "grey cardigan, white shirt, denim overalls, purple jacket, black hair ties",
121
+ "black leather dress, high-heel boots",
122
+ "blue camo sports bra, blue camo leggings",
123
+ "long-sleeve top, white bandeau, pink hues, sheer texture, butterfly prints",
124
+ "black tank top, white shirt, denim jeans",
125
+ "blue bikini top, blue high-waisted bottoms, large hoop earrings, white sneakers",
126
+ "beige hoodie, blue highlights, black sunglasses, blue sneakers, textured sole",
127
+ "beige hoodie, blue t-shirt, black leggings, blue sneakers, textured materials, oversized top, fitted bottoms",
128
+ "black crop top, black sheer-panelled bottoms, solid colors, smooth textures",
129
+ "straw hat, leopard print bikini, white cover-up",
130
+ "black sports bra, black leggings, smooth textures",
131
+ "black bikini top, shiny texture, gold necklace",
132
+ "white sports bra, white leggings, cream textured cardigan",
133
+ "red dress, thin straps, v-neckline, satin texture",
134
+ "black tank top, smooth texture",
135
+ "white halter top, gold necklace",
136
+ "black bikini, strap details",
137
+ "black bodysuit, white snow jacket, visible textures",
138
+ "no visible clothing",
139
+ "pink beret, light blouse, pink jacket, soft textures",
140
+ "fur-lined hood, beige coat, texture-soft",
141
+ "graphic jacket, multicolored, white hoodie, blue jeans",
142
+ "white tank top, spaghetti straps, lace details, natural textures",
143
+ "red crop top, white bikini bottoms, ribbed fabric",
144
+ "red strapless dress, smooth texture",
145
+ "sleeveless top, neutral color, soft texture",
146
+ "black sleeveless dress, textured fabric, sheer details",
147
+ "metallic green dress, crystal choker necklace",
148
+ "white tank top, gold necklace, natural texture",
149
+ "pearl headpiece, white textured dress, bejeweled adornments, sheer sleeves",
150
+ "white dress, deep neckline, sleeveless, lace-up sides, figure-hugging",
151
+ "white deep v-neck top, gold necklace, neutral makeup, straight hair",
152
+ "none visible",
153
+ "patterned blazer, patterned shorts, black bralette, warm colors, glossy texture",
154
+ "sleeveless top, beige color, denim shorts, light wash, leather seat texture",
155
+ "floral bikini top, white color, printed texture",
156
+ "blue dress, white trim, sparkling necklace, silver earrings, silver bracelet",
157
+ "silver chain necklace, pink pendant, gold bracelet",
158
+ "white headband, white ribbed top, black undergarment, light-colored jacket",
159
+ "yellow bikini top, black phone case",
160
+ "white crop top, light blue ripped jeans, smooth texture, silver necklace",
161
+ "peach sports bra, peach skirt, smooth fabric",
162
+ "patterned dress, black and white, deep neckline, short sleeves, textured fabric, black boots, laced footwear",
163
+ "black sleeveless dress, black heels, silver bracelet, silver necklace",
164
+ "light pink dress, sheer texture, fringe details, brown belt",
165
+ "red lace dress, black fur hat, red gloves",
166
+ "white cropped top, light blue jeans, textured fabric",
167
+ "pink cropped top, ribbed texture, tie-front detail, blue ripped jeans, casual style, light wash denim, black shoulder bag, brown belt",
168
+ "blue patterned bikini, sheer sleeves, ruffled cuffs",
169
+ "red dress, low neckline, sleeveless, smooth texture",
170
+ "pink sports bra, pink leggings, barefoot, black accents",
171
+ "striped one-piece swimsuit, blue and white colors, textured fabric",
172
+ "red ribbed sweater, black leather pants",
173
+ "white crop top, long sleeves, white skirt, textured fabric, green handbag, gold necklace, white wristwatch",
174
+ "white crop top, crisscross neckline, white pants, silver chain accents, white handbag, quilted texture",
175
+ "ribbed beige turtleneck dress, chest cut-out, black handbag, black and white sneakers",
176
+ "white tank top, black pants, smooth textures",
177
+ "White long-sleeve top, ribbed texture",
178
+ "black hoodie, pink leggings, brown shoes, white socks",
179
+ "Blue-purple bikini top, white lace-up detail, purple patterned skirt",
180
+ "strapless top, aqua color, textured fabric, high-waisted trousers, matching color, cinched ankles",
181
+ "pink dress, white cardigan, lacy sleeves",
182
+ "denim jumpsuit, light blue, sleeveless, lace-up front, fringed hem",
183
+ "bikini top, bikini bottom, earth tones, string ties",
184
+ "geometric pattern bodysuit, brown and black colors, plunging neckline, long sleeves, glossy black belt, black shoulder bag",
185
+ "white sleeveless top, silver zipper, textured fabric, blue denim shorts, frayed hems",
186
+ "red frilly dress, white heels, blue hair",
187
+ "white cropped shirt, white shorts, smooth fabric",
188
+ "yellow patterned bikini top, white bikini bottom, sunglasses, wrist accessories",
189
+ "grey bikini top, grey skirt, textured fabric, silver wrist accessory",
190
+ "strapless yellow dress, blue waist sash, beige high heels, black floral hair accessory",
191
+ "white crop top, black pants, pink and blue leg pads, vaughn glove, white skates",
192
+ "purple bikini top, lace-up detail, purple print skirt, textured fabric",
193
+ "pink tank top, blue ripped jeans, black strappy heels, beige shoulder bag",
194
+ "white tank top, blue denim shorts, textured fabric, visible brand writing",
195
+ "white cropped top, textured fabric, light-wash denim jeans, high-waisted, lace-up sides",
196
+ "white cropped cardigan, white pleated skirt, black shoulder bag, dark sunglasses, white bralette, gold necklace",
197
+ "pink crop top, white midriff band, pink shorts, glossy tan heels",
198
+ "black bikini top, black bikini bottoms, smooth fabric",
199
+ "sleeveless top, tan cropped pants, black sunglasses, black backpack straps, ribbed texture top, light colors",
200
+ "white crochet dress, brown belt, textures visible",
201
+ "white off-shoulder top, white shorts, textured fabric, ruffled sleeves",
202
+ "blue crop top, long sleeves, ribbed texture, plunging neckline, gray plaid skirt, pleated design",
203
+ "floral dress, white base, red and green patterns, V-neckline, long sleeves, brown belt, textured fabric",
204
+ "purple dress, gold heels, textured fabric, sleeveless, cut-out detailing",
205
+ "white hat, white dress, tiered ruffles, lace texture, small purse, silver watch, neutral heels",
206
+ "pink crop top, pink skirt, pink high heels, sleeveless, button details, smooth texture",
207
+ "black bodysuit, lace texture, sheer fabric",
208
+ "left: tan bodysuit, right: black dress, plunging neckline, short sleeves",
209
+ "sleeveless sequined dress, black and blue tones, sheer fabric, high slit, silver sequined dress, beige tones, strappy sandals, ankle strap, heeled footwear",
210
+ "black corset, lace texture, black gloves, chandelier earrings, silver necklace",
211
+ "brown polka-dot swimsuit, wide-brimmed straw hat, smooth texture",
212
+ "pink hearts bodysuit, white base, long sleeves",
213
+ "gray crop top, gold necklace, gold earrings, light makeup",
214
+ "Tan crochet bikini top, tan bikini bottom, gold waist chain, black halterneck bikini top, black tie-side bikini bottom, tan crochet bikini top, tan crochet skirt, gold waist chain",
215
+ "white hat, sunglasses, olive green cropped shirt, olive green skirt, black belt, black bikini bottom visible",
216
+ "beige dress, deep neckline, ribbed texture, white heels, criss-cross straps",
217
+ "blue tank top, textured fabric, lace-up front, white shorts, striped pattern, white sneakers",
218
+ "grey cardigan, white crop top, animal print shorts, blue hair",
219
+ "green dress, deep neckline, long sleeves, smooth texture, waist belt",
220
+ "pink bikini, pink heels, pink sunglasses",
221
+ "patterned jacket, patterned skirt, bikini top, vibrant colors, shiny texture",
222
+ "white cropped t-shirt, black graphic design, casual style",
223
+ "Red bikini, white polka dots, bow details",
224
+ "blue polka-dot dress, front buttoning, sleeveless design, white sunglasses, tied waist belt",
225
+ "white sports bra, white leggings, black sneakers, textures visible",
226
+ "lavender floral dress, white sunglasses, silver hoop earrings",
227
+ "sports bra, leggings, pastel green, form-fitting, sleeveless, high-waisted",
228
+ "white top, sheer overlay, light textures",
229
+ "white crop top, blue denim shorts, black and white sneakers, ribbed texture top",
230
+ "red crop top, blue jeans, light textures",
231
+ "blue sports bra, blue leggings, smooth texture",
232
+ "white crop top, high-waisted skirt, textured pink heels, black shoulder bag",
233
+ "striped swimsuit, blue and white, thin straps",
234
+ "white bikini top, white bikini bottoms, smooth texture",
235
+ "denim tube top, denim shorts, light blue, frayed hems, gold necklace, gold bracelet, navel piercing",
236
+ "black cap, black-framed glasses, red and black striped sweater, denim shorts, black belt, clear-lens glasses",
237
+ "crocheted bikini, white color, tassel details, tied straps",
238
+ "black halter dress, cut-out details, form-fitting, knee-length",
239
+ "white bikini, halter neck top, string bikini bottom, smooth texture",
240
+ "black dress, sleeveless, cut-out details, form-fitting",
241
+ "sports bra, leggings, pastel colors, form-fitting, athletic wear",
242
+ "blue and white striped top, front zipper, black shorts, denim texture",
243
+ "patterned dress, white with blue spots, short sleeves, v-neckline, textured fabric",
244
+ "blue bikini, white-orange socks, red-yellow roller skates",
245
+ "white long-sleeve top, distressed blue jeans, white sneakers",
246
+ "Black blazer, v-neckline, satin texture",
247
+ "white off-shoulder top, white bikini bottom, gold necklace, black sunglasses, textured fabrics",
248
+ "floral bikini, vibrant colors, textured fabric",
249
+ "green jumpsuit, cut-out torso, wide-leg pants, sleeveless top, flowy fabric",
250
+ "Pink dress, text patterns, sleeveless, high neckline, cut-out detail",
251
+ "black corset top, ripped blue jeans, white blazer, golden necklace, sunglasses on head",
252
+ "pink tank top, blue denim shorts, diamond choker necklace, brown patterned handbag",
253
+ "black corset top, patterned skirt, glossy texture",
254
+ "White halter top, blue denim jeans, gold bracelet, beige handbag",
255
+ "blue fringe haircut, pink sunglasses, pink denim jacket, white tank top, pink skirt, pink heart-shaped purse",
256
+ "pink crop top, pink shorts, ribbed texture, athletic wear",
257
+ "white off-shoulder top, wide sleeves, straw hat, textured fabric",
258
+ "denim jacket, black dress, white sneakers, blue backpack",
259
+ "white sports bra, black shorts, white sneakers, white socks",
260
+ "brown corset top, brown leather pants, glossy texture",
261
+ "brown cropped top, denim shorts, eyeglasses, wrist watch",
262
+ "white cropped top, blue denim jeans, smooth texture, frayed edges",
263
+ "light blue corset, denim jeans, silver necklace, black belt, light blue handbag",
264
+ "white cropped top, patterned green skirt, fabric texture visible, white undergarment",
265
+ "yellow crop top, blue denim shorts, white strapless top, tan belt, frayed hems",
266
+ "white crochet top, fringed detailing, denim jeans, tan shoulder bag",
267
+ "leopard print halter-top, blue ripped jeans",
268
+ "white long-sleeve top, plunging neckline, high-waisted jeans, distressed denim, blue color, tan ankle boots",
269
+ "black cut-out dress, gold bracelet, black and white heels, beige handbag",
270
+ "black crop top, deep neckline, long sleeves, denim shorts, frayed hem, black bralette, multiple straps, sheer sleeves, mesh pattern, choker necklace, high-waisted shorts, button closure",
271
+ "beige hoodie, matching sweatpants, visible drawstrings, soft texture",
272
+ "gray t-shirt, blue jeans, smooth texture, casual style",
273
+ "pink bikini top, pink skirt, sunglasses, gold watch",
274
+ "lace top, brown skirt, strapless design, textured fabric",
275
+ "strappy dress, beige color, form-fitting, textured fabric, sleeveless, knee-length",
276
+ "black t-shirt, rib cage print, white shorts",
277
+ "light blue hoodie, matching shorts, soft, cotton texture, hoodie drawstrings, exposed midriff",
278
+ "blue patterned top, blue patterned shorts, black glasses",
279
+ "black sequin dress, high neckline, sleeveless, side slit, strappy high heels, silver earrings",
280
+ "black sequined dress, high neckline, sleeveless, back slit, strappy high heels, metallic color",
281
+ "transparent patterned top, black bralette, glossy black pants, glittery sneakers",
282
+ "black eyeliner, silver hoop earrings, gray-scale makeup, camouflage long sleeve top, black crop top, glossy black pants, glittery silver sneakers",
283
+ "blue dress, short sleeves, shiny texture, watch, ring",
284
+ "white crop top, black headphones, black sunglasses",
285
+ "button-up dress, peach color, short sleeves, collar, thigh length, fabric texture",
286
+ "white crop top, yellow sweatpants, textured fabric",
287
+ "striped swimsuit, glasses",
288
+ "pink dress, short sleeves, crew neckline, ribbed texture",
289
+ "pink dress, tiered layers, spaghetti straps, v-neckline, pleated texture, silver watch",
290
+ "red sports bra, red leggings, smooth texture, athletic wear",
291
+ "light jacket, matching trousers, white sneakers, black bag",
292
+ "Yellow checkered bikini, white straps, smooth texture",
293
+ "white ribbed dress, yellow-tinted sunglasses",
294
+ "long-sleeve top, ribbed texture, brown color, matching skirt, high-waisted",
295
+ "black sports bra, striped sheer pants",
296
+ "golden bikini, textured fabric",
297
+ "white crop top, blue denim shorts, cow print boots, silver necklace",
298
+ "orange dress, ribbed texture, short sleeves, side cut-outs, tie-up details",
299
+ "red bikini top, red bikini bottom, ribbed texture, tied sides",
300
+ "black bikini, textured fabric",
301
+ "white corset top, floral pattern, denim jeans, corset laces",
302
+ "white tank top, grey sports bra, grey shorts, textured fabrics, visible branding",
303
+ "white ribbed top, front tie, long sleeves, black leather pants, high-waisted",
304
+ "brown hat, black tank top, white denim shorts, frayed shorts hem",
305
+ "black crop top, mesh sleeves, checkered mini skirt, black boots, textured fabrics",
306
+ "black sweatshirt, cartoon graphic, glasses, light shorts, casual style",
307
+ "crop top, olive green, ribbed texture, high-waisted leggings, olive green, fitted",
308
+ "black bikini, glossy texture, gold earrings",
309
+ "black v-neck top, black belt, black trousers, blue handbag, golden necklace",
310
+ "black crop top, long sleeves, high-waisted leggings, mesh panels, dark hues, white sneakers",
311
+ "white crop top, gray trousers, white sandals, black sunglasses, gold belt",
312
+ "gray cardigan, white crop top, leopard print shorts, blue hair",
313
+ "white v-neck top, knotted waist, light-colored pants, fitted texture",
314
+ "white crop top, grey shorts, white sneakers, text on top",
315
+ "black swimsuit, straw hat, textured fabric",
316
+ "off-shoulder top, white with stripes, casual shorts",
317
+ "white crop top, glitter texture, black leather jacket, black leather pants",
318
+ "black tank top, shoulder straps, scoop neckline",
319
+ "Sleeveless top, pink hue, denim shorts, ripped texture, sunglasses on head",
320
+ "black long-sleeve top, light blue jeans, silver belt, form-fitting, casual style",
321
+ "floral jumpsuit, red and beige, texture visible, high heels, tan-colored",
322
+ "red dress, sleeveless, V-neckline",
323
+ "dark sunglasses, white collared shirt, navy blue sweater, pleated white skirt, black shoulder bag with gold hardware",
324
+ "white tank top, textured fabric, large hoop earrings, headscarf with print",
325
+ "black swimsuit, red headband, sunglasses",
326
+ "black tank top, sheer fabric, patterned design, golden bracelet",
327
+ "camouflage bikini, white-brown-beige tones, high-waisted bottoms, sleeveless top, hoop earrings",
328
+ "patterned crop top, light colors, tie front, long sleeves, white pants, soft texture",
329
+ "green tank top, white shorts, black glasses",
330
+ "Red patterned top, deep neckline, short sleeves",
331
+ "white crop top, lace-up detail, textured skirt, cream color, sleeveless, midriff-baring",
332
+ "white bathrobe, textured fabric, glasses",
333
+ "white cropped top, blue trim, long sleeves, blue track pants",
334
+ "white crop top, pastel green leggings, textured fabric",
335
+ "spotted swimsuit, light-dark contrast, thin straps, skin exposure",
336
+ "black dress, double-breasted, v-neckline, sleeveless, silver necklace",
337
+ "black beanie, black cropped top, black leggings, black boots, red bag, gold watch",
338
+ "beige fedora, white cropped top, textured terracotta skirt",
339
+ "blue denim jeans, blue strapless top, texture appears soft",
340
+ "White lace dress, Off-shoulder sleeves, Corset-style top, Drawstring details",
341
+ "sleeveless top, beige color, ribbed texture, high neckline, light blue jeans, fitted style, denim material, wrist accessory, silver color, sparkling texture",
342
+ "white strapless top, white skirt, shiny fabric",
343
+ "light white dress, thin straps, sheer texture"
344
+ ]
data/composition.json ADDED
@@ -0,0 +1,344 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "lush greenery, blurred foliage, natural lighting",
3
+ "geometric tiles, circular mirror, bright lighting, hexagonal patterns",
4
+ "graffiti on door, urban setting, dark tones, metallic door handle",
5
+ "hockey rink, empty stands, protective netting, overhead lighting",
6
+ "white textured wall, architectural details, indirect lighting",
7
+ "interior setting, yacht cabin, neutral colors",
8
+ "marble interior, bath tub, luxury decor, neutral colors",
9
+ "white brick wall, soft shadows, neutral tones",
10
+ "wooden cabinetry, metallic handles, indoor lighting, blurred marina",
11
+ "black door, white wall, outdoor lighting, architectural details",
12
+ "boxing gym, hanging punching bags, scattered newspapers, weight plates",
13
+ "sunlit setting, waterfront, architectural columns, tropical plants",
14
+ "dark room, graphic door sign, purple wall accents, pink lighting effect",
15
+ "wooden structures, blurred furnishings, indoor setting, natural light",
16
+ "white structure, arch details, outdoor setting, other subjects",
17
+ "white walls, minimalistic design, clear sky, architectural details",
18
+ "rocky terrain, blurred foliage, natural setting",
19
+ "open doorway, bright lighting, indoor setting, blurred background",
20
+ "clear sky, coastal view, lush landscape, outdoor setting",
21
+ "pale wall, indoor setting, plant left side, yoga mat right side",
22
+ "outdoor light, blurred marina, overcast sky",
23
+ "indoor setting, sheer curtains, diffused lighting, soft color palette",
24
+ "green foliage, blurred leaves, natural setting",
25
+ "snowy landscape, pine trees, outdoor setting, daytime, wooden structure",
26
+ "neutral walls, indoor setting, minimalistic style",
27
+ "blurred indoors, muted colors, window visible",
28
+ "sandy beach, ocean waves, clear sky, pier structure",
29
+ "beach view, cloudy sky, calm sea, outdoor setting, blurred horizon",
30
+ "nighttime cityscape, window reflections, indoor setting",
31
+ "illuminated pool, purple lighting, night time, outdoor setting, landscaped garden",
32
+ "neutral colors, indoor setting, framed artwork, white sofa, glass table",
33
+ "textured white wall, minimalistic, outdoor lighting",
34
+ "calm water, overcast sky, sandy beach, distant sunshades, tranquil setting",
35
+ "white sculptures, classical columns, artistic space, diffuse natural light",
36
+ "urban setting, geometric structures, blurred background, overcast lighting",
37
+ "modern sculpture, clear sky, reflective water, urban setting, angular architecture",
38
+ "gym setting, blurred equipment, blue lighting, dark ambiance",
39
+ "dark blue backdrop, subtle texture, glowing edge",
40
+ "white walls, minimalistic art, indoor setting",
41
+ "indoor setting, patterned walls, wooden furniture, relaxed ambiance",
42
+ "lush greenery, terracotta roofs, coastal view, hazy skyline",
43
+ "indoor setting, green plants, dark couch, tiled floor, bright lighting",
44
+ "parking garage, concrete pillars, shadow patterns",
45
+ "outdoor stairs, building facade, flowering plants",
46
+ "blurred setting, neutral colors, outdoor environment",
47
+ "floral surroundings, blurred greens, natural setting",
48
+ "glass doors, tropical trees, clear sky, outdoor setting",
49
+ "plain wall, minimal shadows, neutral colors",
50
+ "staircase behind, indoor lighting, neutral colors",
51
+ "plain wall, neutral color, minimal shadows, soft lighting",
52
+ "industrial setting, nighttime, artificial lighting, parking area",
53
+ "neutral walls, indoor setting, minimalistic decor, potted plant",
54
+ "neutral-colored walls, indoor setting, plant on side",
55
+ "white boat, clear skies, sunlit, outdoor setting",
56
+ "plain wall, wooden floor, indoor lighting, potted plant",
57
+ "white stairs, surfboard overhead, outdoor setting",
58
+ "dark green tones, decorative artwork, ambient lighting",
59
+ "neutral wall, indoor setting, minimal detail",
60
+ "green cushions, outdoor setting, foliage, shaded area",
61
+ "outdoor setting, blurred greenery, wooden structure",
62
+ "blue sky, calm sea, boat deck",
63
+ "stone wall, draped curtains, indoor lighting",
64
+ "red car interior, blurred movement, sunlit ambiance",
65
+ "sunny sky, white structure, outdoor setting, partially cloudy",
66
+ "blue sky, ocean view, yacht in distance, seated pose",
67
+ "white interior, sheer curtains, window blinds, minimalistic style",
68
+ "indoor setting, large windows, daylight, minimalistic decor, outdoor view",
69
+ "foliage, outdoor setting, blurred greenery, natural light",
70
+ "car interior, black leather seats, diamond pattern stitching",
71
+ "indoor setting, neutral colors, minimalistic decor, soft lighting",
72
+ "arched structure, blurred foliage, outdoor setting",
73
+ "outdoor setting, white umbrellas, patio chairs, Moet & Chandon bottle, green plants",
74
+ "indoor setting, mirrored walls, soft lighting",
75
+ "sunny beach, blurred waves, clear sky",
76
+ "blurred interior, neutral tones, soft lighting",
77
+ "nighttime cityscape, blurred lights, outdoor setting",
78
+ "outdoor setting, tree branches, bright sunlight",
79
+ "blue umbrella, tropical setting, outdoor seating, beverage can, glass with drink",
80
+ "indoor setting, chairs visible, cluttered table, neutral colors",
81
+ "modern structure, blue sections, clear sky, urban setting, old building",
82
+ "white walls, soft lighting, indoor setting",
83
+ "light-colored building, dark doorway, minimalistic, urban setting",
84
+ "white wall, indoor setting, minimalistic decor",
85
+ "mural art, painted wings, indoor setting, casual ambience",
86
+ "vehicle interior, leather seats, car door window, slightly blurred",
87
+ "indoor setting, television on, modern decor, blurred details",
88
+ "dim lighting, indoor setting, blurred plants, warm tones",
89
+ "dimly lit room, blurred decor, warm tones, ambient lighting",
90
+ "dark room, black and white wall art, contrast lighting, minimalistic decor",
91
+ "sunrise\/sunset, calm water, anchored boats, hilly landscape, clear sky",
92
+ "indoor setting, blurred surroundings",
93
+ "outdoor setting, green plants, restaurant ambiance, daylight conditions",
94
+ "outdoor setting, clear blue sky, mountain view, lush greenery, architectural structure",
95
+ "bright room, modern furniture, large window",
96
+ "indoor setting, neutral colors, blurred decor",
97
+ "indoor setting, windows, blurred room details",
98
+ "plain white wall, indoor setting, soft lighting",
99
+ "outdoor setting, blue sky, swimming pool, lush plants, sunny day",
100
+ "indoor setting, blurred decor, neutral colors",
101
+ "outdoor cafe, green plants, tropical setting",
102
+ "stage structures, greenery, daytime, speakers, cables, yellow tennis balls",
103
+ "wooden structure, blurred greenery, natural daylight",
104
+ "hazy sky, mountainous terrain, balcony railing",
105
+ "outdoor setting, sports car, lush greenery",
106
+ "ocean view, cloudy sky, outdoor setting, sunset lighting",
107
+ "window curtains, indoor setting, neutral colors",
108
+ "ornate mirror, floral wallpaper, neutral tones, indoor setting",
109
+ "solid teal backdrop, soft shadows, no other subjects",
110
+ "house entrance, evening lighting, brick column, window",
111
+ "swimming pool, green lawn, outdoor setting, blue sky, daytime",
112
+ "green foliage, natural lighting, sunny day",
113
+ "neutral-colored wall, indoor setting, minimalistic decor",
114
+ "tropical foliage, blurred greenery, sunny daylight",
115
+ "indoor setting, neutral colors, ambient lighting",
116
+ "plain white, soft shadow, minimalistic",
117
+ "indoor room, potted plants, textured floor",
118
+ "outdoor setting, blurred foliage, overcast sky, natural light, creek or river",
119
+ "monochromatic hues, blurred setting, dark ambiance",
120
+ "indoor setting, crowded venue, blurred figures",
121
+ "white cyclorama, minimalist setting, studio environment",
122
+ "clear blue sky, lush green plants, sunlit ambiance",
123
+ "blue sky, palm trees, sunny day, outdoor setting",
124
+ "underpass structure, concrete columns, shadow patterns",
125
+ "concrete structure, shadow patterns, sunlit area",
126
+ "starry space, distant Earth, hexagonal pattern floor, metallic surface",
127
+ "space setting, starry sky, Earth visible, metallic floor, hexagonal pattern",
128
+ "tropical beach, green foliage, palm tree, blurred background, serene setting",
129
+ "sandy beach, green foliage, natural setting",
130
+ "gym equipment, blurred lights, reflective surfaces",
131
+ "sunlit building, green grass, shadow patterns, late afternoon",
132
+ "neutral tones, indoor setting, soft furnishings, blurred textures",
133
+ "evening sky, blurred greenery, distant water view",
134
+ "outdoor setting, basketball hoop, lush greenery, bright sunlight, colorful flowers",
135
+ "white walls, large window, indoor setting",
136
+ "sandy beach, ocean horizon, clear sky, distant figures",
137
+ "snowy setting, blurred trees, natural light",
138
+ "white bathtub, blurred surroundings, indoor setting",
139
+ "blossoming branches, blurred background, warm tones",
140
+ "outdoor gathering, blurred people, canopy structure, natural light",
141
+ "blue gradient, studio setting, no visible objects",
142
+ "blurred indoors, warm tones, indistinct shapes",
143
+ "yacht interior, sunset skies, calm water, moored boats",
144
+ "car interior, nighttime, blurred lights",
145
+ "white wall, indoor setting, minimal decor",
146
+ "event backdrop, logo patterns, green carpet",
147
+ "soft-focused, dark hues, subtle shadows",
148
+ "vehicle interior, blurred windows, soft lighting",
149
+ "indoor setting, blurred details, bokeh effect",
150
+ "solid dark, indoors, soft lighting",
151
+ "indoor setting, doorway, minimal decor",
152
+ "swimming pool, clear water, blurred blue, outdoor setting",
153
+ "outdoor seating, blurred plants, neutral colors",
154
+ "car interior, daylight, building exterior, reflective window",
155
+ "water body, hills, clear sky",
156
+ "indoor setting, blurred bedding, neutral colors",
157
+ "plain white, no distractions",
158
+ "urban setting, white buildings, overcast sky",
159
+ "plain wall, neutral colors, indoor lighting",
160
+ "sandy beach, rocky terrain, calm sea, clear sky",
161
+ "indoor room, sheer curtains, soft shadows",
162
+ "textured wall, concrete texture, muted colors, indoor setting, wooden stool",
163
+ "pink patterned chair, wooden furniture, cream carpet, floor lamp",
164
+ "stone wall, white railing, sunny day, shadow patterns",
165
+ "blue sky, coastal scenery, sparse vegetation, gravel ground",
166
+ "palm trees, blue sky, white building, parked cars",
167
+ "city street, cobblestone pavement, street staircase, colorful buildings, overcast sky, European architecture, daylight setting",
168
+ "indoor setting, gray sofa, sliding door",
169
+ "indoor setting, natural light, decorative mirror, neutral tones, floral arrangement, contemporary decor",
170
+ "paved walkway, potted plants, building facade, daytime",
171
+ "sandy beach, tropical vegetation, kayaks, clear sky",
172
+ "carousel, vibrant colors, blurry movement, white fence",
173
+ "outdoor setting, brightly lit, foliage, hexagonal tiles, architectural features",
174
+ "casino setting, slot machines, ambient lighting, blurred background",
175
+ "garage setting, parked car, concrete floor",
176
+ "hockey rink boards, indoor lighting, sporty environment",
177
+ "Marble steps, clear sky, architectural structure",
178
+ "luxury car interior, pink seats, door open",
179
+ "Green foliage, blurred plants, sunny day",
180
+ "outdoor setting, blooming flowers, wooden structure",
181
+ "green field, wooden fence, grazing horse, trees, dusk sky",
182
+ "concrete structure, underpass, soft shadows, daylight",
183
+ "beach setting, ocean horizon, cloudy sky, gentle waves, soft sand",
184
+ "parking garage, concrete pillars, EXIT sign, diffused daylight",
185
+ "metal staircase, blue hues, outdoor location, clear sky",
186
+ "colored balls, white floor, minimalistic architecture",
187
+ "marina setting, high-rise buildings, clear sky",
188
+ "outdoor pool, white building, tropical vegetation, poolside furniture",
189
+ "boat interior, water view, clear sky, distant buildings",
190
+ "white curved walls, arch-like alcoves, simple white stools",
191
+ "ice hockey rink, empty stands, neutral lighting",
192
+ "lush greenery, blurred foliage, outdoor setting",
193
+ "white walls, smooth texture, architectural lines, minimalistic style",
194
+ "red patterned car, daytime, outdoor setting, blurred surroundings",
195
+ "white picket fence, green foliage, sunlit scene",
196
+ "palm trees, clear skies, paved walkway, tropical setting",
197
+ "marble countertop, wooden slats, pink cabinets, makeup brushes",
198
+ "sandy beach, ocean waves, clear sky, surfboard",
199
+ "sandy beach, cloudy sky, distant mountains, beachgoers, paragliders, natural setting",
200
+ "stone wall, narrow pathway, natural light",
201
+ "urban skyline, water reflections, soft lighting, distant buildings",
202
+ "autumn leaves, wooded path, blurry foliage, natural setting",
203
+ "stone walls, green plants, hanging utensils, cobblestone ground, outdoor setting, narrow alley",
204
+ "gray couch, floral wallpaper, subdued lighting, large blooms, dark tones",
205
+ "green hedge, evenly lit, shadow on ground, outdoor setting",
206
+ "yellow couch, pink wall, white pillow, floral arrangement, indoor setting",
207
+ "red wallpaper, ornate chair, vintage phone, patterned carpet",
208
+ "greenery, sunlit lawn, blurred backdrop",
209
+ "theater setting, plush seating, ambient lighting, popcorn spilled, circular patterns on carpet",
210
+ "grey walls, pumpkin decorations, lit jack-o'-lantern, indoor setting, halloween theme",
211
+ "sandy beach, blurred foliage, white towel, printed design, scattered flowers",
212
+ "wooden door frame, snow-covered ground, pine trees",
213
+ "outdoor setting, waterfront view, glass panes, bar counter, citrus drinks, clear skies",
214
+ "Beach scenery, cloudy sky, sunset lighting, vegetation",
215
+ "sandy terrain, rocky formations, clear sky, picnic setup",
216
+ "tropical setting, palm trees, water body, champagne bucket, white draped chair",
217
+ "overlooking ocean, tropical foliage, distant islands, clear sky, stone wall",
218
+ "urban landscape, skyscrapers, overcast sky, greenery, empty lot",
219
+ "urban landscape, balcony railing, overcast sky, flowering shrubs, distant buildings",
220
+ "vintage car, car wash setting, soapy water, overcast sky",
221
+ "red wall, green foliage, natural daylight",
222
+ "indoor setting, wooden staircase, sunlit doorway",
223
+ "Blue sky, calm sea, wooden dock, lounge chairs, yellow towel, boat mast",
224
+ "urban setting, covered walkway, architectural columns, clear sky",
225
+ "balcony setting, urban skyline, daytime, green box with letters",
226
+ "lush greenery, purple flowers, blurred details",
227
+ "gym setting, cardio machines, large windows, snowy outdoors, urban environment",
228
+ "sandy beach, ocean waves, clear sky",
229
+ "concrete stairs, outdoor setting, sunlit, shadowed areas",
230
+ "paved sidewalk, green bushes, white picket fence, clear sky, distant people",
231
+ "residential area, paved road, clear sky, daytime",
232
+ "cloudy sky, historical monument, bustling plaza, street lamps",
233
+ "city skyline, water, daytime, clear skies",
234
+ "palm tree, tropical foliage, blurred greenery",
235
+ "lush greenery, flowering shrubs, paved path, outdoor setting, soft-focus plants",
236
+ "autumn leaves, picnic setting, carved pumpkins, basket, wine bottle, scattered fruits, woodland scenery",
237
+ "green van, sunlit trees, parked vehicle, daytime",
238
+ "narrow alleyway, beige walls, soft focus, daylight",
239
+ "beach setting, evening sky, soft focus, ocean horizon, other person blurred",
240
+ "beige walls, outdoor setting, architectural features",
241
+ "outdoor setting, running track, greenery, trees, sunlight",
242
+ "green trees, sunlit path, daytime, blurred background",
243
+ "tropical plants, blurred greenery, wooden structure, bright atmosphere",
244
+ "wooden boardwalk, blurred pedestrians, warm lighting",
245
+ "neutral tones, indoor setting, minimalist decor",
246
+ "Blurred shelves, indoor setting, warm tones",
247
+ "tropical setting, bar counter, patterned tiles, green cushioned chair, beverage visible",
248
+ "outdoor setting, patio, sliding door",
249
+ "stone wall, wrought iron gate, urban setting, neat pavements, subtle shadows",
250
+ "Wooden door, marble walls, indoor lighting, mirrored reflection",
251
+ "city skyline, large windows, indoor setting, sunset lighting, high-rise view",
252
+ "glass reflection, blurred greenery, outdoor setting",
253
+ "indoor setting, wooden floor, ornate furniture",
254
+ "Green foliage, outdoor setting, sunlit",
255
+ "ornate iron gate, stone building facade, urban environment, clear skies",
256
+ "palm trees, clear sky, tropical setting, paved path",
257
+ "tropical beach setting, palm trees, blue water, clear sky, wooden structure",
258
+ "stone wall, green hills, cloudy sky, river in distance",
259
+ "tennis court, blue surface, white lines, tennis racket, yellow tennis balls, net partial view",
260
+ "city street, evening lighting, shopfront windows, parked cars",
261
+ "bookshelves, stacked books, indoor setting",
262
+ "pink chair, white wall, 'VILLAGE' sign, outdoor setting",
263
+ "glass door, indoor setting, patterned rug, hardwood floors",
264
+ "fruit stand, hanging bananas, assorted fruits, daylight, outdoor market",
265
+ "white wall, indoor setting, natural light, door frame, glass reflection",
266
+ "green foliage, residential area, sunny day, clear sky",
267
+ "palm trees, sunny skies, floral bushes",
268
+ "modern interior, white walls, wooden floor, potted plant, bar stools",
269
+ "modern room, large window, green plant, white sofa, coffee table, beige pillows, gray walls",
270
+ "neon lights, Chinese characters, urban feel, dark ambiance",
271
+ "dark backdrop, blue accents, subtle texture, illuminated base",
272
+ "fuzzy pink blanket, blue-green tinted background, smartphone present, indoors, comfortable setting",
273
+ "palm trees, blue sky, outdoor furniture, patio setting",
274
+ "kitchen setting, espresso machine, white cabinets, decorative items",
275
+ "bright room, curtain-draped window, reflected in mirror, soft shadows",
276
+ "high-rise view, glass window, modern furniture",
277
+ "bright interior, white walls, open doorways, tiled floor, minimal decor",
278
+ "white wall, minimalistic, shadow patterns",
279
+ "city lights, blurred background, nighttime, wooden railing, dark ambiance",
280
+ "city lights, bokeh effect, nighttime, wooden surface",
281
+ "industrial setting, metal window, concrete wall, moss-covered ground",
282
+ "industrial setting, daylight, weathered building, concrete ground, overgrown vegetation",
283
+ "red chairs, wooden panels, natural light, yellow rose, white plate, silverware",
284
+ "clear skies, mountainous terrain, urban landscape",
285
+ "green hedge, clear sky, outdoor setting, daytime, concrete path",
286
+ "balcony setting, water view, boats docked, cloudy sky",
287
+ "city skyline, water, daylight",
288
+ "car interior, black leather seats, red stitching, parking garage",
289
+ "curtain-draped windows, cityscape view, natural light, modern interior",
290
+ "gym setting, blurred weights, indoor environment, clear windows, green foliage outside",
291
+ "urban setting, blurred vehicles, soft focus, evening light",
292
+ "Outdoor setting, clear sky, poolside, tropical vegetation",
293
+ "open road, clear sky, desert landscape",
294
+ "glass door, reflection visible, outdoor setting, plants, overcast sky",
295
+ "outdoor setting, greenery, trees, blurred foliage",
296
+ "beach sands, overturned boat, green foliage",
297
+ "dirt pathway, green plants, red flowers",
298
+ "open road, clear sky, mountainous terrain, daylight",
299
+ "rocky terrain, calm sea, clear sky, daylight",
300
+ "poolside, sunset sky, tropical trees, water reflections",
301
+ "green curtains, window blinds, indoor setting, golden hour light",
302
+ "sandy ground, wooden equipment, blurred buildings",
303
+ "plain wall, neutral colors, indoor setting",
304
+ "golden hour, out-of-focus horses, clear sky, outdoor setting, warm tones",
305
+ "stone wall, dappled sunlight, outdoor setting, foliage",
306
+ "wooden railing, green foliage, blurred scenery, outdoor environment",
307
+ "sheer curtains, soft backlight, indoor room, muted colors, minimalist style, peaceful atmosphere",
308
+ "outdoor setting, stone structure, hanging lanterns, foliage, ceramic pottery",
309
+ "illuminated buildings, urban setting, nighttime ambiance",
310
+ "tennis court, hard surface, painted lines, no other people",
311
+ "clear sky, coastal view, urban skyline, architectural features",
312
+ "urban skyline, grassy field, overcast sky",
313
+ "urban setting, blurred fountain, clear sky, buildings in distance",
314
+ "skyscrapers, palm trees, clear sky, balcony railing",
315
+ "swimming pool, lounge chairs, palm trees, clear skies",
316
+ "palm trees, beach huts, clear sky, sandy ground",
317
+ "gas station pumps, red bricks building, clear sky, daytime",
318
+ "marble tiles, shower heads, indoor lighting, shower knobs",
319
+ "Marina setting, yachts docked, clear sky, wooden pier",
320
+ "wooden pergola, hanging lights, green plants, twilight ambiance, outdoor setting",
321
+ "green foliage, blurred scenery, outdoor setting, brick path",
322
+ "blurred setting, neutral colors, outdoor environment",
323
+ "blurry cityscape, glass balustrade, indoor setting",
324
+ "blurry nature, earthy tones, out of focus",
325
+ "desert terrain, clear sky, ATV vehicle",
326
+ "water feature, blue tiles, blurred buildings, outdoor setting",
327
+ "outdoor setting, bright sunlight, orange umbrellas, white lounge chairs, clear sky",
328
+ "horizontal lines, warm lighting, blurred setting, outdoor location",
329
+ "sunlit trees, blurred foliage, outdoor setting",
330
+ "Blurry greenery, white structure, defocused meal",
331
+ "sandy beach, sunset lighting, coastal vegetation, wooden post",
332
+ "window with sheer curtain, soft natural light, blurred food tray, couch corner",
333
+ "sunlit street, blurred foliage, warm tones",
334
+ "neutral tones, minimalistic decor, plain walls",
335
+ "tropical setting, blurred greenery, open-air structure, beverage on table",
336
+ "modern interior, large window, daytime, urban skyline, minimal furniture",
337
+ "city street, stone balustrade, cloudy sky, walking people, fluttering flags",
338
+ "desert landscape, clear skies, distant camel",
339
+ "interior setting, ceiling fan, natural lighting, open door, floor lamp",
340
+ "Indoor setting, Wooden floor, White lampshade, Dining chairs, Kitchen counter",
341
+ "wooden panels, modern architecture, outdoor setting, bright daylight",
342
+ "window frame, white wall, pipe visible",
343
+ "wooden structure, forested area, natural light, out of focus greenery"
344
+ ]
data/default_tags.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "a man",
3
+ "a woman",
4
+ "a young man",
5
+ "a young woman",
6
+ "a middle aged man",
7
+ "a middle aged woman",
8
+ "an old man",
9
+ "an old woman"
10
+ ]
data/device.json ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "Canon EOS 5D Mark IV with Canon EF 24-70mm f-2.8L II",
3
+ "Canon EOS 90D with Canon EF-S 18-135mm f-3.5-5.6 IS USM",
4
+ "Canon EOS M6 Mark II with Canon EF-M 32mm f-1.4",
5
+ "Canon EOS R with Canon RF 28-70mm f-2L",
6
+ "Canon EOS-1D X Mark III with Canon EF 50mm f-1.2L",
7
+ "Canon PowerShot G5 X Mark II with Built-in 8.8-44mm f-1.8-2.8",
8
+ "DJI Mavic Air 2 with Built-in 24mm f-2.8",
9
+ "FujiFilm X-T4 with Fujinon XF 35mm f-2 R WR",
10
+ "Fujifilm GFX 100 with GF 110mm f-2 R LM WR",
11
+ "Fujifilm X-Pro3 with Fujinon XF 56mm f-1.2 R",
12
+ "Fujifilm X-S10 with Fujinon XF 10-24mm f-4 R OIS WR",
13
+ "Fujifilm X100V with Fujinon 23mm f-2",
14
+ "GoPro HERO9 with Built-in f-2.8 Ultra-Wide",
15
+ "Hasselblad 907X with Hasselblad XCD 30mm f-3.5",
16
+ "Hasselblad X1D II with Hasselblad XCD 65mm f-2.8",
17
+ "Kodak PIXPRO AZ901 with Built-in 4.3-258mm f-2.9-6.7",
18
+ "Leica CL with Leica Summilux-TL 35mm f-1.4 ASPH",
19
+ "Leica M10 with LEICA 35mm f-2 SUMMICRON-M ASPH",
20
+ "Leica Q2 with Summilux 28mm f-1.7 ASPH",
21
+ "Leica SL2 with Leica APO-Summicron-SL 50mm f-2 ASPH",
22
+ "Nikon Coolpix P950 with Built-in 24-2000mm f-2.8-6.5",
23
+ "Nikon D780 with Nikkor 14-24mm f-2.8G",
24
+ "Nikon D850 with Nikkor 50mm f-1.8",
25
+ "Nikon Z50 with Nikon Z DX 16-50mm f-3.5-6.3",
26
+ "Nikon Z6 II with Nikon Z 24-70mm f-4 S",
27
+ "Nikon Z7 with Nikon Z 70-200mm f-2.8 VR S",
28
+ "Olympus OM-D E-M1 Mark III with M.Zuiko 12-40mm f-2.8",
29
+ "Olympus OM-D E-M5 Mark III with M.Zuiko 40-150mm f-2.8",
30
+ "Olympus PEN-F with M.Zuiko 17mm f-1.8",
31
+ "Olympus Tough TG-6 with Built-in 4.5-18mm f-2-4.9",
32
+ "Panasonic Lumix G9 with Leica DG 42.5mm f-1.2",
33
+ "Panasonic Lumix GH5 with Leica DG 25mm f-1.4",
34
+ "Panasonic Lumix S5 with Lumix S PRO 70-200mm f-2.8 O.I.S",
35
+ "Panasonic S1R with Lumix S 50mm f-1.4",
36
+ "Pentax 645Z with Pentax-D FA 645 55mm f-2.8",
37
+ "Pentax K-1 Mark II with Pentax FA 43mm f-1.9 Limited",
38
+ "Pentax KP with Pentax HD DA 20-40mm f-2.8-4",
39
+ "Ricoh GR III with GR 18.3mm f-2.8",
40
+ "Sigma fp with Sigma 45mm f-2.8 DG DN",
41
+ "Sigma sd Quattro H with Sigma 24-70mm f-2.8 DG",
42
+ "Sony A1 with Sony FE 20mm f-1.8 G",
43
+ "Sony A6400 with Sony E 35mm f-1.8 OSS",
44
+ "Sony A7C with Sony FE 28-60mm f-4-5.6",
45
+ "Sony A7R IV with Sony FE 85mm f-1.4 GM",
46
+ "Sony A9 II with Sony FE 24-70mm f-2.8 GM",
47
+ "Sony RX100 VII with Built-in 24-200mm f-2.8-4.5"
48
+ ]
data/digital_artform.json ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "Glitch Art art",
3
+ "Digital Painting art",
4
+ "Acrylic Paint art",
5
+ "Algorithmic art",
6
+ "Animation art",
7
+ "Art glass art",
8
+ "Assemblage art",
9
+ "Augmented reality art",
10
+ "Batik art",
11
+ "Beadwork art",
12
+ "Body painting art",
13
+ "Bookbinding art",
14
+ "Cast paper art",
15
+ "Ceramics art",
16
+ "Bronze art",
17
+ "Charcoal art",
18
+ "Collage art",
19
+ "Collagraphy art",
20
+ "Colored pencil art",
21
+ "Computer-generated imagery (cgi) art",
22
+ "Crochet art",
23
+ "Decoupage art",
24
+ "Digital sculpture art",
25
+ "Foam carving art",
26
+ "Found objects art",
27
+ "Fresco art",
28
+ "Glass art",
29
+ "Gouache art",
30
+ "Graffiti art",
31
+ "Ice art",
32
+ "Ink wash painting art",
33
+ "Installation art",
34
+ "Interactive media art",
35
+ "Lenticular printing art",
36
+ "Light projection art",
37
+ "Lithography art",
38
+ "Marble art",
39
+ "Metal art",
40
+ "Metalpoint art",
41
+ "Miniature painting art",
42
+ "Mixed media art",
43
+ "Monotype printing art",
44
+ "Neon art",
45
+ "Oil painting art",
46
+ "Origami art",
47
+ "Papier-mache art",
48
+ "Pastel art",
49
+ "Pen and ink art",
50
+ "Plastic arts",
51
+ "Polymer clay art",
52
+ "Printmaking art",
53
+ "Puppetry art",
54
+ "Pyrography art",
55
+ "Quilling art",
56
+ "Quilting art",
57
+ "Recycled art",
58
+ "Resin art",
59
+ "Sand art",
60
+ "Sound art",
61
+ "Silverpoint art",
62
+ "Spray paint art",
63
+ "Stone art",
64
+ "Tempera art",
65
+ "Tattoo art",
66
+ "Video art",
67
+ "Watercolor art",
68
+ "Wax art",
69
+ "Wood art"
70
+ ]
data/female_additional_details.json ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "a purple iridescent suit",
3
+ "wearing a (necklace)",
4
+ "wearing ((earrings))",
5
+ "wearing a (bracelet)",
6
+ "wearing one or multiple (rings)",
7
+ "wearing a (brooch)",
8
+ "wearing (eyeglasses)",
9
+ "wearing (sunglasses)",
10
+ "wearing a (hat)",
11
+ "wearing a (scarf)",
12
+ "wearing a (headband)",
13
+ "wearing a (nose ring)",
14
+ "wearing a (lip ring)",
15
+ "wearing a (tongue ring)",
16
+ "wearing an (eyebrow ring)",
17
+ "wearing (face tattoos)",
18
+ "wearing a (wreath)",
19
+ "wearing a (crown)",
20
+ "wearing a (tiara)",
21
+ "wearing a (crown of thorns)",
22
+ "wearing a (crown of jewels)",
23
+ "wearing (bohemian clothes)",
24
+ "wearing (chic clothes)",
25
+ "wearing (glamorous clothes)",
26
+ "wearing (grunge clothes)",
27
+ "wearing (preppy clothes)",
28
+ "wearing (punk clothes)",
29
+ "wearing (retro clothes)",
30
+ "wearing (rockabilly clothes)",
31
+ "wearing (romantic clothes)",
32
+ "wearing (tomboy clothes)",
33
+ "wearing (urban clothes)",
34
+ "wearing (camo clothes)",
35
+ "wearing (robes)",
36
+ "wearing (excessive amount of jewellery)",
37
+ "wearing (vintage clothes)",
38
+ "wearing (western clothes)",
39
+ "wearing (minimalist clothes)",
40
+ "wearing (sportswear clothes)",
41
+ "wearing (flapper clothes)",
42
+ "wearing (pin-up clothes)",
43
+ "wearing (mid-century modern clothes)",
44
+ "wearing (art deco clothes)",
45
+ "wearing (victorian clothes)",
46
+ "wearing (edwardian clothes)",
47
+ "wearing (elizabethan clothes)",
48
+ "wearing (retro 70s clothes)",
49
+ "wearing (retro 80s clothes)",
50
+ "wearing (retro 90s clothes)",
51
+ "wearing (retro 00s clothes)",
52
+ "wearing (musical equipment)",
53
+ "wearing (leather)",
54
+ "wearing (bdsm leather)",
55
+ "wearing (shiny latex)",
56
+ "wearing (shiny latex suit)",
57
+ "wearing (silk)",
58
+ "wearing (full tweed set)",
59
+ "wearing (clothes made entirely of feathers)",
60
+ "wearing (clothes made entirely of fur)",
61
+ "wearing (clothes made entirely of leather)",
62
+ "wearing (clothes made entirely of metal)",
63
+ "wearing (clothes made entirely of plastic)",
64
+ "wearing (clothes adorned with shimmering jewels or crystals)",
65
+ "waring (clothes adorned with sequins)",
66
+ "wearing (clothes with exaggerated or extreme silhouettes)",
67
+ "wearing (clothes with exaggerated or extreme footwear)",
68
+ "wearing (clothes with exaggerated or extreme headwear)",
69
+ "wearing (clothes with exaggerated or extreme facial or body piercings or tattoos)",
70
+ "wearing (clothes with multiple layers or tiers)",
71
+ "wearing (clothes with exaggerated or extreme colors)",
72
+ "wearing (clothes with exaggerated or extreme patterns)",
73
+ "wearing (cloak)",
74
+ "wearing an astronaut armor",
75
+ "wearing a bio mechanical suit",
76
+ "wearing a bio hazard suit",
77
+ "(( working with laptop))",
78
+ "with Heat deformation",
79
+ "(((future soldier, full body armor, futuristic football, shoulder pads, guns, grenades, weapons, bullet proof vest, high tech, straps, belts, camouflage)))",
80
+ "((full body, zoomed out)) long slender legs 80mm",
81
+ "(((sci-fi, future war, cyberpunk, cyborg, future fashion, beautiful face, glowing tattoos)))",
82
+ "((angry expression, pretty face))",
83
+ "(((full body, athletic body, action pose, detailed black soldier outfit, slender long legs)))",
84
+ "playing epic electric guitar solo in front of a huge crowd",
85
+ "singing epic solo into a microphone in front of a huge crowd",
86
+ "as a ((gelatinous horror dripping alien creature))",
87
+ "in a tie or bowtie, lending a touch of formal elegance or quirky charm, knotted around the collar to elevate the outfit",
88
+ "with anklets, delicate chains or beads that gracefully encircle the ankle, adding a touch of femininity with every step",
89
+ "donning a belt, functional yet fashionable, cinching the waist or sitting low on the hips, often with a statement buckle",
90
+ "wearing gloves, either elegant satin for formal events or rugged leather for a tougher look, complementing the attire and mood",
91
+ "with a choker, snugly encircling the neck, often made of lace, velvet, or leather, exuding a mix of elegance and edge",
92
+ "in stockings or tights, sheer or opaque, enhancing the legs while adding a touch of sophistication or playful patterns",
93
+ "with a satchel or bag, a functional accessory that speaks volumes about personal style, be it a minimalist tote or an embellished clutch",
94
+ "wearing cufflinks, subtle symbols of elegance, adorning the sleeves of a formal shirt, showcasing attention to detail",
95
+ "with a pendant, a piece of jewelry that dangles gracefully from a necklace, often holding sentimental or symbolic value",
96
+ "in layered necklaces, a blend of chains of varying lengths, creating depth and showcasing multiple pendants or charms",
97
+ "sporting a watch, a timeless accessory that blends functionality with style, either minimalist or grand, reflecting personal tastes",
98
+ "wearing a veil, a delicate piece of fabric that adds mystery and allure, often seen in bridal or ceremonial attire",
99
+ "donning a cape or cloak, adding drama to the ensemble, flowing gracefully with every movement, evoking a sense of fantasy or regality",
100
+ "with a tiara or diadem, a jeweled headpiece that signifies royalty or celebration, resting gracefully atop the head",
101
+ "Adorned with a crown, symbolizing royalty and authority with gemstones and metals",
102
+ "With a sparkling tiara, reminiscent of princesses or beauty queens",
103
+ "With a poignant crown of thorns, symbolizing sacrifice and resilience",
104
+ "With a jewel-encrusted crown, reflecting affluence and grandeur",
105
+ "In bohemian attire, embodying the free spirits with patterns and fringes",
106
+ "Dressed in chic fashion, blending comfort with high style",
107
+ "In glamorous attire, shiny or sequined, perfect for red-carpet events",
108
+ "Donning grunge wear, with flannels and combat boots, reflecting a rebellious spirit",
109
+ "In preppy clothes, with clean lines and classic patterns",
110
+ "Sporting punk fashion, with leather, studs, and bold hairstyles",
111
+ "In retro outfits, channeling specific decades with authentic pieces",
112
+ "Wearing rockabilly style, with pin-up influences and rock 'n' roll flair",
113
+ "In romantic attire, featuring soft fabrics and feminine silhouettes",
114
+ "Dressed in tomboy fashion, with boyish charm and comfort-focused pieces",
115
+ "In urban streetwear, blending comfort with trendy, city-inspired looks",
116
+ "Wearing camouflage, either for function or as a bold fashion statement",
117
+ "Draped in robes, from casual bathrobes to formal ceremonial garments",
118
+ "Adorned with excessive jewelry, creating a bold and opulent look",
119
+ "In vintage clothes, authentically representing past eras and styles",
120
+ "Sporting western wear, with cowboy hats, boots, and denim",
121
+ "In minimalist attire, focusing on clean lines and a less-is-more approach",
122
+ "Wearing sportswear, blending function and style for athletic pursuits",
123
+ "In flapper style, with dropped waists and ornate beading from the 1920s",
124
+ "Dressed as a pin-up, channeling retro glamour with curve-hugging styles",
125
+ "In mid-century modern fashion, reflecting the sleek designs of the 1950s and 60s",
126
+ "Wearing art deco inspired clothes, with geometric patterns and luxurious fabrics",
127
+ "In Victorian-style attire, with high necklines, corsets, and full skirts",
128
+ "Dressed in Edwardian fashion, featuring S-shaped silhouettes and large hats",
129
+ "In Elizabethan costume, with ruffs, farthingales, and ornate embroidery",
130
+ "Sporting 70s retro looks, with bell-bottoms, platforms, and psychedelic prints",
131
+ "In 80s inspired outfits, featuring bold colors, shoulder pads, and leg warmers",
132
+ "Wearing 90s fashion, with crop tops, high-waisted jeans, and chunky shoes",
133
+ "In early 2000s style, featuring low-rise jeans, crop tops, and platform sandals",
134
+ "With musical equipment, like guitars, drumsticks, or headphones as accessories",
135
+ "In leather attire, from sleek jackets to edgy pants or skirts",
136
+ "Wearing BDSM-inspired leather, with harnesses, collars, or studded accessories",
137
+ "In shiny latex, hugging every curve with a glossy, futuristic appeal",
138
+ "Sporting a full latex suit, covering from neck to toe in sleek, shiny material",
139
+ "Draped in silk, with flowing fabrics that catch the light beautifully",
140
+ "In a full tweed set, channeling British countryside chic",
141
+ "Wearing an outfit made entirely of feathers, creating a bold, avian-inspired look",
142
+ "In a fur ensemble, either faux or real, exuding luxury and warmth",
143
+ "Sporting an all-leather outfit, from jacket to pants and accessories",
144
+ "In a metallic outfit, with clothes seemingly forged from shining metals",
145
+ "Wearing an ensemble made entirely of plastic, futuristic and unconventional",
146
+ "Adorned in clothes shimmering with jewels or crystals, catching light at every angle",
147
+ "In a sequin-covered outfit, sparkling and eye-catching from every view",
148
+ "Wearing clothes with exaggerated silhouettes, pushing the boundaries of shape and form",
149
+ "In footwear with extreme designs, from towering platforms to avant-garde shapes",
150
+ "Sporting headwear with exaggerated proportions or unconventional materials",
151
+ "With extreme facial piercings or full-body tattoos, turning the skin into a canvas",
152
+ "In an outfit with multiple layers or tiers, creating depth and visual interest",
153
+ "Wearing clothes in extremely bold or neon colors, making a vibrant statement",
154
+ "In attire with exaggerated or surreal patterns, creating visual intrigue",
155
+ "Draped in a mysterious cloak, adding an air of intrigue or fantasy",
156
+ "In astronaut armor, representing space exploration and futuristic concepts",
157
+ "Wearing a bio-mechanical suit, blending organic forms with mechanical elements",
158
+ "In a biohazard suit, fully enclosed for protection or as a fashion statement",
159
+ "Engaged with a laptop, representing technology integration in fashion",
160
+ "Surrounded by heat deformation effects, as if the very air is bending around them",
161
+ "In futuristic soldier gear, with high-tech armor, weapons, and camouflage",
162
+ "Posed to accentuate long, slender legs, often with 80mm or higher heels",
163
+ "In sci-fi inspired wear, with cyberpunk elements and glowing tattoos",
164
+ "With an angry expression juxtaposed against delicate features",
165
+ "In a detailed black tactical outfit, emphasizing an athletic build and long legs",
166
+ "Mid-performance with an electric guitar, captivating an imaginary audience",
167
+ "Belting out a solo performance, microphone in hand, before a cheering crowd",
168
+ "Transformed into a gelatinous alien creature, dripping and otherworldly",
169
+ "With a tie or bowtie, adding a formal or quirky touch to the ensemble",
170
+ "Wearing delicate anklets, adding a feminine charm to the overall look",
171
+ "With a statement belt, either cinching the waist or riding low on the hips",
172
+ "In elegant or rugged gloves, complementing the outfit's overall mood",
173
+ "Sporting a choker, from delicate lace to edgy leather designs",
174
+ "In stockings or tights, either sheer for elegance or patterned for fun",
175
+ "Carrying a stylish bag, from minimalist totes to ornate clutches",
176
+ "With cufflinks, adding a touch of sophistication to formal wear",
177
+ "Wearing a meaningful pendant, dangling from a necklace",
178
+ "In layered necklaces, creating depth with varying lengths and styles",
179
+ "Sporting a watch, balancing functionality with personal style",
180
+ "Wearing a veil, adding mystery and allure to the overall look",
181
+ "Draped in a cape or cloak, bringing drama and movement to the ensemble",
182
+ "Crowned with a tiara or diadem, adding a regal touch to the outfit"
183
+ ]
data/female_body_types.json ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "pretty",
3
+ "chubby",
4
+ "midweight",
5
+ "overweight",
6
+ "fat",
7
+ "flabby",
8
+ "buxom",
9
+ "voluptuous",
10
+ "hefty",
11
+ "pudgy",
12
+ "plump",
13
+ "obese",
14
+ "morbidly obese",
15
+ "stout",
16
+ "rotund",
17
+ "thick-bodied",
18
+ "thicc",
19
+ "thick",
20
+ "beefy",
21
+ "portly",
22
+ "tubby",
23
+ "overweight",
24
+ "(slightly overweight)",
25
+ "buff",
26
+ "burly",
27
+ "fit",
28
+ "well-built",
29
+ "well-endowed",
30
+ "muscular",
31
+ "stocky",
32
+ "big-boned",
33
+ "curvy",
34
+ "flabby",
35
+ "flyweight",
36
+ "skinny",
37
+ "too skinny",
38
+ "anorexic",
39
+ "not skinny",
40
+ "slender",
41
+ "lanky",
42
+ "slim",
43
+ "slight"
44
+ ]
data/female_clothing.json ADDED
@@ -0,0 +1,344 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "white crop top, denim shorts,silver bracelet,white texture,denim texture",
3
+ "white top, sleeveless, button-up, white bottoms, ribbed texture",
4
+ "white crop top, blue jeans, silver belt, textured fabric, denim texture",
5
+ "white tank top, black pants, pink and blue goalie pads, black belt, white skates",
6
+ "black long-sleeve dress, fishnet stockings",
7
+ "black bikini top, black bikini bottom, hoop earrings",
8
+ "white towel, white head wrap",
9
+ "gray crop top, black skirt, ribbed texture, v-neckline",
10
+ "black bodysuit, sheer texture, light wash jeans, golden bangles",
11
+ "pink dress, spaghetti straps, form-fitting, floor-length",
12
+ "black sports bra, black leggings, textured fabric, small white logo",
13
+ "black bikini, knit texture, gold accessories, aviator sunglasses",
14
+ "patterned crop top, green leather pants, silver necklaces, red bracelet, hoop earrings",
15
+ "black bikini top, striped pants, beige textures, open white shirt",
16
+ "pink dress, orange sash, gold heels, floral headpiece",
17
+ "pastel pink tank top, blue ripped jeans, black platform heels, neutral shoulder bag",
18
+ "white sleeveless top, ribbed texture, high-cut white bottoms",
19
+ "black dress, plunging neckline, satin texture, brown handbag, chain strap, diamond necklace, wristwatch, silver bracelet",
20
+ "brown crop top, brown skirt, smooth texture",
21
+ "black sports bra, black leggings, white sneakers, textured fabric",
22
+ "blue dress, bodycon fit, sleeveless, zipper detail, V-neckline, subtle sheen",
23
+ "beige tank top, black denim shorts, smooth fabric, ripped texture",
24
+ "black tube top, gold necklace, gold arm cuff, red headwrap",
25
+ "black jumpsuit, zipper detail, form-fitting, long-sleeved",
26
+ "white crop top, blue jeans, silver necklace",
27
+ "light blue crop top, ribbed texture, long sleeves, denim jeans",
28
+ "black swimsuit, plunging neckline, sleeveless",
29
+ "blue dress, strap sleeves, high slit, textured fabric, hoop earrings, wristwatch, bracelet",
30
+ "black sleeveless top, black leather pants, gold necklace",
31
+ "black tank top, chain belt, black shorts, patterned boots",
32
+ "pink hoodie, pink shorts, textured fabric",
33
+ "black bikini top, denim shorts, frayed hems",
34
+ "blue bikini, tie-up detail, vibrant prints, double-strap top, high-cut bottoms, textured fabric",
35
+ "tan crop top, tan high-waisted pants, ripped knee, checked shirt tied, white sneakers",
36
+ "brown tank top, plaid skirt, smooth texture, fitted top, flared skirt",
37
+ "white dress, black sandals, dark sunglasses, textured fabric, sheer sleeves, leather bag",
38
+ "black sports bra, black shorts, black arm band, dark wrist watch, clear eyeglasses",
39
+ "beige hoodie, matching pants, textured fabric",
40
+ "red satin dress, off-shoulder style, knotted front",
41
+ "white crop top, lace details, high-waisted skirt, pleated texture",
42
+ "black dress, sleeveless top, plunging neckline, white cross necklace, textured handbag, silver bracelet",
43
+ "pink halter-neck dress, ribbed texture, form-fitting",
44
+ "yellow lace-up top, white lace bralette, blue denim shorts, green handbag",
45
+ "white crop top, white jeans, glasses",
46
+ "red dress, sleeveless, v-neckline",
47
+ "white blouse, intricate lace, sheer sleeves",
48
+ "white bikini top, white mesh cover-up, white skirt, silver necklace",
49
+ "black oversized t-shirt, white sport socks",
50
+ "black strap top, lace trim, glossy texture",
51
+ "white crop top, ribbed texture, short sleeves, high-waisted shorts, elastic waistband",
52
+ "pink blazer, white top, pink trousers, silky fabric",
53
+ "green sports bra, green shorts, white sneakers, textured fabric",
54
+ "blue crop top, blue shorts, white sneakers, texture appears smooth",
55
+ "black tank top, denim shorts, textured fabric, light blue, frayed hems",
56
+ "green sports bra, green shorts, white socks, multicolored sneakers",
57
+ "straw hat, fringe bikini top, bikini bottom, earth tones",
58
+ "black dress, strap details, sheer textures",
59
+ "grey sweatshirt, soft texture, round neckline",
60
+ "white bikini top, ruffled edges, light fabric, headscarf with print, necklace",
61
+ "red bikini top, snakeskin pattern, textured fabric",
62
+ "white tank top, form-fitting, sleeveless",
63
+ "pink shiny dress, plunging neckline, sleeveless, textured fabric",
64
+ "strawberry-print top, white with red, matching shorts, silver loop earrings",
65
+ "pink crop-top, blue denim shorts, smooth texture, subtle sheen",
66
+ "textured fabric",
67
+ "white top, off-shoulder design, ruffled texture",
68
+ "beige strapless top, golden necklace",
69
+ "pink bikini top, shiny fabric, thin straps, pendant necklace, aviator sunglasses",
70
+ "white top, blue headband, black headphones",
71
+ "dark blue top, v-neckline, smooth texture, necklace with pendant",
72
+ "white top, black accents, mesh details, logo text",
73
+ "yellow crop top, yellow skirt, white high heels, gold necklace",
74
+ "white floral dress, off-shoulder design, sheer fabric",
75
+ "colorful bikini top, gold chain necklace, gold hoop earrings",
76
+ "denim jumpsuit, blue color, zipper front, sleeveless",
77
+ "white halter top, smooth texture",
78
+ "beige fedora, black bikini top, patterned cover-up, light-colored textures",
79
+ "green bikini top, white necklace",
80
+ "black halter top, glossy texture",
81
+ "black jacket, black crop top, black pants, various textures",
82
+ "black strapless top, golden necklace, golden bracelet",
83
+ "tie-dye bikini, blue-green-black hues, sports shorts, black with green and blue patterns",
84
+ "grey turtleneck, sleeveless, soft texture",
85
+ "beige tracksuit, zipper hoodie, matching pants, soft fabric",
86
+ "white tank top, blue jeans, black hair tie, gold necklace, blonde hair",
87
+ "satin top, silver color, strapless design, necklace, bracelet",
88
+ "red dress, plunging neckline, sleeveless, smooth texture, large hoop earrings",
89
+ "white floral dress, puff sleeves, low-cut neckline, butterfly pendant necklace",
90
+ "white fluffy robe, gold chain necklace, red lipstick",
91
+ "blue dress, sleeveless, plunging neckline, cinched waist, flowy texture",
92
+ "black jacket, purple shirt, denim overalls, white hair accessory, cream cardigan, simple necklace",
93
+ "sleeveless top, beige color, ribbed texture, high-waisted pants, black color, button details",
94
+ "white halter top, knotted center, sleeveless, smooth texture",
95
+ "cream crop top, beige striped shirt, blue ripped jeans",
96
+ "patterned white hat, large black glasses, denim jacket, red top, gold ring, white manicure",
97
+ "black rimmed glasses, beige blazer, black top, gold necklace",
98
+ "brown blouse, shoulder strap, gold necklace, stud earrings, eyeglasses, white manicure, gold rings",
99
+ "light green tank top, white drawstrings, ribbed texture, light green bottoms, fitted waistband, casual style",
100
+ "white strapless top, satin texture",
101
+ "white lace top, denim bottoms",
102
+ "camouflage crop top, camouflage shorts, brown boots, silver bracelets, sunglasses, hoop earrings",
103
+ "black top, sheer sleeves, black skirt, black boots, glasses",
104
+ "white ribbed top, plunging neckline, long sleeves, drawstring front, black jeans, distressed details",
105
+ "sleeveless top, beige color, snug fit, shorts, sitting",
106
+ "red dress, textured fabric, thin straps",
107
+ "yellow shirt, lace bralette, hoop earrings",
108
+ "white top, sheer sleeves, lace details, pastel pink bralette",
109
+ "black bodysuit, sheer gloves, patterned scarf, hoop earrings",
110
+ "black corset top, plaid skirt, glossy texture, lace details",
111
+ "beige bikini top, gold chain necklace",
112
+ "blue lace top, cleavage-revealing, long sleeves",
113
+ "black tank top, smooth texture",
114
+ "black halter top, white flower accessory",
115
+ "light pink hairband, green floral dress, gold earrings, light pink nail polish",
116
+ "white top, low neckline, soft texture",
117
+ "black tank top, black headband, headphones",
118
+ "black polka-dot bikini, thin necklace",
119
+ "black sleeveless top, textured fabric, shiny accessories",
120
+ "grey cardigan, white shirt, denim overalls, purple jacket, black hair ties",
121
+ "black leather dress, high-heel boots",
122
+ "blue camo sports bra, blue camo leggings",
123
+ "long-sleeve top, white bandeau, pink hues, sheer texture, butterfly prints",
124
+ "black tank top, white shirt, denim jeans",
125
+ "blue bikini top, blue high-waisted bottoms, large hoop earrings, white sneakers",
126
+ "beige hoodie, blue highlights, black sunglasses, blue sneakers, textured sole",
127
+ "beige hoodie, blue t-shirt, black leggings, blue sneakers, textured materials, oversized top, fitted bottoms",
128
+ "black crop top, black sheer-panelled bottoms, solid colors, smooth textures",
129
+ "straw hat, leopard print bikini, white cover-up",
130
+ "black sports bra, black leggings, smooth textures",
131
+ "black bikini top, shiny texture, gold necklace",
132
+ "white sports bra, white leggings, cream textured cardigan",
133
+ "red dress, thin straps, v-neckline, satin texture",
134
+ "black tank top, smooth texture",
135
+ "white halter top, gold necklace",
136
+ "black bikini, strap details",
137
+ "black bodysuit, white snow jacket, visible textures",
138
+ "no visible clothing",
139
+ "pink beret, light blouse, pink jacket, soft textures",
140
+ "fur-lined hood, beige coat, texture-soft",
141
+ "graphic jacket, multicolored, white hoodie, blue jeans",
142
+ "white tank top, spaghetti straps, lace details, natural textures",
143
+ "red crop top, white bikini bottoms, ribbed fabric",
144
+ "red strapless dress, smooth texture",
145
+ "sleeveless top, neutral color, soft texture",
146
+ "black sleeveless dress, textured fabric, sheer details",
147
+ "metallic green dress, crystal choker necklace",
148
+ "white tank top, gold necklace, natural texture",
149
+ "pearl headpiece, white textured dress, bejeweled adornments, sheer sleeves",
150
+ "white dress, deep neckline, sleeveless, lace-up sides, figure-hugging",
151
+ "white deep v-neck top, gold necklace, neutral makeup, straight hair",
152
+ "none visible",
153
+ "patterned blazer, patterned shorts, black bralette, warm colors, glossy texture",
154
+ "sleeveless top, beige color, denim shorts, light wash, leather seat texture",
155
+ "floral bikini top, white color, printed texture",
156
+ "blue dress, white trim, sparkling necklace, silver earrings, silver bracelet",
157
+ "silver chain necklace, pink pendant, gold bracelet",
158
+ "white headband, white ribbed top, black undergarment, light-colored jacket",
159
+ "yellow bikini top, black phone case",
160
+ "white crop top, light blue ripped jeans, smooth texture, silver necklace",
161
+ "peach sports bra, peach skirt, smooth fabric",
162
+ "patterned dress, black and white, deep neckline, short sleeves, textured fabric, black boots, laced footwear",
163
+ "black sleeveless dress, black heels, silver bracelet, silver necklace",
164
+ "light pink dress, sheer texture, fringe details, brown belt",
165
+ "red lace dress, black fur hat, red gloves",
166
+ "white cropped top, light blue jeans, textured fabric",
167
+ "pink cropped top, ribbed texture, tie-front detail, blue ripped jeans, casual style, light wash denim, black shoulder bag, brown belt",
168
+ "blue patterned bikini, sheer sleeves, ruffled cuffs",
169
+ "red dress, low neckline, sleeveless, smooth texture",
170
+ "pink sports bra, pink leggings, barefoot, black accents",
171
+ "striped one-piece swimsuit, blue and white colors, textured fabric",
172
+ "red ribbed sweater, black leather pants",
173
+ "white crop top, long sleeves, white skirt, textured fabric, green handbag, gold necklace, white wristwatch",
174
+ "white crop top, crisscross neckline, white pants, silver chain accents, white handbag, quilted texture",
175
+ "ribbed beige turtleneck dress, chest cut-out, black handbag, black and white sneakers",
176
+ "white tank top, black pants, smooth textures",
177
+ "White long-sleeve top, ribbed texture",
178
+ "black hoodie, pink leggings, brown shoes, white socks",
179
+ "Blue-purple bikini top, white lace-up detail, purple patterned skirt",
180
+ "strapless top, aqua color, textured fabric, high-waisted trousers, matching color, cinched ankles",
181
+ "pink dress, white cardigan, lacy sleeves",
182
+ "denim jumpsuit, light blue, sleeveless, lace-up front, fringed hem",
183
+ "bikini top, bikini bottom, earth tones, string ties",
184
+ "geometric pattern bodysuit, brown and black colors, plunging neckline, long sleeves, glossy black belt, black shoulder bag",
185
+ "white sleeveless top, silver zipper, textured fabric, blue denim shorts, frayed hems",
186
+ "red frilly dress, white heels, blue hair",
187
+ "white cropped shirt, white shorts, smooth fabric",
188
+ "yellow patterned bikini top, white bikini bottom, sunglasses, wrist accessories",
189
+ "grey bikini top, grey skirt, textured fabric, silver wrist accessory",
190
+ "strapless yellow dress, blue waist sash, beige high heels, black floral hair accessory",
191
+ "white crop top, black pants, pink and blue leg pads, vaughn glove, white skates",
192
+ "purple bikini top, lace-up detail, purple print skirt, textured fabric",
193
+ "pink tank top, blue ripped jeans, black strappy heels, beige shoulder bag",
194
+ "white tank top, blue denim shorts, textured fabric, visible brand writing",
195
+ "white cropped top, textured fabric, light-wash denim jeans, high-waisted, lace-up sides",
196
+ "white cropped cardigan, white pleated skirt, black shoulder bag, dark sunglasses, white bralette, gold necklace",
197
+ "pink crop top, white midriff band, pink shorts, glossy tan heels",
198
+ "black bikini top, black bikini bottoms, smooth fabric",
199
+ "sleeveless top, tan cropped pants, black sunglasses, black backpack straps, ribbed texture top, light colors",
200
+ "white crochet dress, brown belt, textures visible",
201
+ "white off-shoulder top, white shorts, textured fabric, ruffled sleeves",
202
+ "blue crop top, long sleeves, ribbed texture, plunging neckline, gray plaid skirt, pleated design",
203
+ "floral dress, white base, red and green patterns, V-neckline, long sleeves, brown belt, textured fabric",
204
+ "purple dress, gold heels, textured fabric, sleeveless, cut-out detailing",
205
+ "white hat, white dress, tiered ruffles, lace texture, small purse, silver watch, neutral heels",
206
+ "pink crop top, pink skirt, pink high heels, sleeveless, button details, smooth texture",
207
+ "black bodysuit, lace texture, sheer fabric",
208
+ "left: tan bodysuit, right: black dress, plunging neckline, short sleeves",
209
+ "sleeveless sequined dress, black and blue tones, sheer fabric, high slit, silver sequined dress, beige tones, strappy sandals, ankle strap, heeled footwear",
210
+ "black corset, lace texture, black gloves, chandelier earrings, silver necklace",
211
+ "brown polka-dot swimsuit, wide-brimmed straw hat, smooth texture",
212
+ "pink hearts bodysuit, white base, long sleeves",
213
+ "gray crop top, gold necklace, gold earrings, light makeup",
214
+ "Tan crochet bikini top, tan bikini bottom, gold waist chain, black halterneck bikini top, black tie-side bikini bottom, tan crochet bikini top, tan crochet skirt, gold waist chain",
215
+ "white hat, sunglasses, olive green cropped shirt, olive green skirt, black belt, black bikini bottom visible",
216
+ "beige dress, deep neckline, ribbed texture, white heels, criss-cross straps",
217
+ "blue tank top, textured fabric, lace-up front, white shorts, striped pattern, white sneakers",
218
+ "grey cardigan, white crop top, animal print shorts, blue hair",
219
+ "green dress, deep neckline, long sleeves, smooth texture, waist belt",
220
+ "pink bikini, pink heels, pink sunglasses",
221
+ "patterned jacket, patterned skirt, bikini top, vibrant colors, shiny texture",
222
+ "white cropped t-shirt, black graphic design, casual style",
223
+ "Red bikini, white polka dots, bow details",
224
+ "blue polka-dot dress, front buttoning, sleeveless design, white sunglasses, tied waist belt",
225
+ "white sports bra, white leggings, black sneakers, textures visible",
226
+ "lavender floral dress, white sunglasses, silver hoop earrings",
227
+ "sports bra, leggings, pastel green, form-fitting, sleeveless, high-waisted",
228
+ "white top, sheer overlay, light textures",
229
+ "white crop top, blue denim shorts, black and white sneakers, ribbed texture top",
230
+ "red crop top, blue jeans, light textures",
231
+ "blue sports bra, blue leggings, smooth texture",
232
+ "white crop top, high-waisted skirt, textured pink heels, black shoulder bag",
233
+ "striped swimsuit, blue and white, thin straps",
234
+ "white bikini top, white bikini bottoms, smooth texture",
235
+ "denim tube top, denim shorts, light blue, frayed hems, gold necklace, gold bracelet, navel piercing",
236
+ "black cap, black-framed glasses, red and black striped sweater, denim shorts, black belt, clear-lens glasses",
237
+ "crocheted bikini, white color, tassel details, tied straps",
238
+ "black halter dress, cut-out details, form-fitting, knee-length",
239
+ "white bikini, halter neck top, string bikini bottom, smooth texture",
240
+ "black dress, sleeveless, cut-out details, form-fitting",
241
+ "sports bra, leggings, pastel colors, form-fitting, athletic wear",
242
+ "blue and white striped top, front zipper, black shorts, denim texture",
243
+ "patterned dress, white with blue spots, short sleeves, v-neckline, textured fabric",
244
+ "blue bikini, white-orange socks, red-yellow roller skates",
245
+ "white long-sleeve top, distressed blue jeans, white sneakers",
246
+ "Black blazer, v-neckline, satin texture",
247
+ "white off-shoulder top, white bikini bottom, gold necklace, black sunglasses, textured fabrics",
248
+ "floral bikini, vibrant colors, textured fabric",
249
+ "green jumpsuit, cut-out torso, wide-leg pants, sleeveless top, flowy fabric",
250
+ "Pink dress, text patterns, sleeveless, high neckline, cut-out detail",
251
+ "black corset top, ripped blue jeans, white blazer, golden necklace, sunglasses on head",
252
+ "pink tank top, blue denim shorts, diamond choker necklace, brown patterned handbag",
253
+ "black corset top, patterned skirt, glossy texture",
254
+ "White halter top, blue denim jeans, gold bracelet, beige handbag",
255
+ "blue fringe haircut, pink sunglasses, pink denim jacket, white tank top, pink skirt, pink heart-shaped purse",
256
+ "pink crop top, pink shorts, ribbed texture, athletic wear",
257
+ "white off-shoulder top, wide sleeves, straw hat, textured fabric",
258
+ "denim jacket, black dress, white sneakers, blue backpack",
259
+ "white sports bra, black shorts, white sneakers, white socks",
260
+ "brown corset top, brown leather pants, glossy texture",
261
+ "brown cropped top, denim shorts, eyeglasses, wrist watch",
262
+ "white cropped top, blue denim jeans, smooth texture, frayed edges",
263
+ "light blue corset, denim jeans, silver necklace, black belt, light blue handbag",
264
+ "white cropped top, patterned green skirt, fabric texture visible, white undergarment",
265
+ "yellow crop top, blue denim shorts, white strapless top, tan belt, frayed hems",
266
+ "white crochet top, fringed detailing, denim jeans, tan shoulder bag",
267
+ "leopard print halter-top, blue ripped jeans",
268
+ "white long-sleeve top, plunging neckline, high-waisted jeans, distressed denim, blue color, tan ankle boots",
269
+ "black cut-out dress, gold bracelet, black and white heels, beige handbag",
270
+ "black crop top, deep neckline, long sleeves, denim shorts, frayed hem, black bralette, multiple straps, sheer sleeves, mesh pattern, choker necklace, high-waisted shorts, button closure",
271
+ "beige hoodie, matching sweatpants, visible drawstrings, soft texture",
272
+ "gray t-shirt, blue jeans, smooth texture, casual style",
273
+ "pink bikini top, pink skirt, sunglasses, gold watch",
274
+ "lace top, brown skirt, strapless design, textured fabric",
275
+ "strappy dress, beige color, form-fitting, textured fabric, sleeveless, knee-length",
276
+ "black t-shirt, rib cage print, white shorts",
277
+ "light blue hoodie, matching shorts, soft, cotton texture, hoodie drawstrings, exposed midriff",
278
+ "blue patterned top, blue patterned shorts, black glasses",
279
+ "black sequin dress, high neckline, sleeveless, side slit, strappy high heels, silver earrings",
280
+ "black sequined dress, high neckline, sleeveless, back slit, strappy high heels, metallic color",
281
+ "transparent patterned top, black bralette, glossy black pants, glittery sneakers",
282
+ "black eyeliner, silver hoop earrings, gray-scale makeup, camouflage long sleeve top, black crop top, glossy black pants, glittery silver sneakers",
283
+ "blue dress, short sleeves, shiny texture, watch, ring",
284
+ "white crop top, black headphones, black sunglasses",
285
+ "button-up dress, peach color, short sleeves, collar, thigh length, fabric texture",
286
+ "white crop top, yellow sweatpants, textured fabric",
287
+ "striped swimsuit, glasses",
288
+ "pink dress, short sleeves, crew neckline, ribbed texture",
289
+ "pink dress, tiered layers, spaghetti straps, v-neckline, pleated texture, silver watch",
290
+ "red sports bra, red leggings, smooth texture, athletic wear",
291
+ "light jacket, matching trousers, white sneakers, black bag",
292
+ "Yellow checkered bikini, white straps, smooth texture",
293
+ "white ribbed dress, yellow-tinted sunglasses",
294
+ "long-sleeve top, ribbed texture, brown color, matching skirt, high-waisted",
295
+ "black sports bra, striped sheer pants",
296
+ "golden bikini, textured fabric",
297
+ "white crop top, blue denim shorts, cow print boots, silver necklace",
298
+ "orange dress, ribbed texture, short sleeves, side cut-outs, tie-up details",
299
+ "red bikini top, red bikini bottom, ribbed texture, tied sides",
300
+ "black bikini, textured fabric",
301
+ "white corset top, floral pattern, denim jeans, corset laces",
302
+ "white tank top, grey sports bra, grey shorts, textured fabrics, visible branding",
303
+ "white ribbed top, front tie, long sleeves, black leather pants, high-waisted",
304
+ "brown hat, black tank top, white denim shorts, frayed shorts hem",
305
+ "black crop top, mesh sleeves, checkered mini skirt, black boots, textured fabrics",
306
+ "black sweatshirt, cartoon graphic, glasses, light shorts, casual style",
307
+ "crop top, olive green, ribbed texture, high-waisted leggings, olive green, fitted",
308
+ "black bikini, glossy texture, gold earrings",
309
+ "black v-neck top, black belt, black trousers, blue handbag, golden necklace",
310
+ "black crop top, long sleeves, high-waisted leggings, mesh panels, dark hues, white sneakers",
311
+ "white crop top, gray trousers, white sandals, black sunglasses, gold belt",
312
+ "gray cardigan, white crop top, leopard print shorts, blue hair",
313
+ "white v-neck top, knotted waist, light-colored pants, fitted texture",
314
+ "white crop top, grey shorts, white sneakers, text on top",
315
+ "black swimsuit, straw hat, textured fabric",
316
+ "off-shoulder top, white with stripes, casual shorts",
317
+ "white crop top, glitter texture, black leather jacket, black leather pants",
318
+ "black tank top, shoulder straps, scoop neckline",
319
+ "Sleeveless top, pink hue, denim shorts, ripped texture, sunglasses on head",
320
+ "black long-sleeve top, light blue jeans, silver belt, form-fitting, casual style",
321
+ "floral jumpsuit, red and beige, texture visible, high heels, tan-colored",
322
+ "red dress, sleeveless, V-neckline",
323
+ "dark sunglasses, white collared shirt, navy blue sweater, pleated white skirt, black shoulder bag with gold hardware",
324
+ "white tank top, textured fabric, large hoop earrings, headscarf with print",
325
+ "black swimsuit, red headband, sunglasses",
326
+ "black tank top, sheer fabric, patterned design, golden bracelet",
327
+ "camouflage bikini, white-brown-beige tones, high-waisted bottoms, sleeveless top, hoop earrings",
328
+ "patterned crop top, light colors, tie front, long sleeves, white pants, soft texture",
329
+ "green tank top, white shorts, black glasses",
330
+ "Red patterned top, deep neckline, short sleeves",
331
+ "white crop top, lace-up detail, textured skirt, cream color, sleeveless, midriff-baring",
332
+ "white bathrobe, textured fabric, glasses",
333
+ "white cropped top, blue trim, long sleeves, blue track pants",
334
+ "white crop top, pastel green leggings, textured fabric",
335
+ "spotted swimsuit, light-dark contrast, thin straps, skin exposure",
336
+ "black dress, double-breasted, v-neckline, sleeveless, silver necklace",
337
+ "black beanie, black cropped top, black leggings, black boots, red bag, gold watch",
338
+ "beige fedora, white cropped top, textured terracotta skirt",
339
+ "blue denim jeans, blue strapless top, texture appears soft",
340
+ "White lace dress, Off-shoulder sleeves, Corset-style top, Drawstring details",
341
+ "sleeveless top, beige color, ribbed texture, high neckline, light blue jeans, fitted style, denim material, wrist accessory, silver color, sparkling texture",
342
+ "white strapless top, white skirt, shiny fabric",
343
+ "light white dress, thin straps, sheer texture"
344
+ ]
data/female_default_tags.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ [
2
+ "a woman",
3
+ "a young woman",
4
+ "a middle aged woman",
5
+ "an old woman"
6
+ ]
data/hairstyles.json ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "with ((long hair))",
3
+ "with ((very curly hair))",
4
+ "with ((curly hair))",
5
+ "with ((pixie cut hair))",
6
+ "with ((bob cut hair))",
7
+ "with ((undercut hair))",
8
+ "with ((messy hair))",
9
+ "with ((mullet hair))",
10
+ "with ((braids))",
11
+ "with ((french braids))",
12
+ "with ((cornrows hair))",
13
+ "with ((ponytail hair))",
14
+ "with ((side part hair))",
15
+ "with ((mohawk hair))",
16
+ "with ((bun hair))",
17
+ "with ((pompadour hair))",
18
+ "with ((slicked back hair))",
19
+ "with ((asymmetrical cut hair))",
20
+ "with ((multicolored rainbow hair))",
21
+ "with ((balayage hair))",
22
+ "with ((french crop hair))",
23
+ "with ((shaved hair))",
24
+ "with ((shaved sides hair))",
25
+ "with ((side swept fringe))",
26
+ "with ((long bob haircut))",
27
+ "with ((a-line bob haircut))",
28
+ "with ((layered cut haircut))",
29
+ "with ((shag cut hair))",
30
+ "with ((buzz cut hair))",
31
+ "with ((feathered cut hair))",
32
+ "with ((blunt cut hair))",
33
+ "with ((undercut hair))",
34
+ "with ((french bob haircut))",
35
+ "with ((textured bob haircut))",
36
+ "with ((slicked-back haircut))",
37
+ "with ((wedge cut haircut))",
38
+ "with ((long layers haircut))",
39
+ "with ((curly bob haircut))",
40
+ "with ((cropped cut haircut))",
41
+ "with ((faux hawk haircut))",
42
+ "with ((angled bob haircut))",
43
+ "with ((razor cut haircut))",
44
+ "with ((emo haircut))",
45
+ "with ((curtain bangs haircut))",
46
+ "with ((waterfall braid haircut))",
47
+ "with ((fox braids haircut))",
48
+ "with ((chignon cut hair))",
49
+ "with ((pigtails))",
50
+ "with ((plait hair))",
51
+ "with ((ponytail))",
52
+ "with ((ringlets hair))",
53
+ "with ((curl hair))",
54
+ "with ((double bun topknot))",
55
+ "with ((drill cut hair))",
56
+ "with ((twintails hair))",
57
+ "with ((hair set up for wedding))",
58
+ "with ((wavy hair))",
59
+ "with ((beach waves hair))",
60
+ "with ((fishtail braid))",
61
+ "with ((dreadlocks))",
62
+ "with ((pin curls hair))",
63
+ "with ((twisted updo))",
64
+ "with ((hime cut hair))",
65
+ "with ((pull-through braid hair))",
66
+ "with ((Afro hair))",
67
+ "with ((crown braid))",
68
+ "with ((low fade haircut))",
69
+ "with ((man bun))",
70
+ "with ((finger waves hair))",
71
+ "with ((Dutch braids))",
72
+ "with ((tousled hair))",
73
+ "with ((princess cut hair))",
74
+ "with ((micro braids hair))",
75
+ "with ((lob haircut))",
76
+ "with ((senegalese twist hair))",
77
+ "with ((victory rolls hair))",
78
+ "with ((quiff haircut))",
79
+ "with ((mermaid waves hair))",
80
+ "with ((box braids))",
81
+ "with ((faux locs hair))",
82
+ "with ((bantu knots))",
83
+ "with ((spiral curls hair))"
84
+ ]
data/lighting.json ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "popping colors, popart style",
3
+ "bokeh",
4
+ "dramatic",
5
+ "golden hour",
6
+ "depth of field",
7
+ "movie still",
8
+ "colorful",
9
+ "soft lighting",
10
+ "studio lighting with strong rim light",
11
+ "ambient lighting",
12
+ "sun rays",
13
+ "cinematic lighting",
14
+ "characteristics of the light",
15
+ "volumetric lighting",
16
+ "natural point rose",
17
+ "outdoor lighting",
18
+ "soft pastel lighting colors scheme",
19
+ "sensual lighting",
20
+ "neon lights",
21
+ "baroque",
22
+ "rokoko",
23
+ "rim light, iridescent accents",
24
+ "neoclassicism",
25
+ "realism",
26
+ "fantastic colors",
27
+ "surrealism",
28
+ "futurism",
29
+ "accent lighting",
30
+ "high key lighting",
31
+ "low key lighting",
32
+ "strong backlight",
33
+ "artificial lighting",
34
+ "decorative lighting",
35
+ "recessed lighting",
36
+ "wall sconces lighting",
37
+ "laser lighting",
38
+ "multi-colored lighting",
39
+ "mood lighting",
40
+ "accent lighting",
41
+ "projection lighting",
42
+ "bioluminiscent",
43
+ "plasma",
44
+ "ice",
45
+ "water",
46
+ "rule of thirds",
47
+ "anamorphic lens flare",
48
+ "sharp focus",
49
+ "vivid colors",
50
+ "masterpiece",
51
+ "colors",
52
+ "8k",
53
+ "atmospheric",
54
+ "cinematic sensual",
55
+ "hyperrealistic",
56
+ "big depth of field",
57
+ "glow effect",
58
+ "modelshoot style",
59
+ "shallow depth of field",
60
+ "hdr",
61
+ "dynamic composition",
62
+ "broad light",
63
+ "natural lighting",
64
+ "elegant pose",
65
+ "flowing",
66
+ "film photo",
67
+ "extremely detailed",
68
+ "big depth of field",
69
+ "matte skin, pores, wrinkles",
70
+ "hyperdetailed",
71
+ "(abstract:1.3)",
72
+ "intricate and low contrast detailed",
73
+ "(composition)",
74
+ "film grain",
75
+ "(8k, RAW photo, best quality, masterpiece:1.2)",
76
+ "(realistic, photo-realistic:1.37)",
77
+ "beautiful detailed eyes, beautiful detailed lips, a captivating gaze, and an alluring expression",
78
+ "beautiful dynamic dramatic dark moody lighting",
79
+ "(detailed face:1.3)",
80
+ "multilayered realism",
81
+ "majestically strides forward toward us with abandon",
82
+ "disintegrating moon",
83
+ "extremely intricate details",
84
+ "anatomical beauty",
85
+ "high fantasy",
86
+ "detailed skin pores",
87
+ "flat color scheme",
88
+ "80s music clip background",
89
+ "Use a backlighting effect to add depth to the image. impressionistic painting style, john singer sarget, blue pallette",
90
+ "(natural skin texture, hyperrealism, soft light, sharp:1.2)",
91
+ "(cinematic, teal and orange:0.85)",
92
+ "(intricate skin detail:1.3), (wrinkles:1.2),(skin blemishes:1.1),(skin pores:1.1),(detailed face:1.3), (lips slightly parted:1.0)",
93
+ "(muted colors, dim colors, soothing tones:1.3), low saturation, (hyperdetailed:1.2)",
94
+ "(noir:0.4), (intricate details:1.12), hdr, (intricate details, hyperdetailed:1.15)",
95
+ "(neutral colors:1.2), art, (hdr:1.5), (muted colors:1.1), (pastel:0.2), hyperdetailed",
96
+ "dramatic lighting",
97
+ "((landscape view)), 4k unity, (best illumination)",
98
+ "dynamic angle",
99
+ "detailed freckles skin",
100
+ "movie grain",
101
+ "epic composition",
102
+ "Tarot Card style",
103
+ "(solo focus, one frame)",
104
+ "(masterpiece, best quality, ultra-detailed, highres)",
105
+ "biopunk",
106
+ "dramatic Pull from the ghost of a virtual memory",
107
+ "gritty industrial",
108
+ "triadic color palette",
109
+ "Monochromatic color palette",
110
+ "Analogous color palette",
111
+ "Complementary color palette",
112
+ "Split-Complementary color palette",
113
+ "Double Complementary (Tetradic) color palette",
114
+ "Square color palette",
115
+ "Rectangular (Tetradic) color palette",
116
+ "Neutral color palette",
117
+ "Pastel color palette",
118
+ "Warm color palette",
119
+ "Cool color palette",
120
+ "Earth Tone color palette",
121
+ "Jewel Tone color palette",
122
+ "Muted color palette",
123
+ "High Contrast"
124
+ ]
data/male_additional_details.json ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "a purple iridescent suit",
3
+ "wearing a (necklace)",
4
+ "wearing ((earrings))",
5
+ "wearing a (bracelet)",
6
+ "wearing one or multiple (rings)",
7
+ "wearing a (brooch)",
8
+ "wearing (eyeglasses)",
9
+ "wearing (sunglasses)",
10
+ "wearing a (hat)",
11
+ "wearing a (scarf)",
12
+ "wearing a (headband)",
13
+ "wearing a (nose ring)",
14
+ "wearing a (lip ring)",
15
+ "wearing a (tongue ring)",
16
+ "wearing an (eyebrow ring)",
17
+ "wearing (face tattoos)",
18
+ "wearing a (wreath)",
19
+ "wearing a (crown)",
20
+ "wearing a (tiara)",
21
+ "wearing a (crown of thorns)",
22
+ "wearing a (crown of jewels)",
23
+ "wearing (bohemian clothes)",
24
+ "wearing (chic clothes)",
25
+ "wearing (glamorous clothes)",
26
+ "wearing (grunge clothes)",
27
+ "wearing (preppy clothes)",
28
+ "wearing (punk clothes)",
29
+ "wearing (retro clothes)",
30
+ "wearing (rockabilly clothes)",
31
+ "wearing (romantic clothes)",
32
+ "wearing (tomboy clothes)",
33
+ "wearing (urban clothes)",
34
+ "wearing (camo clothes)",
35
+ "wearing (robes)",
36
+ "wearing (excessive amount of jewellery)",
37
+ "wearing (vintage clothes)",
38
+ "wearing (western clothes)",
39
+ "wearing (minimalist clothes)",
40
+ "wearing (sportswear clothes)",
41
+ "wearing (flapper clothes)",
42
+ "wearing (pin-up clothes)",
43
+ "wearing (mid-century modern clothes)",
44
+ "wearing (art deco clothes)",
45
+ "wearing (victorian clothes)",
46
+ "wearing (edwardian clothes)",
47
+ "wearing (elizabethan clothes)",
48
+ "wearing (retro 70s clothes)",
49
+ "wearing (retro 80s clothes)",
50
+ "wearing (retro 90s clothes)",
51
+ "wearing (retro 00s clothes)",
52
+ "wearing (musical equipment)",
53
+ "wearing (leather)",
54
+ "wearing (bdsm leather)",
55
+ "wearing (shiny latex)",
56
+ "wearing (shiny latex suit)",
57
+ "wearing (silk)",
58
+ "wearing (full tweed set)",
59
+ "wearing (clothes made entirely of feathers)",
60
+ "wearing (clothes made entirely of fur)",
61
+ "wearing (clothes made entirely of leather)",
62
+ "wearing (clothes made entirely of metal)",
63
+ "wearing (clothes made entirely of plastic)",
64
+ "wearing (clothes adorned with shimmering jewels or crystals)",
65
+ "waring (clothes adorned with sequins)",
66
+ "wearing (clothes with exaggerated or extreme silhouettes)",
67
+ "wearing (clothes with exaggerated or extreme footwear)",
68
+ "wearing (clothes with exaggerated or extreme headwear)",
69
+ "wearing (clothes with exaggerated or extreme facial or body piercings or tattoos)",
70
+ "wearing (clothes with multiple layers or tiers)",
71
+ "wearing (clothes with exaggerated or extreme colors)",
72
+ "wearing (clothes with exaggerated or extreme patterns)",
73
+ "wearing (cloak)",
74
+ "wearing an astronaut armor",
75
+ "wearing a bio mechanical suit",
76
+ "wearing a bio hazard suit",
77
+ "(( working with laptop))",
78
+ "with Heat deformation",
79
+ "(((future soldier, full body armor, futuristic football, shoulder pads, guns, grenades, weapons, bullet proof vest, high tech, straps, belts, camouflage)))",
80
+ "((full body, zoomed out)) long slender legs 80mm",
81
+ "(((sci-fi, future war, cyberpunk, cyborg, future fashion, beautiful face, glowing tattoos)))",
82
+ "((angry expression, pretty face))",
83
+ "(((full body, athletic body, action pose, detailed black soldier outfit, slender long legs)))",
84
+ "playing epic electric guitar solo in front of a huge crowd",
85
+ "singing epic solo into a microphone in front of a huge crowd",
86
+ "as a ((gelatinous horror dripping alien creature))",
87
+ "in a tie or bowtie, lending a touch of formal elegance or quirky charm, knotted around the collar to elevate the outfit",
88
+ "with anklets, delicate chains or beads that gracefully encircle the ankle, adding a touch of femininity with every step",
89
+ "donning a belt, functional yet fashionable, cinching the waist or sitting low on the hips, often with a statement buckle",
90
+ "wearing gloves, either elegant satin for formal events or rugged leather for a tougher look, complementing the attire and mood",
91
+ "with a choker, snugly encircling the neck, often made of lace, velvet, or leather, exuding a mix of elegance and edge",
92
+ "in stockings or tights, sheer or opaque, enhancing the legs while adding a touch of sophistication or playful patterns",
93
+ "with a satchel or bag, a functional accessory that speaks volumes about personal style, be it a minimalist tote or an embellished clutch",
94
+ "wearing cufflinks, subtle symbols of elegance, adorning the sleeves of a formal shirt, showcasing attention to detail",
95
+ "with a pendant, a piece of jewelry that dangles gracefully from a necklace, often holding sentimental or symbolic value",
96
+ "in layered necklaces, a blend of chains of varying lengths, creating depth and showcasing multiple pendants or charms",
97
+ "sporting a watch, a timeless accessory that blends functionality with style, either minimalist or grand, reflecting personal tastes",
98
+ "wearing a veil, a delicate piece of fabric that adds mystery and allure, often seen in bridal or ceremonial attire",
99
+ "donning a cape or cloak, adding drama to the ensemble, flowing gracefully with every movement, evoking a sense of fantasy or regality",
100
+ "with a tiara or diadem, a jeweled headpiece that signifies royalty or celebration, resting gracefully atop the head",
101
+ "Adorned with a crown, symbolizing royalty and authority with gemstones and metals",
102
+ "With a sparkling tiara, reminiscent of princesses or beauty queens",
103
+ "With a poignant crown of thorns, symbolizing sacrifice and resilience",
104
+ "With a jewel-encrusted crown, reflecting affluence and grandeur",
105
+ "In bohemian attire, embodying the free spirits with patterns and fringes",
106
+ "Dressed in chic fashion, blending comfort with high style",
107
+ "In glamorous attire, shiny or sequined, perfect for red-carpet events",
108
+ "Donning grunge wear, with flannels and combat boots, reflecting a rebellious spirit",
109
+ "In preppy clothes, with clean lines and classic patterns",
110
+ "Sporting punk fashion, with leather, studs, and bold hairstyles",
111
+ "In retro outfits, channeling specific decades with authentic pieces",
112
+ "Wearing rockabilly style, with pin-up influences and rock 'n' roll flair",
113
+ "In romantic attire, featuring soft fabrics and feminine silhouettes",
114
+ "Dressed in tomboy fashion, with boyish charm and comfort-focused pieces",
115
+ "In urban streetwear, blending comfort with trendy, city-inspired looks",
116
+ "Wearing camouflage, either for function or as a bold fashion statement",
117
+ "Draped in robes, from casual bathrobes to formal ceremonial garments",
118
+ "Adorned with excessive jewelry, creating a bold and opulent look",
119
+ "In vintage clothes, authentically representing past eras and styles",
120
+ "Sporting western wear, with cowboy hats, boots, and denim",
121
+ "In minimalist attire, focusing on clean lines and a less-is-more approach",
122
+ "Wearing sportswear, blending function and style for athletic pursuits",
123
+ "In flapper style, with dropped waists and ornate beading from the 1920s",
124
+ "Dressed as a pin-up, channeling retro glamour with curve-hugging styles",
125
+ "In mid-century modern fashion, reflecting the sleek designs of the 1950s and 60s",
126
+ "Wearing art deco inspired clothes, with geometric patterns and luxurious fabrics",
127
+ "In Victorian-style attire, with high necklines, corsets, and full skirts",
128
+ "Dressed in Edwardian fashion, featuring S-shaped silhouettes and large hats",
129
+ "In Elizabethan costume, with ruffs, farthingales, and ornate embroidery",
130
+ "Sporting 70s retro looks, with bell-bottoms, platforms, and psychedelic prints",
131
+ "In 80s inspired outfits, featuring bold colors, shoulder pads, and leg warmers",
132
+ "Wearing 90s fashion, with crop tops, high-waisted jeans, and chunky shoes",
133
+ "In early 2000s style, featuring low-rise jeans, crop tops, and platform sandals",
134
+ "With musical equipment, like guitars, drumsticks, or headphones as accessories",
135
+ "In leather attire, from sleek jackets to edgy pants or skirts",
136
+ "Wearing BDSM-inspired leather, with harnesses, collars, or studded accessories",
137
+ "In shiny latex, hugging every curve with a glossy, futuristic appeal",
138
+ "Sporting a full latex suit, covering from neck to toe in sleek, shiny material",
139
+ "Draped in silk, with flowing fabrics that catch the light beautifully",
140
+ "In a full tweed set, channeling British countryside chic",
141
+ "Wearing an outfit made entirely of feathers, creating a bold, avian-inspired look",
142
+ "In a fur ensemble, either faux or real, exuding luxury and warmth",
143
+ "Sporting an all-leather outfit, from jacket to pants and accessories",
144
+ "In a metallic outfit, with clothes seemingly forged from shining metals",
145
+ "Wearing an ensemble made entirely of plastic, futuristic and unconventional",
146
+ "Adorned in clothes shimmering with jewels or crystals, catching light at every angle",
147
+ "In a sequin-covered outfit, sparkling and eye-catching from every view",
148
+ "Wearing clothes with exaggerated silhouettes, pushing the boundaries of shape and form",
149
+ "In footwear with extreme designs, from towering platforms to avant-garde shapes",
150
+ "Sporting headwear with exaggerated proportions or unconventional materials",
151
+ "With extreme facial piercings or full-body tattoos, turning the skin into a canvas",
152
+ "In an outfit with multiple layers or tiers, creating depth and visual interest",
153
+ "Wearing clothes in extremely bold or neon colors, making a vibrant statement",
154
+ "In attire with exaggerated or surreal patterns, creating visual intrigue",
155
+ "Draped in a mysterious cloak, adding an air of intrigue or fantasy",
156
+ "In astronaut armor, representing space exploration and futuristic concepts",
157
+ "Wearing a bio-mechanical suit, blending organic forms with mechanical elements",
158
+ "In a biohazard suit, fully enclosed for protection or as a fashion statement",
159
+ "Engaged with a laptop, representing technology integration in fashion",
160
+ "Surrounded by heat deformation effects, as if the very air is bending around them",
161
+ "In futuristic soldier gear, with high-tech armor, weapons, and camouflage",
162
+ "Posed to accentuate long, slender legs, often with 80mm or higher heels",
163
+ "In sci-fi inspired wear, with cyberpunk elements and glowing tattoos",
164
+ "With an angry expression juxtaposed against delicate features",
165
+ "In a detailed black tactical outfit, emphasizing an athletic build and long legs",
166
+ "Mid-performance with an electric guitar, captivating an imaginary audience",
167
+ "Belting out a solo performance, microphone in hand, before a cheering crowd",
168
+ "Transformed into a gelatinous alien creature, dripping and otherworldly",
169
+ "With a tie or bowtie, adding a formal or quirky touch to the ensemble",
170
+ "Wearing delicate anklets, adding a subtle charm to the overall look",
171
+ "With a statement belt, either cinching the waist or riding low on the hips",
172
+ "In elegant or rugged gloves, complementing the outfit's overall mood",
173
+ "Sporting a choker, from delicate designs to edgy leather styles",
174
+ "In dress socks or patterned socks, adding a pop of color or sophistication",
175
+ "Carrying a stylish bag, from minimalist briefcases to trendy messenger bags",
176
+ "With cufflinks, adding a touch of sophistication to formal wear",
177
+ "Wearing a meaningful pendant, dangling from a necklace",
178
+ "In layered necklaces, creating depth with varying lengths and styles",
179
+ "Sporting a watch, balancing functionality with personal style",
180
+ "Wearing a ceremonial sash, adding formality and significance to the attire",
181
+ "Draped in a cape or cloak, bringing drama and movement to the ensemble",
182
+ "Crowned with a laurel wreath, symbolizing victory or achievement"
183
+ ]
data/male_body_types.json ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "chubby",
3
+ "midweight",
4
+ "overweight",
5
+ "fat",
6
+ "flabby",
7
+ "hefty",
8
+ "pudgy",
9
+ "plump",
10
+ "obese",
11
+ "morbidly obese",
12
+ "stout",
13
+ "rotund",
14
+ "thick-bodied",
15
+ "thicc",
16
+ "thick",
17
+ "beefy",
18
+ "portly",
19
+ "tubby",
20
+ "overweight",
21
+ "(slightly overweight)",
22
+ "buff",
23
+ "burly",
24
+ "fit",
25
+ "well-built",
26
+ "well-endowed",
27
+ "muscular",
28
+ "stocky",
29
+ "big-boned",
30
+ "flabby",
31
+ "flyweight",
32
+ "skinny",
33
+ "too skinny",
34
+ "anorexic",
35
+ "not skinny",
36
+ "slender",
37
+ "lanky",
38
+ "slim",
39
+ "slight"
40
+ ]
data/male_clothing.json ADDED
@@ -0,0 +1,196 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "white t-shirt, blue jeans, brown leather belt, white sneakers",
3
+ "black suit, white dress shirt, red tie, polished black shoes",
4
+ "gray hoodie, black sweatpants, white athletic shoes",
5
+ "blue denim jacket, white t-shirt, black jeans, brown boots",
6
+ "khaki chinos, light blue button-up shirt, brown loafers",
7
+ "navy blue blazer, white dress shirt, gray slacks, black dress shoes",
8
+ "red and black plaid flannel shirt, dark wash jeans, work boots",
9
+ "black leather jacket, white t-shirt, dark jeans, black motorcycle boots",
10
+ "green cargo pants, black t-shirt, hiking boots",
11
+ "white polo shirt, khaki shorts, boat shoes",
12
+ "black tuxedo, white dress shirt, black bow tie, patent leather shoes",
13
+ "blue swim trunks, white tank top, flip flops",
14
+ "gray sweatshirt, black joggers, running shoes",
15
+ "brown tweed jacket, cream sweater, dark brown trousers, oxford shoes",
16
+ "black turtleneck, dark gray slacks, Chelsea boots",
17
+ "white linen shirt, light blue shorts, sandals",
18
+ "red basketball jersey, black shorts, high-top sneakers",
19
+ "navy blue pea coat, gray scarf, dark jeans, leather gloves",
20
+ "olive green military jacket, white t-shirt, camouflage pants, combat boots",
21
+ "purple v-neck sweater, light gray chinos, brown brogues",
22
+ "black wetsuit, surfboard shorts",
23
+ "white chef's jacket, black and white checkered pants, non-slip shoes",
24
+ "orange high-visibility vest, blue work shirt, denim jeans, steel-toe boots",
25
+ "light blue scrubs, white lab coat, comfortable shoes",
26
+ "black clergy shirt with white collar, black trousers",
27
+ "tan safari jacket, khaki shorts, hiking boots, wide-brimmed hat",
28
+ "red and white striped rugby shirt, white shorts, cleats",
29
+ "gray pinstripe suit, light blue dress shirt, patterned tie, oxford shoes",
30
+ "black leather vest, white t-shirt, ripped jeans, cowboy boots",
31
+ "yellow raincoat, waterproof pants, rubber boots",
32
+ "white martial arts gi, black belt",
33
+ "blue and white striped sailor shirt, white pants, boat shoes",
34
+ "green scrubs, surgical cap, face mask",
35
+ "black wetsuit, diving boots, gloves",
36
+ "red and black checkered lumberjack shirt, jeans, work boots",
37
+ "white cricket uniform, protective pads, spiked shoes",
38
+ "blue denim overalls, red plaid shirt, work boots",
39
+ "black judge's robe, white collar",
40
+ "tan fishing vest, khaki shorts, waterproof boots",
41
+ "white chef's hat, double-breasted chef's jacket, black pants",
42
+ "orange prison jumpsuit",
43
+ "blue letter carrier uniform, shorts, comfortable walking shoes",
44
+ "green surgical gown, cap, mask, gloves",
45
+ "black cassock, white collar",
46
+ "red and yellow firefighter turnout gear, helmet",
47
+ "blue police uniform, badge, utility belt",
48
+ "white karate uniform, colored belt",
49
+ "gray sweatshirt, matching sweatpants, running shoes",
50
+ "black leather punk jacket with studs, ripped jeans, combat boots",
51
+ "colorful Hawaiian shirt, khaki shorts, sandals",
52
+ "white dress shirt, suspenders, bow tie, black trousers",
53
+ "blue coveralls, work boots, hard hat",
54
+ "camouflage hunting jacket and pants, boots",
55
+ "black graduation gown, cap with tassel",
56
+ "red and white Santa Claus suit, black boots",
57
+ "green elf costume, pointy shoes, hat with bell",
58
+ "white space suit, helmet",
59
+ "blue jeans, flannel shirt, cowboy hat, boots",
60
+ "black ninja outfit, face mask",
61
+ "brown monk's robe, rope belt, sandals",
62
+ "colorful clown costume, oversized shoes, red nose",
63
+ "gray business suit, white shirt, tie, dress shoes",
64
+ "white sailor's uniform, hat",
65
+ "green army uniform, combat boots, beret",
66
+ "blue airline pilot uniform, hat",
67
+ "orange astronaut suit, white helmet",
68
+ "red and white striped Where's Waldo shirt, blue jeans, glasses",
69
+ "black and white referee uniform, whistle",
70
+ "blue mailman uniform, hat, mail bag",
71
+ "white lab coat, stethoscope, scrubs",
72
+ "brown UPS uniform, shorts, brown shoes",
73
+ "gray janitor uniform, name tag",
74
+ "black and white striped prisoner uniform",
75
+ "blue denim jacket, white t-shirt, ripped jeans, sneakers",
76
+ "green camouflage military uniform, boots, hat",
77
+ "red lifeguard swimsuit, whistle, sunglasses",
78
+ "white cricket uniform, protective gear",
79
+ "blue mechanic's coveralls, work boots, tool belt",
80
+ "black tuxedo t-shirt, jeans, sneakers",
81
+ "tan safari outfit, pith helmet",
82
+ "red and white candy striper uniform",
83
+ "blue air force uniform, hat",
84
+ "green park ranger uniform, hat",
85
+ "white naval officer uniform, hat",
86
+ "black and white waiter uniform, bow tie",
87
+ "orange construction worker vest, hard hat, jeans",
88
+ "purple wizard robe, pointed hat",
89
+ "brown Franciscan monk habit",
90
+ "red and gold matador outfit",
91
+ "blue train conductor uniform, hat",
92
+ "green Robin Hood costume, feathered cap",
93
+ "white fencing uniform, mask",
94
+ "black gothic outfit, leather pants, boots",
95
+ "red and white baseball uniform, cap",
96
+ "blue Olympic gymnast uniform",
97
+ "green Boy Scout uniform, badges",
98
+ "white martial arts gi, black belt",
99
+ "tan zookeeper uniform, khaki shorts",
100
+ "blue NASCAR driver uniform, helmet",
101
+ "red Canadian Mountie uniform, hat",
102
+ "black and white mime outfit, face paint",
103
+ "green leprechaun costume, top hat",
104
+ "white ice cream man uniform, hat",
105
+ "blue and white Greek evzone uniform, pom-pom shoes",
106
+ "red British Royal Guard uniform, bearskin hat",
107
+ "black ninja outfit, mask",
108
+ "white chef uniform, tall hat",
109
+ "brown cowboy outfit, hat, boots",
110
+ "blue and white sailor uniform, hat",
111
+ "green army camouflage, helmet",
112
+ "red firefighter uniform, helmet",
113
+ "black SWAT team uniform, bulletproof vest",
114
+ "white astronaut spacesuit, helmet",
115
+ "blue airline pilot uniform, cap",
116
+ "tan safari guide outfit, hat",
117
+ "purple and gold king costume, crown",
118
+ "gray business suit, red tie",
119
+ "blue denim overalls, plaid shirt",
120
+ "black leather biker jacket, jeans",
121
+ "white doctor's coat, stethoscope",
122
+ "green surgical scrubs, mask",
123
+ "red and white Santa Claus outfit",
124
+ "brown UPS delivery uniform",
125
+ "orange prisoner jumpsuit",
126
+ "blue postal worker uniform",
127
+ "black and white referee shirt, whistle",
128
+ "tan park ranger uniform, hat",
129
+ "white naval officer uniform, hat",
130
+ "green army dress uniform, medals",
131
+ "blue air force flight suit",
132
+ "red and white lifeguard outfit",
133
+ "black tuxedo, bow tie",
134
+ "white chef's jacket, checkered pants",
135
+ "blue mechanic's coveralls",
136
+ "green landscaper uniform, work boots",
137
+ "tan archaeologist outfit, hat",
138
+ "purple wizard costume, star-covered robe",
139
+ "red and gold circus ringmaster outfit",
140
+ "blue train conductor uniform, hat",
141
+ "white cricket player uniform",
142
+ "black gothic outfit, leather jacket",
143
+ "red and white racing driver suit",
144
+ "blue Olympic swimmer outfit",
145
+ "green environmental activist t-shirt, cargo pants",
146
+ "white karate uniform, black belt",
147
+ "tan wildlife photographer vest, khaki pants",
148
+ "blue NASCAR pit crew uniform",
149
+ "red Canadian Mountie uniform, hat",
150
+ "black and white mime costume",
151
+ "green St. Patrick's Day outfit, shamrock accessories",
152
+ "white ice cream vendor uniform",
153
+ "blue Greek fisherman outfit",
154
+ "red British Royal Guard uniform",
155
+ "black martial arts uniform",
156
+ "white sushi chef outfit",
157
+ "brown cowboy costume, hat and boots",
158
+ "blue sailor uniform, white hat",
159
+ "green camouflage hunting outfit",
160
+ "red firefighter turnout gear",
161
+ "black tactical police uniform",
162
+ "white space shuttle astronaut suit",
163
+ "blue commercial pilot uniform",
164
+ "tan desert explorer outfit",
165
+ "purple medieval jester costume",
166
+ "gray Wall Street businessman suit",
167
+ "blue denim farmer overalls",
168
+ "black rock band leather outfit",
169
+ "white lab researcher coat",
170
+ "green hospital scrubs",
171
+ "red holiday elf costume",
172
+ "brown delivery driver uniform",
173
+ "orange highway worker safety vest",
174
+ "blue meter reader uniform",
175
+ "black and white soccer referee jersey",
176
+ "tan zookeeper uniform",
177
+ "white cruise ship officer uniform",
178
+ "green military cadet uniform",
179
+ "blue coast guard uniform",
180
+ "red ski patrol jacket",
181
+ "black formal waiter uniform",
182
+ "white professional tennis outfit",
183
+ "blue auto mechanic uniform",
184
+ "green waste management worker uniform",
185
+ "tan construction site manager outfit",
186
+ "purple comic book superhero costume",
187
+ "red circus acrobat leotard",
188
+ "blue ship captain uniform",
189
+ "white cricket umpire outfit",
190
+ "black nightclub bouncer attire",
191
+ "red and white sports mascot costume",
192
+ "blue competitive swimmer outfit",
193
+ "green eco-tour guide uniform",
194
+ "white Taekwondo uniform",
195
+ "tan nature documentary filmmaker outfit"
196
+ ]
data/male_default_tags.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ [
2
+ "a man",
3
+ "a young man",
4
+ "a middle aged man",
5
+ "an old man"
6
+ ]
data/photo_framing.json ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "extreme close-up",
3
+ "close-up",
4
+ "medium close-up",
5
+ "medium shot",
6
+ "long shot",
7
+ "establishing shot",
8
+ "medium full shot",
9
+ "full shot",
10
+ "upper body shot",
11
+ "full body shot"
12
+ ]
data/photo_type.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "front view",
3
+ "bilaterally symmetrical",
4
+ "side view",
5
+ "back view",
6
+ "from above",
7
+ "from below",
8
+ "from behind",
9
+ "wide angle view",
10
+ "fisheyes view",
11
+ "macro view",
12
+ "overhead shot",
13
+ "top down",
14
+ "birds eye view",
15
+ "high angle",
16
+ "slightly above",
17
+ "straight on",
18
+ "hero view",
19
+ "low view",
20
+ "selfie"
21
+ ]
data/photographer.json ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "Alessio Albi",
3
+ "Alvin Langdon Coburn",
4
+ "Anne Brigman",
5
+ "Ansel Adams",
6
+ "Anton Corbijn",
7
+ "Berenice Abbott",
8
+ "Bill Brandt",
9
+ "Brooke DiDonato",
10
+ "Bruce Davidson",
11
+ "Bruno Barbey",
12
+ "Chris Burkard",
13
+ "Claude Cahun",
14
+ "David Bailey",
15
+ "David Burdeny",
16
+ "Dawoud Bey",
17
+ "Diane Arbus",
18
+ "Dirk Braeckman",
19
+ "Edward Burtynsky",
20
+ "Edward S. Curtis",
21
+ "Elina Brotherus",
22
+ "Elsa Bleda",
23
+ "Erwin Blumenfeld",
24
+ "Flora Borsi",
25
+ "Gregory Colbert",
26
+ "Gregory Crewdson",
27
+ "Guy Aroch",
28
+ "Guy Bourdin",
29
+ "Hans Bellmer",
30
+ "Harry Benson",
31
+ "Harry Callahan",
32
+ "Henri Cartier-Bresson",
33
+ "Ilse Bing",
34
+ "Imogen Cunningham",
35
+ "Iwan Baan",
36
+ "James Balog",
37
+ "Jamie Baldridge",
38
+ "James Balog",
39
+ "Julia Margaret Cameron",
40
+ "Julie Blackmon",
41
+ "Karl Blossfeldt",
42
+ "Katia Chausheva",
43
+ "Keith Carter",
44
+ "Larry Burrows",
45
+ "Larry Clark",
46
+ "Laurent Baheux",
47
+ "Lewis Baltz",
48
+ "Lillian Bassman",
49
+ "Lynsey Addario",
50
+ "Margaret Bourke-White",
51
+ "Marianne Breslauer",
52
+ "Marta Bevacqua",
53
+ "Mathew Brady",
54
+ "Miki Asai",
55
+ "Miles Aldridge",
56
+ "Nick Brandt",
57
+ "Nobuyoshi Araki",
58
+ "Olive Cotton",
59
+ "Patrick Demarchelier",
60
+ "Paul Barson",
61
+ "Petra Collins",
62
+ "Petra Collins",
63
+ "Richard Avedon",
64
+ "Rineke Dijkstra",
65
+ "Robby Cavanaugh",
66
+ "Robert Adams",
67
+ "Robert Capa",
68
+ "Roger Ballen",
69
+ "Ruth Bernhard",
70
+ "Slim Aarons",
71
+ "Tami Bone",
72
+ "Tina Barney",
73
+ "Vanley Burke"
74
+ ]
data/photography_styles.json ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "high fashion photography",
3
+ "avant garde photography",
4
+ "fashion photography",
5
+ "portrait photography",
6
+ "landscape photography",
7
+ "documentary photography",
8
+ "street photography",
9
+ "action photography",
10
+ "vintage photography"
11
+ ]
data/place.json ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "indoor",
3
+ "outdoor",
4
+ "at night",
5
+ "in the park",
6
+ "studio",
7
+ "at a party",
8
+ "at a festival",
9
+ "at a concert",
10
+ "on persons home planet",
11
+ "magical portal with particles",
12
+ "in a neon lit city",
13
+ "in a cyberpunk city",
14
+ "in a fantasy world",
15
+ "glamour photography",
16
+ "fashion photography",
17
+ "at home",
18
+ "at work",
19
+ "at a cafe",
20
+ "at a gym",
21
+ "at a hotel",
22
+ "at a concert performance",
23
+ "at the beach",
24
+ "at a museum",
25
+ "in a hidden city deep in the rainforest",
26
+ "in a floating island in the sky",
27
+ "in an underground world beneath the earths surface ",
28
+ "in a secret garden hidden in a mysterious maze",
29
+ "in a grand castle on the top of a remote mountain",
30
+ "in a enchanted forest with talking animals and magical creatures",
31
+ "in a mystical island filled with ancient ruins and hidden treasure",
32
+ "in a faraway planet with a unique and alien landscape",
33
+ "in a hidden paradise hidden behind a waterfall",
34
+ "in a dreamlike world where anything is possible and the impossible is real",
35
+ "in a hidden oasis in the desert",
36
+ "in a secret underground city",
37
+ "in an underwater kingdom",
38
+ "in a lost temple in the jungle",
39
+ "in a castle in the clouds",
40
+ "in a hidden valley in the mountains",
41
+ "in a uturistic city on a distant planet",
42
+ "in a mystical land of eternal twilight",
43
+ "Smoke and ash in the air",
44
+ "suburban america",
45
+ "suburbs",
46
+ "slums",
47
+ "at the sea",
48
+ "at the ocean",
49
+ "at the lake",
50
+ "at the river",
51
+ "at the waterfall",
52
+ "in the labyrinth",
53
+ "in a lab",
54
+ "rendered in a 2.5D isometric perspective. Soft gradients add dimension, pastel color scheme",
55
+ "in an ancient enchanted forest",
56
+ "atop a floating sky island",
57
+ "inside a crystal cavern",
58
+ "beside a shimmering fairy pond",
59
+ "in the ruins of a forgotten temple",
60
+ "at the heart of a magical vortex",
61
+ "on the steps of a celestial palace",
62
+ "in the lair of a mythical beast",
63
+ "on the shores of an eldritch sea",
64
+ "within the walls of a dreamer's fortress",
65
+ "in a neon-lit back alley market",
66
+ "atop a towering megastructure",
67
+ "inside a virtual reality dive bar",
68
+ "beneath the city in the techno catacombs",
69
+ "on the bustling streets of the augmented metropolis",
70
+ "at a clandestine hacker's hideout",
71
+ "in a hover-car chase through the cityscape",
72
+ "at a black market cybernetics clinic",
73
+ "within a digital data fortress in cyberspace",
74
+ "on a rain-soaked rooftop overlooking the neon sprawl",
75
+ "aboard a sprawling interstellar spaceship",
76
+ "on a distant planet's alien landscape",
77
+ "inside a high-tech orbital space station",
78
+ "at a bustling galactic trade hub",
79
+ "within the depths of a biomechanical hive",
80
+ "on a terraformed Martian colony",
81
+ "in the heart of a quantum singularity",
82
+ "at a futuristic AI-controlled mega-city",
83
+ "within the virtual realms of a digital utopia",
84
+ "on the observation deck of a cosmic observatory",
85
+ "inside the belly of a gigantic jellyfish floating in space",
86
+ "on a floating island made entirely of candy and sweets",
87
+ "within a dimension where colors sing and sounds have taste",
88
+ "at a bazaar selling bottled dreams and captured starlight",
89
+ "on a roller coaster weaving through time and memories",
90
+ "in a library where books sprout legs and share their tales",
91
+ "on a planet where the oceans are made of liquid crystal",
92
+ "at a dance party hosted by interdimensional beings on the rings of Saturn",
93
+ "on a beach where the sand is made of tiny glowing stars"
94
+ ]
data/pose.json ADDED
@@ -0,0 +1,344 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "standing straight, facing camera, leaf in hand",
3
+ "standing, hands on surface, facing camera",
4
+ "one arm bent, hip jutted out, direct gaze",
5
+ "standing straight, hands on pads, confident stance",
6
+ "hands raised, slight twist, standing straight",
7
+ "standing straight, hands resting, slight smile",
8
+ "sitting, relaxed, facing camera",
9
+ "hand in hair, standing straight, slight smile",
10
+ "hands on hips, straight posture, direct gaze",
11
+ "standing straight, left arm raised, right arm down, facing camera",
12
+ "standing straight, left arm raised, right arm bent, facing camera",
13
+ "standing straight, hands on hips, head slightly tilted",
14
+ "holding hair, straight stance, direct gaze",
15
+ "standing straight, hands relaxed, confident stance",
16
+ "standing straight, hand on hip, looking at camera",
17
+ "standing straight, hands clasping bag, weight on right leg, smiling",
18
+ "seated, arm raised, head tilted",
19
+ "facing forward, slight tilt, relaxed stance",
20
+ "standing pose, hands on ledge, facing camera",
21
+ "standing straight, relaxed arms, holding bottle",
22
+ "standing straight, facing camera, hands on hips",
23
+ "leaning forward, hands on thighs, slight smile",
24
+ "arms crossed, head slightly tilted, direct gaze",
25
+ "hand on head, standing straight, slight twist, confident stance",
26
+ "standing straight, hands on hips, facing camera",
27
+ "facing camera, slight head tilt, relaxed posture",
28
+ "standing upright, slight smile, facing camera",
29
+ "standing straight, hands together, slight smile",
30
+ "facing camera, seated position, hands on knees",
31
+ "standing straight, hands on hips, facing camera",
32
+ "facing away, head turned, slight twist",
33
+ "standing straight, hands on shorts, slightly tilted head",
34
+ "standing upright, hands raised, interlocked above head, one leg straight, other bent, facing camera",
35
+ "standing straight, hand on hip, slight bend in right knee, head tilted",
36
+ "standing straight, hands together, direct gaze",
37
+ "sitting down, crossed legs, leaning forward",
38
+ "standing upright, hands on hips, facing forward",
39
+ "hands on hips, facing camera, confident stance",
40
+ "facing camera, head tilted, subtle smile",
41
+ "standing upright, arms raised, hand in hair",
42
+ "leaning on railing, facing camera, arms apart, straight posture",
43
+ "sitting down, facing camera, head slightly tilted",
44
+ "standing straight, looking forward, left hand holding bag",
45
+ "hands on hips, standing straight, slight body twist",
46
+ "facing camera, arms crossed, slight smile",
47
+ "facing camera, gentle gaze, holding arm",
48
+ "standing upright, arms relaxed, looking forward",
49
+ "sitting cross-legged, hands on ankles, direct gaze",
50
+ "standing straight, slight head tilt, direct gaze",
51
+ "standing upright, hands on hips, slight smile",
52
+ "standing upright, hand on jacket, confident stance",
53
+ "standing upright, hands on hips, facing camera",
54
+ "standing upright, one hand holding object, slight body turn",
55
+ "sitting, hand on head, legs crossed",
56
+ "standing upright, hands on hips, looking forward",
57
+ "seated, open-legged, arms resting",
58
+ "head turned, gazing upward, flowing hair",
59
+ "head tilted, hand on chin, direct gaze",
60
+ "sitting down, one arm resting, head slightly tilted",
61
+ "facing camera, slightly tilted head, relaxed posture",
62
+ "facing camera, head tilted, relaxed stance",
63
+ "facing camera, slight smile, left arm raised",
64
+ "sitting, smiling, relaxed posture",
65
+ "facing camera, slight smile, straight posture",
66
+ "kneeling, hand on forehead, looking at camera",
67
+ "facing camera, slight smile, relaxed stance",
68
+ "facing camera, slight smile, head slightly tilted",
69
+ "facing camera, slight head tilt, relaxed stance",
70
+ "looking forward, slight head tilt, relaxed posture",
71
+ "facing camera, slight smile, relaxed stance",
72
+ "looking forward, slight smile, head tilted",
73
+ "squatting position, hands in hair, eyes closed",
74
+ "facing camera, slight head tilt, relaxed shoulders",
75
+ "head tilted, looking forward, hair swept aside",
76
+ "hand in hair, facing camera, slight tilt",
77
+ "facing camera, slight smile, head tilted",
78
+ "hand on hat, facing camera, slightly leaning",
79
+ "hand on cheek, sitting down, head slightly tilted",
80
+ "facing camera, slight smile, head tilted",
81
+ "tilted head, hand lifting jacket, direct gaze",
82
+ "looking at camera, slightly tilted head, touching hair",
83
+ "arms raised, elbows bent, flexing biceps, confident stance",
84
+ "facing camera, slight tilt, relaxed posture",
85
+ "seated, slightly leaning, facing camera",
86
+ "hand in hair, leaning elbow, direct gaze, slightly parted lips",
87
+ "head tilted, hand in hair, looking at camera, slight smile",
88
+ "sitting, hands on thighs, direct gaze",
89
+ "head tilted slightly, eyes looking forward, hand touching hair",
90
+ "head tilted, hand on neck, relaxed demeanor, bare shoulders",
91
+ "sitting down, crossed legs, looking downward, one hand near neck",
92
+ "smiling faces, direct gaze, group hug",
93
+ "seated position, smiling expression, facing camera",
94
+ "facing camera, slight smile, relaxed stance",
95
+ "sitting down, facing camera, one leg bent",
96
+ "smiling, peace sign, looking forward, head tilted",
97
+ "facing camera, slight smile, head tilted",
98
+ "facing camera, slight smile, touching neck, hairclips in hair",
99
+ "kneeling position, hand in hair, confident gaze, slight smile",
100
+ "facing camera, slight smile, head tilted",
101
+ "seated, leaning forward, smiling",
102
+ "sitting, one leg bent, one leg extended, leaning forward, arms resting",
103
+ "sitting down, arms crossed, facing camera",
104
+ "standing, arm raised, facing camera",
105
+ "seated, relaxed, looking aside",
106
+ "facing camera, slight smile, relaxed posture",
107
+ "facing camera, slightly tilted head, relaxed posture",
108
+ "slight tilt, looking at camera, relaxed posture",
109
+ "facing forward, slight tilt, confident expression",
110
+ "straight standing, head tilted, gaze at camera",
111
+ "head tilt, slight smile, looking at camera",
112
+ "looking at camera, slight head tilt, relaxed posture",
113
+ "facing camera, slightly tilted head, one arm visible",
114
+ "facing camera, slight smile, relaxed stance",
115
+ "head cocked, hand on chin, looking at camera, slight smile",
116
+ "facing camera, slightly tilted head, relaxed posture",
117
+ "kneeling down, facing camera, leaning forward",
118
+ "facing camera, slight head tilt, pouting lips",
119
+ "hand on face, leaning slightly, intense gaze",
120
+ "smiling, hugging children, direct gaze",
121
+ "leaning forward, one leg raised, playful gesture",
122
+ "hand in hair, slight tilt, bending forward",
123
+ "facing camera, slight tilt head, one hand raised",
124
+ "standing upright, looking forward, relaxed arms",
125
+ "sitting down, arms rested, legs crossed",
126
+ "crouching down, chin resting, looking sideways",
127
+ "squatting position, head tilt, one hand raised",
128
+ "leaning on tree, gently touching hair, standing pose, eyes closed, relaxed demeanor",
129
+ "sitting, leaning slightly, smiling",
130
+ "standing sideways, looking back, slightly bent torso",
131
+ "gazing forward, slight head tilt, hair pulled back",
132
+ "sitting down, hand in hair, looking sideways",
133
+ "hand in hair, looking away, slight twist",
134
+ "facing camera, slightly tilted head, one-shoulder visible",
135
+ "facing camera, slight smile, head tilted",
136
+ "head tilted, slight smile, looking at camera",
137
+ "facing camera, slight tilt, soft expression",
138
+ "seated, arms crossed, legs bent",
139
+ "head tilt, gazing upwards, holding flowers",
140
+ "head tilted, hand raised, playful expression",
141
+ "leaning forward, knee up, hand on forehead, gazing at camera",
142
+ "leaning forward, hand on chin, thoughtful expression",
143
+ "sitting down, facing camera, slight tilt",
144
+ "sitting, arm raised, head tilted",
145
+ "facing camera, slight tilt head, relaxed posture",
146
+ "head turned, looking back, hand on hip",
147
+ "hands on face, slight head tilt, looking at camera",
148
+ "facing camera, relaxed posture, slightly parted lips",
149
+ "facing camera, slight tilt, soft gaze",
150
+ "standing, facing camera, hand on neck",
151
+ "arms crossed, slight smile, looking away",
152
+ "leaning forward, hands under chin, looking at camera",
153
+ "seated, hand on head, torso twisted",
154
+ "looking at camera, slightly angled, relaxed posture",
155
+ "facing camera, relaxed stance, slight smile",
156
+ "hand on chin, looking forward, slight tilt",
157
+ "head tilted, hand in hair, facing camera",
158
+ "looking forward, hand on head, slightly tilted head",
159
+ "pouting lips, holding phone, slightly tilted head",
160
+ "standing straight, left hand raised, smiling at camera",
161
+ "seated, slightly leaning, soft smile",
162
+ "sitting, legs crossed, facing camera, relaxed posture",
163
+ "sitting on floor, looking at camera, one leg bent",
164
+ "standing straight, hands on hips, smiling",
165
+ "standing straight, hands near face, facing camera",
166
+ "hand in hair, slightly turned, standing upright",
167
+ "standing pose, slightly bent arm, hand touching hair, hip tilted, confident stance, half-turned towards camera, relaxed facial expression",
168
+ "standing, arms raised, facing camera",
169
+ "seated position, looking forward, slight tilt, relaxed posture",
170
+ "standing pose, one hand raised, facing camera, hip jutted",
171
+ "sitting down, one hand on knee, head slightly tilted",
172
+ "standing, slightly angled, hand on hip",
173
+ "standing straight, slightly angled, hands on bag",
174
+ "standing straight, hand on hip, head slightly tilted",
175
+ "squatting position, left arm resting, right hand on waist",
176
+ "sitting on bench, leaning forward, casually posed",
177
+ "Kneeling, leaning forward, gaze at camera",
178
+ "sitting, hand gesture, legs crossed",
179
+ "Standing straight, slight smile, looking at camera",
180
+ "hands raised, head tilt, standing straight",
181
+ "standing straight, left hand raised, facing camera",
182
+ "straight posture, slight lean, direct gaze",
183
+ "standing straight, arms relaxed, facing camera",
184
+ "standing upright, left hand on hip, slight left twist, right arm hanging",
185
+ "standing straight, hand in hair, slight body turn",
186
+ "crouching, looking at camera, hands on knees",
187
+ "standing upright, hand in hair, slight twist",
188
+ "standing straight, left hand adjusting sunglasses, right hand on hip, facing camera",
189
+ "standing straight, hands together, slight body turn",
190
+ "standing upright, one leg crossed, hands on hip",
191
+ "standing straight, hands on pads, front-facing",
192
+ "standing straight, hands relaxed, facing camera",
193
+ "standing straight, hands on hips, smiling, facing camera",
194
+ "standing upright, hands touching, slightly turned",
195
+ "standing straight, hands by side, direct gaze",
196
+ "walking forward, left leg forward, slight smile",
197
+ "seated position, leaning forward, one leg bent",
198
+ "standing straight, hands on hips, looking at camera",
199
+ "standing, slightly turned, casual hold of pants, relaxed posture, sunglass on head",
200
+ "facing camera, slight smile, hand on hip",
201
+ "leaning forward, arching back, looking away",
202
+ "standing straight, hands together, looking forward",
203
+ "sitting down, facing camera, slight smile",
204
+ "sitting, one leg crossed, looking at camera, confident stance",
205
+ "standing straight, slight smile, left hand holding purse, right hand relaxed",
206
+ "sitting down, legs crossed, left hand resting, right hand on thigh, direct gaze",
207
+ "sitting down, holding phone, legs crossed",
208
+ "left: standing straight, right hand raised, left: standing, hand on hip",
209
+ "seated on couch, leaning forward, hands supporting chin, legs crossed, eyes looking upward",
210
+ "sitting, arm raised, head tilted",
211
+ "sitting down, legs bent, hands on knee, relaxed demeanor",
212
+ "standing, facing camera, hand on face",
213
+ "hand on head, facing camera, slightly smiling",
214
+ "Standing straight, hands on hips, facing camera",
215
+ "standing straight, holding object, slight twist",
216
+ "sitting down, eyes closed, head slightly tilted, holding dress",
217
+ "sitting down, crossed legs, hands on legs, facing camera",
218
+ "standing beside bicycle, holding handlebars, facing camera",
219
+ "sitting, crossed legs, relaxed posture, hand on knee",
220
+ "bending forward, one hand on car, looking at camera",
221
+ "standing upright, leaning slightly, one arm raised",
222
+ "standing upright, one hand raised, facing camera",
223
+ "Sitting down, slightly leaned forward, direct gaze",
224
+ "hand on head, standing straight, facing camera, confident stance",
225
+ "sitting, one leg raised, engaged expression",
226
+ "hands in hair, seated, legs crossed",
227
+ "three-quarter view, standing upright, looking over shoulder",
228
+ "standing upright, slight hip tilt, arms relaxed",
229
+ "crouching, looking forward, left hand on ground, right arm resting on leg",
230
+ "standing straight, left hand touching hair, facing camera",
231
+ "standing straight, slight hip tilt, right arm bent",
232
+ "sitting, one leg raised, facing camera",
233
+ "sitting, one knee raised, looking at camera",
234
+ "standing, one arm raised, facing camera",
235
+ "standing upright, slight body turn, left hand on hip, right hand holding object",
236
+ "sitting down, smiling, holding a drink",
237
+ "standing, facing camera, biting ice cream",
238
+ "hand on hip, slight body tilt, chin down, forward-facing",
239
+ "standing upright, relaxed posture, facing camera",
240
+ "hand in hair, arched back, seductive stance",
241
+ "standing, three-quarter view, left hand on hip",
242
+ "standing straight, hands on thighs, facing camera",
243
+ "sitting on chair, legs crossed, leaning forward, holding drink, looking at camera",
244
+ "crouching, smiling, looking forward",
245
+ "sitting, right leg bent, left arm raised",
246
+ "Direct gaze, slight smile, hand in hair",
247
+ "sitting, legs crossed, hands on knee",
248
+ "standing upright, hand in hair, smiling",
249
+ "arm raised, bent elbow, one leg forward, standing pose, confident stance",
250
+ "Standing pose, one leg crossed, hand on hip, facing camera",
251
+ "sitting, hand in hair, facing camera",
252
+ "standing upright, slight smile, one hand holding bag",
253
+ "standing upright, hands by side, direct gaze",
254
+ "Standing pose, facing camera, slight tilt",
255
+ "standing straight, left hand on sunglasses, right hand holding purse",
256
+ "standing upright, hands on hips, relaxed posture",
257
+ "sitting down, touching hat, smiling",
258
+ "leaning on wall, looking at camera, one leg raised",
259
+ "seated, legs spread, head tilted down",
260
+ "standing straight, hands by side, direct gaze",
261
+ "standing upright, holding book, slight body turn",
262
+ "sitting down, leaning back, smiling, leg crossed",
263
+ "standing straight, left hand on hip, right hand holding bag",
264
+ "standing straight, hands on hips, slight smile",
265
+ "facing camera, slight smile, relaxed posture, left hand on hip, right hand by side",
266
+ "standing upright, directly facing camera, relaxed stance",
267
+ "arms on table, standing straight, slight torso twist",
268
+ "standing straight, facing camera, holding phone",
269
+ "standing, left leg forward, hand on waist",
270
+ "standing upright, hands together, facing camera",
271
+ "hands on hips, slight lean, confident stance",
272
+ "reclining, arms raised, directly facing camera, relaxed demeanor",
273
+ "sitting, one hand holding glass, crossed legs",
274
+ "standing upright, slightly tilted head, holding hair",
275
+ "standing upright, slight twist, left hand adjusting, looking at camera",
276
+ "sitting down, legs crossed, looking at phone",
277
+ "standing upright, looking forward, hands on stomach, slight smile, casual stance",
278
+ "standing, one hand holding phone, slight body turn",
279
+ "sitting pose, one hand on chin, legs crossed, head slightly tilted",
280
+ "sitting down, hand on cheek, one leg crossed",
281
+ "one leg extended, leaning back, direct gaze",
282
+ "leaning back, one leg bent, one leg extended, confident gaze",
283
+ "facing camera, slightly tilted head, resting arms",
284
+ "standing upright, DJing, slight smile",
285
+ "standing upright, left leg forward, hands on thighs, facing camera",
286
+ "standing upright, arm raised, smiling",
287
+ "sitting down, slightly leaning forward, facing camera",
288
+ "seated, relaxed posture, looking forward",
289
+ "standing straight, hand on hip, slight smile, head tilted",
290
+ "standing, one arm bent, holding dumbbell, looking forward",
291
+ "walking, left profile, one foot forward",
292
+ "Leaning back, angled towards camera, relaxed posture",
293
+ "looking back, slight twist, right hand resting",
294
+ "facing away, looking back, left hand raised",
295
+ "standing, arms raised, hands touching",
296
+ "sitting down, casual posture",
297
+ "standing straight, hands on hips, direct gaze",
298
+ "half-turned, looking back, one arm bent",
299
+ "arm raised, standing straight, looking forward",
300
+ "sitting, legs bent, relaxed posture",
301
+ "sitting down, facing camera, slightly tilted head",
302
+ "turned sideways, lifting dumbbells, slight bend in knees",
303
+ "hand on head, slightly turned, standing straight",
304
+ "standing straight, slight smile, right hand on hip, facing camera",
305
+ "leaning against wall, one leg bent, looking over shoulder",
306
+ "sitting, hand on chin, crossed legs",
307
+ "standing straight, slight twist, gazing forward, relaxed posture, hands not visible",
308
+ "sitting down, arms raised, head tilted",
309
+ "leaning on railing, facing camera, slight smile",
310
+ "sitting, arms raised, looking at camera",
311
+ "sitting, arms raised, head tilted",
312
+ "standing, holding bike, facing camera",
313
+ "standing straight, hands on hips, direct gaze",
314
+ "standing straight, hand on head, facing away",
315
+ "sitting, facing away, relaxed posture",
316
+ "facing away, head turned, one hand touching thigh",
317
+ "standing pose, leaning on counter, one arm bent, looking at camera",
318
+ "smiling, facing camera, relaxed stance",
319
+ "Standing straight, hands on hips, slight smile, looking forward",
320
+ "looking over shoulder, three-quarter turn, hand on hip",
321
+ "hand in hair, kneeling position, direct gaze, left leg bent, confident expression",
322
+ "facing camera, arms crossed, slight tilt",
323
+ "leaning forward, looking to the side, one hand on hip",
324
+ "arms crossed, looking at camera, slight head tilt",
325
+ "kneeling, leaning forward, hands on handles",
326
+ "leaning forwards, hand on head, facing camera",
327
+ "standing upright, hands on hips, confident stance",
328
+ "straight standing, hands together, slight smile",
329
+ "looking back, slight twist, hand on hip",
330
+ "Sitting down, facing camera, holding glass",
331
+ "standing upright, hand in hair, facing camera",
332
+ "standing, leaning on wall, holding glass, crossed legs",
333
+ "head tilted, sitting, hand on neck",
334
+ "standing, looking back, hand on thigh",
335
+ "sitting, hand on face, legs crossed, relaxed demeanor",
336
+ "standing, hands on head, eyes closed",
337
+ "standing upright, facing camera, slight twist",
338
+ "hand on hat, slightly turned, mid-walk stance",
339
+ "facing sideways, slight twist, playful stance",
340
+ "Standing upright, Left hand holding flower, Right hand on hip, Gazing forward",
341
+ "standing upright, hands on hips, smiling face",
342
+ "standing upright, arm raised, indirect gaze",
343
+ "sitting down, hand on head, legs bent, relaxed posture"
344
+ ]
data/roles.json ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "as a ((cyborg))",
3
+ "as an ((x-men character))",
4
+ "as a ((marvel character))",
5
+ "as a ((character from lord of the rings))",
6
+ "as a ((superhero character))",
7
+ "as a ((scifi character))",
8
+ "as a ((character from star wars))",
9
+ "as a ((character from star trek))",
10
+ "as a ((character from the matrix))",
11
+ "as a ((character from the tv show the boys))",
12
+ "as a ((glamour model))",
13
+ "as a ((fashion model))",
14
+ "as a ((greek god))",
15
+ "as a ((norse god))",
16
+ "as a ((egyptian god))",
17
+ "as a ((construction worker))",
18
+ "as a ((teacher))",
19
+ "as a ((body builder))",
20
+ "as a ((pirate))",
21
+ "as a ((sanitation worker))",
22
+ "as a ((plumber))",
23
+ "as an ((electrician))",
24
+ "as a ((carpenter))",
25
+ "as a ((mechanic))",
26
+ "as a ((farmer))",
27
+ "as a ((fisherman))",
28
+ "as a ((hunter))",
29
+ "as a ((nerd))",
30
+ "as an ((accountant))",
31
+ "as an ((artist))",
32
+ "as an ((athlete))",
33
+ "as a ((baker))",
34
+ "as a ((barber))",
35
+ "as a ((bartender))",
36
+ "as a ((butcher))",
37
+ "as a ((doctor))",
38
+ "as a ((dentist))",
39
+ "as a ((dancer))",
40
+ "as a ((designer))",
41
+ "as a ((diver))",
42
+ "as a ((director))",
43
+ "as an ((engineer))",
44
+ "as a ((firefighter))",
45
+ "as a ((journalist))",
46
+ "as a ((lawyer))",
47
+ "as a ((mechanic))",
48
+ "as a ((musician))",
49
+ "as a ((nurse))",
50
+ "as a ((pilot))",
51
+ "as a ((police officer))",
52
+ "as a ((salesperson))",
53
+ "as a ((scientist))",
54
+ "as a ((web developer))",
55
+ "as a ((writer))",
56
+ "as a ((warrior))",
57
+ "as a ((mad scientist))",
58
+ "as a ((knight in armor))",
59
+ "as a ((jedi with a light saber))",
60
+ "as a ((wrestler))",
61
+ "as an ((astronaut))",
62
+ "as a ((warlord))",
63
+ "as a ((hobo))",
64
+ "as a ((surfer))",
65
+ "as a ((necromancer))",
66
+ "as a ((thiefling))",
67
+ "as a ((luxury person))",
68
+ "as an ((anthropomorphic creature))",
69
+ "as a ((samurai))",
70
+ "as a ((viking barbarian))",
71
+ "as an ((undead))",
72
+ "as a ((clown))",
73
+ "as a ((rockstar))",
74
+ "as an ((influencer))",
75
+ "as a ((priest))",
76
+ "((dressed as a pope))",
77
+ "((dressed as a king))",
78
+ "as a ((holy person))",
79
+ "as a ((hunter))",
80
+ "as an ((alien being))",
81
+ "as a ((soldier))",
82
+ "as an ((emo))",
83
+ "as an ((goth))",
84
+ "as an ((video game character))",
85
+ "as an ((michelin chef))",
86
+ "as a ((military person))",
87
+ "as a ((serial killer))",
88
+ "as a ((maniac))",
89
+ "as a ((captain))",
90
+ "as an ((evil magician))",
91
+ "as a ((pure blood))",
92
+ "as a ((dragon tamer))",
93
+ "as a ((warlock))",
94
+ "as a ((mermaid/merman))",
95
+ "as a ((cowboy))",
96
+ "as a ((black metal artist))",
97
+ "as a ((death metal front figure))",
98
+ "as an ((alien diplomat))",
99
+ "as a ((demigod))",
100
+ "as a ((monster hunter))",
101
+ "as a ((spaceship captain))",
102
+ "((dressed as jesus))",
103
+ "as ((the ultimate warrior))",
104
+ "as a wall street broker yuppie",
105
+ "as a ((cyborg, a fusion of human and machine, often equipped with advanced technology and prosthetics))",
106
+ "as a ((dragon whisperer))",
107
+ "as a ((pixie gardener))",
108
+ "as a ((necromancer))",
109
+ "as a ((phoenix tamer))",
110
+ "as a ((crystal seer))",
111
+ "as a ((fairy godparent))",
112
+ "as a ((spellweaver))",
113
+ "as a ((merfolk ambassador))",
114
+ "as a ((goblin trader))",
115
+ "as a ((unicorn healer))",
116
+ "as a ((dreamcatcher crafter))",
117
+ "as a ((star navigator))",
118
+ "as a ((enchanted armor smith))",
119
+ "as a ((griffin rider))",
120
+ "as a ((potion master))",
121
+ "as a ((lunar diviner))",
122
+ "as a ((eldritch librarian))",
123
+ "as a ((celestial musician))",
124
+ "as a ((mystic botanist))",
125
+ "as a ((spiritual stonemason))",
126
+ "as a ((shadow puppeteer))",
127
+ "as a ((time weaver))",
128
+ "as a ((sorcerous scribe))",
129
+ "as a ((elemental geologist))",
130
+ "as a ((ethereal architect))",
131
+ "as a ((starship engineer))",
132
+ "as a ((quantum cryptographer))",
133
+ "as a ((exo-botanist))",
134
+ "as a ((alien linguist))",
135
+ "as a ((holodeck programmer))",
136
+ "as a ((cybernetic surgeon))",
137
+ "as a ((astrogation specialist))",
138
+ "as a ((zero-gravity artist))",
139
+ "as a ((stellar cartographer))",
140
+ "as a ((time-travel historian))",
141
+ "as a ((interstellar diplomat))",
142
+ "as a ((teleportation technician))",
143
+ "as a ((neural network designer))",
144
+ "as a ((bio-enhancement consultant))",
145
+ "as a ((warp drive mechanic))",
146
+ "as a ((xenobiology researcher))",
147
+ "as a ((nano-medic))",
148
+ "as a ((android ethicist))",
149
+ "as a ((galactic explorer))",
150
+ "as a ((synthetic life curator))",
151
+ "as a ((multiverse navigator))",
152
+ "as a ((quantum foam sculptor))",
153
+ "as a ((holographic performer))",
154
+ "as a ((asteroid miner))",
155
+ "as a ((interdimensional trader))",
156
+ "as a ((cultist recruiter))",
157
+ "as a ((elder sign engraver))",
158
+ "as a ((forbidden tome librarian))",
159
+ "as a ((abyssal ambassador))",
160
+ "as a ((deep one liaison))",
161
+ "as a ((madness muse))",
162
+ "as a ((eldritch etymologist))",
163
+ "as a ((non-euclidean architect))",
164
+ "as a ((miskatonic scholar))",
165
+ "as a ((R'lyeh relic researcher))",
166
+ "as a ((dreamland cartographer))",
167
+ "as a ((night-gaunt navigator))",
168
+ "as a ((shub-niggurath shepherd))",
169
+ "as a ((yog-sothoth yodeler))",
170
+ "as a ((innsmouth innkeeper))",
171
+ "as a ((cthulhu chorister))",
172
+ "as a ((dragon devotee))",
173
+ "as a ((arkham archaeologist))",
174
+ "as a ((leng plateau pilgrim))",
175
+ "as a ((whisperer-in-darkness translator))",
176
+ "as a ((azathoth astronomer))",
177
+ "as a ((nyarlathotep negotiator))",
178
+ "as a ((carcosa curator))",
179
+ "as a ((tsathoggua therapist))",
180
+ "as a ((elder thing ethnographer))",
181
+ "as a ((neon netrunner))",
182
+ "as a ((cyberdeck coder))",
183
+ "as a ((techno-shaman))",
184
+ "as a ((hologram hustler))",
185
+ "as a ((megacity mercenary))",
186
+ "as a ((virtual voodoo priest))",
187
+ "as a ((data dive drifter))",
188
+ "as a ((chrome chaser))",
189
+ "as a ((synthwave slicer))",
190
+ "as a ((replicant rehabilitator))",
191
+ "as a ((black market biomod broker))",
192
+ "as a ((augmented artisan))",
193
+ "as a ((neural network ninja))",
194
+ "as a ((quantum qubit quixote))",
195
+ "as a ((cyberspace salvager))",
196
+ "as a ((pixel punker))",
197
+ "as a ((nanotech nomad))",
198
+ "as a ((binary blade bouncer))",
199
+ "as a ((digital dystopia detective))",
200
+ "as a ((megabuilding mapper))",
201
+ "as a ((corpo-hacker confidante))",
202
+ "as a ((aero auto-rickshaw racer))",
203
+ "as a ((skyline slicer))",
204
+ "as a ((terminal trickster))",
205
+ "as a ((matrix maverick))"
206
+ ]
depth_estimator.py ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import PIL.Image
3
+ from controlnet_aux.util import HWC3
4
+ from transformers import pipeline
5
+
6
+ from cv_utils import resize_image
7
+
8
+
9
+ class DepthEstimator:
10
+ def __init__(self):
11
+ self.model = pipeline("depth-estimation")
12
+
13
+ def __call__(self, image: np.ndarray, **kwargs) -> PIL.Image.Image:
14
+ return image
env.py ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+
3
+
4
+ CIVITAI_API_KEY = os.environ.get("CIVITAI_API_KEY")
5
+ hf_token = os.environ.get("HF_TOKEN")
6
+ hf_read_token = os.environ.get('HF_READ_TOKEN') # only use for private repo
7
+
8
+
9
+ # List all Models for specified user
10
+ HF_MODEL_USER_LIKES = [] # sorted by number of likes
11
+ HF_MODEL_USER_EX = [] # sorted by a special rule
12
+
13
+
14
+ # - **Download Models**
15
+ download_model_list = [
16
+ ]
17
+
18
+ # - **Download VAEs**
19
+ download_vae_list = [
20
+ ]
21
+
22
+ # - **Download LoRAs**
23
+ download_lora_list = [
24
+ ]
25
+
26
+
27
+ directory_models = 'models'
28
+ os.makedirs(directory_models, exist_ok=True)
29
+ directory_loras = 'loras'
30
+ os.makedirs(directory_loras, exist_ok=True)
31
+ directory_vaes = 'vaes'
32
+ os.makedirs(directory_vaes, exist_ok=True)
33
+
34
+
35
+ HF_LORA_PRIVATE_REPOS1 = []
36
+ HF_LORA_PRIVATE_REPOS2 = [] # to be sorted as 1 repo
37
+ HF_LORA_PRIVATE_REPOS = HF_LORA_PRIVATE_REPOS1 + HF_LORA_PRIVATE_REPOS2
38
+ HF_LORA_ESSENTIAL_PRIVATE_REPO = '' # to be downloaded on run app
39
+ HF_VAE_PRIVATE_REPO = ''
40
+
flux.py ADDED
@@ -0,0 +1,284 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import spaces
2
+ import os
3
+ import gradio as gr
4
+ import json
5
+ import logging
6
+ logging.getLogger("diffusers").setLevel(logging.ERROR)
7
+ import diffusers
8
+ diffusers.utils.logging.set_verbosity(40)
9
+ import warnings
10
+ warnings.filterwarnings(action="ignore", category=FutureWarning, module="diffusers")
11
+ warnings.filterwarnings(action="ignore", category=UserWarning, module="diffusers")
12
+ warnings.filterwarnings(action="ignore", category=FutureWarning, module="transformers")
13
+ from pathlib import Path
14
+ from env import (hf_token, hf_read_token, # to use only for private repos
15
+ CIVITAI_API_KEY, HF_LORA_PRIVATE_REPOS1, HF_LORA_PRIVATE_REPOS2, HF_LORA_ESSENTIAL_PRIVATE_REPO,
16
+ HF_VAE_PRIVATE_REPO, directory_models, directory_loras, directory_vaes,
17
+ download_model_list, download_lora_list, download_vae_list)
18
+ from modutils import (to_list, list_uniq, list_sub, get_lora_model_list, download_private_repo,
19
+ safe_float, escape_lora_basename, to_lora_key, to_lora_path, get_local_model_list,
20
+ get_private_lora_model_lists, get_valid_lora_name, get_valid_lora_path, get_valid_lora_wt,
21
+ get_lora_info, normalize_prompt_list, get_civitai_info, search_lora_on_civitai)
22
+
23
+
24
+ def download_things(directory, url, hf_token="", civitai_api_key=""):
25
+ url = url.strip()
26
+
27
+ if "drive.google.com" in url:
28
+ original_dir = os.getcwd()
29
+ os.chdir(directory)
30
+ os.system(f"gdown --fuzzy {url}")
31
+ os.chdir(original_dir)
32
+ elif "huggingface.co" in url:
33
+ url = url.replace("?download=true", "")
34
+ # url = urllib.parse.quote(url, safe=':/') # fix encoding
35
+ if "/blob/" in url:
36
+ url = url.replace("/blob/", "/resolve/")
37
+ user_header = f'"Authorization: Bearer {hf_token}"'
38
+ if hf_token:
39
+ os.system(f"aria2c --console-log-level=error --summary-interval=10 --header={user_header} -c -x 16 -k 1M -s 16 {url} -d {directory} -o {url.split('/')[-1]}")
40
+ else:
41
+ os.system (f"aria2c --optimize-concurrent-downloads --console-log-level=error --summary-interval=10 -c -x 16 -k 1M -s 16 {url} -d {directory} -o {url.split('/')[-1]}")
42
+ elif "civitai.com" in url:
43
+ if "?" in url:
44
+ url = url.split("?")[0]
45
+ if civitai_api_key:
46
+ url = url + f"?token={civitai_api_key}"
47
+ os.system(f"aria2c --console-log-level=error --summary-interval=10 -c -x 16 -k 1M -s 16 -d {directory} {url}")
48
+ else:
49
+ print("\033[91mYou need an API key to download Civitai models.\033[0m")
50
+ else:
51
+ os.system(f"aria2c --console-log-level=error --summary-interval=10 -c -x 16 -k 1M -s 16 -d {directory} {url}")
52
+
53
+
54
+ def get_model_list(directory_path):
55
+ model_list = []
56
+ valid_extensions = {'.ckpt' , '.pt', '.pth', '.safetensors', '.bin'}
57
+
58
+ for filename in os.listdir(directory_path):
59
+ if os.path.splitext(filename)[1] in valid_extensions:
60
+ name_without_extension = os.path.splitext(filename)[0]
61
+ file_path = os.path.join(directory_path, filename)
62
+ # model_list.append((name_without_extension, file_path))
63
+ model_list.append(file_path)
64
+ print('\033[34mFILE: ' + file_path + '\033[0m')
65
+ return model_list
66
+
67
+
68
+ # - **Download Models**
69
+ download_model = ", ".join(download_model_list)
70
+ # - **Download VAEs**
71
+ download_vae = ", ".join(download_vae_list)
72
+ # - **Download LoRAs**
73
+ download_lora = ", ".join(download_lora_list)
74
+
75
+ #download_private_repo(HF_LORA_ESSENTIAL_PRIVATE_REPO, directory_loras, True)
76
+ #download_private_repo(HF_VAE_PRIVATE_REPO, directory_vaes, False)
77
+
78
+ CIVITAI_API_KEY = os.environ.get("CIVITAI_API_KEY")
79
+ hf_token = os.environ.get("HF_TOKEN")
80
+
81
+ # Download stuffs
82
+ for url in [url.strip() for url in download_model.split(',')]:
83
+ if not os.path.exists(f"./models/{url.split('/')[-1]}"):
84
+ download_things(directory_models, url, hf_token, CIVITAI_API_KEY)
85
+ for url in [url.strip() for url in download_vae.split(',')]:
86
+ if not os.path.exists(f"./vaes/{url.split('/')[-1]}"):
87
+ download_things(directory_vaes, url, hf_token, CIVITAI_API_KEY)
88
+ for url in [url.strip() for url in download_lora.split(',')]:
89
+ if not os.path.exists(f"./loras/{url.split('/')[-1]}"):
90
+ download_things(directory_loras, url, hf_token, CIVITAI_API_KEY)
91
+
92
+ lora_model_list = get_lora_model_list()
93
+ vae_model_list = get_model_list(directory_vaes)
94
+ vae_model_list.insert(0, "None")
95
+
96
+
97
+ def get_t2i_model_info(repo_id: str):
98
+ from huggingface_hub import HfApi
99
+ api = HfApi()
100
+ try:
101
+ if " " in repo_id or not api.repo_exists(repo_id): return ""
102
+ model = api.model_info(repo_id=repo_id)
103
+ except Exception as e:
104
+ print(f"Error: Failed to get {repo_id}'s info. ")
105
+ print(e)
106
+ return ""
107
+ if model.private or model.gated: return ""
108
+ tags = model.tags
109
+ info = []
110
+ url = f"https://huggingface.co/{repo_id}/"
111
+ if not 'diffusers' in tags: return ""
112
+ if 'diffusers:FluxPipeline' in tags:
113
+ info.append("FLUX.1")
114
+ elif 'diffusers:StableDiffusionXLPipeline' in tags:
115
+ info.append("SDXL")
116
+ elif 'diffusers:StableDiffusionPipeline' in tags:
117
+ info.append("SD1.5")
118
+ if model.card_data and model.card_data.tags:
119
+ info.extend(list_sub(model.card_data.tags, ['text-to-image', 'stable-diffusion', 'stable-diffusion-api', 'safetensors', 'stable-diffusion-xl']))
120
+ info.append(f"DLs: {model.downloads}")
121
+ info.append(f"likes: {model.likes}")
122
+ info.append(model.last_modified.strftime("lastmod: %Y-%m-%d"))
123
+ md = f"Model Info: {', '.join(info)}, [Model Repo]({url})"
124
+ return gr.update(value=md)
125
+
126
+
127
+ private_lora_dict = {"": ["", "", "", "", ""]}
128
+ try:
129
+ with open('lora_dict.json', encoding='utf-8') as f:
130
+ d = json.load(f)
131
+ for k, v in d.items():
132
+ private_lora_dict[escape_lora_basename(k)] = v
133
+ except Exception:
134
+ pass
135
+
136
+
137
+ private_lora_model_list = get_private_lora_model_lists()
138
+ loras_dict = {"None": ["", "", "", "", ""], "": ["", "", "", "", ""]} | private_lora_dict.copy()
139
+ loras_url_to_path_dict = {} # {"URL to download": "local filepath", ...}
140
+ civitai_lora_last_results = {} # {"URL to download": {search results}, ...}
141
+ all_lora_list = []
142
+
143
+
144
+ def get_all_lora_list():
145
+ global all_lora_list
146
+ loras = get_lora_model_list()
147
+ all_lora_list = loras.copy()
148
+ return loras
149
+
150
+
151
+ def get_all_lora_tupled_list():
152
+ global loras_dict
153
+ models = get_all_lora_list()
154
+ if not models: return []
155
+ tupled_list = []
156
+ for model in models:
157
+ #if not model: continue # to avoid GUI-related bug
158
+ basename = Path(model).stem
159
+ key = to_lora_key(model)
160
+ items = None
161
+ if key in loras_dict.keys():
162
+ items = loras_dict.get(key, None)
163
+ else:
164
+ items = get_civitai_info(model)
165
+ if items != None:
166
+ loras_dict[key] = items
167
+ name = basename
168
+ value = model
169
+ if items and items[2] != "":
170
+ if items[1] == "Pony":
171
+ name = f"{basename} (for {items[1]}🐴, {items[2]})"
172
+ else:
173
+ name = f"{basename} (for {items[1]}, {items[2]})"
174
+ tupled_list.append((name, value))
175
+ return tupled_list
176
+
177
+
178
+ def update_lora_dict(path: str):
179
+ global loras_dict
180
+ key = to_lora_key(path)
181
+ if key in loras_dict.keys(): return
182
+ items = get_civitai_info(path)
183
+ if items == None: return
184
+ loras_dict[key] = items
185
+
186
+
187
+ def download_lora(dl_urls: str):
188
+ global loras_url_to_path_dict
189
+ dl_path = ""
190
+ before = get_local_model_list(directory_loras)
191
+ urls = []
192
+ for url in [url.strip() for url in dl_urls.split(',')]:
193
+ local_path = f"{directory_loras}/{url.split('/')[-1]}"
194
+ if not Path(local_path).exists():
195
+ download_things(directory_loras, url, hf_token, CIVITAI_API_KEY)
196
+ urls.append(url)
197
+ after = get_local_model_list(directory_loras)
198
+ new_files = list_sub(after, before)
199
+ for i, file in enumerate(new_files):
200
+ path = Path(file)
201
+ if path.exists():
202
+ new_path = Path(f'{path.parent.name}/{escape_lora_basename(path.stem)}{path.suffix}')
203
+ path.resolve().rename(new_path.resolve())
204
+ loras_url_to_path_dict[urls[i]] = str(new_path)
205
+ update_lora_dict(str(new_path))
206
+ dl_path = str(new_path)
207
+ return dl_path
208
+
209
+
210
+ def copy_lora(path: str, new_path: str):
211
+ import shutil
212
+ if path == new_path: return new_path
213
+ cpath = Path(path)
214
+ npath = Path(new_path)
215
+ if cpath.exists():
216
+ try:
217
+ shutil.copy(str(cpath.resolve()), str(npath.resolve()))
218
+ except Exception:
219
+ return None
220
+ update_lora_dict(str(npath))
221
+ return new_path
222
+ else:
223
+ return None
224
+
225
+
226
+ def download_my_lora(dl_urls: str, lora):
227
+ path = download_lora(dl_urls)
228
+ if path: lora = path
229
+ choices = get_all_lora_tupled_list()
230
+ return gr.update(value=lora, choices=choices)
231
+
232
+
233
+ def apply_lora_prompt(lora_info: str):
234
+ if lora_info == "None": return ""
235
+ lora_tag = lora_info.replace("/",",")
236
+ lora_tags = lora_tag.split(",") if str(lora_info) != "None" else []
237
+ lora_prompts = normalize_prompt_list(lora_tags)
238
+ prompt = ", ".join(list_uniq(lora_prompts))
239
+ return prompt
240
+
241
+
242
+ def update_loras(prompt, lora, lora_wt):
243
+ on, label, tag, md = get_lora_info(lora)
244
+ choices = get_all_lora_tupled_list()
245
+ return gr.update(value=prompt), gr.update(value=lora, choices=choices), gr.update(value=lora_wt),\
246
+ gr.update(value=tag, label=label, visible=on), gr.update(value=md, visible=on)
247
+
248
+
249
+ def search_civitai_lora(query, base_model):
250
+ global civitai_lora_last_results
251
+ items = search_lora_on_civitai(query, base_model)
252
+ if not items: return gr.update(choices=[("", "")], value="", visible=False),\
253
+ gr.update(value="", visible=False), gr.update(visible=True), gr.update(visible=True)
254
+ civitai_lora_last_results = {}
255
+ choices = []
256
+ for item in items:
257
+ base_model_name = "Pony🐴" if item['base_model'] == "Pony" else item['base_model']
258
+ name = f"{item['name']} (for {base_model_name} / By: {item['creator']} / Tags: {', '.join(item['tags'])})"
259
+ value = item['dl_url']
260
+ choices.append((name, value))
261
+ civitai_lora_last_results[value] = item
262
+ if not choices: return gr.update(choices=[("", "")], value="", visible=False),\
263
+ gr.update(value="", visible=False), gr.update(visible=True), gr.update(visible=True)
264
+ result = civitai_lora_last_results.get(choices[0][1], "None")
265
+ md = result['md'] if result else ""
266
+ return gr.update(choices=choices, value=choices[0][1], visible=True), gr.update(value=md, visible=True),\
267
+ gr.update(visible=True), gr.update(visible=True)
268
+
269
+
270
+ def select_civitai_lora(search_result):
271
+ if not "http" in search_result: return gr.update(value=""), gr.update(value="None", visible=True)
272
+ result = civitai_lora_last_results.get(search_result, "None")
273
+ md = result['md'] if result else ""
274
+ return gr.update(value=search_result), gr.update(value=md, visible=True)
275
+
276
+
277
+ def search_civitai_lora_json(query, base_model):
278
+ results = {}
279
+ items = search_lora_on_civitai(query, base_model)
280
+ if not items: return gr.update(value=results)
281
+ for item in items:
282
+ results[item['dl_url']] = item
283
+ return gr.update(value=results)
284
+
flux_lora.png ADDED
image_datasets/canny_dataset.py ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import pandas as pd
3
+ import numpy as np
4
+ from PIL import Image
5
+ import torch
6
+ from torch.utils.data import Dataset, DataLoader
7
+ import json
8
+ import random
9
+ import cv2
10
+
11
+
12
+ def canny_processor(image, low_threshold=100, high_threshold=200):
13
+ image = np.array(image)
14
+ image = cv2.Canny(image, low_threshold, high_threshold)
15
+ image = image[:, :, None]
16
+ image = np.concatenate([image, image, image], axis=2)
17
+ canny_image = Image.fromarray(image)
18
+ return canny_image
19
+
20
+
21
+ def c_crop(image):
22
+ width, height = image.size
23
+ new_size = min(width, height)
24
+ left = (width - new_size) / 2
25
+ top = (height - new_size) / 2
26
+ right = (width + new_size) / 2
27
+ bottom = (height + new_size) / 2
28
+ return image.crop((left, top, right, bottom))
29
+
30
+ class CustomImageDataset(Dataset):
31
+ def __init__(self, img_dir, img_size=512):
32
+ self.images = [os.path.join(img_dir, i) for i in os.listdir(img_dir) if '.jpg' in i or '.png' in i]
33
+ self.images.sort()
34
+ self.img_size = img_size
35
+
36
+ def __len__(self):
37
+ return len(self.images)
38
+
39
+ def __getitem__(self, idx):
40
+ try:
41
+ img = Image.open(self.images[idx])
42
+ img = c_crop(img)
43
+ img = img.resize((self.img_size, self.img_size))
44
+ hint = canny_processor(img)
45
+ img = torch.from_numpy((np.array(img) / 127.5) - 1)
46
+ img = img.permute(2, 0, 1)
47
+ hint = torch.from_numpy((np.array(hint) / 127.5) - 1)
48
+ hint = hint.permute(2, 0, 1)
49
+ json_path = self.images[idx].split('.')[0] + '.json'
50
+ prompt = json.load(open(json_path))['caption']
51
+ return img, hint, prompt
52
+ except Exception as e:
53
+ print(e)
54
+ return self.__getitem__(random.randint(0, len(self.images) - 1))
55
+
56
+
57
+ def loader(train_batch_size, num_workers, **args):
58
+ dataset = CustomImageDataset(**args)
59
+ return DataLoader(dataset, batch_size=train_batch_size, num_workers=num_workers)
image_datasets/dataset.py ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import pandas as pd
3
+ import numpy as np
4
+ from PIL import Image
5
+ import torch
6
+ from torch.utils.data import Dataset, DataLoader
7
+ import json
8
+ import random
9
+
10
+ def c_crop(image):
11
+ width, height = image.size
12
+ new_size = min(width, height)
13
+ left = (width - new_size) / 2
14
+ top = (height - new_size) / 2
15
+ right = (width + new_size) / 2
16
+ bottom = (height + new_size) / 2
17
+ return image.crop((left, top, right, bottom))
18
+
19
+ class CustomImageDataset(Dataset):
20
+ def __init__(self, img_dir, img_size=512):
21
+ self.images = [os.path.join(img_dir, i) for i in os.listdir(img_dir) if '.jpg' in i or '.png' in i]
22
+ self.images.sort()
23
+ self.img_size = img_size
24
+
25
+ def __len__(self):
26
+ return len(self.images)
27
+
28
+ def __getitem__(self, idx):
29
+ try:
30
+ img = Image.open(self.images[idx])
31
+ img = c_crop(img)
32
+ img = img.resize((self.img_size, self.img_size))
33
+ img = torch.from_numpy((np.array(img) / 127.5) - 1)
34
+ img = img.permute(2, 0, 1)
35
+ json_path = self.images[idx].split('.')[0] + '.json'
36
+ prompt = json.load(open(json_path))['caption']
37
+ return img, prompt
38
+ except Exception as e:
39
+ print(e)
40
+ return self.__getitem__(random.randint(0, len(self.images) - 1))
41
+
42
+
43
+ def loader(train_batch_size, num_workers, **args):
44
+ dataset = CustomImageDataset(**args)
45
+ return DataLoader(dataset, batch_size=train_batch_size, num_workers=num_workers, shuffle=True)
image_segmentor.py ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import numpy as np
3
+ import PIL.Image
4
+ import torch
5
+ from controlnet_aux.util import HWC3, ade_palette
6
+ from transformers import AutoImageProcessor, UperNetForSemanticSegmentation
7
+
8
+ from cv_utils import resize_image
9
+
10
+
11
+ class ImageSegmentor:
12
+
13
+ def __init__(self):
14
+ self.image_processor = AutoImageProcessor.from_pretrained("openmmlab/upernet-convnext-small")
15
+ self.image_segmentor = UperNetForSemanticSegmentation.from_pretrained("openmmlab/upernet-convnext-small")
16
+
17
+ @torch.no_grad()
18
+ def __call__(self, image: np.ndarray, **kwargs) -> PIL.Image.Image:
19
+ detect_resolution = kwargs.pop("detect_resolution", 512)
20
+ image_resolution = kwargs.pop("image_resolution", 512)
21
+ image = HWC3(image)
22
+ image = resize_image(image, resolution=detect_resolution)
23
+ image = PIL.Image.fromarray(image)
24
+
25
+ pixel_values = self.image_processor(image, return_tensors="pt").pixel_values
26
+ outputs = self.image_segmentor(pixel_values)
27
+ seg = self.image_processor.post_process_semantic_segmentation(outputs, target_sizes=[image.size[::-1]])[0]
28
+ color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8)
29
+ for label, color in enumerate(ade_palette()):
30
+ color_seg[seg == label, :] = color
31
+ color_seg = color_seg.astype(np.uint8)
32
+
33
+ color_seg = resize_image(color_seg, resolution=image_resolution, interpolation=cv2.INTER_NEAREST)
34
+ return PIL.Image.fromarray(color_seg)
live_preview_helpers.py ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import numpy as np
3
+ from diffusers import FluxPipeline, AutoencoderTiny, FlowMatchEulerDiscreteScheduler
4
+ from typing import Any, Dict, List, Optional, Union
5
+
6
+ # Helper functions
7
+ def calculate_shift(
8
+ image_seq_len,
9
+ base_seq_len: int = 256,
10
+ max_seq_len: int = 4096,
11
+ base_shift: float = 0.5,
12
+ max_shift: float = 1.16,
13
+ ):
14
+ m = (max_shift - base_shift) / (max_seq_len - base_seq_len)
15
+ b = base_shift - m * base_seq_len
16
+ mu = image_seq_len * m + b
17
+ return mu
18
+
19
+ def retrieve_timesteps(
20
+ scheduler,
21
+ num_inference_steps: Optional[int] = None,
22
+ device: Optional[Union[str, torch.device]] = None,
23
+ timesteps: Optional[List[int]] = None,
24
+ sigmas: Optional[List[float]] = None,
25
+ **kwargs,
26
+ ):
27
+ if timesteps is not None and sigmas is not None:
28
+ raise ValueError("Only one of `timesteps` or `sigmas` can be passed. Please choose one to set custom values")
29
+ if timesteps is not None:
30
+ scheduler.set_timesteps(timesteps=timesteps, device=device, **kwargs)
31
+ timesteps = scheduler.timesteps
32
+ num_inference_steps = len(timesteps)
33
+ elif sigmas is not None:
34
+ scheduler.set_timesteps(sigmas=sigmas, device=device, **kwargs)
35
+ timesteps = scheduler.timesteps
36
+ num_inference_steps = len(timesteps)
37
+ else:
38
+ scheduler.set_timesteps(num_inference_steps, device=device, **kwargs)
39
+ timesteps = scheduler.timesteps
40
+ return timesteps, num_inference_steps
41
+
42
+ # FLUX pipeline function
43
+ @torch.inference_mode()
44
+ def flux_pipe_call_that_returns_an_iterable_of_images(
45
+ self,
46
+ prompt: Union[str, List[str]] = None,
47
+ prompt_2: Optional[Union[str, List[str]]] = None,
48
+ height: Optional[int] = None,
49
+ width: Optional[int] = None,
50
+ num_inference_steps: int = 28,
51
+ timesteps: List[int] = None,
52
+ guidance_scale: float = 3.5,
53
+ num_images_per_prompt: Optional[int] = 1,
54
+ generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None,
55
+ latents: Optional[torch.FloatTensor] = None,
56
+ prompt_embeds: Optional[torch.FloatTensor] = None,
57
+ pooled_prompt_embeds: Optional[torch.FloatTensor] = None,
58
+ output_type: Optional[str] = "pil",
59
+ return_dict: bool = True,
60
+ joint_attention_kwargs: Optional[Dict[str, Any]] = None,
61
+ max_sequence_length: int = 512,
62
+ good_vae: Optional[Any] = None,
63
+ ):
64
+ height = height or self.default_sample_size * self.vae_scale_factor
65
+ width = width or self.default_sample_size * self.vae_scale_factor
66
+
67
+ # 1. Check inputs
68
+ self.check_inputs(
69
+ prompt,
70
+ prompt_2,
71
+ height,
72
+ width,
73
+ prompt_embeds=prompt_embeds,
74
+ pooled_prompt_embeds=pooled_prompt_embeds,
75
+ max_sequence_length=max_sequence_length,
76
+ )
77
+
78
+ self._guidance_scale = guidance_scale
79
+ self._joint_attention_kwargs = joint_attention_kwargs
80
+ self._interrupt = False
81
+
82
+ # 2. Define call parameters
83
+ batch_size = 1 if isinstance(prompt, str) else len(prompt)
84
+ device = self._execution_device
85
+
86
+ # 3. Encode prompt
87
+ lora_scale = joint_attention_kwargs.get("scale", None) if joint_attention_kwargs is not None else None
88
+ prompt_embeds, pooled_prompt_embeds, text_ids = self.encode_prompt(
89
+ prompt=prompt,
90
+ prompt_2=prompt_2,
91
+ prompt_embeds=prompt_embeds,
92
+ pooled_prompt_embeds=pooled_prompt_embeds,
93
+ device=device,
94
+ num_images_per_prompt=num_images_per_prompt,
95
+ max_sequence_length=max_sequence_length,
96
+ lora_scale=lora_scale,
97
+ )
98
+ # 4. Prepare latent variables
99
+ num_channels_latents = self.transformer.config.in_channels // 4
100
+ latents, latent_image_ids = self.prepare_latents(
101
+ batch_size * num_images_per_prompt,
102
+ num_channels_latents,
103
+ height,
104
+ width,
105
+ prompt_embeds.dtype,
106
+ device,
107
+ generator,
108
+ latents,
109
+ )
110
+ # 5. Prepare timesteps
111
+ sigmas = np.linspace(1.0, 1 / num_inference_steps, num_inference_steps)
112
+ image_seq_len = latents.shape[1]
113
+ mu = calculate_shift(
114
+ image_seq_len,
115
+ self.scheduler.config.base_image_seq_len,
116
+ self.scheduler.config.max_image_seq_len,
117
+ self.scheduler.config.base_shift,
118
+ self.scheduler.config.max_shift,
119
+ )
120
+ timesteps, num_inference_steps = retrieve_timesteps(
121
+ self.scheduler,
122
+ num_inference_steps,
123
+ device,
124
+ timesteps,
125
+ sigmas,
126
+ mu=mu,
127
+ )
128
+ self._num_timesteps = len(timesteps)
129
+
130
+ # Handle guidance
131
+ guidance = torch.full([1], guidance_scale, device=device, dtype=torch.float32).expand(latents.shape[0]) if self.transformer.config.guidance_embeds else None
132
+
133
+ # 6. Denoising loop
134
+ for i, t in enumerate(timesteps):
135
+ if self.interrupt:
136
+ continue
137
+
138
+ timestep = t.expand(latents.shape[0]).to(latents.dtype)
139
+
140
+ noise_pred = self.transformer(
141
+ hidden_states=latents,
142
+ timestep=timestep / 1000,
143
+ guidance=guidance,
144
+ pooled_projections=pooled_prompt_embeds,
145
+ encoder_hidden_states=prompt_embeds,
146
+ txt_ids=text_ids,
147
+ img_ids=latent_image_ids,
148
+ joint_attention_kwargs=self.joint_attention_kwargs,
149
+ return_dict=False,
150
+ )[0]
151
+ latents = self.scheduler.step(noise_pred, t, latents, return_dict=False)[0]
152
+
153
+ # Yield intermediate result
154
+ latents_for_image = self._unpack_latents(latents, height, width, self.vae_scale_factor)
155
+ latents_for_image = (latents_for_image / self.vae.config.scaling_factor) + self.vae.config.shift_factor
156
+ image = self.vae.decode(latents_for_image, return_dict=False)[0]
157
+ yield self.image_processor.postprocess(image, output_type=output_type)[0]
158
+ torch.cuda.empty_cache()
159
+
160
+ # Final image using good_vae
161
+ latents = self._unpack_latents(latents, height, width, self.vae_scale_factor)
162
+ latents = (latents / good_vae.config.scaling_factor) + good_vae.config.shift_factor
163
+ image = good_vae.decode(latents, return_dict=False)[0]
164
+ self.maybe_free_model_hooks()
165
+ torch.cuda.empty_cache()
166
+ yield self.image_processor.postprocess(image, output_type=output_type)[0]
loras.json ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "image": "https://cdn-uploads.huggingface.co/production/uploads/641498f7479c98a0b36f9e3e/2hT_tW_DCcF60lNyCBE_8.png",
4
+ "title": "Abe Shinzo Flux",
5
+ "repo": "AbeShinzo0708/AbeShinzo_flux_lora_test",
6
+ "weights": "AbeShinzo.safetensors",
7
+ "trigger_word": ", Shinzo Abe"
8
+ },
9
+ {
10
+ "image": "https://huggingface.co/p1atdev/flux.1-schnell-pvc-style-lora/resolve/main/images/flux_lora_00221_.png",
11
+ "title": "FLUX.1 schnell PVC style",
12
+ "repo": "p1atdev/flux.1-schnell-pvc-style-lora",
13
+ "weights": "pvc-shnell-7250+7500.safetensors",
14
+ "trigger_word": ", pvc figure"
15
+ },
16
+ {
17
+ "image": "https://cdn-uploads.huggingface.co/production/uploads/64b24543eec33e27dc9a6eca/sCvp6zDbBTXBEHh3ZSav6.png",
18
+ "title": "Flux Pastel Anime",
19
+ "repo": "Raelina/Flux-Pastel-Anime",
20
+ "weights": "lora_pastel_anime_flux.safetensors",
21
+ "trigger_word": ""
22
+ },
23
+ {
24
+ "image": "https://huggingface.co/wavymulder/OverlordStyleFLUX/resolve/main/imgs/ComfyUI_00725_.png",
25
+ "title": "Overlord Style FLUX",
26
+ "repo": "wavymulder/OverlordStyleFLUX",
27
+ "weights": "ovld_style_overlord_wavymulder.safetensors",
28
+ "trigger_word": ", ovld style anime"
29
+ },
30
+ {
31
+ "image": "https://huggingface.co/multimodalart/flux-tarot-v1/resolve/main/images/e5f2761e5d474e6ba492d20dca0fa26f_e78f1524074b42b6ac49643ffad50ac6.png",
32
+ "title": "Tarot v1",
33
+ "repo": "multimodalart/flux-tarot-v1",
34
+ "trigger_word": "in the style of TOK a trtcrd, tarot style",
35
+ "aspect": "portrait"
36
+ },
37
+ {
38
+ "image": "https://huggingface.co/alvdansen/softpasty-flux-dev/resolve/main/images/ComfyUI_00814_%20(2).png",
39
+ "title": "SoftPasty",
40
+ "repo": "alvdansen/softpasty-flux-dev",
41
+ "trigger_word": "araminta_illus illustration style"
42
+ },
43
+ {
44
+ "image": "https://huggingface.co/AIWarper/RubberCore1920sCartoonStyle/resolve/main/images/Rub_00006_.png",
45
+ "title": "1920s cartoon",
46
+ "repo": "AIWarper/RubberCore1920sCartoonStyle",
47
+ "trigger_word": "RU883R style",
48
+ "trigger_position": "prepend"
49
+ },
50
+ {
51
+ "image": "https://huggingface.co/mgwr/Cine-Aesthetic/resolve/main/images/00030-1333633802.png",
52
+ "title": "Cine Aesthetic",
53
+ "repo": "mgwr/Cine-Aesthetic",
54
+ "trigger_word": "mgwr/cine",
55
+ "trigger_position": "prepend"
56
+ },
57
+ {
58
+ "image": "https://huggingface.co/Shakker-Labs/FLUX.1-dev-LoRA-blended-realistic-illustration/resolve/main/images/example3.png",
59
+ "title": "Blended Realistic Illustration",
60
+ "repo": "Shakker-Labs/FLUX.1-dev-LoRA-blended-realistic-illustration",
61
+ "trigger_word": "artistic style blends reality and illustration elements"
62
+ },
63
+ {
64
+ "image": "https://github.com/XLabs-AI/x-flux/blob/main/assets/readme/examples/picture-6-rev1.png?raw=true",
65
+ "title": "flux-Realism",
66
+ "repo": "XLabs-AI/flux-RealismLora",
67
+ "trigger_word": ""
68
+ },
69
+ {
70
+ "image": "https://huggingface.co/multimodalart/vintage-ads-flux/resolve/main/samples/j_XNU6Oe0mgttyvf9uPb3_dc244dd3d6c246b4aff8351444868d66.png",
71
+ "title": "Vintage Ads",
72
+ "repo":"multimodalart/vintage-ads-flux",
73
+ "trigger_word": "a vintage ad of",
74
+ "trigger_position": "prepend"
75
+ },
76
+ {
77
+ "image": "https://huggingface.co/nerijs/animation2k-flux/resolve/main/images/Q8-oVxNnXvZ9HNrgbNpGw_02762aaaba3b47859ee5fe9403a371e3.png",
78
+ "title": "animation2k",
79
+ "repo": "nerijs/animation2k-flux",
80
+ "trigger_word": ""
81
+ },
82
+ {
83
+ "image":"https://huggingface.co/alvdansen/softserve_anime/resolve/main/images/ComfyUI_00062_.png",
84
+ "title":"SoftServe Anime",
85
+ "repo": "alvdansen/softserve_anime",
86
+ "trigger_word": ""
87
+ },
88
+ {
89
+ "image": "https://huggingface.co/veryVANYA/ps1-style-flux/resolve/main/24439220.jpeg",
90
+ "title": "PS1 style",
91
+ "repo": "veryVANYA/ps1-style-flux",
92
+ "trigger_word": "ps1 game screenshot"
93
+ },
94
+ {
95
+ "image": "https://huggingface.co/alvdansen/flux-koda/resolve/main/images/ComfyUI_00566_%20(2).png",
96
+ "title": "flux koda",
97
+ "repo": "alvdansen/flux-koda",
98
+ "trigger_word": "flmft style"
99
+ },
100
+ {
101
+ "image": "https://huggingface.co/alvdansen/frosting_lane_flux/resolve/main/images/content%20-%202024-08-11T005936.346.jpeg",
102
+ "title": "Frosting Lane Flux",
103
+ "repo": "alvdansen/frosting_lane_flux",
104
+ "trigger_word": ""
105
+ },
106
+ {
107
+ "image": "https://pbs.twimg.com/media/GU7NsZPa8AA4Ddl?format=jpg&name=4096x4096",
108
+ "title": "Half Illustration",
109
+ "repo": "davisbro/half_illustration",
110
+ "trigger_word": "in the style of TOK"
111
+ },
112
+ {
113
+ "image":"https://pbs.twimg.com/media/GVRiSH7WgAAnI4P?format=jpg&name=medium",
114
+ "title":"wrong",
115
+ "repo": "fofr/flux-wrong",
116
+ "trigger_word": "WRNG"
117
+ },
118
+ {
119
+ "image":"https://huggingface.co/linoyts/yarn_art_Flux_LoRA/resolve/main/yarn_art_2.png",
120
+ "title":"Yarn Art",
121
+ "repo": "linoyts/yarn_art_Flux_LoRA",
122
+ "trigger_word": ", yarn art style"
123
+ },
124
+ {
125
+ "image": "https://huggingface.co/Norod78/Flux_1_Dev_LoRA_Paper-Cutout-Style/resolve/main/08a19840b6214b76b0607b2f9d5a7e28_63159b9d98124c008efb1d36446a615c.png",
126
+ "title": "Paper Cutout",
127
+ "repo": "Norod78/Flux_1_Dev_LoRA_Paper-Cutout-Style",
128
+ "trigger_word": ", Paper Cutout Style"
129
+ },
130
+ {
131
+ "image": "https://huggingface.co/SebastianBodza/flux_lora_aquarel_watercolor/resolve/main/images/ascend.webp",
132
+ "title": "Aquarell Watercolor",
133
+ "repo": "SebastianBodza/Flux_Aquarell_Watercolor_v2",
134
+ "trigger_word": "in a watercolor style, AQUACOLTOK. White background."
135
+ },
136
+ {
137
+ "image": "https://huggingface.co/dataautogpt3/FLUX-SyntheticAnime/resolve/main/assets/angel.png",
138
+ "title": "SyntheticAnime",
139
+ "repo": "dataautogpt3/FLUX-SyntheticAnime",
140
+ "trigger_word": "1980s anime screengrab, VHS quality"
141
+ },
142
+ {
143
+ "image": "https://github.com/XLabs-AI/x-flux/blob/main/assets/readme/examples/result_14.png?raw=true",
144
+ "title": "flux-anime",
145
+ "repo": "XLabs-AI/flux-lora-collection",
146
+ "weights": "anime_lora.safetensors",
147
+ "trigger_word": ", anime"
148
+ },
149
+ {
150
+ "image": "https://replicate.delivery/yhqm/QD8Ioy5NExqSCtBS8hG04XIRQZFaC9pxJemINT1bibyjZfSTA/out-0.webp",
151
+ "title": "80s Cyberpunk",
152
+ "repo": "fofr/flux-80s-cyberpunk",
153
+ "trigger_word": "style of 80s cyberpunk",
154
+ "trigger_position": "prepend"
155
+ },
156
+ {
157
+ "image": "https://huggingface.co/kudzueye/Boreal/resolve/main/images/ComfyUI_00845_.png",
158
+ "title": "Boreal",
159
+ "repo": "kudzueye/Boreal",
160
+ "weights": "boreal-flux-dev-lora-v04_1000_steps.safetensors",
161
+ "trigger_word": "phone photo"
162
+ },
163
+ {
164
+ "image": "https://github.com/XLabs-AI/x-flux/blob/main/assets/readme/examples/result_18.png?raw=true",
165
+ "title": "flux-disney",
166
+ "repo": "XLabs-AI/flux-lora-collection",
167
+ "weights": "disney_lora.safetensors",
168
+ "trigger_word": ", disney style"
169
+ },
170
+ {
171
+ "image": "https://github.com/XLabs-AI/x-flux/blob/main/assets/readme/examples/result_23.png?raw=true",
172
+ "title": "flux-art",
173
+ "repo": "XLabs-AI/flux-lora-collection",
174
+ "weights": "art_lora.safetensors",
175
+ "trigger_word": ", art"
176
+ },
177
+ {
178
+ "image": "https://huggingface.co/martintomov/retrofuturism-flux/resolve/main/images/2e40deba-858e-454f-ae1c-d1ba2adb6a65.jpeg",
179
+ "title": "Retrofuturism Flux",
180
+ "repo": "martintomov/retrofuturism-flux",
181
+ "trigger_word": ", retrofuturism"
182
+ }
183
+ ]
mod.py ADDED
@@ -0,0 +1,348 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import torch
3
+ import spaces
4
+
5
+ from pathlib import Path
6
+ import gc
7
+ import subprocess
8
+ from PIL import Image
9
+
10
+
11
+ subprocess.run('pip install flash-attn --no-build-isolation', env={'FLASH_ATTENTION_SKIP_CUDA_BUILD': "TRUE"}, shell=True)
12
+ subprocess.run('pip cache purge', shell=True)
13
+ device = "cuda" if torch.cuda.is_available() else "cpu"
14
+ torch.set_grad_enabled(False)
15
+
16
+
17
+ models = [
18
+ "camenduru/FLUX.1-dev-diffusers",
19
+ "black-forest-labs/FLUX.1-schnell",
20
+ "sayakpaul/FLUX.1-merged",
21
+ "John6666/flux-dev2pro-bf16-flux",
22
+ "John6666/flux1-dev-minus-v1-fp8-flux",
23
+ "John6666/hyper-flux1-dev-fp8-flux",
24
+ "John6666/blue-pencil-flux1-v001-fp8-flux",
25
+ "John6666/copycat-flux-test-fp8-v11-fp8-flux",
26
+ "John6666/flux-dev8-anime-nsfw-fp8-flux",
27
+ "John6666/nepotism-fuxdevschnell-v3aio-fp8-flux",
28
+ "John6666/niji-style-flux-devfp8-fp8-flux",
29
+ "John6666/niji56-style-v3-fp8-flux",
30
+ "John6666/lyh-dalle-anime-v12dalle-fp8-flux",
31
+ "John6666/glimmerkin-flux-cute-v10-fp8-flux",
32
+ "John6666/xe-anime-flux-03-fp8-flux",
33
+ "John6666/xe-figure-flux-01-fp8-flux",
34
+ "John6666/xe-pixel-flux-01-fp8-flux",
35
+ "John6666/fluxunchained-artfulnsfw-fut516xfp8e4m3fnv11-fp8-flux",
36
+ "John6666/fastflux-unchained-t5f16-fp8-flux",
37
+ "John6666/iniverse-mix-xl-sfwnsfw-fluxdfp16nsfwv11-fp8-flux",
38
+ "John6666/nsfw-master-flux-lora-merged-with-flux1-dev-fp16-v10-fp8-flux",
39
+ "John6666/the-araminta-flux1a1-fp8-flux",
40
+ "John6666/acorn-is-spinning-flux-v11-fp8-flux",
41
+ "John6666/real-horny-pro-fp8-flux",
42
+ "John6666/centerfold-flux-v20fp8e5m2-fp8-flux",
43
+ "John6666/jib-mix-flux-v208stephyper-fp8-flux",
44
+ "John6666/flux-asian-realistic-v10-fp8-flux",
45
+ "John6666/fluxasiandoll-v10-fp8-flux",
46
+ "John6666/xe-asian-flux-01-fp8-flux",
47
+ "John6666/fluxescore-dev-v10fp16-fp8-flux",
48
+ # "",
49
+ ]
50
+
51
+
52
+ num_loras = 3
53
+ num_cns = 2
54
+ control_images = [None] * num_cns
55
+ control_modes = [-1] * num_cns
56
+ control_scales = [0] * num_cns
57
+
58
+
59
+ def is_repo_name(s):
60
+ import re
61
+ return re.fullmatch(r'^[^/,\s\"\']+/[^/,\s\"\']+$', s)
62
+
63
+
64
+ def is_repo_exists(repo_id):
65
+ from huggingface_hub import HfApi
66
+ api = HfApi()
67
+ try:
68
+ if api.repo_exists(repo_id=repo_id): return True
69
+ else: return False
70
+ except Exception as e:
71
+ print(f"Error: Failed to connect {repo_id}. ")
72
+ print(e)
73
+ return True # for safe
74
+
75
+
76
+ def clear_cache():
77
+ torch.cuda.empty_cache()
78
+ gc.collect()
79
+
80
+
81
+ def deselect_lora():
82
+ selected_index = None
83
+ new_placeholder = "Type a prompt"
84
+ updated_text = ""
85
+ width = 1024
86
+ height = 1024
87
+ return (
88
+ gr.update(placeholder=new_placeholder),
89
+ updated_text,
90
+ selected_index,
91
+ width,
92
+ height,
93
+ )
94
+
95
+
96
+ def get_repo_safetensors(repo_id: str):
97
+ from huggingface_hub import HfApi
98
+ api = HfApi()
99
+ try:
100
+ if not is_repo_name(repo_id) or not is_repo_exists(repo_id): return gr.update(value="", choices=[])
101
+ files = api.list_repo_files(repo_id=repo_id)
102
+ except Exception as e:
103
+ print(f"Error: Failed to get {repo_id}'s info.")
104
+ print(e)
105
+ return gr.update(choices=[])
106
+ files = [f for f in files if f.endswith(".safetensors")]
107
+ if len(files) == 0: return gr.update(value="", choices=[])
108
+ else: return gr.update(value=files[0], choices=files)
109
+
110
+
111
+ def expand2square(pil_img: Image.Image, background_color: tuple=(0, 0, 0)):
112
+ width, height = pil_img.size
113
+ if width == height:
114
+ return pil_img
115
+ elif width > height:
116
+ result = Image.new(pil_img.mode, (width, width), background_color)
117
+ result.paste(pil_img, (0, (width - height) // 2))
118
+ return result
119
+ else:
120
+ result = Image.new(pil_img.mode, (height, height), background_color)
121
+ result.paste(pil_img, ((height - width) // 2, 0))
122
+ return result
123
+
124
+
125
+ # https://huggingface.co/spaces/DamarJati/FLUX.1-DEV-Canny/blob/main/app.py
126
+ def resize_image(image, target_width, target_height, crop=True):
127
+ from image_datasets.canny_dataset import c_crop
128
+ if crop:
129
+ image = c_crop(image) # Crop the image to square
130
+ original_width, original_height = image.size
131
+
132
+ # Resize to match the target size without stretching
133
+ scale = max(target_width / original_width, target_height / original_height)
134
+ resized_width = int(scale * original_width)
135
+ resized_height = int(scale * original_height)
136
+
137
+ image = image.resize((resized_width, resized_height), Image.LANCZOS)
138
+
139
+ # Center crop to match the target dimensions
140
+ left = (resized_width - target_width) // 2
141
+ top = (resized_height - target_height) // 2
142
+ image = image.crop((left, top, left + target_width, top + target_height))
143
+ else:
144
+ image = image.resize((target_width, target_height), Image.LANCZOS)
145
+
146
+ return image
147
+
148
+
149
+ # https://huggingface.co/spaces/jiuface/FLUX.1-dev-Controlnet-Union/blob/main/app.py
150
+ # https://huggingface.co/InstantX/FLUX.1-dev-Controlnet-Union
151
+ controlnet_union_modes = {
152
+ "None": -1,
153
+ #"scribble_hed": 0,
154
+ "canny": 0, # supported
155
+ "mlsd": 0, #supported
156
+ "tile": 1, #supported
157
+ "depth_midas": 2, # supported
158
+ "blur": 3, # supported
159
+ "openpose": 4, # supported
160
+ "gray": 5, # supported
161
+ "low_quality": 6, # supported
162
+ }
163
+
164
+
165
+ # https://github.com/pytorch/pytorch/issues/123834
166
+ def get_control_params():
167
+ from diffusers.utils import load_image
168
+ modes = []
169
+ images = []
170
+ scales = []
171
+ for i, mode in enumerate(control_modes):
172
+ if mode == -1 or control_images[i] is None: continue
173
+ modes.append(control_modes[i])
174
+ images.append(load_image(control_images[i]))
175
+ scales.append(control_scales[i])
176
+ return modes, images, scales
177
+
178
+
179
+ from preprocessor import Preprocessor
180
+ def preprocess_image(image: Image.Image, control_mode: str, height: int, width: int,
181
+ preprocess_resolution: int):
182
+ if control_mode == "None": return image
183
+ image_resolution = max(width, height)
184
+ image_before = resize_image(expand2square(image.convert("RGB")), image_resolution, image_resolution, False)
185
+ # generated control_
186
+ print("start to generate control image")
187
+ preprocessor = Preprocessor()
188
+ if control_mode == "depth_midas":
189
+ preprocessor.load("Midas")
190
+ control_image = preprocessor(
191
+ image=image_before,
192
+ image_resolution=image_resolution,
193
+ detect_resolution=preprocess_resolution,
194
+ )
195
+ if control_mode == "openpose":
196
+ preprocessor.load("Openpose")
197
+ control_image = preprocessor(
198
+ image=image_before,
199
+ hand_and_face=True,
200
+ image_resolution=image_resolution,
201
+ detect_resolution=preprocess_resolution,
202
+ )
203
+ if control_mode == "canny":
204
+ preprocessor.load("Canny")
205
+ control_image = preprocessor(
206
+ image=image_before,
207
+ image_resolution=image_resolution,
208
+ detect_resolution=preprocess_resolution,
209
+ )
210
+
211
+ if control_mode == "mlsd":
212
+ preprocessor.load("MLSD")
213
+ control_image = preprocessor(
214
+ image=image_before,
215
+ image_resolution=image_resolution,
216
+ detect_resolution=preprocess_resolution,
217
+ )
218
+
219
+ if control_mode == "scribble_hed":
220
+ preprocessor.load("HED")
221
+ control_image = preprocessor(
222
+ image=image_before,
223
+ image_resolution=image_resolution,
224
+ detect_resolution=preprocess_resolution,
225
+ )
226
+
227
+ if control_mode == "low_quality" or control_mode == "gray" or control_mode == "blur" or control_mode == "tile":
228
+ control_image = image_before
229
+ image_width = 768
230
+ image_height = 768
231
+ else:
232
+ # make sure control image size is same as resized_image
233
+ image_width, image_height = control_image.size
234
+
235
+ image_after = resize_image(control_image, width, height, False)
236
+ ref_width, ref_height = image.size
237
+ print(f"generate control image success: {ref_width}x{ref_height} => {image_width}x{image_height}")
238
+ return image_after
239
+
240
+
241
+ def get_control_union_mode():
242
+ return list(controlnet_union_modes.keys())
243
+
244
+
245
+ def set_control_union_mode(i: int, mode: str, scale: str):
246
+ global control_modes
247
+ global control_scales
248
+ control_modes[i] = controlnet_union_modes.get(mode, 0)
249
+ control_scales[i] = scale
250
+ if mode != "None": return True
251
+ else: return gr.update(visible=True)
252
+
253
+
254
+ def set_control_union_image(i: int, mode: str, image: Image.Image | None, height: int, width: int, preprocess_resolution: int):
255
+ global control_images
256
+ if image is None: return None
257
+ control_images[i] = preprocess_image(image, mode, height, width, preprocess_resolution)
258
+ return control_images[i]
259
+
260
+
261
+ def compose_lora_json(lorajson: list[dict], i: int, name: str, scale: float, filename: str, trigger: str):
262
+ lorajson[i]["name"] = str(name) if name != "None" else ""
263
+ lorajson[i]["scale"] = float(scale)
264
+ lorajson[i]["filename"] = str(filename)
265
+ lorajson[i]["trigger"] = str(trigger)
266
+ return lorajson
267
+
268
+
269
+ def is_valid_lora(lorajson: list[dict]):
270
+ valid = False
271
+ for d in lorajson:
272
+ if "name" in d.keys() and d["name"] and d["name"] != "None": valid = True
273
+ return valid
274
+
275
+
276
+ def get_trigger_word(lorajson: list[dict]):
277
+ trigger = ""
278
+ for d in lorajson:
279
+ if "name" in d.keys() and d["name"] and d["name"] != "None" and d["trigger"]:
280
+ trigger += ", " + d["trigger"]
281
+ return trigger
282
+
283
+
284
+ # https://huggingface.co/docs/diffusers/v0.23.1/en/api/loaders#diffusers.loaders.LoraLoaderMixin.fuse_lora
285
+ # https://github.com/huggingface/diffusers/issues/4919
286
+ def fuse_loras(pipe, lorajson: list[dict]):
287
+ if not lorajson or not isinstance(lorajson, list): return
288
+ a_list = []
289
+ w_list = []
290
+ for d in lorajson:
291
+ if not d or not isinstance(d, dict) or not d["name"] or d["name"] == "None": continue
292
+ k = d["name"]
293
+ if is_repo_name(k) and is_repo_exists(k):
294
+ a_name = Path(k).stem
295
+ pipe.load_lora_weights(k, weight_name=d["filename"], adapter_name = a_name)
296
+ elif not Path(k).exists():
297
+ print(f"LoRA not found: {k}")
298
+ continue
299
+ else:
300
+ w_name = Path(k).name
301
+ a_name = Path(k).stem
302
+ pipe.load_lora_weights(k, weight_name = w_name, adapter_name = a_name)
303
+ a_list.append(a_name)
304
+ w_list.append(d["scale"])
305
+ if not a_list: return
306
+ pipe.set_adapters(a_list, adapter_weights=w_list)
307
+ pipe.fuse_lora(adapter_names=a_list, lora_scale=1.0)
308
+ #pipe.unload_lora_weights()
309
+
310
+
311
+ def description_ui():
312
+ gr.Markdown(
313
+ """
314
+ - Mod of [multimodalart/flux-lora-the-explorer](https://huggingface.co/spaces/multimodalart/flux-lora-the-explorer),
315
+ [jiuface/FLUX.1-dev-Controlnet-Union](https://huggingface.co/spaces/jiuface/FLUX.1-dev-Controlnet-Union),
316
+ [DamarJati/FLUX.1-DEV-Canny](https://huggingface.co/spaces/DamarJati/FLUX.1-DEV-Canny),
317
+ [gokaygokay/FLUX-Prompt-Generator](https://huggingface.co/spaces/gokaygokay/FLUX-Prompt-Generator).
318
+ """
319
+ )
320
+
321
+
322
+ from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM
323
+ def load_prompt_enhancer():
324
+ try:
325
+ model_checkpoint = "gokaygokay/Flux-Prompt-Enhance"
326
+ tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)
327
+ model = AutoModelForSeq2SeqLM.from_pretrained(model_checkpoint).eval().to(device=device)
328
+ enhancer_flux = pipeline('text2text-generation', model=model, tokenizer=tokenizer, repetition_penalty=1.5, device=device)
329
+ except Exception as e:
330
+ print(e)
331
+ enhancer_flux = None
332
+ return enhancer_flux
333
+
334
+
335
+ enhancer_flux = load_prompt_enhancer()
336
+
337
+
338
+ @spaces.GPU(duration=30)
339
+ def enhance_prompt(input_prompt):
340
+ result = enhancer_flux("enhance prompt: " + input_prompt, max_length = 256)
341
+ enhanced_text = result[0]['generated_text']
342
+ return enhanced_text
343
+
344
+
345
+ load_prompt_enhancer.zerogpu = True
346
+ fuse_loras.zerogpu = True
347
+ preprocess_image.zerogpu = True
348
+ get_control_params.zerogpu = True
modutils.py ADDED
@@ -0,0 +1,1228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import spaces
2
+ import json
3
+ import gradio as gr
4
+ from huggingface_hub import HfApi
5
+ import os
6
+ from pathlib import Path
7
+
8
+
9
+ from env import (HF_LORA_PRIVATE_REPOS1, HF_LORA_PRIVATE_REPOS2,
10
+ HF_MODEL_USER_EX, HF_MODEL_USER_LIKES,
11
+ directory_loras, hf_read_token, hf_token, CIVITAI_API_KEY)
12
+
13
+
14
+ def get_user_agent():
15
+ return 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0'
16
+
17
+
18
+ def to_list(s):
19
+ return [x.strip() for x in s.split(",") if not s == ""]
20
+
21
+
22
+ def list_uniq(l):
23
+ return sorted(set(l), key=l.index)
24
+
25
+
26
+ def list_sub(a, b):
27
+ return [e for e in a if e not in b]
28
+
29
+
30
+ def get_local_model_list(dir_path):
31
+ model_list = []
32
+ valid_extensions = ('.ckpt', '.pt', '.pth', '.safetensors', '.bin')
33
+ for file in Path(dir_path).glob("*"):
34
+ if file.suffix in valid_extensions:
35
+ file_path = str(Path(f"{dir_path}/{file.name}"))
36
+ model_list.append(file_path)
37
+ return model_list
38
+
39
+
40
+ def download_things(directory, url, hf_token="", civitai_api_key=""):
41
+ url = url.strip()
42
+
43
+ if "drive.google.com" in url:
44
+ original_dir = os.getcwd()
45
+ os.chdir(directory)
46
+ os.system(f"gdown --fuzzy {url}")
47
+ os.chdir(original_dir)
48
+ elif "huggingface.co" in url:
49
+ url = url.replace("?download=true", "")
50
+ # url = urllib.parse.quote(url, safe=':/') # fix encoding
51
+ if "/blob/" in url:
52
+ url = url.replace("/blob/", "/resolve/")
53
+ user_header = f'"Authorization: Bearer {hf_token}"'
54
+ if hf_token:
55
+ os.system(f"aria2c --console-log-level=error --summary-interval=10 --header={user_header} -c -x 16 -k 1M -s 16 {url} -d {directory} -o {url.split('/')[-1]}")
56
+ else:
57
+ os.system (f"aria2c --optimize-concurrent-downloads --console-log-level=error --summary-interval=10 -c -x 16 -k 1M -s 16 {url} -d {directory} -o {url.split('/')[-1]}")
58
+ elif "civitai.com" in url:
59
+ if "?" in url:
60
+ url = url.split("?")[0]
61
+ if civitai_api_key:
62
+ url = url + f"?token={civitai_api_key}"
63
+ os.system(f"aria2c --console-log-level=error --summary-interval=10 -c -x 16 -k 1M -s 16 -d {directory} {url}")
64
+ else:
65
+ print("\033[91mYou need an API key to download Civitai models.\033[0m")
66
+ else:
67
+ os.system(f"aria2c --console-log-level=error --summary-interval=10 -c -x 16 -k 1M -s 16 -d {directory} {url}")
68
+
69
+
70
+ def escape_lora_basename(basename: str):
71
+ return basename.replace(".", "_").replace(" ", "_").replace(",", "")
72
+
73
+
74
+ def to_lora_key(path: str):
75
+ return escape_lora_basename(Path(path).stem)
76
+
77
+
78
+ def to_lora_path(key: str):
79
+ if Path(key).is_file(): return key
80
+ path = Path(f"{directory_loras}/{escape_lora_basename(key)}.safetensors")
81
+ return str(path)
82
+
83
+
84
+ def safe_float(input):
85
+ output = 1.0
86
+ try:
87
+ output = float(input)
88
+ except Exception:
89
+ output = 1.0
90
+ return output
91
+
92
+
93
+ def save_gallery_images(images, progress=gr.Progress(track_tqdm=True)):
94
+ from datetime import datetime, timezone, timedelta
95
+ progress(0, desc="Updating gallery...")
96
+ dt_now = datetime.now(timezone(timedelta(hours=9)))
97
+ basename = dt_now.strftime('%Y%m%d_%H%M%S_')
98
+ i = 1
99
+ if not images: return images
100
+ output_images = []
101
+ output_paths = []
102
+ for image in images:
103
+ filename = basename + str(i) + ".png"
104
+ i += 1
105
+ oldpath = Path(image[0])
106
+ newpath = oldpath
107
+ try:
108
+ if oldpath.exists():
109
+ newpath = oldpath.resolve().rename(Path(filename).resolve())
110
+ except Exception as e:
111
+ print(e)
112
+ finally:
113
+ output_paths.append(str(newpath))
114
+ output_images.append((str(newpath), str(filename)))
115
+ progress(1, desc="Gallery updated.")
116
+ return gr.update(value=output_images), gr.update(value=output_paths), gr.update(visible=True)
117
+
118
+
119
+ def download_private_repo(repo_id, dir_path, is_replace):
120
+ from huggingface_hub import snapshot_download
121
+ if not hf_read_token: return
122
+ try:
123
+ snapshot_download(repo_id=repo_id, local_dir=dir_path, allow_patterns=['*.ckpt', '*.pt', '*.pth', '*.safetensors', '*.bin'], use_auth_token=hf_read_token)
124
+ except Exception as e:
125
+ print(f"Error: Failed to download {repo_id}.")
126
+ print(e)
127
+ return
128
+ if is_replace:
129
+ for file in Path(dir_path).glob("*"):
130
+ if file.exists() and "." in file.stem or " " in file.stem and file.suffix in ['.ckpt', '.pt', '.pth', '.safetensors', '.bin']:
131
+ newpath = Path(f'{file.parent.name}/{escape_lora_basename(file.stem)}{file.suffix}')
132
+ file.resolve().rename(newpath.resolve())
133
+
134
+
135
+ private_model_path_repo_dict = {} # {"local filepath": "huggingface repo_id", ...}
136
+
137
+
138
+ def get_private_model_list(repo_id, dir_path):
139
+ global private_model_path_repo_dict
140
+ api = HfApi()
141
+ if not hf_read_token: return []
142
+ try:
143
+ files = api.list_repo_files(repo_id, token=hf_read_token)
144
+ except Exception as e:
145
+ print(f"Error: Failed to list {repo_id}.")
146
+ print(e)
147
+ return []
148
+ model_list = []
149
+ for file in files:
150
+ path = Path(f"{dir_path}/{file}")
151
+ if path.suffix in ['.ckpt', '.pt', '.pth', '.safetensors', '.bin']:
152
+ model_list.append(str(path))
153
+ for model in model_list:
154
+ private_model_path_repo_dict[model] = repo_id
155
+ return model_list
156
+
157
+
158
+ def download_private_file(repo_id, path, is_replace):
159
+ from huggingface_hub import hf_hub_download
160
+ file = Path(path)
161
+ newpath = Path(f'{file.parent.name}/{escape_lora_basename(file.stem)}{file.suffix}') if is_replace else file
162
+ if not hf_read_token or newpath.exists(): return
163
+ filename = file.name
164
+ dirname = file.parent.name
165
+ try:
166
+ hf_hub_download(repo_id=repo_id, filename=filename, local_dir=dirname, use_auth_token=hf_read_token)
167
+ except Exception as e:
168
+ print(f"Error: Failed to download {filename}.")
169
+ print(e)
170
+ return
171
+ if is_replace:
172
+ file.resolve().rename(newpath.resolve())
173
+
174
+
175
+ def download_private_file_from_somewhere(path, is_replace):
176
+ if not path in private_model_path_repo_dict.keys(): return
177
+ repo_id = private_model_path_repo_dict.get(path, None)
178
+ download_private_file(repo_id, path, is_replace)
179
+
180
+
181
+ model_id_list = []
182
+ def get_model_id_list():
183
+ global model_id_list
184
+ if len(model_id_list) != 0: return model_id_list
185
+ api = HfApi()
186
+ model_ids = []
187
+ try:
188
+ models_likes = []
189
+ for author in HF_MODEL_USER_LIKES:
190
+ models_likes.extend(api.list_models(author=author, cardData=True, sort="likes"))
191
+ models_ex = []
192
+ for author in HF_MODEL_USER_EX:
193
+ models_ex = api.list_models(author=author, cardData=True, sort="last_modified")
194
+ except Exception as e:
195
+ print(f"Error: Failed to list {author}'s models.")
196
+ print(e)
197
+ return model_ids
198
+ for model in models_likes:
199
+ model_ids.append(model.id) if not model.private else ""
200
+ anime_models = []
201
+ real_models = []
202
+ for model in models_ex:
203
+ if not model.private:
204
+ anime_models.append(model.id) if 'anime' in model.tags else real_models.append(model.id)
205
+ model_ids.extend(anime_models)
206
+ model_ids.extend(real_models)
207
+ model_id_list = model_ids.copy()
208
+ return model_ids
209
+
210
+
211
+ model_id_list = get_model_id_list()
212
+
213
+
214
+ def get_t2i_model_info(repo_id: str):
215
+ api = HfApi()
216
+ try:
217
+ if " " in repo_id or not api.repo_exists(repo_id): return ""
218
+ model = api.model_info(repo_id=repo_id)
219
+ except Exception as e:
220
+ print(f"Error: Failed to get {repo_id}'s info.")
221
+ print(e)
222
+ return ""
223
+ if model.private or model.gated: return ""
224
+ tags = model.tags
225
+ info = []
226
+ url = f"https://huggingface.co/{repo_id}/"
227
+ if not 'diffusers' in tags: return ""
228
+ if 'diffusers:FluxPipeline' in tags: info.append("FLUX.1")
229
+ elif 'diffusers:StableDiffusionXLPipeline' in tags: info.append("SDXL")
230
+ elif 'diffusers:StableDiffusionPipeline' in tags: info.append("SD1.5")
231
+ if model.card_data and model.card_data.tags:
232
+ info.extend(list_sub(model.card_data.tags, ['text-to-image', 'stable-diffusion', 'stable-diffusion-api', 'safetensors', 'stable-diffusion-xl']))
233
+ info.append(f"DLs: {model.downloads}")
234
+ info.append(f"likes: {model.likes}")
235
+ info.append(model.last_modified.strftime("lastmod: %Y-%m-%d"))
236
+ md = f"Model Info: {', '.join(info)}, [Model Repo]({url})"
237
+ return gr.update(value=md)
238
+
239
+
240
+ def get_tupled_model_list(model_list):
241
+ if not model_list: return []
242
+ tupled_list = []
243
+ for repo_id in model_list:
244
+ api = HfApi()
245
+ try:
246
+ if not api.repo_exists(repo_id): continue
247
+ model = api.model_info(repo_id=repo_id)
248
+ except Exception as e:
249
+ print(e)
250
+ continue
251
+ if model.private or model.gated: continue
252
+ tags = model.tags
253
+ info = []
254
+ if not 'diffusers' in tags: continue
255
+ if 'diffusers:StableDiffusionXLPipeline' in tags:
256
+ info.append("SDXL")
257
+ elif 'diffusers:StableDiffusionPipeline' in tags:
258
+ info.append("SD1.5")
259
+ if model.card_data and model.card_data.tags:
260
+ info.extend(list_sub(model.card_data.tags, ['text-to-image', 'stable-diffusion', 'stable-diffusion-api', 'safetensors', 'stable-diffusion-xl']))
261
+ if "pony" in info:
262
+ info.remove("pony")
263
+ name = f"{repo_id} (Pony🐴, {', '.join(info)})"
264
+ else:
265
+ name = f"{repo_id} ({', '.join(info)})"
266
+ tupled_list.append((name, repo_id))
267
+ return tupled_list
268
+
269
+
270
+ private_lora_dict = {}
271
+ try:
272
+ with open('lora_dict.json', encoding='utf-8') as f:
273
+ d = json.load(f)
274
+ for k, v in d.items():
275
+ private_lora_dict[escape_lora_basename(k)] = v
276
+ except Exception as e:
277
+ print(e)
278
+ loras_dict = {"None": ["", "", "", "", ""], "": ["", "", "", "", ""]} | private_lora_dict.copy()
279
+ civitai_not_exists_list = []
280
+ loras_url_to_path_dict = {} # {"URL to download": "local filepath", ...}
281
+ civitai_lora_last_results = {} # {"URL to download": {search results}, ...}
282
+ all_lora_list = []
283
+
284
+
285
+ private_lora_model_list = []
286
+ def get_private_lora_model_lists():
287
+ global private_lora_model_list
288
+ if len(private_lora_model_list) != 0: return private_lora_model_list
289
+ models1 = []
290
+ models2 = []
291
+ for repo in HF_LORA_PRIVATE_REPOS1:
292
+ models1.extend(get_private_model_list(repo, directory_loras))
293
+ for repo in HF_LORA_PRIVATE_REPOS2:
294
+ models2.extend(get_private_model_list(repo, directory_loras))
295
+ models = list_uniq(models1 + sorted(models2))
296
+ private_lora_model_list = models.copy()
297
+ return models
298
+
299
+
300
+ private_lora_model_list = get_private_lora_model_lists()
301
+
302
+
303
+ def get_civitai_info(path):
304
+ global civitai_not_exists_list
305
+ import requests
306
+ from urllib3.util import Retry
307
+ from requests.adapters import HTTPAdapter
308
+ if path in set(civitai_not_exists_list): return ["", "", "", "", ""]
309
+ if not Path(path).exists(): return None
310
+ user_agent = get_user_agent()
311
+ headers = {'User-Agent': user_agent, 'content-type': 'application/json'}
312
+ base_url = 'https://civitai.com/api/v1/model-versions/by-hash/'
313
+ params = {}
314
+ session = requests.Session()
315
+ retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
316
+ session.mount("https://", HTTPAdapter(max_retries=retries))
317
+ import hashlib
318
+ with open(path, 'rb') as file:
319
+ file_data = file.read()
320
+ hash_sha256 = hashlib.sha256(file_data).hexdigest()
321
+ url = base_url + hash_sha256
322
+ try:
323
+ r = session.get(url, params=params, headers=headers, stream=True, timeout=(3.0, 15))
324
+ except Exception as e:
325
+ print(e)
326
+ return ["", "", "", "", ""]
327
+ if not r.ok: return None
328
+ json = r.json()
329
+ if not 'baseModel' in json:
330
+ civitai_not_exists_list.append(path)
331
+ return ["", "", "", "", ""]
332
+ items = []
333
+ items.append(" / ".join(json['trainedWords']))
334
+ items.append(json['baseModel'])
335
+ items.append(json['model']['name'])
336
+ items.append(f"https://civitai.com/models/{json['modelId']}")
337
+ items.append(json['images'][0]['url'])
338
+ return items
339
+
340
+
341
+ def get_lora_model_list():
342
+ loras = list_uniq(get_private_lora_model_lists() + get_local_model_list(directory_loras))
343
+ loras.insert(0, "None")
344
+ loras.insert(0, "")
345
+ return loras
346
+
347
+
348
+ def get_all_lora_list():
349
+ global all_lora_list
350
+ loras = get_lora_model_list()
351
+ all_lora_list = loras.copy()
352
+ return loras
353
+
354
+
355
+ def get_all_lora_tupled_list():
356
+ global loras_dict
357
+ models = get_all_lora_list()
358
+ if not models: return []
359
+ tupled_list = []
360
+ for model in models:
361
+ #if not model: continue # to avoid GUI-related bug
362
+ basename = Path(model).stem
363
+ key = to_lora_key(model)
364
+ items = None
365
+ if key in loras_dict.keys():
366
+ items = loras_dict.get(key, None)
367
+ else:
368
+ items = get_civitai_info(model)
369
+ if items != None:
370
+ loras_dict[key] = items
371
+ name = basename
372
+ value = model
373
+ if items and items[2] != "":
374
+ if items[1] == "Pony":
375
+ name = f"{basename} (for {items[1]}🐴, {items[2]})"
376
+ else:
377
+ name = f"{basename} (for {items[1]}, {items[2]})"
378
+ tupled_list.append((name, value))
379
+ return tupled_list
380
+
381
+
382
+ def update_lora_dict(path):
383
+ global loras_dict
384
+ key = escape_lora_basename(Path(path).stem)
385
+ if key in loras_dict.keys(): return
386
+ items = get_civitai_info(path)
387
+ if items == None: return
388
+ loras_dict[key] = items
389
+
390
+
391
+ def download_lora(dl_urls: str):
392
+ global loras_url_to_path_dict
393
+ dl_path = ""
394
+ before = get_local_model_list(directory_loras)
395
+ urls = []
396
+ for url in [url.strip() for url in dl_urls.split(',')]:
397
+ local_path = f"{directory_loras}/{url.split('/')[-1]}"
398
+ if not Path(local_path).exists():
399
+ download_things(directory_loras, url, hf_token, CIVITAI_API_KEY)
400
+ urls.append(url)
401
+ after = get_local_model_list(directory_loras)
402
+ new_files = list_sub(after, before)
403
+ i = 0
404
+ for file in new_files:
405
+ path = Path(file)
406
+ if path.exists():
407
+ new_path = Path(f'{path.parent.name}/{escape_lora_basename(path.stem)}{path.suffix}')
408
+ path.resolve().rename(new_path.resolve())
409
+ loras_url_to_path_dict[urls[i]] = str(new_path)
410
+ update_lora_dict(str(new_path))
411
+ dl_path = str(new_path)
412
+ i += 1
413
+ return dl_path
414
+
415
+
416
+ def copy_lora(path: str, new_path: str):
417
+ import shutil
418
+ if path == new_path: return new_path
419
+ cpath = Path(path)
420
+ npath = Path(new_path)
421
+ if cpath.exists():
422
+ try:
423
+ shutil.copy(str(cpath.resolve()), str(npath.resolve()))
424
+ except Exception as e:
425
+ print(e)
426
+ return None
427
+ update_lora_dict(str(npath))
428
+ return new_path
429
+ else:
430
+ return None
431
+
432
+
433
+ def download_my_lora(dl_urls: str, lora1: str, lora2: str, lora3: str, lora4: str, lora5: str):
434
+ path = download_lora(dl_urls)
435
+ if path:
436
+ if not lora1 or lora1 == "None":
437
+ lora1 = path
438
+ elif not lora2 or lora2 == "None":
439
+ lora2 = path
440
+ elif not lora3 or lora3 == "None":
441
+ lora3 = path
442
+ elif not lora4 or lora4 == "None":
443
+ lora4 = path
444
+ elif not lora5 or lora5 == "None":
445
+ lora5 = path
446
+ choices = get_all_lora_tupled_list()
447
+ return gr.update(value=lora1, choices=choices), gr.update(value=lora2, choices=choices), gr.update(value=lora3, choices=choices),\
448
+ gr.update(value=lora4, choices=choices), gr.update(value=lora5, choices=choices)
449
+
450
+
451
+ def get_valid_lora_name(query: str):
452
+ path = "None"
453
+ if not query or query == "None": return "None"
454
+ if to_lora_key(query) in loras_dict.keys(): return query
455
+ if query in loras_url_to_path_dict.keys():
456
+ path = loras_url_to_path_dict[query]
457
+ else:
458
+ path = to_lora_path(query.strip().split('/')[-1])
459
+ if Path(path).exists():
460
+ return path
461
+ elif "http" in query:
462
+ dl_file = download_lora(query)
463
+ if dl_file and Path(dl_file).exists(): return dl_file
464
+ else:
465
+ dl_file = find_similar_lora(query)
466
+ if dl_file and Path(dl_file).exists(): return dl_file
467
+ return "None"
468
+
469
+
470
+ def get_valid_lora_path(query: str):
471
+ path = None
472
+ if not query or query == "None": return None
473
+ if to_lora_key(query) in loras_dict.keys(): return query
474
+ if Path(path).exists():
475
+ return path
476
+ else:
477
+ return None
478
+
479
+
480
+ def get_valid_lora_wt(prompt: str, lora_path: str, lora_wt: float):
481
+ import re
482
+ wt = lora_wt
483
+ result = re.findall(f'<lora:{to_lora_key(lora_path)}:(.+?)>', prompt)
484
+ if not result: return wt
485
+ wt = safe_float(result[0][0])
486
+ return wt
487
+
488
+
489
+ def set_prompt_loras(prompt, prompt_syntax, lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt):
490
+ import re
491
+ if not "Classic" in str(prompt_syntax): return lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt
492
+ lora1 = get_valid_lora_name(lora1)
493
+ lora2 = get_valid_lora_name(lora2)
494
+ lora3 = get_valid_lora_name(lora3)
495
+ lora4 = get_valid_lora_name(lora4)
496
+ lora5 = get_valid_lora_name(lora5)
497
+ if not "<lora" in prompt: return lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt
498
+ lora1_wt = get_valid_lora_wt(prompt, lora1, lora1_wt)
499
+ lora2_wt = get_valid_lora_wt(prompt, lora2, lora2_wt)
500
+ lora3_wt = get_valid_lora_wt(prompt, lora3, lora3_wt)
501
+ lora4_wt = get_valid_lora_wt(prompt, lora4, lora4_wt)
502
+ lora5_wt = get_valid_lora_wt(prompt, lora5, lora5_wt)
503
+ on1, label1, tag1, md1 = get_lora_info(lora1)
504
+ on2, label2, tag2, md2 = get_lora_info(lora2)
505
+ on3, label3, tag3, md3 = get_lora_info(lora3)
506
+ on4, label4, tag4, md4 = get_lora_info(lora4)
507
+ on5, label5, tag5, md5 = get_lora_info(lora5)
508
+ lora_paths = [lora1, lora2, lora3, lora4, lora5]
509
+ prompts = prompt.split(",") if prompt else []
510
+ for p in prompts:
511
+ p = str(p).strip()
512
+ if "<lora" in p:
513
+ result = re.findall(r'<lora:(.+?):(.+?)>', p)
514
+ if not result: continue
515
+ key = result[0][0]
516
+ wt = result[0][1]
517
+ path = to_lora_path(key)
518
+ if not key in loras_dict.keys() or not path:
519
+ path = get_valid_lora_name(path)
520
+ if not path or path == "None": continue
521
+ if path in lora_paths:
522
+ continue
523
+ elif not on1:
524
+ lora1 = path
525
+ lora_paths = [lora1, lora2, lora3, lora4, lora5]
526
+ lora1_wt = safe_float(wt)
527
+ on1 = True
528
+ elif not on2:
529
+ lora2 = path
530
+ lora_paths = [lora1, lora2, lora3, lora4, lora5]
531
+ lora2_wt = safe_float(wt)
532
+ on2 = True
533
+ elif not on3:
534
+ lora3 = path
535
+ lora_paths = [lora1, lora2, lora3, lora4, lora5]
536
+ lora3_wt = safe_float(wt)
537
+ on3 = True
538
+ elif not on4:
539
+ lora4 = path
540
+ lora_paths = [lora1, lora2, lora3, lora4, lora5]
541
+ lora4_wt = safe_float(wt)
542
+ on4, label4, tag4, md4 = get_lora_info(lora4)
543
+ elif not on5:
544
+ lora5 = path
545
+ lora_paths = [lora1, lora2, lora3, lora4, lora5]
546
+ lora5_wt = safe_float(wt)
547
+ on5 = True
548
+ return lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt
549
+
550
+
551
+ def get_lora_info(lora_path: str):
552
+ is_valid = False
553
+ tag = ""
554
+ label = ""
555
+ md = "None"
556
+ if not lora_path or lora_path == "None":
557
+ print("LoRA file not found.")
558
+ return is_valid, label, tag, md
559
+ path = Path(lora_path)
560
+ new_path = Path(f'{path.parent.name}/{escape_lora_basename(path.stem)}{path.suffix}')
561
+ if not to_lora_key(str(new_path)) in loras_dict.keys() and str(path) not in set(get_all_lora_list()):
562
+ print("LoRA file is not registered.")
563
+ return tag, label, tag, md
564
+ if not new_path.exists():
565
+ download_private_file_from_somewhere(str(path), True)
566
+ basename = new_path.stem
567
+ label = f'Name: {basename}'
568
+ items = loras_dict.get(basename, None)
569
+ if items == None:
570
+ items = get_civitai_info(str(new_path))
571
+ if items != None:
572
+ loras_dict[basename] = items
573
+ if items and items[2] != "":
574
+ tag = items[0]
575
+ label = f'Name: {basename}'
576
+ if items[1] == "Pony":
577
+ label = f'Name: {basename} (for Pony🐴)'
578
+ if items[4]:
579
+ md = f'<img src="{items[4]}" alt="thumbnail" width="150" height="240"><br>[LoRA Model URL]({items[3]})'
580
+ elif items[3]:
581
+ md = f'[LoRA Model URL]({items[3]})'
582
+ is_valid = True
583
+ return is_valid, label, tag, md
584
+
585
+
586
+ def normalize_prompt_list(tags: list[str]):
587
+ prompts = []
588
+ for tag in tags:
589
+ tag = str(tag).strip()
590
+ if tag:
591
+ prompts.append(tag)
592
+ return prompts
593
+
594
+
595
+ def apply_lora_prompt(prompt: str = "", lora_info: str = ""):
596
+ if lora_info == "None": return gr.update(value=prompt)
597
+ tags = prompt.split(",") if prompt else []
598
+ prompts = normalize_prompt_list(tags)
599
+
600
+ lora_tag = lora_info.replace("/",",")
601
+ lora_tags = lora_tag.split(",") if str(lora_info) != "None" else []
602
+ lora_prompts = normalize_prompt_list(lora_tags)
603
+
604
+ empty = [""]
605
+ prompt = ", ".join(list_uniq(prompts + lora_prompts) + empty)
606
+ return gr.update(value=prompt)
607
+
608
+
609
+ def update_loras(prompt, prompt_syntax, lora1, lora1_wt, lora2, lora2_wt, lora3, lora3_wt, lora4, lora4_wt, lora5, lora5_wt):
610
+ import re
611
+ on1, label1, tag1, md1 = get_lora_info(lora1)
612
+ on2, label2, tag2, md2 = get_lora_info(lora2)
613
+ on3, label3, tag3, md3 = get_lora_info(lora3)
614
+ on4, label4, tag4, md4 = get_lora_info(lora4)
615
+ on5, label5, tag5, md5 = get_lora_info(lora5)
616
+ lora_paths = [lora1, lora2, lora3, lora4, lora5]
617
+
618
+ output_prompt = prompt
619
+ if "Classic" in str(prompt_syntax):
620
+ prompts = prompt.split(",") if prompt else []
621
+ output_prompts = []
622
+ for p in prompts:
623
+ p = str(p).strip()
624
+ if "<lora" in p:
625
+ result = re.findall(r'<lora:(.+?):(.+?)>', p)
626
+ if not result: continue
627
+ key = result[0][0]
628
+ wt = result[0][1]
629
+ path = to_lora_path(key)
630
+ if not key in loras_dict.keys() or not path: continue
631
+ if path in lora_paths:
632
+ output_prompts.append(f"<lora:{to_lora_key(path)}:{safe_float(wt):.2f}>")
633
+ elif p:
634
+ output_prompts.append(p)
635
+ lora_prompts = []
636
+ if on1: lora_prompts.append(f"<lora:{to_lora_key(lora1)}:{lora1_wt:.2f}>")
637
+ if on2: lora_prompts.append(f"<lora:{to_lora_key(lora2)}:{lora2_wt:.2f}>")
638
+ if on3: lora_prompts.append(f"<lora:{to_lora_key(lora3)}:{lora3_wt:.2f}>")
639
+ if on4: lora_prompts.append(f"<lora:{to_lora_key(lora4)}:{lora4_wt:.2f}>")
640
+ if on5: lora_prompts.append(f"<lora:{to_lora_key(lora5)}:{lora5_wt:.2f}>")
641
+ output_prompt = ", ".join(list_uniq(output_prompts + lora_prompts + [""]))
642
+ choices = get_all_lora_tupled_list()
643
+
644
+ return gr.update(value=output_prompt), gr.update(value=lora1, choices=choices), gr.update(value=lora1_wt),\
645
+ gr.update(value=tag1, label=label1, visible=on1), gr.update(visible=on1), gr.update(value=md1, visible=on1),\
646
+ gr.update(value=lora2, choices=choices), gr.update(value=lora2_wt),\
647
+ gr.update(value=tag2, label=label2, visible=on2), gr.update(visible=on2), gr.update(value=md2, visible=on2),\
648
+ gr.update(value=lora3, choices=choices), gr.update(value=lora3_wt),\
649
+ gr.update(value=tag3, label=label3, visible=on3), gr.update(visible=on3), gr.update(value=md3, visible=on3),\
650
+ gr.update(value=lora4, choices=choices), gr.update(value=lora4_wt),\
651
+ gr.update(value=tag4, label=label4, visible=on4), gr.update(visible=on4), gr.update(value=md4, visible=on4),\
652
+ gr.update(value=lora5, choices=choices), gr.update(value=lora5_wt),\
653
+ gr.update(value=tag5, label=label5, visible=on5), gr.update(visible=on5), gr.update(value=md5, visible=on5)
654
+
655
+
656
+ def get_my_lora(link_url):
657
+ from pathlib import Path
658
+ before = get_local_model_list(directory_loras)
659
+ for url in [url.strip() for url in link_url.split(',')]:
660
+ if not Path(f"{directory_loras}/{url.split('/')[-1]}").exists():
661
+ download_things(directory_loras, url, hf_token, CIVITAI_API_KEY)
662
+ after = get_local_model_list(directory_loras)
663
+ new_files = list_sub(after, before)
664
+ for file in new_files:
665
+ path = Path(file)
666
+ if path.exists():
667
+ new_path = Path(f'{path.parent.name}/{escape_lora_basename(path.stem)}{path.suffix}')
668
+ path.resolve().rename(new_path.resolve())
669
+ update_lora_dict(str(new_path))
670
+ new_lora_model_list = get_lora_model_list()
671
+ new_lora_tupled_list = get_all_lora_tupled_list()
672
+
673
+ return gr.update(
674
+ choices=new_lora_tupled_list, value=new_lora_model_list[-1]
675
+ ), gr.update(
676
+ choices=new_lora_tupled_list
677
+ ), gr.update(
678
+ choices=new_lora_tupled_list
679
+ ), gr.update(
680
+ choices=new_lora_tupled_list
681
+ ), gr.update(
682
+ choices=new_lora_tupled_list
683
+ )
684
+
685
+
686
+ def upload_file_lora(files, progress=gr.Progress(track_tqdm=True)):
687
+ progress(0, desc="Uploading...")
688
+ file_paths = [file.name for file in files]
689
+ progress(1, desc="Uploaded.")
690
+ return gr.update(value=file_paths, visible=True), gr.update(visible=True)
691
+
692
+
693
+ def move_file_lora(filepaths):
694
+ import shutil
695
+ for file in filepaths:
696
+ path = Path(shutil.move(Path(file).resolve(), Path(f"./{directory_loras}").resolve()))
697
+ newpath = Path(f'{path.parent.name}/{escape_lora_basename(path.stem)}{path.suffix}')
698
+ path.resolve().rename(newpath.resolve())
699
+ update_lora_dict(str(newpath))
700
+
701
+ new_lora_model_list = get_lora_model_list()
702
+ new_lora_tupled_list = get_all_lora_tupled_list()
703
+
704
+ return gr.update(
705
+ choices=new_lora_tupled_list, value=new_lora_model_list[-1]
706
+ ), gr.update(
707
+ choices=new_lora_tupled_list
708
+ ), gr.update(
709
+ choices=new_lora_tupled_list
710
+ ), gr.update(
711
+ choices=new_lora_tupled_list
712
+ ), gr.update(
713
+ choices=new_lora_tupled_list
714
+ )
715
+
716
+
717
+ def get_civitai_info(path):
718
+ global civitai_not_exists_list
719
+ global loras_url_to_path_dict
720
+ import requests
721
+ from requests.adapters import HTTPAdapter
722
+ from urllib3.util import Retry
723
+ default = ["", "", "", "", ""]
724
+ if path in set(civitai_not_exists_list): return default
725
+ if not Path(path).exists(): return None
726
+ user_agent = get_user_agent()
727
+ headers = {'User-Agent': user_agent, 'content-type': 'application/json'}
728
+ base_url = 'https://civitai.com/api/v1/model-versions/by-hash/'
729
+ params = {}
730
+ session = requests.Session()
731
+ retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
732
+ session.mount("https://", HTTPAdapter(max_retries=retries))
733
+ import hashlib
734
+ with open(path, 'rb') as file:
735
+ file_data = file.read()
736
+ hash_sha256 = hashlib.sha256(file_data).hexdigest()
737
+ url = base_url + hash_sha256
738
+ try:
739
+ r = session.get(url, params=params, headers=headers, stream=True, timeout=(3.0, 15))
740
+ except Exception as e:
741
+ print(e)
742
+ return default
743
+ else:
744
+ if not r.ok: return None
745
+ json = r.json()
746
+ if 'baseModel' not in json:
747
+ civitai_not_exists_list.append(path)
748
+ return default
749
+ items = []
750
+ items.append(" / ".join(json['trainedWords'])) # The words (prompts) used to trigger the model
751
+ items.append(json['baseModel']) # Base model (SDXL1.0, Pony, ...)
752
+ items.append(json['model']['name']) # The name of the model version
753
+ items.append(f"https://civitai.com/models/{json['modelId']}") # The repo url for the model
754
+ items.append(json['images'][0]['url']) # The url for a sample image
755
+ loras_url_to_path_dict[path] = json['downloadUrl'] # The download url to get the model file for this specific version
756
+ return items
757
+
758
+
759
+ def search_lora_on_civitai(query: str, allow_model: list[str] = ["Pony", "SDXL 1.0"], limit: int = 100):
760
+ import requests
761
+ from requests.adapters import HTTPAdapter
762
+ from urllib3.util import Retry
763
+ if not query: return None
764
+ user_agent = get_user_agent()
765
+ headers = {'User-Agent': user_agent, 'content-type': 'application/json'}
766
+ base_url = 'https://civitai.com/api/v1/models'
767
+ params = {'query': query, 'types': ['LORA'], 'sort': 'Highest Rated', 'period': 'AllTime',
768
+ 'nsfw': 'true', 'supportsGeneration ': 'true', 'limit': limit}
769
+ session = requests.Session()
770
+ retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
771
+ session.mount("https://", HTTPAdapter(max_retries=retries))
772
+ try:
773
+ r = session.get(base_url, params=params, headers=headers, stream=True, timeout=(3.0, 30))
774
+ except Exception as e:
775
+ print(e)
776
+ return None
777
+ else:
778
+ if not r.ok: return None
779
+ json = r.json()
780
+ if 'items' not in json: return None
781
+ items = []
782
+ for j in json['items']:
783
+ for model in j['modelVersions']:
784
+ item = {}
785
+ if model['baseModel'] not in set(allow_model): continue
786
+ item['name'] = j['name']
787
+ item['creator'] = j['creator']['username']
788
+ item['tags'] = j['tags']
789
+ item['model_name'] = model['name']
790
+ item['base_model'] = model['baseModel']
791
+ item['dl_url'] = model['downloadUrl']
792
+ item['md'] = f'<img src="{model["images"][0]["url"]}" alt="thumbnail" width="150" height="240"><br>[LoRA Model URL](https://civitai.com/models/{j["id"]})'
793
+ items.append(item)
794
+ return items
795
+
796
+
797
+ def search_civitai_lora(query, base_model):
798
+ global civitai_lora_last_results
799
+ items = search_lora_on_civitai(query, base_model)
800
+ if not items: return gr.update(choices=[("", "")], value="", visible=False),\
801
+ gr.update(value="", visible=False), gr.update(visible=True), gr.update(visible=True)
802
+ civitai_lora_last_results = {}
803
+ choices = []
804
+ for item in items:
805
+ base_model_name = "Pony🐴" if item['base_model'] == "Pony" else item['base_model']
806
+ name = f"{item['name']} (for {base_model_name} / By: {item['creator']} / Tags: {', '.join(item['tags'])})"
807
+ value = item['dl_url']
808
+ choices.append((name, value))
809
+ civitai_lora_last_results[value] = item
810
+ if not choices: return gr.update(choices=[("", "")], value="", visible=False),\
811
+ gr.update(value="", visible=False), gr.update(visible=True), gr.update(visible=True)
812
+ result = civitai_lora_last_results.get(choices[0][1], "None")
813
+ md = result['md'] if result else ""
814
+ return gr.update(choices=choices, value=choices[0][1], visible=True), gr.update(value=md, visible=True),\
815
+ gr.update(visible=True), gr.update(visible=True)
816
+
817
+
818
+ def select_civitai_lora(search_result):
819
+ if not "http" in search_result: return gr.update(value=""), gr.update(value="None", visible=True)
820
+ result = civitai_lora_last_results.get(search_result, "None")
821
+ md = result['md'] if result else ""
822
+ return gr.update(value=search_result), gr.update(value=md, visible=True)
823
+
824
+
825
+ def find_similar_lora(q: str):
826
+ from rapidfuzz.process import extractOne
827
+ from rapidfuzz.utils import default_process
828
+ query = to_lora_key(q)
829
+ print(f"Finding <lora:{query}:...>...")
830
+ keys = list(private_lora_dict.keys())
831
+ values = [x[2] for x in list(private_lora_dict.values())]
832
+ s = default_process(query)
833
+ e1 = extractOne(s, keys + values, processor=default_process, score_cutoff=80.0)
834
+ key = ""
835
+ if e1:
836
+ e = e1[0]
837
+ if e in set(keys): key = e
838
+ elif e in set(values): key = keys[values.index(e)]
839
+ if key:
840
+ path = to_lora_path(key)
841
+ new_path = to_lora_path(query)
842
+ if not Path(path).exists():
843
+ if not Path(new_path).exists(): download_private_file_from_somewhere(path, True)
844
+ if Path(path).exists() and copy_lora(path, new_path): return new_path
845
+ print(f"Finding <lora:{query}:...> on Civitai...")
846
+ civitai_query = Path(query).stem if Path(query).is_file() else query
847
+ civitai_query = civitai_query.replace("_", " ").replace("-", " ")
848
+ base_model = ["Pony", "SDXL 1.0"]
849
+ items = search_lora_on_civitai(civitai_query, base_model, 1)
850
+ if items:
851
+ item = items[0]
852
+ path = download_lora(item['dl_url'])
853
+ new_path = query if Path(query).is_file() else to_lora_path(query)
854
+ if path and copy_lora(path, new_path): return new_path
855
+ return None
856
+
857
+
858
+ def change_interface_mode(mode: str):
859
+ if mode == "Fast":
860
+ return gr.update(open=False), gr.update(visible=True), gr.update(open=False), gr.update(open=False),\
861
+ gr.update(visible=True), gr.update(open=False), gr.update(visible=True), gr.update(open=False),\
862
+ gr.update(visible=True), gr.update(value="Fast")
863
+ elif mode == "Simple": # t2i mode
864
+ return gr.update(open=True), gr.update(visible=True), gr.update(open=False), gr.update(open=False),\
865
+ gr.update(visible=True), gr.update(open=False), gr.update(visible=False), gr.update(open=True),\
866
+ gr.update(visible=False), gr.update(value="Standard")
867
+ elif mode == "LoRA": # t2i LoRA mode
868
+ return gr.update(open=True), gr.update(visible=True), gr.update(open=True), gr.update(open=False),\
869
+ gr.update(visible=True), gr.update(open=True), gr.update(visible=True), gr.update(open=False),\
870
+ gr.update(visible=False), gr.update(value="Standard")
871
+ else: # Standard
872
+ return gr.update(open=False), gr.update(visible=True), gr.update(open=False), gr.update(open=False),\
873
+ gr.update(visible=True), gr.update(open=False), gr.update(visible=True), gr.update(open=False),\
874
+ gr.update(visible=True), gr.update(value="Standard")
875
+
876
+
877
+ quality_prompt_list = [
878
+ {
879
+ "name": "None",
880
+ "prompt": "",
881
+ "negative_prompt": "lowres",
882
+ },
883
+ {
884
+ "name": "Animagine Common",
885
+ "prompt": "anime artwork, anime style, vibrant, studio anime, highly detailed, masterpiece, best quality, very aesthetic, absurdres",
886
+ "negative_prompt": "lowres, (bad), text, error, fewer, extra, missing, worst quality, jpeg artifacts, low quality, watermark, unfinished, displeasing, oldest, early, chromatic aberration, signature, extra digits, artistic error, username, scan, [abstract]",
887
+ },
888
+ {
889
+ "name": "Pony Anime Common",
890
+ "prompt": "source_anime, score_9, score_8_up, score_7_up, masterpiece, best quality, very aesthetic, absurdres",
891
+ "negative_prompt": "source_pony, source_furry, source_cartoon, score_6, score_5, score_4, busty, ugly face, mutated hands, low res, blurry face, black and white, the simpsons, overwatch, apex legends",
892
+ },
893
+ {
894
+ "name": "Pony Common",
895
+ "prompt": "source_anime, score_9, score_8_up, score_7_up",
896
+ "negative_prompt": "source_pony, source_furry, source_cartoon, score_6, score_5, score_4, busty, ugly face, mutated hands, low res, blurry face, black and white, the simpsons, overwatch, apex legends",
897
+ },
898
+ {
899
+ "name": "Animagine Standard v3.0",
900
+ "prompt": "masterpiece, best quality",
901
+ "negative_prompt": "lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, artist name",
902
+ },
903
+ {
904
+ "name": "Animagine Standard v3.1",
905
+ "prompt": "masterpiece, best quality, very aesthetic, absurdres",
906
+ "negative_prompt": "lowres, (bad), text, error, fewer, extra, missing, worst quality, jpeg artifacts, low quality, watermark, unfinished, displeasing, oldest, early, chromatic aberration, signature, extra digits, artistic error, username, scan, [abstract]",
907
+ },
908
+ {
909
+ "name": "Animagine Light v3.1",
910
+ "prompt": "(masterpiece), best quality, very aesthetic, perfect face",
911
+ "negative_prompt": "(low quality, worst quality:1.2), very displeasing, 3d, watermark, signature, ugly, poorly drawn",
912
+ },
913
+ {
914
+ "name": "Animagine Heavy v3.1",
915
+ "prompt": "(masterpiece), (best quality), (ultra-detailed), very aesthetic, illustration, disheveled hair, perfect composition, moist skin, intricate details",
916
+ "negative_prompt": "longbody, lowres, bad anatomy, bad hands, missing fingers, pubic hair, extra digit, fewer digits, cropped, worst quality, low quality, very displeasing",
917
+ },
918
+ ]
919
+
920
+
921
+ style_list = [
922
+ {
923
+ "name": "None",
924
+ "prompt": "",
925
+ "negative_prompt": "",
926
+ },
927
+ {
928
+ "name": "Cinematic",
929
+ "prompt": "cinematic still, emotional, harmonious, vignette, highly detailed, high budget, bokeh, cinemascope, moody, epic, gorgeous, film grain, grainy",
930
+ "negative_prompt": "cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured",
931
+ },
932
+ {
933
+ "name": "Photographic",
934
+ "prompt": "cinematic photo, 35mm photograph, film, bokeh, professional, 4k, highly detailed",
935
+ "negative_prompt": "drawing, painting, crayon, sketch, graphite, impressionist, noisy, blurry, soft, deformed, ugly",
936
+ },
937
+ {
938
+ "name": "Anime",
939
+ "prompt": "anime artwork, anime style, vibrant, studio anime, highly detailed",
940
+ "negative_prompt": "photo, deformed, black and white, realism, disfigured, low contrast",
941
+ },
942
+ {
943
+ "name": "Manga",
944
+ "prompt": "manga style, vibrant, high-energy, detailed, iconic, Japanese comic style",
945
+ "negative_prompt": "ugly, deformed, noisy, blurry, low contrast, realism, photorealistic, Western comic style",
946
+ },
947
+ {
948
+ "name": "Digital Art",
949
+ "prompt": "concept art, digital artwork, illustrative, painterly, matte painting, highly detailed",
950
+ "negative_prompt": "photo, photorealistic, realism, ugly",
951
+ },
952
+ {
953
+ "name": "Pixel art",
954
+ "prompt": "pixel-art, low-res, blocky, pixel art style, 8-bit graphics",
955
+ "negative_prompt": "sloppy, messy, blurry, noisy, highly detailed, ultra textured, photo, realistic",
956
+ },
957
+ {
958
+ "name": "Fantasy art",
959
+ "prompt": "ethereal fantasy concept art, magnificent, celestial, ethereal, painterly, epic, majestic, magical, fantasy art, cover art, dreamy",
960
+ "negative_prompt": "photographic, realistic, realism, 35mm film, dslr, cropped, frame, text, deformed, glitch, noise, noisy, off-center, deformed, cross-eyed, closed eyes, bad anatomy, ugly, disfigured, sloppy, duplicate, mutated, black and white",
961
+ },
962
+ {
963
+ "name": "Neonpunk",
964
+ "prompt": "neonpunk style, cyberpunk, vaporwave, neon, vibes, vibrant, stunningly beautiful, crisp, detailed, sleek, ultramodern, magenta highlights, dark purple shadows, high contrast, cinematic, ultra detailed, intricate, professional",
965
+ "negative_prompt": "painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured",
966
+ },
967
+ {
968
+ "name": "3D Model",
969
+ "prompt": "professional 3d model, octane render, highly detailed, volumetric, dramatic lighting",
970
+ "negative_prompt": "ugly, deformed, noisy, low poly, blurry, painting",
971
+ },
972
+ ]
973
+
974
+
975
+ optimization_list = {
976
+ "None": [28, 7., 'Euler a', False, 'None', 1.],
977
+ "Default": [28, 7., 'Euler a', False, 'None', 1.],
978
+ "SPO": [28, 7., 'Euler a', True, 'loras/spo_sdxl_10ep_4k-data_lora_diffusers.safetensors', 1.],
979
+ "DPO": [28, 7., 'Euler a', True, 'loras/sdxl-DPO-LoRA.safetensors', 1.],
980
+ "DPO Turbo": [8, 2.5, 'LCM', True, 'loras/sd_xl_dpo_turbo_lora_v1-128dim.safetensors', 1.],
981
+ "SDXL Turbo": [8, 2.5, 'LCM', True, 'loras/sd_xl_turbo_lora_v1.safetensors', 1.],
982
+ "Hyper-SDXL 12step": [12, 5., 'TCD', True, 'loras/Hyper-SDXL-12steps-CFG-lora.safetensors', 1.],
983
+ "Hyper-SDXL 8step": [8, 5., 'TCD', True, 'loras/Hyper-SDXL-8steps-CFG-lora.safetensors', 1.],
984
+ "Hyper-SDXL 4step": [4, 0, 'TCD', True, 'loras/Hyper-SDXL-4steps-lora.safetensors', 1.],
985
+ "Hyper-SDXL 2step": [2, 0, 'TCD', True, 'loras/Hyper-SDXL-2steps-lora.safetensors', 1.],
986
+ "Hyper-SDXL 1step": [1, 0, 'TCD', True, 'loras/Hyper-SDXL-1steps-lora.safetensors', 1.],
987
+ "PCM 16step": [16, 4., 'Euler a trailing', True, 'loras/pcm_sdxl_normalcfg_16step_converted.safetensors', 1.],
988
+ "PCM 8step": [8, 4., 'Euler a trailing', True, 'loras/pcm_sdxl_normalcfg_8step_converted.safetensors', 1.],
989
+ "PCM 4step": [4, 2., 'Euler a trailing', True, 'loras/pcm_sdxl_smallcfg_4step_converted.safetensors', 1.],
990
+ "PCM 2step": [2, 1., 'Euler a trailing', True, 'loras/pcm_sdxl_smallcfg_2step_converted.safetensors', 1.],
991
+ }
992
+
993
+
994
+ def set_optimization(opt, steps_gui, cfg_gui, sampler_gui, clip_skip_gui, lora_gui, lora_scale_gui):
995
+ if not opt in list(optimization_list.keys()): opt = "None"
996
+ def_steps_gui = 28
997
+ def_cfg_gui = 7.
998
+ steps = optimization_list.get(opt, "None")[0]
999
+ cfg = optimization_list.get(opt, "None")[1]
1000
+ sampler = optimization_list.get(opt, "None")[2]
1001
+ clip_skip = optimization_list.get(opt, "None")[3]
1002
+ lora = optimization_list.get(opt, "None")[4]
1003
+ lora_scale = optimization_list.get(opt, "None")[5]
1004
+ if opt == "None":
1005
+ steps = max(steps_gui, def_steps_gui)
1006
+ cfg = max(cfg_gui, def_cfg_gui)
1007
+ clip_skip = clip_skip_gui
1008
+ elif opt == "SPO" or opt == "DPO":
1009
+ steps = max(steps_gui, def_steps_gui)
1010
+ cfg = max(cfg_gui, def_cfg_gui)
1011
+
1012
+ return gr.update(value=steps), gr.update(value=cfg), gr.update(value=sampler),\
1013
+ gr.update(value=clip_skip), gr.update(value=lora), gr.update(value=lora_scale),
1014
+
1015
+
1016
+ # [sampler_gui, steps_gui, cfg_gui, clip_skip_gui, img_width_gui, img_height_gui, optimization_gui]
1017
+ preset_sampler_setting = {
1018
+ "None": ["Euler a", 28, 7., True, 1024, 1024, "None"],
1019
+ "Anime 3:4 Fast": ["LCM", 8, 2.5, True, 896, 1152, "DPO Turbo"],
1020
+ "Anime 3:4 Standard": ["Euler a", 28, 7., True, 896, 1152, "None"],
1021
+ "Anime 3:4 Heavy": ["Euler a", 40, 7., True, 896, 1152, "None"],
1022
+ "Anime 1:1 Fast": ["LCM", 8, 2.5, True, 1024, 1024, "DPO Turbo"],
1023
+ "Anime 1:1 Standard": ["Euler a", 28, 7., True, 1024, 1024, "None"],
1024
+ "Anime 1:1 Heavy": ["Euler a", 40, 7., True, 1024, 1024, "None"],
1025
+ "Photo 3:4 Fast": ["LCM", 8, 2.5, False, 896, 1152, "DPO Turbo"],
1026
+ "Photo 3:4 Standard": ["DPM++ 2M Karras", 28, 7., False, 896, 1152, "None"],
1027
+ "Photo 3:4 Heavy": ["DPM++ 2M Karras", 40, 7., False, 896, 1152, "None"],
1028
+ "Photo 1:1 Fast": ["LCM", 8, 2.5, False, 1024, 1024, "DPO Turbo"],
1029
+ "Photo 1:1 Standard": ["DPM++ 2M Karras", 28, 7., False, 1024, 1024, "None"],
1030
+ "Photo 1:1 Heavy": ["DPM++ 2M Karras", 40, 7., False, 1024, 1024, "None"],
1031
+ }
1032
+
1033
+
1034
+ def set_sampler_settings(sampler_setting):
1035
+ if not sampler_setting in list(preset_sampler_setting.keys()) or sampler_setting == "None":
1036
+ return gr.update(value="Euler a"), gr.update(value=28), gr.update(value=7.), gr.update(value=True),\
1037
+ gr.update(value=1024), gr.update(value=1024), gr.update(value="None")
1038
+ v = preset_sampler_setting.get(sampler_setting, ["Euler a", 28, 7., True, 1024, 1024])
1039
+ # sampler, steps, cfg, clip_skip, width, height, optimization
1040
+ return gr.update(value=v[0]), gr.update(value=v[1]), gr.update(value=v[2]), gr.update(value=v[3]),\
1041
+ gr.update(value=v[4]), gr.update(value=v[5]), gr.update(value=v[6])
1042
+
1043
+
1044
+ preset_styles = {k["name"]: (k["prompt"], k["negative_prompt"]) for k in style_list}
1045
+ preset_quality = {k["name"]: (k["prompt"], k["negative_prompt"]) for k in quality_prompt_list}
1046
+
1047
+
1048
+ def process_style_prompt(prompt: str, neg_prompt: str, styles_key: str = "None", quality_key: str = "None", type: str = "Auto"):
1049
+ def to_list(s):
1050
+ return [x.strip() for x in s.split(",") if not s == ""]
1051
+
1052
+ def list_sub(a, b):
1053
+ return [e for e in a if e not in b]
1054
+
1055
+ def list_uniq(l):
1056
+ return sorted(set(l), key=l.index)
1057
+
1058
+ animagine_ps = to_list("anime artwork, anime style, vibrant, studio anime, highly detailed, masterpiece, best quality, very aesthetic, absurdres")
1059
+ animagine_nps = to_list("lowres, (bad), text, error, fewer, extra, missing, worst quality, jpeg artifacts, low quality, watermark, unfinished, displeasing, oldest, early, chromatic aberration, signature, extra digits, artistic error, username, scan, [abstract]")
1060
+ pony_ps = to_list("source_anime, score_9, score_8_up, score_7_up, masterpiece, best quality, very aesthetic, absurdres")
1061
+ pony_nps = to_list("source_pony, source_furry, source_cartoon, score_6, score_5, score_4, busty, ugly face, mutated hands, low res, blurry face, black and white, the simpsons, overwatch, apex legends")
1062
+ prompts = to_list(prompt)
1063
+ neg_prompts = to_list(neg_prompt)
1064
+
1065
+ all_styles_ps = []
1066
+ all_styles_nps = []
1067
+ for d in style_list:
1068
+ all_styles_ps.extend(to_list(str(d.get("prompt", ""))))
1069
+ all_styles_nps.extend(to_list(str(d.get("negative_prompt", ""))))
1070
+
1071
+ all_quality_ps = []
1072
+ all_quality_nps = []
1073
+ for d in quality_prompt_list:
1074
+ all_quality_ps.extend(to_list(str(d.get("prompt", ""))))
1075
+ all_quality_nps.extend(to_list(str(d.get("negative_prompt", ""))))
1076
+
1077
+ quality_ps = to_list(preset_quality[quality_key][0])
1078
+ quality_nps = to_list(preset_quality[quality_key][1])
1079
+ styles_ps = to_list(preset_styles[styles_key][0])
1080
+ styles_nps = to_list(preset_styles[styles_key][1])
1081
+
1082
+ prompts = list_sub(prompts, animagine_ps + pony_ps + all_styles_ps + all_quality_ps)
1083
+ neg_prompts = list_sub(neg_prompts, animagine_nps + pony_nps + all_styles_nps + all_quality_nps)
1084
+
1085
+ last_empty_p = [""] if not prompts and type != "None" and type != "Auto" and styles_key != "None" and quality_key != "None" else []
1086
+ last_empty_np = [""] if not neg_prompts and type != "None" and type != "Auto" and styles_key != "None" and quality_key != "None" else []
1087
+
1088
+ if type == "Animagine":
1089
+ prompts = prompts + animagine_ps
1090
+ neg_prompts = neg_prompts + animagine_nps
1091
+ elif type == "Pony":
1092
+ prompts = prompts + pony_ps
1093
+ neg_prompts = neg_prompts + pony_nps
1094
+
1095
+ prompts = prompts + styles_ps + quality_ps
1096
+ neg_prompts = neg_prompts + styles_nps + quality_nps
1097
+
1098
+ prompt = ", ".join(list_uniq(prompts) + last_empty_p)
1099
+ neg_prompt = ", ".join(list_uniq(neg_prompts) + last_empty_np)
1100
+
1101
+ return gr.update(value=prompt), gr.update(value=neg_prompt), gr.update(value=type)
1102
+
1103
+
1104
+ def set_quick_presets(genre:str = "None", type:str = "Auto", speed:str = "None", aspect:str = "None"):
1105
+ quality = "None"
1106
+ style = "None"
1107
+ sampler = "None"
1108
+ opt = "None"
1109
+
1110
+ if genre == "Anime":
1111
+ if type != "None" and type != "Auto": style = "Anime"
1112
+ if aspect == "1:1":
1113
+ if speed == "Heavy":
1114
+ sampler = "Anime 1:1 Heavy"
1115
+ elif speed == "Fast":
1116
+ sampler = "Anime 1:1 Fast"
1117
+ else:
1118
+ sampler = "Anime 1:1 Standard"
1119
+ elif aspect == "3:4":
1120
+ if speed == "Heavy":
1121
+ sampler = "Anime 3:4 Heavy"
1122
+ elif speed == "Fast":
1123
+ sampler = "Anime 3:4 Fast"
1124
+ else:
1125
+ sampler = "Anime 3:4 Standard"
1126
+ if type == "Pony":
1127
+ quality = "Pony Anime Common"
1128
+ elif type == "Animagine":
1129
+ quality = "Animagine Common"
1130
+ else:
1131
+ quality = "None"
1132
+ elif genre == "Photo":
1133
+ if type != "None" and type != "Auto": style = "Photographic"
1134
+ if aspect == "1:1":
1135
+ if speed == "Heavy":
1136
+ sampler = "Photo 1:1 Heavy"
1137
+ elif speed == "Fast":
1138
+ sampler = "Photo 1:1 Fast"
1139
+ else:
1140
+ sampler = "Photo 1:1 Standard"
1141
+ elif aspect == "3:4":
1142
+ if speed == "Heavy":
1143
+ sampler = "Photo 3:4 Heavy"
1144
+ elif speed == "Fast":
1145
+ sampler = "Photo 3:4 Fast"
1146
+ else:
1147
+ sampler = "Photo 3:4 Standard"
1148
+ if type == "Pony":
1149
+ quality = "Pony Common"
1150
+ else:
1151
+ quality = "None"
1152
+
1153
+ if speed == "Fast":
1154
+ opt = "DPO Turbo"
1155
+ if genre == "Anime" and type != "Pony" and type != "Auto": quality = "Animagine Light v3.1"
1156
+
1157
+ return gr.update(value=quality), gr.update(value=style), gr.update(value=sampler), gr.update(value=opt), gr.update(value=type)
1158
+
1159
+
1160
+ textual_inversion_dict = {}
1161
+ try:
1162
+ with open('textual_inversion_dict.json', encoding='utf-8') as f:
1163
+ textual_inversion_dict = json.load(f)
1164
+ except Exception:
1165
+ pass
1166
+ textual_inversion_file_token_list = []
1167
+
1168
+
1169
+ def get_tupled_embed_list(embed_list):
1170
+ global textual_inversion_file_list
1171
+ tupled_list = []
1172
+ for file in embed_list:
1173
+ token = textual_inversion_dict.get(Path(file).name, [Path(file).stem.replace(",",""), False])[0]
1174
+ tupled_list.append((token, file))
1175
+ textual_inversion_file_token_list.append(token)
1176
+ return tupled_list
1177
+
1178
+
1179
+ def set_textual_inversion_prompt(textual_inversion_gui, prompt_gui, neg_prompt_gui, prompt_syntax_gui):
1180
+ ti_tags = list(textual_inversion_dict.values()) + textual_inversion_file_token_list
1181
+ tags = prompt_gui.split(",") if prompt_gui else []
1182
+ prompts = []
1183
+ for tag in tags:
1184
+ tag = str(tag).strip()
1185
+ if tag and not tag in ti_tags:
1186
+ prompts.append(tag)
1187
+ ntags = neg_prompt_gui.split(",") if neg_prompt_gui else []
1188
+ neg_prompts = []
1189
+ for tag in ntags:
1190
+ tag = str(tag).strip()
1191
+ if tag and not tag in ti_tags:
1192
+ neg_prompts.append(tag)
1193
+ ti_prompts = []
1194
+ ti_neg_prompts = []
1195
+ for ti in textual_inversion_gui:
1196
+ tokens = textual_inversion_dict.get(Path(ti).name, [Path(ti).stem.replace(",",""), False])
1197
+ is_positive = tokens[1] == True or "positive" in Path(ti).parent.name
1198
+ if is_positive: # positive prompt
1199
+ ti_prompts.append(tokens[0])
1200
+ else: # negative prompt (default)
1201
+ ti_neg_prompts.append(tokens[0])
1202
+ empty = [""]
1203
+ prompt = ", ".join(prompts + ti_prompts + empty)
1204
+ neg_prompt = ", ".join(neg_prompts + ti_neg_prompts + empty)
1205
+ return gr.update(value=prompt), gr.update(value=neg_prompt),
1206
+
1207
+
1208
+ def get_model_pipeline(repo_id: str):
1209
+ from huggingface_hub import HfApi
1210
+ api = HfApi()
1211
+ default = "StableDiffusionPipeline"
1212
+ try:
1213
+ if " " in repo_id or not api.repo_exists(repo_id): return default
1214
+ model = api.model_info(repo_id=repo_id)
1215
+ except Exception as e:
1216
+ return default
1217
+ if model.private or model.gated: return default
1218
+ tags = model.tags
1219
+ if not 'diffusers' in tags: return default
1220
+ if 'diffusers:FluxPipeline' in tags:
1221
+ return "FluxPipeline"
1222
+ if 'diffusers:StableDiffusionXLPipeline' in tags:
1223
+ return "StableDiffusionXLPipeline"
1224
+ elif 'diffusers:StableDiffusionPipeline' in tags:
1225
+ return "StableDiffusionPipeline"
1226
+ else:
1227
+ return default
1228
+
packages.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ aria2 -y
pre-requirements.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ pip>=23.0.0
preprocessor.py ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gc
2
+
3
+ import numpy as np
4
+ import PIL.Image
5
+ import torch
6
+ import torchvision
7
+ from controlnet_aux import (
8
+ CannyDetector,
9
+ ContentShuffleDetector,
10
+ HEDdetector,
11
+ LineartAnimeDetector,
12
+ LineartDetector,
13
+ MidasDetector,
14
+ MLSDdetector,
15
+ NormalBaeDetector,
16
+ OpenposeDetector,
17
+ PidiNetDetector,
18
+ )
19
+ from controlnet_aux.util import HWC3
20
+
21
+ from cv_utils import resize_image
22
+ from depth_estimator import DepthEstimator
23
+ from image_segmentor import ImageSegmentor
24
+
25
+ from kornia.core import Tensor
26
+
27
+ # load preprocessor
28
+
29
+ # HED = HEDdetector.from_pretrained("lllyasviel/Annotators")
30
+ Midas = MidasDetector.from_pretrained("lllyasviel/Annotators")
31
+ MLSD = MLSDdetector.from_pretrained("lllyasviel/Annotators")
32
+ Canny = CannyDetector()
33
+ OPENPOSE = OpenposeDetector.from_pretrained("lllyasviel/Annotators")
34
+
35
+
36
+ class Preprocessor:
37
+ MODEL_ID = "lllyasviel/Annotators"
38
+
39
+ def __init__(self):
40
+ self.model = None
41
+ self.name = ""
42
+
43
+ def load(self, name: str) -> None:
44
+ if name == self.name:
45
+ return
46
+
47
+ if name == "Midas":
48
+ self.model = Midas
49
+ elif name == "MLSD":
50
+ self.model =MLSD
51
+ elif name == "Openpose":
52
+ self.model = OPENPOSE
53
+ elif name == "Canny":
54
+ self.model = Canny
55
+ else:
56
+ raise ValueError
57
+ torch.cuda.empty_cache()
58
+ gc.collect()
59
+ self.name = name
60
+
61
+ def __call__(self, image: PIL.Image.Image, **kwargs) -> PIL.Image.Image:
62
+ if self.name == "Canny" or self.name == "MLSD":
63
+ detect_resolution = kwargs.pop("detect_resolution")
64
+ image_resolution = kwargs.pop("image_resolution", 512)
65
+ image = np.array(image)
66
+ image = HWC3(image)
67
+ image = resize_image(image, resolution=detect_resolution)
68
+ image = self.model(image, **kwargs)
69
+ image = np.array(image)
70
+ image = HWC3(image)
71
+ image = resize_image(image, resolution=image_resolution)
72
+ return PIL.Image.fromarray(image).convert('RGB')
73
+
74
+ else:
75
+ detect_resolution = kwargs.pop("detect_resolution", 512)
76
+ image_resolution = kwargs.pop("image_resolution", 512)
77
+ image = np.array(image)
78
+ image = HWC3(image)
79
+ image = resize_image(image, resolution=detect_resolution)
80
+ image = self.model(image, **kwargs)
81
+ image = np.array(image)
82
+ image = HWC3(image)
83
+ image = resize_image(image, resolution=image_resolution)
84
+ return PIL.Image.fromarray(image)
prompt.py ADDED
@@ -0,0 +1,575 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import spaces
2
+ import gradio as gr
3
+ import random
4
+ import json
5
+ import os
6
+ import re
7
+ from datetime import datetime
8
+ from huggingface_hub import InferenceClient
9
+ import subprocess
10
+ import torch
11
+ from PIL import Image
12
+ from transformers import AutoProcessor, AutoModelForCausalLM
13
+ import random
14
+
15
+ subprocess.run('pip install flash-attn --no-build-isolation', env={'FLASH_ATTENTION_SKIP_CUDA_BUILD': "TRUE"}, shell=True)
16
+
17
+ huggingface_token = os.getenv("HF_TOKEN")
18
+
19
+ # Initialize Florence model
20
+ device = "cuda" if torch.cuda.is_available() else "cpu"
21
+ florence_model = AutoModelForCausalLM.from_pretrained('microsoft/Florence-2-base', trust_remote_code=True).to("cpu").eval()
22
+ florence_processor = AutoProcessor.from_pretrained('microsoft/Florence-2-base', trust_remote_code=True)
23
+
24
+ # Florence caption function
25
+ @spaces.GPU(duration=30)
26
+ def florence_caption(image):
27
+ if not isinstance(image, Image.Image):
28
+ image = Image.fromarray(image)
29
+
30
+ florence_model.to(device=device)
31
+ inputs = florence_processor(text="<MORE_DETAILED_CAPTION>", images=image, return_tensors="pt").to(device)
32
+ generated_ids = florence_model.generate(
33
+ input_ids=inputs["input_ids"],
34
+ pixel_values=inputs["pixel_values"],
35
+ max_new_tokens=1024,
36
+ early_stopping=False,
37
+ do_sample=False,
38
+ num_beams=3,
39
+ )
40
+ florence_model.to("cpu")
41
+ generated_text = florence_processor.batch_decode(generated_ids, skip_special_tokens=False)[0]
42
+ parsed_answer = florence_processor.post_process_generation(
43
+ generated_text,
44
+ task="<MORE_DETAILED_CAPTION>",
45
+ image_size=(image.width, image.height)
46
+ )
47
+ return parsed_answer["<MORE_DETAILED_CAPTION>"]
48
+
49
+ # Load JSON files
50
+ def load_json_file(file_name):
51
+ file_path = os.path.join("data", file_name)
52
+ with open(file_path, "r") as file:
53
+ return json.load(file)
54
+
55
+ # Load gender-specific JSON files
56
+ FEMALE_DEFAULT_TAGS = load_json_file("female_default_tags.json")
57
+ MALE_DEFAULT_TAGS = load_json_file("male_default_tags.json")
58
+ FEMALE_BODY_TYPES = load_json_file("female_body_types.json")
59
+ MALE_BODY_TYPES = load_json_file("male_body_types.json")
60
+ FEMALE_CLOTHING = load_json_file("female_clothing.json")
61
+ MALE_CLOTHING = load_json_file("male_clothing.json")
62
+ FEMALE_ADDITIONAL_DETAILS = load_json_file("female_additional_details.json")
63
+ MALE_ADDITIONAL_DETAILS = load_json_file("male_additional_details.json")
64
+
65
+ # Load non-gender-specific JSON files
66
+ ARTFORM = load_json_file("artform.json")
67
+ PHOTO_TYPE = load_json_file("photo_type.json")
68
+ ROLES = load_json_file("roles.json")
69
+ HAIRSTYLES = load_json_file("hairstyles.json")
70
+ PLACE = load_json_file("place.json")
71
+ LIGHTING = load_json_file("lighting.json")
72
+ COMPOSITION = load_json_file("composition.json")
73
+ POSE = load_json_file("pose.json")
74
+ BACKGROUND = load_json_file("background.json")
75
+ PHOTOGRAPHY_STYLES = load_json_file("photography_styles.json")
76
+ DEVICE = load_json_file("device.json")
77
+ PHOTOGRAPHER = load_json_file("photographer.json")
78
+ ARTIST = load_json_file("artist.json")
79
+ DIGITAL_ARTFORM = load_json_file("digital_artform.json")
80
+
81
+ class PromptGenerator:
82
+ def __init__(self, seed=None):
83
+ self.rng = random.Random(seed)
84
+
85
+ def split_and_choose(self, input_str):
86
+ choices = [choice.strip() for choice in input_str.split(",")]
87
+ return self.rng.choices(choices, k=1)[0]
88
+
89
+ def get_choice(self, input_str, default_choices):
90
+ if input_str.lower() == "disabled":
91
+ return ""
92
+ elif "," in input_str:
93
+ return self.split_and_choose(input_str)
94
+ elif input_str.lower() == "random":
95
+ return self.rng.choices(default_choices, k=1)[0]
96
+ else:
97
+ return input_str
98
+
99
+ def clean_consecutive_commas(self, input_string):
100
+ cleaned_string = re.sub(r',\s*,', ', ', input_string)
101
+ return cleaned_string
102
+
103
+ def process_string(self, replaced, seed):
104
+ replaced = re.sub(r'\s*,\s*', ', ', replaced)
105
+ replaced = re.sub(r',+', ', ', replaced)
106
+ original = replaced
107
+
108
+ first_break_clipl_index = replaced.find("BREAK_CLIPL")
109
+ second_break_clipl_index = replaced.find("BREAK_CLIPL", first_break_clipl_index + len("BREAK_CLIPL"))
110
+
111
+ if first_break_clipl_index != -1 and second_break_clipl_index != -1:
112
+ clip_content_l = replaced[first_break_clipl_index + len("BREAK_CLIPL"):second_break_clipl_index]
113
+ replaced = replaced[:first_break_clipl_index].strip(", ") + replaced[second_break_clipl_index + len("BREAK_CLIPL"):].strip(", ")
114
+ clip_l = clip_content_l
115
+ else:
116
+ clip_l = ""
117
+
118
+ first_break_clipg_index = replaced.find("BREAK_CLIPG")
119
+ second_break_clipg_index = replaced.find("BREAK_CLIPG", first_break_clipg_index + len("BREAK_CLIPG"))
120
+
121
+ if first_break_clipg_index != -1 and second_break_clipg_index != -1:
122
+ clip_content_g = replaced[first_break_clipg_index + len("BREAK_CLIPG"):second_break_clipg_index]
123
+ replaced = replaced[:first_break_clipg_index].strip(", ") + replaced[second_break_clipg_index + len("BREAK_CLIPG"):].strip(", ")
124
+ clip_g = clip_content_g
125
+ else:
126
+ clip_g = ""
127
+
128
+ t5xxl = replaced
129
+
130
+ original = original.replace("BREAK_CLIPL", "").replace("BREAK_CLIPG", "")
131
+ original = re.sub(r'\s*,\s*', ', ', original)
132
+ original = re.sub(r',+', ', ', original)
133
+ clip_l = re.sub(r'\s*,\s*', ', ', clip_l)
134
+ clip_l = re.sub(r',+', ', ', clip_l)
135
+ clip_g = re.sub(r'\s*,\s*', ', ', clip_g)
136
+ clip_g = re.sub(r',+', ', ', clip_g)
137
+ if clip_l.startswith(", "):
138
+ clip_l = clip_l[2:]
139
+ if clip_g.startswith(", "):
140
+ clip_g = clip_g[2:]
141
+ if original.startswith(", "):
142
+ original = original[2:]
143
+ if t5xxl.startswith(", "):
144
+ t5xxl = t5xxl[2:]
145
+
146
+ # Add spaces after commas
147
+ replaced = re.sub(r',(?!\s)', ', ', replaced)
148
+ original = re.sub(r',(?!\s)', ', ', original)
149
+ clip_l = re.sub(r',(?!\s)', ', ', clip_l)
150
+ clip_g = re.sub(r',(?!\s)', ', ', clip_g)
151
+ t5xxl = re.sub(r',(?!\s)', ', ', t5xxl)
152
+
153
+ return original, seed, t5xxl, clip_l, clip_g
154
+
155
+ def generate_prompt(self, seed, custom, subject, gender, artform, photo_type, body_types, default_tags, roles, hairstyles,
156
+ additional_details, photography_styles, device, photographer, artist, digital_artform,
157
+ place, lighting, clothing, composition, pose, background, input_image):
158
+ kwargs = locals()
159
+ del kwargs['self']
160
+
161
+ seed = kwargs.get("seed", 0)
162
+ if seed is not None:
163
+ self.rng = random.Random(seed)
164
+ components = []
165
+ custom = kwargs.get("custom", "")
166
+ if custom:
167
+ components.append(custom)
168
+ is_photographer = kwargs.get("artform", "").lower() == "photography" or (
169
+ kwargs.get("artform", "").lower() == "random"
170
+ and self.rng.choice([True, False])
171
+ )
172
+
173
+ subject = kwargs.get("subject", "")
174
+ gender = kwargs.get("gender", "female")
175
+
176
+ if is_photographer:
177
+ selected_photo_style = self.get_choice(kwargs.get("photography_styles", ""), PHOTOGRAPHY_STYLES)
178
+ if not selected_photo_style:
179
+ selected_photo_style = "photography"
180
+ components.append(selected_photo_style)
181
+ if kwargs.get("photography_style", "") != "disabled" and kwargs.get("default_tags", "") != "disabled" or subject != "":
182
+ components.append(" of")
183
+
184
+ default_tags = kwargs.get("default_tags", "random")
185
+ body_type = kwargs.get("body_types", "")
186
+ if not subject:
187
+ if default_tags == "random":
188
+ if body_type != "disabled" and body_type != "random":
189
+ selected_subject = self.get_choice(kwargs.get("default_tags", ""), FEMALE_DEFAULT_TAGS if gender == "female" else MALE_DEFAULT_TAGS).replace("a ", "").replace("an ", "")
190
+ components.append("a ")
191
+ components.append(body_type)
192
+ components.append(selected_subject)
193
+ elif body_type == "disabled":
194
+ selected_subject = self.get_choice(kwargs.get("default_tags", ""), FEMALE_DEFAULT_TAGS if gender == "female" else MALE_DEFAULT_TAGS)
195
+ components.append(selected_subject)
196
+ else:
197
+ body_type = self.get_choice(body_type, FEMALE_BODY_TYPES if gender == "female" else MALE_BODY_TYPES)
198
+ components.append("a ")
199
+ components.append(body_type)
200
+ selected_subject = self.get_choice(kwargs.get("default_tags", ""), FEMALE_DEFAULT_TAGS if gender == "female" else MALE_DEFAULT_TAGS).replace("a ", "").replace("an ", "")
201
+ components.append(selected_subject)
202
+ elif default_tags == "disabled":
203
+ pass
204
+ else:
205
+ components.append(default_tags)
206
+ else:
207
+ if body_type != "disabled" and body_type != "random":
208
+ components.append("a ")
209
+ components.append(body_type)
210
+ elif body_type == "disabled":
211
+ pass
212
+ else:
213
+ body_type = self.get_choice(body_type, FEMALE_BODY_TYPES if gender == "female" else MALE_BODY_TYPES)
214
+ components.append("a ")
215
+ components.append(body_type)
216
+ components.append(subject)
217
+
218
+ params = [
219
+ ("roles", ROLES),
220
+ ("hairstyles", HAIRSTYLES),
221
+ ("additional_details", FEMALE_ADDITIONAL_DETAILS if gender == "female" else MALE_ADDITIONAL_DETAILS),
222
+ ]
223
+ for param in params:
224
+ components.append(self.get_choice(kwargs.get(param[0], ""), param[1]))
225
+ for i in reversed(range(len(components))):
226
+ if components[i] in PLACE:
227
+ components[i] += ", "
228
+ break
229
+ if kwargs.get("clothing", "") != "disabled" and kwargs.get("clothing", "") != "random":
230
+ components.append(", dressed in ")
231
+ clothing = kwargs.get("clothing", "")
232
+ components.append(clothing)
233
+ elif kwargs.get("clothing", "") == "random":
234
+ components.append(", dressed in ")
235
+ clothing = self.get_choice(kwargs.get("clothing", ""), FEMALE_CLOTHING if gender == "female" else MALE_CLOTHING)
236
+ components.append(clothing)
237
+
238
+ if kwargs.get("composition", "") != "disabled" and kwargs.get("composition", "") != "random":
239
+ components.append(", ")
240
+ composition = kwargs.get("composition", "")
241
+ components.append(composition)
242
+ elif kwargs.get("composition", "") == "random":
243
+ components.append(", ")
244
+ composition = self.get_choice(kwargs.get("composition", ""), COMPOSITION)
245
+ components.append(composition)
246
+
247
+ if kwargs.get("pose", "") != "disabled" and kwargs.get("pose", "") != "random":
248
+ components.append(", ")
249
+ pose = kwargs.get("pose", "")
250
+ components.append(pose)
251
+ elif kwargs.get("pose", "") == "random":
252
+ components.append(", ")
253
+ pose = self.get_choice(kwargs.get("pose", ""), POSE)
254
+ components.append(pose)
255
+ components.append("BREAK_CLIPG")
256
+ if kwargs.get("background", "") != "disabled" and kwargs.get("background", "") != "random":
257
+ components.append(", ")
258
+ background = kwargs.get("background", "")
259
+ components.append(background)
260
+ elif kwargs.get("background", "") == "random":
261
+ components.append(", ")
262
+ background = self.get_choice(kwargs.get("background", ""), BACKGROUND)
263
+ components.append(background)
264
+
265
+ if kwargs.get("place", "") != "disabled" and kwargs.get("place", "") != "random":
266
+ components.append(", ")
267
+ place = kwargs.get("place", "")
268
+ components.append(place)
269
+ elif kwargs.get("place", "") == "random":
270
+ components.append(", ")
271
+ place = self.get_choice(kwargs.get("place", ""), PLACE)
272
+ components.append(place + ", ")
273
+
274
+ lighting = kwargs.get("lighting", "").lower()
275
+ if lighting == "random":
276
+ selected_lighting = ", ".join(self.rng.sample(LIGHTING, self.rng.randint(2, 5)))
277
+ components.append(", ")
278
+ components.append(selected_lighting)
279
+ elif lighting == "disabled":
280
+ pass
281
+ else:
282
+ components.append(", ")
283
+ components.append(lighting)
284
+ components.append("BREAK_CLIPG")
285
+ components.append("BREAK_CLIPL")
286
+ if is_photographer:
287
+ if kwargs.get("photo_type", "") != "disabled":
288
+ photo_type_choice = self.get_choice(kwargs.get("photo_type", ""), PHOTO_TYPE)
289
+ if photo_type_choice and photo_type_choice != "random" and photo_type_choice != "disabled":
290
+ random_value = round(self.rng.uniform(1.1, 1.5), 1)
291
+ components.append(f", ({photo_type_choice}:{random_value}), ")
292
+
293
+ params = [
294
+ ("device", DEVICE),
295
+ ("photographer", PHOTOGRAPHER),
296
+ ]
297
+ components.extend([self.get_choice(kwargs.get(param[0], ""), param[1]) for param in params])
298
+ if kwargs.get("device", "") != "disabled":
299
+ components[-2] = f", shot on {components[-2]}"
300
+ if kwargs.get("photographer", "") != "disabled":
301
+ components[-1] = f", photo by {components[-1]}"
302
+ else:
303
+ digital_artform_choice = self.get_choice(kwargs.get("digital_artform", ""), DIGITAL_ARTFORM)
304
+ if digital_artform_choice:
305
+ components.append(f"{digital_artform_choice}")
306
+ if kwargs.get("artist", "") != "disabled":
307
+ components.append(f"by {self.get_choice(kwargs.get('artist', ''), ARTIST)}")
308
+ components.append("BREAK_CLIPL")
309
+
310
+ prompt = " ".join(components)
311
+ prompt = re.sub(" +", " ", prompt)
312
+ replaced = prompt.replace("of as", "of")
313
+ replaced = self.clean_consecutive_commas(replaced)
314
+
315
+ return self.process_string(replaced, seed)
316
+
317
+ def add_caption_to_prompt(self, prompt, caption):
318
+ if caption:
319
+ return f"{prompt}, {caption}"
320
+ return prompt
321
+
322
+ import os
323
+ from openai import OpenAI
324
+
325
+ class HuggingFaceInferenceNode:
326
+
327
+ def __init__(self):
328
+ #self.client = InferenceClient("meta-llama/Meta-Llama-3.1-70B-Instruct") #
329
+ try:
330
+ self.client = OpenAI(base_url="https://api-inference.huggingface.co/v1/", api_key=huggingface_token)
331
+ except Exception as e:
332
+ print(e)
333
+ self.client = None
334
+ self.prompts_dir = "./prompts"
335
+ os.makedirs(self.prompts_dir, exist_ok=True)
336
+
337
+ def save_prompt(self, prompt):
338
+ filename_text = "hf_" + prompt.split(',')[0].strip()
339
+ filename_text = re.sub(r'[^\w\-_\. ]', '_', filename_text)
340
+ filename_text = filename_text[:30]
341
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
342
+ base_filename = f"{filename_text}_{timestamp}.txt"
343
+ filename = os.path.join(self.prompts_dir, base_filename)
344
+
345
+ with open(filename, "w") as file:
346
+ file.write(prompt)
347
+
348
+ print(f"Prompt saved to {filename}")
349
+
350
+ def generate(self, input_text, happy_talk, compress, compression_level, poster, custom_base_prompt=""):
351
+ try:
352
+ default_happy_prompt = """Create a detailed visually descriptive caption of this description, which will be used as a prompt for a text to image AI system (caption only, no instructions like "create an image").Remove any mention of digital artwork or artwork style. Give detailed visual descriptions of the character(s), including ethnicity, skin tone, expression etc. Imagine using keywords for a still for someone who has aphantasia. Describe the image style, e.g. any photographic or art styles / techniques utilized. Make sure to fully describe all aspects of the cinematography, with abundant technical details and visual descriptions. If there is more than one image, combine the elements and characters from all of the images creatively into a single cohesive composition with a single background, inventing an interaction between the characters. Be creative in combining the characters into a single cohesive scene. Focus on two primary characters (or one) and describe an interesting interaction between them, such as a hug, a kiss, a fight, giving an object, an emotional reaction / interaction. If there is more than one background in the images, pick the most appropriate one. Your output is only the caption itself, no comments or extra formatting. The caption is in a single long paragraph. If you feel the images are inappropriate, invent a new scene / characters inspired by these. Additionally, incorporate a specific movie director's visual style and describe the lighting setup in detail, including the type, color, and placement of light sources to create the desired mood and atmosphere. Always frame the scene, including details about the film grain, color grading, and any artifacts or characteristics specific."""
353
+
354
+ default_simple_prompt = """Create a brief, straightforward caption for this description, suitable for a text-to-image AI system. Focus on the main elements, key characters, and overall scene without elaborate details. Provide a clear and concise description in one or two sentences."""
355
+
356
+ poster_prompt = """Analyze the provided description and extract key information to create a movie poster style description. Format the output as follows:
357
+ Title: A catchy, intriguing title that captures the essence of the scene, place the title in "".
358
+ Main character: Give a description of the main character.
359
+ Background: Describe the background in detail.
360
+ Supporting characters: Describe the supporting characters
361
+ Branding type: Describe the branding type
362
+ Tagline: Include a tagline that captures the essence of the movie.
363
+ Visual style: Ensure that the visual style fits the branding type and tagline.
364
+ You are allowed to make up film and branding names, and do them like 80's, 90's or modern movie posters."""
365
+
366
+ if poster:
367
+ base_prompt = poster_prompt
368
+ elif custom_base_prompt.strip():
369
+ base_prompt = custom_base_prompt
370
+ else:
371
+ base_prompt = default_happy_prompt if happy_talk else default_simple_prompt
372
+
373
+ if compress and not poster:
374
+ compression_chars = {
375
+ "soft": 600 if happy_talk else 300,
376
+ "medium": 400 if happy_talk else 200,
377
+ "hard": 200 if happy_talk else 100
378
+ }
379
+ char_limit = compression_chars[compression_level]
380
+ base_prompt += f" Compress the output to be concise while retaining key visual details. MAX OUTPUT SIZE no more than {char_limit} characters."
381
+
382
+ system_message = "You are a helpful assistant. Try your best to give the best response possible to the user."
383
+ user_message = f"{base_prompt}\nDescription: {input_text}"
384
+
385
+ messages = [
386
+ {"role": "system", "content": system_message},
387
+ {"role": "user", "content": user_message}
388
+ ]
389
+
390
+ #response = self.client.chat_completion( #
391
+ response = self.client.chat.completions.create(
392
+ model="meta-llama/Meta-Llama-3.1-70B-Instruct",
393
+ max_tokens=1024,
394
+ temperature=0.7,
395
+ top_p=0.95,
396
+ messages=messages,
397
+ )
398
+
399
+ output = response.choices[0].message.content.strip()
400
+
401
+ # Clean up the output
402
+ if ": " in output:
403
+ output = output.split(": ", 1)[1].strip()
404
+ elif output.lower().startswith("here"):
405
+ sentences = output.split(". ")
406
+ if len(sentences) > 1:
407
+ output = ". ".join(sentences[1:]).strip()
408
+
409
+ return output
410
+
411
+ except Exception as e:
412
+ print(f"An error occurred: {e}")
413
+ return f"Error occurred while processing the request: {str(e)}"
414
+
415
+ pg_title = """<h1 align="center">FLUX Prompt Generator</h1>
416
+ <p><center>
417
+ <a href="https://x.com/gokayfem" target="_blank">[X gokaygokay]</a>
418
+ <a href="https://github.com/gokayfem" target="_blank">[Github gokayfem]</a>
419
+ <a href="https://github.com/dagthomas/comfyui_dagthomas" target="_blank">[comfyui_dagthomas]</a>
420
+ <p align="center">Create long prompts from images or simple words. Enhance your short prompts with prompt enhancer.</p>
421
+ </center></p>
422
+ """
423
+
424
+ def create_interface():
425
+ prompt_generator = PromptGenerator()
426
+ huggingface_node = HuggingFaceInferenceNode()
427
+
428
+ with gr.Blocks(theme='bethecloud/storj_theme') as demo:
429
+
430
+ gr.HTML(pg_title)
431
+
432
+ with gr.Row():
433
+ with gr.Column(scale=2):
434
+ with gr.Accordion("Basic Settings"):
435
+ pg_custom = gr.Textbox(label="Custom Input Prompt (optional)")
436
+ pg_subject = gr.Textbox(label="Subject (optional)")
437
+ pg_gender = gr.Radio(["female", "male"], label="Gender", value="female")
438
+
439
+ # Add the radio button for global option selection
440
+ pg_global_option = gr.Radio(
441
+ ["Disabled", "Random", "No Figure Rand"],
442
+ label="Set all options to:",
443
+ value="Disabled"
444
+ )
445
+
446
+ with gr.Accordion("Artform and Photo Type", open=False):
447
+ pg_artform = gr.Dropdown(["disabled", "random"] + ARTFORM, label="Artform", value="disabled")
448
+ pg_photo_type = gr.Dropdown(["disabled", "random"] + PHOTO_TYPE, label="Photo Type", value="disabled")
449
+
450
+ with gr.Accordion("Character Details", open=False):
451
+ pg_body_types = gr.Dropdown(["disabled", "random"] + FEMALE_BODY_TYPES + MALE_BODY_TYPES, label="Body Types", value="disabled")
452
+ pg_default_tags = gr.Dropdown(["disabled", "random"] + FEMALE_DEFAULT_TAGS + MALE_DEFAULT_TAGS, label="Default Tags", value="disabled")
453
+ pg_roles = gr.Dropdown(["disabled", "random"] + ROLES, label="Roles", value="disabled")
454
+ pg_hairstyles = gr.Dropdown(["disabled", "random"] + HAIRSTYLES, label="Hairstyles", value="disabled")
455
+ pg_clothing = gr.Dropdown(["disabled", "random"] + FEMALE_CLOTHING + MALE_CLOTHING, label="Clothing", value="disabled")
456
+
457
+ with gr.Accordion("Scene Details", open=False):
458
+ pg_place = gr.Dropdown(["disabled", "random"] + PLACE, label="Place", value="disabled")
459
+ pg_lighting = gr.Dropdown(["disabled", "random"] + LIGHTING, label="Lighting", value="disabled")
460
+ pg_composition = gr.Dropdown(["disabled", "random"] + COMPOSITION, label="Composition", value="disabled")
461
+ pg_pose = gr.Dropdown(["disabled", "random"] + POSE, label="Pose", value="disabled")
462
+ pg_background = gr.Dropdown(["disabled", "random"] + BACKGROUND, label="Background", value="disabled")
463
+
464
+ with gr.Accordion("Style and Artist", open=False):
465
+ pg_additional_details = gr.Dropdown(["disabled", "random"] + FEMALE_ADDITIONAL_DETAILS + MALE_ADDITIONAL_DETAILS, label="Additional Details", value="disabled")
466
+ pg_photography_styles = gr.Dropdown(["disabled", "random"] + PHOTOGRAPHY_STYLES, label="Photography Styles", value="disabled")
467
+ pg_device = gr.Dropdown(["disabled", "random"] + DEVICE, label="Device", value="disabled")
468
+ pg_photographer = gr.Dropdown(["disabled", "random"] + PHOTOGRAPHER, label="Photographer", value="disabled")
469
+ pg_artist = gr.Dropdown(["disabled", "random"] + ARTIST, label="Artist", value="disabled")
470
+ pg_digital_artform = gr.Dropdown(["disabled", "random"] + DIGITAL_ARTFORM, label="Digital Artform", value="disabled")
471
+
472
+ pg_generate_button = gr.Button("Generate Prompt")
473
+
474
+ with gr.Column(scale=2):
475
+ with gr.Accordion("Image and Caption", open=False):
476
+ pg_input_image = gr.Image(label="Input Image (optional)")
477
+ pg_caption_output = gr.Textbox(label="Generated Caption", lines=3)
478
+ pg_create_caption_button = gr.Button("Create Caption")
479
+ pg_add_caption_button = gr.Button("Add Caption to Prompt")
480
+
481
+ with gr.Accordion("Prompt Generation", open=True):
482
+ pg_output = gr.Textbox(label="Generated Prompt / Input Text", lines=4)
483
+ pg_t5xxl_output = gr.Textbox(label="T5XXL Output", visible=True)
484
+ pg_clip_l_output = gr.Textbox(label="CLIP L Output", visible=True)
485
+ pg_clip_g_output = gr.Textbox(label="CLIP G Output", visible=True)
486
+
487
+ with gr.Column(scale=2):
488
+ with gr.Accordion("Prompt Generation with LLM", open=False):
489
+ pg_happy_talk = gr.Checkbox(label="Happy Talk", value=True)
490
+ pg_compress = gr.Checkbox(label="Compress", value=True)
491
+ pg_compression_level = gr.Radio(["soft", "medium", "hard"], label="Compression Level", value="hard")
492
+ pg_poster = gr.Checkbox(label="Poster", value=False)
493
+ pg_custom_base_prompt = gr.Textbox(label="Custom Base Prompt", lines=5)
494
+ pg_generate_text_button = gr.Button("Generate Prompt with LLM (Llama 3.1 70B)")
495
+ pg_text_output = gr.Textbox(label="Generated Text", lines=10)
496
+
497
+ def create_caption(image):
498
+ if image is not None:
499
+ return florence_caption(image)
500
+ return ""
501
+
502
+ pg_create_caption_button.click(
503
+ create_caption,
504
+ inputs=[pg_input_image],
505
+ outputs=[pg_caption_output]
506
+ )
507
+
508
+ def generate_prompt_with_dynamic_seed(*args):
509
+ # Generate a new random seed
510
+ dynamic_seed = random.randint(0, 1000000)
511
+
512
+ # Call the generate_prompt function with the dynamic seed
513
+ result = prompt_generator.generate_prompt(dynamic_seed, *args)
514
+
515
+ # Return the result along with the used seed
516
+ return [dynamic_seed] + list(result)
517
+
518
+ pg_generate_button.click(
519
+ generate_prompt_with_dynamic_seed,
520
+ inputs=[pg_custom, pg_subject, pg_gender, pg_artform, pg_photo_type, pg_body_types, pg_default_tags, pg_roles, pg_hairstyles,
521
+ pg_additional_details, pg_photography_styles, pg_device, pg_photographer, pg_artist, pg_digital_artform,
522
+ pg_place, pg_lighting, pg_clothing, pg_composition, pg_pose, pg_background, pg_input_image],
523
+ outputs=[gr.Number(label="Used Seed", visible=True), pg_output, gr.Number(visible=False), pg_t5xxl_output, pg_clip_l_output, pg_clip_g_output]
524
+ )
525
+
526
+ pg_add_caption_button.click(
527
+ prompt_generator.add_caption_to_prompt,
528
+ inputs=[pg_output, pg_caption_output],
529
+ outputs=[pg_output]
530
+ )
531
+
532
+ pg_generate_text_button.click(
533
+ huggingface_node.generate,
534
+ inputs=[pg_output, pg_happy_talk, pg_compress, pg_ompression_level, pg_poster, pg_custom_base_prompt],
535
+ outputs=pg_text_output
536
+ )
537
+
538
+ def update_all_options(choice):
539
+ updates = {}
540
+ if choice == "Disabled":
541
+ for dropdown in [
542
+ pg_artform, pg_photo_type, pg_body_types, pg_default_tags, pg_roles, pg_hairstyles, pg_clothing,
543
+ pg_place, pg_lighting, pg_composition, pg_pose, pg_background, pg_additional_details,
544
+ pg_photography_styles, device, pg_photographer, pg_artist, pg_digital_artform
545
+ ]:
546
+ updates[dropdown] = gr.update(value="disabled")
547
+ elif choice == "Random":
548
+ for dropdown in [
549
+ pg_artform, pg_photo_type, pg_body_types, pg_default_tags, pg_roles, pg_hairstyles, pg_clothing,
550
+ pg_place, pg_lighting, pg_composition, pg_pose, pg_background, pg_additional_details,
551
+ pg_photography_styles, pg_device, pg_photographer, pg_artist, pg_digital_artform
552
+ ]:
553
+ updates[dropdown] = gr.update(value="random")
554
+ else: # No Figure Random
555
+ for dropdown in [pg_photo_type, pg_body_types, pg_default_tags, pg_roles, pg_hairstyles, pg_clothing, pg_pose, pg_additional_details]:
556
+ updates[dropdown] = gr.update(value="disabled")
557
+ for dropdown in [pg_artform, pg_place, pg_lighting, pg_composition, pg_background, pg_photography_styles, device, pg_photographer, pg_artist, pg_digital_artform]:
558
+ updates[dropdown] = gr.update(value="random")
559
+ return updates
560
+
561
+ pg_global_option.change(
562
+ update_all_options,
563
+ inputs=[pg_global_option],
564
+ outputs=[
565
+ pg_artform, pg_photo_type, pg_body_types, pg_default_tags, pg_roles, pg_hairstyles, pg_clothing,
566
+ pg_place, pg_lighting, pg_composition, pg_pose, pg_background, pg_additional_details,
567
+ pg_photography_styles, pg_device, pg_photographer, pg_artist, pg_digital_artform
568
+ ]
569
+ )
570
+
571
+ return demo
572
+
573
+ if __name__ == "__main__":
574
+ demo = create_interface()
575
+ demo.launch()
prompts/A close-up movie still of a young woman with a mix.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ A close-up movie still of a young woman with a mix of determination and awe in her teary eyes, adorned in a worn metallic helmet with steampunk goggles dripping with water. Her olive skin is sprinkled with freckles and raindrops, and her expression is intense yet serene. Around her neck hangs a mysterious pendant, intricately crafted with metal filigree encasing a crystal sphere, reflecting a forest and amber hues of a twilight sky. The scene, bathed in soft blue and golden sunlight, features impeccable film grain and sharp focus elements, a merger of gritty realism with mystical allure.
prompts/A surreal movie still featuring a vibrant green tr.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ A surreal movie still featuring a vibrant green tree frog clinging to a leaf, adorned with glistening dew drops under dramatic diffused lighting. In the backdrop, a mystical woman with tan skin gazes towards an ethereal, fiery eclipse. Her long dark hair flows against a deep blue gown sparkling with starlit patterns. The scene merges dreamy aquatic and cosmic elements in a hyper-detailed, fantasy setting. The lighting is a soft bioluminescence contrasted by intense, fiery hues of the eclipse, captured with vivid, high-resolution imagery and a subtle film grain.
prompts/prompt_20240804_001736.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ A lone figure in a dark cloak stands solemnly in a vast, muddy field, staring at enormous, floating, mechanical octopus-like creatures with glowing yellow eyes. Nearby, a green tractor is half-submerged in mud. Blurred, misty grey clouds loom overhead, casting a dreary atmosphere. In the distance, a massive, ethereal tree with swirling branches glows brilliantly against a vibrant, magical sky filled with hues of purple, pink, and turquoise. The contrasting elements of muddy realism and fantastical colors create a surreal composition, capturing a moment of awe and mystery in a hyper-detailed movie still. The image has film grain and analog characteristics, with a low saturation for the muddy field and high saturation for the vibrant sky.
requirements.txt ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ spaces
2
+ git+https://github.com/huggingface/diffusers
3
+ torch
4
+ torchvision
5
+ huggingface_hub
6
+ accelerate
7
+ transformers
8
+ peft
9
+ sentencepiece
10
+ timm
11
+ einops
12
+ controlnet-aux
13
+ kornia
14
+ numpy
15
+ opencv-python
16
+ deepspeed
17
+ openai==1.37.0
tagger/character_series_dict.csv ADDED
The diff for this file is too large to render. See raw diff