import gradio as gr
import spaces
import torch
from diffusers import NewbiePipeline
from transformers import AutoModel
import random
import warnings
warnings.filterwarnings("ignore")
# 优化:使用 float16 以获得更好的 GPU 性能和内存效率
torch_dtype = torch.float16
model_path = "Disty0/NewBie-image-Exp0.1-Diffusers"
print("正在加载 Text Encoder...")
text_encoder_2 = AutoModel.from_pretrained(
model_path,
subfolder="text_encoder_2",
trust_remote_code=True,
torch_dtype=torch_dtype
)
print("正在加载 Pipeline...")
# 优化:使用 EulerDiscreteScheduler 替代 DPMSolver,因为 DPMSolver 与 NewBiePipeline 不兼容
pipe_newbie = NewbiePipeline.from_pretrained(
model_path,
text_encoder_2=text_encoder_2,
torch_dtype=torch_dtype
)
# 优化:使用 EulerDiscreteScheduler,它与 NewBiePipeline 兼容
pipe_newbie.scheduler = pipe_newbie.scheduler
pipe_newbie.to("cuda")
print("模型加载完成。")
@spaces.GPU()
def generate_image_newbie(prompt, negative_prompt, height, width, num_inference_steps, guidance_scale, seed, progress=gr.Progress(track_tqdm=True)):
if seed < 0:
seed = random.randint(0, 2**32 - 1)
generator = torch.Generator("cuda").manual_seed(int(seed))
# 优化:减少推理步数以加快生成速度,同时保持质量
image = pipe_newbie(
prompt=prompt,
negative_prompt=negative_prompt,
height=int(height),
width=int(width),
num_inference_steps=min(num_inference_steps, 25), # 限制最大步数以加快速度
guidance_scale=guidance_scale,
generator=generator,
# 优化:启用内存高效模式
output_type="pil"
).images[0]
return image, seed
# 默认提示词
newbie_prompt = """
$character_1$
1girl, solo
blonde_hair, long_hair
large_hat, white_hat, white_blouse, puffy_sleeves, shoulder_cutout, black_skirt, shirt_tucked_in, socks, shoes
looking_up
sitting, reclining, arm_support, from_side, cowboy_shot, wide_shot
center
1girl
(kazutake hazano:1.2), (kazutake hazano:0.5), (onineko:0.8), (r17329 illu:0.2), (ma1ma1helmes b illu:0.2)
detailed_background, scenery, detailed_background
cheerful
dynamic_angle, depth_of_field, high_contrast, colorful, detailed_light, light_leaks, beautiful_detailed_glow, best_shadow, shiny_skin, cinematic_lighting, ray_tracing, from_above, female_focus, close-up, dutch_angle, blue_archive
very_aesthetic, masterpiece, no_text
bag
2024_year
"""
with gr.Blocks(title="NewBie 图像生成器") as demo:
gr.Markdown("# NewBie 图像生成器 (NewBie Image Generator)")
gr.Markdown("使用 NewBie 模型生成高质量动漫风格图像。")
with gr.Row(variant="panel"):
with gr.Column(scale=2):
prompt_newbie = gr.Textbox(
label="提示词 (Prompt)",
value=newbie_prompt,
lines=10,
placeholder="在此输入生成提示词..."
)
negative_prompt_newbie = gr.Textbox(
label="负面提示词 (Negative Prompt)",
value="low quality, bad quality, blurry, low resolution, deformed, ugly, bad anatomy",
lines=3,
placeholder="在此输入不需要出现的元素..."
)
with gr.Row():
height_newbie = gr.Slider(label="图片高度 (Height)", minimum=512, maximum=1024, step=64, value=768) # 优化:降低默认分辨率以加快速度
width_newbie = gr.Slider(label="图片宽度 (Width)", minimum=512, maximum=1024, step=64, value=768) # 优化:降低默认分辨率以加快速度
with gr.Row():
steps_newbie = gr.Slider(label="推理步数 (Inference Steps)", minimum=5, maximum=50, step=1, value=20) # 优化:减少默认步数
guidance_scale_newbie = gr.Slider(label="引导系数 (Guidance Scale)", minimum=1.0, maximum=10.0, step=0.1, value=5.0) # 优化:调整默认值
seed_newbie = gr.Number(label="随机种子 (Seed, -1 为随机)", value=-1, precision=0)
generate_btn_newbie = gr.Button("生成图片 (Generate)", variant="primary")
with gr.Column(scale=1):
image_output_newbie = gr.Image(label="生成结果 (Output)", format="png", interactive=False)
used_seed_newbie = gr.Number(label="使用的种子 (Used Seed)", interactive=False)
progress_bar = gr.Textbox(label="生成进度", interactive=False, value="准备就绪...")
generate_btn_newbie.click(
fn=generate_image_newbie,
inputs=[
prompt_newbie,
negative_prompt_newbie,
height_newbie,
width_newbie,
steps_newbie,
guidance_scale_newbie,
seed_newbie
],
outputs=[image_output_newbie, used_seed_newbie]
)
if __name__ == "__main__":
demo.launch(
theme=gr.themes.Soft(primary_hue="blue"),
footer_links=[{"label": "Built with anycoder", "url": "https://huggingface.co/spaces/akhaliq/anycoder"}],
share=True # 添加 share=True 以创建公共链接
)