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()