Update app.py
Browse files
app.py
CHANGED
@@ -245,22 +245,50 @@ if not torch.cuda.is_available():
|
|
245 |
MAX_SEED = np.iinfo(np.int32).max
|
246 |
MAX_IMAGE_SIZE = 2048
|
247 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
248 |
if torch.cuda.is_available():
|
249 |
vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16)
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
264 |
|
265 |
def randomize_seed_fn(seed: int, randomize_seed: bool) -> int:
|
266 |
if randomize_seed:
|
@@ -279,11 +307,18 @@ def infer(
|
|
279 |
num_inference_steps: int = 30,
|
280 |
randomize_seed: bool = True,
|
281 |
use_resolution_binning: bool = True,
|
|
|
282 |
progress=gr.Progress(track_tqdm=True),
|
283 |
):
|
|
|
|
|
|
|
|
|
|
|
284 |
seed = int(randomize_seed_fn(seed, randomize_seed))
|
285 |
generator = torch.Generator().manual_seed(seed)
|
286 |
-
|
|
|
287 |
compel = Compel(
|
288 |
tokenizer=[pipe.tokenizer, pipe.tokenizer_2],
|
289 |
text_encoder=[pipe.text_encoder, pipe.text_encoder_2],
|
@@ -291,18 +326,17 @@ def infer(
|
|
291 |
requires_pooled=[False, True],
|
292 |
truncate_long_prompts=False
|
293 |
)
|
|
|
294 |
# Store the original prompt before processing
|
295 |
original_prompt_text = prompt
|
296 |
|
297 |
-
# 在 infer 函数中调用 get_embed_new
|
298 |
if not use_negative_prompt:
|
299 |
negative_prompt = ""
|
300 |
|
301 |
processed_prompt = get_embed_new(prompt, pipe, compel, only_convert_string=True)
|
302 |
processed_negative_prompt = get_embed_new(negative_prompt, pipe, compel, only_convert_string=True)
|
303 |
-
conditioning, pooled = compel([processed_prompt, processed_negative_prompt]) #
|
304 |
|
305 |
-
# 在调用 pipe 时,使用新的参数名称(确保参数名称正确)
|
306 |
image = pipe(
|
307 |
prompt_embeds=conditioning[0:1],
|
308 |
pooled_prompt_embeds=pooled[0:1],
|
@@ -326,7 +360,7 @@ def infer(
|
|
326 |
"height": height,
|
327 |
"guidance_scale": guidance_scale,
|
328 |
"num_inference_steps": num_inference_steps,
|
329 |
-
"model":
|
330 |
"use_resolution_binning": use_resolution_binning,
|
331 |
"PreUrl": "https://huggingface.co/spaces/Menyu/NaixlMix"
|
332 |
}
|
@@ -348,7 +382,7 @@ h1{text-align:center}
|
|
348 |
|
349 |
with gr.Blocks(css=css) as demo:
|
350 |
gr.Markdown("""# 梦羽的模型生成器
|
351 |
-
### 快速生成
|
352 |
with gr.Group():
|
353 |
with gr.Row():
|
354 |
prompt = gr.Text(
|
@@ -361,6 +395,11 @@ with gr.Blocks(css=css) as demo:
|
|
361 |
run_button = gr.Button("生成", scale=0, variant="primary")
|
362 |
result = gr.Image(label="Result", show_label=False, format="png")
|
363 |
with gr.Accordion("高级选项", open=False):
|
|
|
|
|
|
|
|
|
|
|
364 |
with gr.Row():
|
365 |
use_negative_prompt = gr.Checkbox(label="使用反向词条", value=True)
|
366 |
negative_prompt = gr.Text(
|
@@ -414,7 +453,7 @@ with gr.Blocks(css=css) as demo:
|
|
414 |
examples=examples,
|
415 |
inputs=prompt,
|
416 |
outputs=[result, seed],
|
417 |
-
fn=infer
|
418 |
)
|
419 |
|
420 |
use_negative_prompt.change(
|
@@ -436,6 +475,8 @@ with gr.Blocks(css=css) as demo:
|
|
436 |
guidance_scale,
|
437 |
num_inference_steps,
|
438 |
randomize_seed,
|
|
|
|
|
439 |
],
|
440 |
outputs=[result, seed],
|
441 |
)
|
|
|
245 |
MAX_SEED = np.iinfo(np.int32).max
|
246 |
MAX_IMAGE_SIZE = 2048
|
247 |
|
248 |
+
# Define available models
|
249 |
+
AVAILABLE_MODELS = {
|
250 |
+
"NaixlMmmmix v50": "naixlMmmmix_v50.safetensors",
|
251 |
+
"Miaomiao": "miaomiao.safetensors",
|
252 |
+
# Add more models here as needed
|
253 |
+
}
|
254 |
+
|
255 |
+
# Global variable to store the loaded model and pipeline
|
256 |
+
loaded_model = None
|
257 |
+
pipe = None
|
258 |
+
vae = None
|
259 |
+
|
260 |
+
# Initialize VAE
|
261 |
if torch.cuda.is_available():
|
262 |
vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16)
|
263 |
+
|
264 |
+
def load_model(model_name):
|
265 |
+
global pipe, loaded_model
|
266 |
+
|
267 |
+
# If the requested model is already loaded, return the existing pipeline
|
268 |
+
if loaded_model == model_name and pipe is not None:
|
269 |
+
return pipe
|
270 |
+
|
271 |
+
if torch.cuda.is_available():
|
272 |
+
model_filename = AVAILABLE_MODELS[model_name]
|
273 |
+
model_path = hf_hub_download(
|
274 |
+
repo_id="Menyu/ModelFile",
|
275 |
+
filename=model_filename
|
276 |
+
)
|
277 |
+
|
278 |
+
pipe = StableDiffusionXLPipeline.from_single_file(
|
279 |
+
model_path,
|
280 |
+
vae=vae,
|
281 |
+
use_safetensors=True,
|
282 |
+
torch_dtype=torch.float16,
|
283 |
+
)
|
284 |
+
pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)
|
285 |
+
pipe.to("cuda")
|
286 |
+
|
287 |
+
# Update the loaded model name
|
288 |
+
loaded_model = model_name
|
289 |
+
|
290 |
+
return pipe
|
291 |
+
return None
|
292 |
|
293 |
def randomize_seed_fn(seed: int, randomize_seed: bool) -> int:
|
294 |
if randomize_seed:
|
|
|
307 |
num_inference_steps: int = 30,
|
308 |
randomize_seed: bool = True,
|
309 |
use_resolution_binning: bool = True,
|
310 |
+
model_name: str = "NaixlMmmmix v50",
|
311 |
progress=gr.Progress(track_tqdm=True),
|
312 |
):
|
313 |
+
# Load the selected model
|
314 |
+
pipe = load_model(model_name)
|
315 |
+
if pipe is None:
|
316 |
+
return None, seed
|
317 |
+
|
318 |
seed = int(randomize_seed_fn(seed, randomize_seed))
|
319 |
generator = torch.Generator().manual_seed(seed)
|
320 |
+
|
321 |
+
# Initialize Compel instance
|
322 |
compel = Compel(
|
323 |
tokenizer=[pipe.tokenizer, pipe.tokenizer_2],
|
324 |
text_encoder=[pipe.text_encoder, pipe.text_encoder_2],
|
|
|
326 |
requires_pooled=[False, True],
|
327 |
truncate_long_prompts=False
|
328 |
)
|
329 |
+
|
330 |
# Store the original prompt before processing
|
331 |
original_prompt_text = prompt
|
332 |
|
|
|
333 |
if not use_negative_prompt:
|
334 |
negative_prompt = ""
|
335 |
|
336 |
processed_prompt = get_embed_new(prompt, pipe, compel, only_convert_string=True)
|
337 |
processed_negative_prompt = get_embed_new(negative_prompt, pipe, compel, only_convert_string=True)
|
338 |
+
conditioning, pooled = compel([processed_prompt, processed_negative_prompt]) # Process both to ensure equal length
|
339 |
|
|
|
340 |
image = pipe(
|
341 |
prompt_embeds=conditioning[0:1],
|
342 |
pooled_prompt_embeds=pooled[0:1],
|
|
|
360 |
"height": height,
|
361 |
"guidance_scale": guidance_scale,
|
362 |
"num_inference_steps": num_inference_steps,
|
363 |
+
"model": model_name,
|
364 |
"use_resolution_binning": use_resolution_binning,
|
365 |
"PreUrl": "https://huggingface.co/spaces/Menyu/NaixlMix"
|
366 |
}
|
|
|
382 |
|
383 |
with gr.Blocks(css=css) as demo:
|
384 |
gr.Markdown("""# 梦羽的模型生成器
|
385 |
+
### 快速生成AI模型的图片""")
|
386 |
with gr.Group():
|
387 |
with gr.Row():
|
388 |
prompt = gr.Text(
|
|
|
395 |
run_button = gr.Button("生成", scale=0, variant="primary")
|
396 |
result = gr.Image(label="Result", show_label=False, format="png")
|
397 |
with gr.Accordion("高级选项", open=False):
|
398 |
+
model_selector = gr.Dropdown(
|
399 |
+
label="选择模型",
|
400 |
+
choices=list(AVAILABLE_MODELS.keys()),
|
401 |
+
value="NaixlMmmmix v50"
|
402 |
+
)
|
403 |
with gr.Row():
|
404 |
use_negative_prompt = gr.Checkbox(label="使用反向词条", value=True)
|
405 |
negative_prompt = gr.Text(
|
|
|
453 |
examples=examples,
|
454 |
inputs=prompt,
|
455 |
outputs=[result, seed],
|
456 |
+
fn=lambda x: infer(x, model_name=model_selector.value)
|
457 |
)
|
458 |
|
459 |
use_negative_prompt.change(
|
|
|
475 |
guidance_scale,
|
476 |
num_inference_steps,
|
477 |
randomize_seed,
|
478 |
+
gr.Checkbox(value=True, visible=False, label="use_resolution_binning"), # Hidden default value
|
479 |
+
model_selector,
|
480 |
],
|
481 |
outputs=[result, seed],
|
482 |
)
|