File size: 9,437 Bytes
383d266
625f4fd
383d266
625f4fd
 
383d266
 
625f4fd
383d266
625f4fd
 
383d266
 
 
 
625f4fd
9d07790
 
 
383d266
 
41aa3b4
625f4fd
383d266
 
 
625f4fd
383d266
 
625f4fd
383d266
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
625f4fd
383d266
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
625f4fd
229b64d
625f4fd
046dcee
229b64d
046dcee
229b64d
046dcee
229b64d
046dcee
229b64d
046dcee
229b64d
046dcee
383d266
 
 
 
 
 
625f4fd
41aa3b4
d66b6dc
 
 
 
 
625f4fd
d66b6dc
383d266
 
 
625f4fd
383d266
 
 
 
 
 
625f4fd
383d266
 
9d07790
 
 
 
 
 
383d266
 
 
 
 
 
625f4fd
383d266
625f4fd
383d266
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
625f4fd
 
383d266
 
 
 
 
 
 
 
 
625f4fd
383d266
625f4fd
 
383d266
 
 
625f4fd
383d266
 
 
 
625f4fd
 
383d266
 
 
 
 
 
 
 
 
 
 
 
 
 
625f4fd
 
383d266
f6b5d39
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
import random
import os
import uuid
from datetime import datetime
import gradio as gr
import numpy as np
import spaces
import torch
from diffusers import DiffusionPipeline
from PIL import Image

# Create permanent storage directory
SAVE_DIR = "saved_images"  # Gradio will handle the persistence
if not os.path.exists(SAVE_DIR):
    os.makedirs(SAVE_DIR, exist_ok=True)

# Load the default image
DEFAULT_IMAGE_PATH = "cover1.webp"

device = "cuda" if torch.cuda.is_available() else "cpu"
repo_id = "black-forest-labs/FLUX.1-dev"
adapter_id = "strangerzonehf/Ctoon-Plus-Plus"

pipeline = DiffusionPipeline.from_pretrained(repo_id, torch_dtype=torch.bfloat16)
pipeline.load_lora_weights(adapter_id)
pipeline = pipeline.to(device)

MAX_SEED = np.iinfo(np.int32).max
MAX_IMAGE_SIZE = 1024

def save_generated_image(image, prompt):
    # Generate unique filename with timestamp
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    unique_id = str(uuid.uuid4())[:8]
    filename = f"{timestamp}_{unique_id}.png"
    filepath = os.path.join(SAVE_DIR, filename)
    
    # Save the image
    image.save(filepath)
    
    # Save metadata
    metadata_file = os.path.join(SAVE_DIR, "metadata.txt")
    with open(metadata_file, "a", encoding="utf-8") as f:
        f.write(f"{filename}|{prompt}|{timestamp}\n")
    
    return filepath

def load_generated_images():
    if not os.path.exists(SAVE_DIR):
        return []
    
    # Load all images from the directory
    image_files = [os.path.join(SAVE_DIR, f) for f in os.listdir(SAVE_DIR) 
                  if f.endswith(('.png', '.jpg', '.jpeg', '.webp'))]
    # Sort by creation time (newest first)
    image_files.sort(key=lambda x: os.path.getctime(x), reverse=True)
    return image_files

def load_predefined_images():
    # Return empty list since we're not using predefined images
    return []

@spaces.GPU(duration=120)
def inference(
    prompt: str,
    seed: int,
    randomize_seed: bool,
    width: int,
    height: int,
    guidance_scale: float,
    num_inference_steps: int,
    lora_scale: float,
    progress: gr.Progress = gr.Progress(track_tqdm=True),
):
    if randomize_seed:
        seed = random.randint(0, MAX_SEED)
    generator = torch.Generator(device=device).manual_seed(seed)
    
    image = pipeline(
        prompt=prompt,
        guidance_scale=guidance_scale,
        num_inference_steps=num_inference_steps,
        width=width,
        height=height,
        generator=generator,
        joint_attention_kwargs={"scale": lora_scale},
    ).images[0]
    
    # Save the generated image
    filepath = save_generated_image(image, prompt)
    
    # Return the image, seed, and updated gallery
    return image, seed, load_generated_images()


examples = [
   "A cartoon drawing of a majestic Persian cat wearing a tiny golden hanbok and crown. The cat has sparkling blue eyes and perfectly groomed white fur that seems to glow. It sits with regal posture on a traditional Korean cushion decorated with cloud patterns. The background is a soft pink with delicate cherry blossom petals floating around. The cat's expression shows a mix of dignity and subtle amusement. [trigger]",
   
   "A cartoon drawing of an enthusiastic orange tabby cat in a puffy white chef's hat. The cat stands on its hind legs at a tiny wooden counter, wearing a white apron covered in flour pawprints. Its green eyes are focused intently on the cookie dough it's rolling with a miniature rolling pin. The background is a warm cream color with tiny floating cooking utensils and swirling steam patterns. [trigger]",
   
   "A cartoon drawing of a sophisticated tuxedo cat photographer with round wire-rimmed glasses perched on its nose. The cat balances carefully on a tree branch, one paw holding a vintage camera while its tail curls in concentration. It wears a tiny brown beret and leather camera bag. The background is a soft blue with playful butterfly silhouettes and floating leaves. [trigger]",
   
   "A cartoon drawing of a chubby Scottish Fold cat floating in a space capsule. The cat wears an adorable white spacesuit with colorful patches, its round face visible through the helmet visor. Its paws are batting at star-shaped toys that float around in zero gravity. The background shows a stylized view of Earth and twinkling stars through the capsule window. [trigger]",
   
   "A cartoon drawing of an elegant Siamese ballet dancer cat in mid-twirl. The cat wears a sparkly pink tutu that flares out perfectly, with tiny satin ribbons wrapped around its ankles. Its blue eyes are closed in graceful concentration as it performs a pirouette. The background is a soft lavender with swirling musical notes and floating rose petals. [trigger]",
   
   "A cartoon drawing of an adventurous calico cat riding atop a smiling elephant. The cat wears a tiny khaki explorer's vest filled with equipment, and a safari hat tilted at a jaunty angle. It holds a comically large map while the elephant's trunk curls up playfully. The background is a warm orange sunset with stylized acacia trees and cartoon birds soaring past. [trigger]"
]
css = """
footer {
    visibility: hidden;
}
"""

with gr.Blocks(theme=gr.themes.Soft(), css=css, analytics_enabled=False) as demo:
    gr.HTML('<div class="title"> Cartoon Image Generation </div>')
    
    gr.HTML("""<a href="https://visitorbadge.io/status?path=https%3A%2F%2Fginigen-cartoon.hf.space">
               <img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fginigen-cartoon.hf.space&countColor=%23263759" />
               </a>""")

    
    with gr.Tabs() as tabs:
        with gr.Tab("Generation"):
            with gr.Column(elem_id="col-container"):
                with gr.Row():
                    prompt = gr.Text(
                        label="Prompt",
                        show_label=False,
                        max_lines=1,
                        placeholder="Enter your prompt",
                        container=False,
                    )
                    run_button = gr.Button("Run", scale=0)

                # Modified to include the default image
                result = gr.Image(
                    label="Result",
                    show_label=False,
                    value=DEFAULT_IMAGE_PATH  # Set the default image
                )

                with gr.Accordion("Advanced Settings", open=False):
                    seed = gr.Slider(
                        label="Seed",
                        minimum=0,
                        maximum=MAX_SEED,
                        step=1,
                        value=42,
                    )
                    randomize_seed = gr.Checkbox(label="Randomize seed", value=True)

                    with gr.Row():
                        width = gr.Slider(
                            label="Width",
                            minimum=256,
                            maximum=MAX_IMAGE_SIZE,
                            step=32,
                            value=1024,
                        )
                        height = gr.Slider(
                            label="Height",
                            minimum=256,
                            maximum=MAX_IMAGE_SIZE,
                            step=32,
                            value=768,
                        )

                    with gr.Row():
                        guidance_scale = gr.Slider(
                            label="Guidance scale",
                            minimum=0.0,
                            maximum=10.0,
                            step=0.1,
                            value=3.5,
                        )
                        num_inference_steps = gr.Slider(
                            label="Number of inference steps",
                            minimum=1,
                            maximum=50,
                            step=1,
                            value=30,
                        )
                        lora_scale = gr.Slider(
                            label="LoRA scale",
                            minimum=0.0,
                            maximum=1.0,
                            step=0.1,
                            value=1.0,
                        )

                gr.Examples(
                    examples=examples,
                    inputs=[prompt],
                    outputs=[result, seed],
                )

        with gr.Tab("Gallery"):
            gallery_header = gr.Markdown("### Generated Images Gallery")
            generated_gallery = gr.Gallery(
                label="Generated Images",
                columns=6,
                show_label=False,
                value=load_generated_images(),
                elem_id="generated_gallery",
                height="auto"
            )
            refresh_btn = gr.Button("🔄 Refresh Gallery")


    # Event handlers
    def refresh_gallery():
        return load_generated_images()

    refresh_btn.click(
        fn=refresh_gallery,
        inputs=None,
        outputs=generated_gallery,
    )

    gr.on(
        triggers=[run_button.click, prompt.submit],
        fn=inference,
        inputs=[
            prompt,
            seed,
            randomize_seed,
            width,
            height,
            guidance_scale,
            num_inference_steps,
            lora_scale,
        ],
        outputs=[result, seed, generated_gallery],
    )

demo.queue()
demo.launch(ssr_mode=False)