Spaces:
Running
Running
| import gradio as gr | |
| import torch | |
| import numpy as np | |
| import random | |
| from diffusers import StableDiffusionImg2ImgPipeline | |
| from PIL import Image | |
| dtype = torch.float16 | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| MAX_SEED = np.iinfo(np.int32).max | |
| MODEL_ID = "runwayml/stable-diffusion-v1-5" | |
| STYLES = { | |
| "Anime": { | |
| "prompt": "anime style portrait, detailed face, vibrant colors, high quality, studio ghibli" | |
| }, | |
| "Pixel Art": { | |
| "prompt": "pixel art avatar, 16-bit style, retro game character, sharp pixels" | |
| }, | |
| "Ghibli": { | |
| "prompt": "ghibli studio style illustration, soft colors, dreamy atmosphere, watercolor" | |
| }, | |
| } | |
| print("Chargement du modèle...") | |
| pipe = StableDiffusionImg2ImgPipeline.from_pretrained( | |
| MODEL_ID, | |
| torch_dtype=dtype, | |
| safety_checker=None | |
| ) | |
| pipe.to(device) | |
| print("Modèle chargé !") | |
| def generate_avatar( | |
| input_image, | |
| style_name, | |
| strength, | |
| seed, | |
| randomize_seed, | |
| progress=gr.Progress(track_tqdm=True) | |
| ): | |
| if input_image is None: | |
| raise gr.Error("Veuillez uploader une photo !") | |
| if randomize_seed: | |
| seed = random.randint(0, MAX_SEED) | |
| generator = torch.Generator(device=device).manual_seed(seed) | |
| prompt = STYLES[style_name]["prompt"] | |
| input_image = input_image.resize((512, 512)) | |
| result = pipe( | |
| prompt=prompt, | |
| image=input_image, | |
| strength=strength, | |
| num_inference_steps=20, | |
| guidance_scale=7.5, | |
| generator=generator, | |
| ).images[0] | |
| return (input_image, result), seed | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Avatar Generator — Transformez votre photo en personnage") | |
| with gr.Row(): | |
| with gr.Column(): | |
| input_img = gr.Image(label="Votre photo", type="pil") | |
| style = gr.Radio( | |
| choices=list(STYLES.keys()), | |
| label="Style d'avatar", | |
| value="Anime" | |
| ) | |
| strength = gr.Slider( | |
| label="Intensité du style", | |
| minimum=0.3, maximum=0.95, | |
| step=0.05, value=0.7, | |
| info="Bas = garde votre visage, Haut = stylisation forte" | |
| ) | |
| with gr.Accordion("Paramètres avancés", open=False): | |
| seed = gr.Slider(0, MAX_SEED, step=1, value=42, label="Seed") | |
| randomize_seed = gr.Checkbox(label="Seed aléatoire", value=True) | |
| btn = gr.Button("Générer mon avatar", variant="primary") | |
| result_slider = gr.ImageSlider(label="Avant / Après", type="pil") | |
| seed_out = gr.Number(label="Seed utilisé", visible=False) | |
| btn.click( | |
| fn=generate_avatar, | |
| inputs=[input_img, style, strength, seed, randomize_seed], | |
| outputs=[result_slider, seed_out] | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() |