Spaces:
Running
on
Zero
Running
on
Zero
File size: 6,176 Bytes
6001e3c 6bc9074 e845246 8ee496d 922fdb6 6bc9074 6001e3c ee973ae acd2b67 e845246 6bc9074 ee973ae 922fdb6 70f555c 922fdb6 223ef25 ee973ae 70f555c ee973ae 70f555c a261e74 70f555c 223ef25 ee973ae 5de7ece 70f555c 922fdb6 70f555c 5f6ee41 70f555c 922fdb6 8c7013a 70f555c 5f6ee41 8c7013a 70f555c ee973ae 70f555c 8c7013a ee973ae 70f555c 78d4203 ee973ae 70f555c ee973ae 70f555c ee973ae 70f555c ee973ae 70f555c ee973ae 70f555c ee973ae 70f555c ee973ae 70f555c ee973ae 70f555c ee973ae 70f555c ee973ae 70f555c ee973ae 70f555c 6bc9074 70f555c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
import gradio as gr
import spaces
import torch
import os
from compel import Compel, ReturnedEmbeddingsType
from diffusers import DiffusionPipeline
# Load model
model_name = os.environ.get('MODEL_NAME', 'UnfilteredAI/NSFW-gen-v2.1')
pipe = DiffusionPipeline.from_pretrained(
model_name,
torch_dtype=torch.float16
)
pipe.to('cuda')
# Compel setup
compel = Compel(
tokenizer=[pipe.tokenizer, pipe.tokenizer_2],
text_encoder=[pipe.text_encoder, pipe.text_encoder_2],
returned_embeddings_type=ReturnedEmbeddingsType.PENULTIMATE_HIDDEN_STATES_NON_NORMALIZED,
requires_pooled=[False, True]
)
# Default negative prompt
default_negative_prompt = "(low quality, worst quality:1.2), very displeasing, 3d, watermark, signature, ugly, poorly drawn, (deformed | distorted | disfigured:1.3), bad anatomy, wrong anatomy, extra limb, missing limb, floating limbs, mutated hands and fingers:1.4, disconnected limbs, blurry, amputation."
# Example prompts
example_prompts = [
["a beautiful 19 aged rusian girl in a summer dress at the beach, golden sunset, professional photography, 8k", default_negative_prompt, 40, 7.5, 1024, 1024, 4],
["a beautiful japan woman in a vikini at the beach, noon sunset, professional photography, 8k", default_negative_prompt, 45, 7.0, 1024, 1024, 4],
]
# Image generation function
@spaces.GPU(duration=120)
def generate(prompt, negative_prompt, num_inference_steps, guidance_scale, width, height, num_samples, progress=gr.Progress()):
progress(0, desc="Preparing")
embeds, pooled = compel(prompt)
neg_embeds, neg_pooled = compel(negative_prompt)
progress(0.1, desc="Generating images")
# Define proper callback for step end
def callback_on_step_end(pipe, i, t, callback_kwargs):
progress((i + 1) / num_inference_steps)
return callback_kwargs
images = pipe(
prompt_embeds=embeds,
pooled_prompt_embeds=pooled,
negative_prompt_embeds=neg_embeds,
negative_pooled_prompt_embeds=neg_pooled,
num_inference_steps=num_inference_steps,
guidance_scale=guidance_scale,
width=width,
height=height,
num_images_per_prompt=num_samples,
callback_on_step_end=callback_on_step_end
).images
return images
# CSS styles
css = """
.gallery-item {
transition: transform 0.2s;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
border-radius: 10px;
}
.gallery-item:hover {
transform: scale(1.03);
box-shadow: 0 8px 16px rgba(0,0,0,0.2);
}
.container {
max-width: 1200px;
margin: auto;
}
.header {
text-align: center;
margin-bottom: 2rem;
padding: 1rem;
background: linear-gradient(90deg, rgba(76,0,161,0.8) 0%, rgba(28,110,164,0.8) 100%);
border-radius: 10px;
color: white;
}
.slider-container {
background-color: #f5f5f5;
padding: 1rem;
border-radius: 10px;
margin-bottom: 1rem;
}
.prompt-container {
background-color: #f0f8ff;
padding: 1rem;
border-radius: 10px;
margin-bottom: 1rem;
border: 1px solid #d0e8ff;
}
.examples-header {
background: linear-gradient(90deg, rgba(41,128,185,0.7) 0%, rgba(142,68,173,0.7) 100%);
color: white;
padding: 0.5rem;
border-radius: 8px;
text-align: center;
margin-bottom: 0.5rem;
}
"""
# Gradio interface
with gr.Blocks(css=css, theme=gr.themes.Soft()) as demo:
gr.HTML("""
<div class="header">
<h1>🎨 Unfiltered AI NSFW Image Generator</h1>
<p>Enter creative prompts and generate high-quality images.</p>
</div>
""")
with gr.Row():
with gr.Column(scale=2):
with gr.Group(elem_classes="prompt-container"):
prompt = gr.Textbox(label="Prompt", placeholder="Describe your desired image...", lines=3)
negative_prompt = gr.Textbox(
label="Negative Prompt",
value=default_negative_prompt,
lines=3
)
with gr.Group(elem_classes="slider-container"):
with gr.Row():
with gr.Column():
steps = gr.Slider(minimum=20, maximum=100, value=60, step=1, label="Inference Steps (Quality)", info="Higher values improve quality (longer generation time)")
guidance = gr.Slider(minimum=1, maximum=15, value=7, step=0.1, label="Guidance Scale (Creativity)", info="Lower values create more creative results")
with gr.Column():
with gr.Row():
width = gr.Slider(minimum=512, maximum=1536, value=1024, step=128, label="Width")
height = gr.Slider(minimum=512, maximum=1536, value=1024, step=128, label="Height")
num_samples = gr.Slider(minimum=1, maximum=8, value=4, step=1, label="Number of Images", info="Number of images to generate at once")
generate_btn = gr.Button("🚀 Generate Images", variant="primary", size="lg")
with gr.Column(scale=3):
output_gallery = gr.Gallery(label="Generated Images", elem_classes="gallery-item", columns=2, object_fit="contain", height=650)
gr.HTML("""<div class="examples-header"><h3>✨ Example Prompts</h3></div>""")
gr.Examples(
examples=example_prompts,
inputs=[prompt, negative_prompt, steps, guidance, width, height, num_samples],
outputs=output_gallery,
fn=generate,
cache_examples=True,
)
# Event connections
generate_btn.click(
fn=generate,
inputs=[prompt, negative_prompt, steps, guidance, width, height, num_samples],
outputs=output_gallery
)
gr.HTML("""
<div style="text-align: center; margin-top: 20px; padding: 10px; background-color: #f0f0f0; border-radius: 10px;">
<p>💡 Tip: For high-quality images, use detailed prompts and higher inference steps.</p>
<p>Example: Add quality terms like "professional photography, 8k, highly detailed, sharp focus, HDR" to your prompts.</p>
</div>
""")
demo.launch() |