Spaces:
Paused
Paused
| import gradio as gr | |
| import torch | |
| from diffusers import StableDiffusionImg2ImgPipeline | |
| from typing import List | |
| #StableDiffusionImg2ImgPipeline | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| model_id = "black-forest-labs/FLUX.1-dev" | |
| pipe = AutoPipelineForImage2Image.from_pretrained( | |
| model_id, | |
| torch_dtype=torch.float16 if device == "cuda" else torch.float32, | |
| safety_checker=None | |
| ).to(device) | |
| pipe.enable_attention_slicing() | |
| styles = { | |
| "Classic Ghibli": "ghibli style portrait", | |
| "Spirited Forest": "studio ghibli mystical forest portrait, soft lighting", | |
| "Windy Valley": "ghibli style sky valley portrait, dreamy atmosphere", | |
| "Cozy Home": "ghibli style cozy cottage scene, warm tones" | |
| } | |
| def generate_final_image( | |
| image: Image.Image, | |
| style_choice: str, | |
| steps: int, | |
| history: List[Image.Image], | |
| progress: gr.Progress = gr.Progress(track_tqdm=True) | |
| ) -> tuple: | |
| prompt = styles.get(style_choice, "ghibli style portrait") | |
| with torch.inference_mode(): | |
| output = pipe( | |
| prompt=prompt, | |
| image=image, | |
| strength=0.6, | |
| guidance_scale=6.5, | |
| num_inference_steps=steps | |
| ) | |
| final_image = output.images[0] | |
| return final_image, history + [final_image] | |
| # Rest of the Gradio interface code remains the same as previous version | |
| with gr.Blocks(theme=gr.themes.Soft()) as iface: | |
| gr.Markdown("## πΈ **Ghibli Portrait Generator β Spicy Edition** πΈ") | |
| gr.Markdown("Upload a photo and transform it into an anime scene in your favorite Ghibli style! π¬β¨") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| image_input = gr.Image(type="pil", label="πΈ Upload your photo", height=300) | |
| style_dropdown = gr.Dropdown( | |
| list(styles.keys()), | |
| label="π¨ Choose a Ghibli Style", | |
| value="Classic Ghibli" | |
| ) | |
| steps_slider = gr.Slider(10, 100, value=42, step=1, label="β¨ Inference Steps") | |
| generate_btn = gr.Button("π« Start Magic!", variant="primary") | |
| with gr.Column(scale=2): | |
| output_image = gr.Image(label="π Final Ghibli Portrait", height=500) | |
| with gr.Row(): | |
| download_btn = gr.Button("πΎ Download Final Image") | |
| clear_btn = gr.Button("π§Ή Clear History") | |
| with gr.Accordion("π Previous Generations", open=False): | |
| history_gallery = gr.Gallery( | |
| label="Your Ghibli Journey", | |
| columns=4, | |
| height="auto", | |
| object_fit="contain" | |
| ) | |
| history_state = gr.State([]) | |
| # Generation workflow | |
| generate_btn.click( | |
| generate_final_image, | |
| [image_input, style_dropdown, steps_slider, history_state], | |
| [output_image, history_state] | |
| ).then( | |
| lambda x: x[-4:], # Update gallery after generation | |
| history_state, | |
| history_gallery | |
| ) | |
| # Image selection from history | |
| history_gallery.select( | |
| lambda evt: evt, | |
| None, | |
| image_input | |
| ) | |
| # Download handler | |
| download_btn.click( | |
| lambda img: img, | |
| output_image, | |
| gr.File(label="β¬οΈ Your Ghibli Portrait") | |
| ) | |
| # Clear history | |
| clear_btn.click( | |
| lambda: [], | |
| None, | |
| history_state | |
| ).then( | |
| lambda: None, | |
| None, | |
| history_gallery | |
| ) | |
| iface.launch(share=True, debug=True) |