Accéder au contenu principal

Tutoriel FLUX.2 Klein : Développement d'une application de génération et d'édition d'images avec Gradio

Découvrez comment associer la génération locale FLUX.2 Klein 4B à l'édition d'images basée sur l'API, au conditionnement multi-références et à l'historique des sessions pour créer un éditeur d'images avec Gradio.
Actualisé 3 févr. 2026  · 14 min lire

FLUX.2 Klein est conçu pour les flux de travail rapides et interactifs liés à l'image, où vous pouvez générer, affiner et itérer avec un temps de latence minimal. Dans ce tutoriel, j'utiliserai FLUX.2 Klein 4B pour créer une application légère de « génération et édition » dans Google Colab avec Gradio

Dans l'application, l'utilisateur commence par saisir une invite de génération afin de créer une image de base, puis fournit une instruction de modification avec des images de référence facultatives pour guider la modification. Chaque version est enregistrée dans l'historique de session, ce qui permet à l'utilisateur de recharger n'importe quelle sortie antérieure et de poursuivre ses expériences à partir de ce point.

Le résultat est un éditeur interactif qui met en avant une itération rapide, une édition d'images fiable et un flux de travail basé sur l'historique, plus proche d'une expérience produit réelle que d'un appel de modèle.

Je vous recommande également de consulter notre tutoriel de base FLUX.2 et notre guide sur l'exécution de FLUX.2 en local

Qu'est-ce que FLUX.2 [klein] 4B ?

FLUX.2 est une famille de modèles d'image adaptés à différents compromis. Il comprend plusieurs variantes optimisées pour différents niveaux de qualité, de vitesse et de flexibilité. La gamme FLUX.2 Klein met l'accent sur l'intelligence visuelle interactive, ce qui signifie que le modèle est conçu pour réagir rapidement, itérer rapidement et fonctionner efficacement sur du matériel accessible. 

La famille FLUX.2 Klein prend en charge la génération de texte en image, l'édition d'images et le conditionnement multi-références.

FLUX.2 [klein] Elo par rapport à la latence (en haut) et à la VRAM (en bas) pour les tâches de conversion texte-image, image-image à référence unique et à références multiples.

Figure : FLUX.2 [klein] Elo par rapport à la latence (en haut) et à la VRAM (en bas) pour les tâches de conversion texte-image, image-image à référence unique et à références multiples (Blog Flux 2)

La variante Klein 4B est l'option la plus conviviale pour les développeurs de la famille Klein, car elle est entièrement ouverte sous licence Apache 2.0 et est conçue pour fonctionner sur des GPU grand public avec environ 13 Go de VRAM. 

FLUX.2 Klein Principales fonctionnalités

  • Itération en temps réel : Klein est conçu pour les flux de travail dans lesquels vous générez puis affinez rapidement. Cela en fait un outil particulièrement adapté aux boucles de prévisualisation interactives et aux expériences d'édition basées sur l'interface utilisateur.
  • Génération et édition unifiées : Plutôt que de traiter la génération et l'édition comme des fonctionnalités distinctes, la gamme de modèles Klein est conçue pour prendre en charge les deux. 
  • Prise en charge multi-références : Klein prend en charge la génération et l'édition multi-références, ce qui est utile pour ancrer les modifications à l'aide d'une image de palette, d'une référence de style ou d'une référence d'objet. Dans l'API officielle, le point de terminaison Klein prend en charge jusqu'à quatre images au total pour l'édition, ce qui correspond parfaitement à une image de base et jusqu'à trois références.

Les modèles de Klein se déclinent généralement en deux grandes catégories : les modèles distillés optimisés pour la vitesse et les modèles de base. modèles de base optimisés pour la flexibilité. Le modèle Klein 4B distillé est le choix pratique pour créer des applications interactives, tandis que les variantes de base sont plus adaptées lorsque vous recherchez une flexibilité et un contrôle maximaux pour les réglages fins, même avec une latence plus élevée.

Tutoriel FLUX.2 Klein : Application de création et d'édition d'images

Dans cette section, nous allons mettre en œuvre un flux de travail en deux étapes pour les images à l'aide de FLUX.2 Klein, intégré dans un application Gradio. À un niveau élevé, l'application exécute trois tâches principales :

  • Générer une image de base à partir d'une invite de texte
  • Modifiez l'image générée à l'aide d'une deuxième invite d'instruction, éventuellement étayée par des références.
  • Enfin, veuillez conserver un historique de session pour faciliter l'exploration. L'utilisateur peut charger n'importe quelle image précédente à partir d'un menu déroulant Historique et y apporter des modifications.

En arrière-plan, ce flux de travail est soutenu par deux fonctions complémentaires :

  • local_generate() La fonction exécute FLUX.2 Klein 4B localement à l'aide de la bibliothèque Diffusers pour générer rapidement des images par text-to-image.
  • bfl_edit(edit_prompt, base_img, ref_imgs) La fonction envoie une demande de modification d'image à l'API d'édition FLUX.2 Klein hébergée par Black Forest Labs, puis interroge de manière répétée l'polling_url e renvoyée jusqu'à ce que l'image modifiée soit prête.

Le mécanisme historique stocke les images générées sous la forme d'un dictionnaire contenant l'image et une brève étiquette, comme suit : {"img": PIL.Image, "label": str}.

Dans la vidéo ci-dessous, vous pouvez observer une version abrégée du flux de travail. La vidéo est accélérée à des fins de démonstration :

Étape 1 : Configuration de l'environnement

Avant de développer notre application de génération et d'édition d'images, il est nécessaire de configurer un environnement propre avec la dernière bibliothèque Diffusers. Pour ce tutoriel, nous exécuterons l'ensemble du processus sur une instance Google Colab équipée d'un GPU A100 afin d'accélérer la génération des images. Cela dit, la même configuration fonctionne également sur des GPU plus modestes, tels que le T4, avec des performances légèrement inférieures.

Nous commençons par désinstaller toute version existante de Diffusers afin d'éviter tout conflit de versions, puis nous installons la dernière version de développement directement depuis GitHub. Nous installons également les bibliothèques de support nécessaires au chargement des modèles, à la gestion des points de contrôle et à l'accélération.

!pip -q uninstall -y diffusers
!pip -q install -U git+https://github.com/huggingface/diffusers.git
!pip -q install -U accelerate safetensors transformers huggingface_hub

Une fois l'installation terminée, nous vérifions la version de Diffusers installée, puis nous nous assurons que la classe Flux2KleinPipeline peut être importée avec succès.

import diffusers
print("diffusers:", diffusers.__version__)
from diffusers import Flux2KleinPipeline
print("Flux2KleinPipeline import OK")

Ceci confirme que notre environnement est correctement configuré. Dans l'étape suivante, nous chargerons le modèle FLUX.2 Klein sur le GPU et le préparerons à la fois pour la génération d'images locales et les workflows d'édition basés sur l'API.

Étape 2 : Charger FLUX.2 Klein 4B 

Avant de charger le modèle, il est nécessaire d'obtenir une clé API auprès de Black Forest Labs. Pour commencer, veuillez vous connecter à votre compte Black Forest Labs et ajoutez des crédits dans l'onglet «Crédits ». Le montant minimum de recharge est d'environ dix dollars, ce qui donne droit à environ mille crédits. Une fois les crédits ajoutés, veuillez cliquer sur «Créer une clé » ( ), attribuez-lui un nom descriptif et conservez-la en lieu sûr.

Clé API Black Forest Labs

Une fois votre clé API prête, l'étape suivante consiste à charger le modèle FLUX.2 Klein 4B et à le préparer pour deux modes d'utilisation différents : la génération d'images locales et l'édition d'images basée sur l'API. 

import os, time, base64, io, requests
import gradio as gr
import torch
import nest_asyncio
from PIL import Image
from diffusers import Flux2KleinPipeline
from google.colab import userdata
nest_asyncio.apply()
# =============================
# LOAD via API
# =============================
MODEL_ID = "black-forest-labs/FLUX.2-klein-4B"
BFL_API_KEY = userdata.get("BFL_API_KEY")
BFL_CREATE_URL = "https://api.bfl.ai/v1/flux-2-klein-4b"
print(f"Loading model to GPU: {torch.cuda.get_device_name(0)}")
# =============================
# LOAD via LOCAL HF PIPELINE
# =============================
dtype = torch.float16 
pipe = Flux2KleinPipeline.from_pretrained(MODEL_ID, torch_dtype=dtype).to("cuda")

Nous commençons par configurer la clé API en tant que secret Colab, afin qu'elle n'apparaisse jamais dans le code du notebook. Nous définissons également l'ID du modèle et le point final d'édition Klein que nous appellerons ultérieurement. 

Ensuite, nous appliquons l'nest_asyncio e avant de lancer l'interface utilisateur Gradio afin d'éviter de déclencher des conflits dans la boucle d'événements.

Enfin, veuillez charger le pipeline local FLUX.2 Klein pour la génération de l'image de base. Nous utilisons Flux2KleinPipeline avec float16 pour une compatibilité GPU étendue (A100 et T4 fonctionnent tous deux efficacement), puis transférons le pipeline vers CUDA pour une inférence rapide. Ce pipeline local est utilisé uniquement pour générer l'image initiale, tandis que les modifications sont gérées via l'API.

Remarque : À ce stade, vous pourriez vous demander pourquoi nous chargeons le modèle localement et configurons également l'accès à l'API. La raison en est la séparation des capacités :

  • Le pipeline Hugging Face local est idéal pour la génération itérative de texte en image et le contrôle total des paramètres d'inférence.
  • L'API Black Forest Labs offre des fonctionnalités avancées d'édition d'images pour FLUX.2 Klein qui ne sont actuellement pas disponibles dans la version open-weight, telles que les modifications d'images basées sur des invites avec plusieurs images de référence.

En combinant ces deux approches, nous bénéficions du meilleur des deux mondes : la rapidité de génération locale et l'assistance à l'édition.

Étape 3 : Fonctions d'assistance

Avant de connecter tous les éléments à l'interface Gradio, nous avons besoin d'un petit ensemble de fonctions d'aide. Étant donné que notre application génère des images localement mais les modifie via l'API, nous avons besoin d'un moyen d'encoder les images en base64 pour les requêtes API, d'un moyen de télécharger les images modifiées renvoyées sous forme d'URL et d'une fonction de génération locale qui produit l'image de base initiale.

def pil_to_b64_png(img: Image.Image) -> str:
    buf = io.BytesIO()
    img.convert("RGB").save(buf, format="PNG")
    return base64.b64encode(buf.getvalue()).decode()
def url_to_pil(url: str) -> Image.Image:
    r = requests.get(url, timeout=60)
    r.raise_for_status()
    return Image.open(io.BytesIO(r.content)).convert("RGB")
def local_generate(prompt: str):
    if not prompt.strip():
        raise gr.Error("Prompt is empty.")
    out = pipe(
        prompt=prompt.strip(),
        width=1024,
        height=1024,
        num_inference_steps=4,
        guidance_scale=1.0,
        output_type="pil",
    )
    return out.images[0].convert("RGB")

Le code ci-dessus définit trois fonctions d'aide essentielles :

  • La fonction pil_to_b64_png() convertit une image PIL en une chaîne PNG encodée en base64. Ceci est nécessaire car l'API d'édition FLUX.2 accepte l'image de base et les images de référence sous forme d'URL ou de chaînes base64. 
  • La fonction ` url_to_pil() ` gère la direction opposée. L'API d'édition renvoie une URL signée pour la sortie générée. Nous récupérons donc cette URL avec requests, validons la réponse et convertissons les octets téléchargés en une image PIL. Cela permet d'afficher le résultat modifié directement dans notre interface Gradio et de l'enregistrer dans l'historique.
  • Enfin, la fonction local_generate() constitue notre point d'entrée local pour la conversion de texte en image. Il vérifie que l'invite n'est pas vide, puis appelle l'Flux2KleinPipeline e locale avec des paramètres fixes tels que la résolution, le nombre d'étapes et l'échelle de guidage. Le résultat est renvoyé sous forme d'image PIL RVB propre, qui devient l'image de base pour les modifications ultérieures.

Nous vous invitons à explorer les paramètres du pipeline FLUX, tels que la résolution d'image, les étapes de diffusion et l'échelle de guidage, afin d'examiner différents compromis entre qualité et vitesse et de mieux comprendre comment chaque paramètre influence l'image finale. 

La documentation relative à l'édition d'images Flux 2 est un excellent outil pour approfondir vos connaissances sur ces paramètres. est un excellent moyen d'approfondir vos connaissances sur ces paramètres.

Dans l'étape suivante, nous utiliserons ces utilitaires pour mettre en œuvre l'édition d'images basée sur l'API avec FLUX.2 Klein.

Étape 4 : Modification via l'API BFL

Cette étape constitue la principale différence entre un workflow Hugging Face pur et l'approche hybride utilisée dans ce tutoriel. Au lieu de tenter d'effectuer l'édition d'images localement, nous déléguons les modifications à l'API, qui gère de manière fiable les modifications basées sur des invites et le conditionnement multi-références optionnel.

À un niveau élevé, l'API d'édition FLUX.2 Klein attend une invite textuelle décrivant la modification, une image de base à modifier et, éventuellement, des images de référence fournies en tant qu'entrées supplémentaires. L'API fonctionne de manière asynchrone, ce qui signifie que nous soumettons une demande, puis interrogeons une URL renvoyée jusqu'à ce que l'image modifiée soit prête.

POLL_INTERVAL_S = 1.0
POLL_TIMEOUT_S = 120
def bfl_edit(edit_prompt, base_img, ref_imgs=None):
    if not BFL_API_KEY:
        raise gr.Error("Missing BFL_API_KEY in Colab Secrets.") 
    payload = {
        "prompt": edit_prompt.strip(),
        "input_image": pil_to_b64_png(base_img),
        "output_format": "png",
    }
    if ref_imgs:
        for i, ref in enumerate(ref_imgs[:3], start=2):
            payload[f"input_image_{i}"] = pil_to_b64_png(ref)
    create = requests.post(
        BFL_CREATE_URL,
        headers={"x-key": BFL_API_KEY, "accept": "application/json"},
        json=payload,
        timeout=60,
    )
    create.raise_for_status()
    job = create.json()
    polling_url = job.get("polling_url")
    if not polling_url:
        raise gr.Error(f"API Error: {job}")
    t0 = time.time()
    while True:
        if time.time() - t0 > POLL_TIMEOUT_S:
            raise gr.Error("BFL API polling timed out.")  
        time.sleep(POLL_INTERVAL_S)
        res = requests.get(polling_url, headers={"x-key": BFL_API_KEY})
        res.raise_for_status()
        j = res.json()
        if j["status"] == "Ready":
            return url_to_pil(j["result"]["sample"])
        if j["status"] in ("Error", "Failed"):
            raise gr.Error(f"Generation Failed: {j}")

La fonction ` bfl_edit() ` effectue trois opérations importantes :

  • Il nécessite trois entrées, à savoir l'invite d'édition, l'image de base que nous souhaitons modifier et une liste facultative d'images de référence. 
  • Nous créons une charge utile JSON avec l'invite d'édition et l'image de base encodée au format PNG base64. Si des images de référence sont fournies, nous les joignons en utilisant le format indexé de l'API. Cela nous permet de fournir jusqu'à trois images de référence en plus de l'image de base, ce qui est suffisant pour de nombreux flux de travail pratiques tels que le transfert de palette de couleurs, l'ancrage de style ou l'ancrage d'objet.
  • Ensuite, nous soumettons la requête au point de terminaison API et analysons la réponse. L'API renvoie une API de travail ( polling_url ) que nous devons interroger de manière répétée jusqu'à ce que le travail soit terminé. Nous mettons cela en œuvre à l'aide d'une simple boucle d'interrogation avec deux garde-fous : un intervalle d'interrogation qui évite les requêtes excessives et un délai d'attente qui empêche le notebook d'attendre indéfiniment.

Une fois que le statut passe à « Ready », la réponse API contient une URL signée vers l'image de sortie. Nous téléchargeons cette image à l'aide de notre fonction d'aide url_to_pil() précédemment mentionnée et la renvoyons sous forme d'image PIL.

Dans l'étape suivante, nous implémenterons l'historique des sessions afin que les utilisateurs puissent revoir toute sortie générée ou modifiée.

Étape 5 : Ajouter l'historique 

À ce stade, le dernier élément dont nous avons besoin avant de créer l'interface utilisateur est une couche mémoire de session légère afin que les utilisateurs puissent revoir les résultats précédents. Nous implémentons l'historique à l'aide de deux objets d'état Gradio :

  • base_img_state enregistre l'image de travail actuelle (l'image à laquelle les modifications futures seront appliquées).
  • history_state stocke chaque version générée ou modifiée sous forme de liste de dictionnaires, chacun contenant une image et une brève description.
def update_history(history):
    choices = [f"{i}: {h['label']}" for i, h in enumerate(history or [])]
    return gr.update(choices=choices, value=choices[-1] if choices else None)
def on_generate(prompt, history):
    img = local_generate(prompt)
    new_history = list(history or [])
    new_history.append({"img": img, "label": "Generated Base"})
    return img, img, new_history, update_history(new_history), "Base image generated."
def on_edit(edit_prompt, ref2, ref3, ref4, base_img, history):
    if base_img is None:
        raise gr.Error("Please generate a base image first.")
    refs = [r.convert("RGB") for r in (ref2, ref3, ref4) if r is not None]
    out = bfl_edit(edit_prompt, base_img, refs)
    new_history = list(history or [])
    new_history.append({"img": out, "label": f"Edit: {edit_prompt[:20]}..."})
    return out, out, new_history, update_history(new_history), "Edit successful."
def on_load(choice, history):
    if not history or not choice:
        return None, None, "No history to load."
    idx = int(choice.split(":")[0])
    img = history[idx]["img"]
    return img, img, f"Loaded entry #{idx}."
def on_clear():
    return None, None, [], gr.update(choices=[], value=None), "Cleared everything."

Les fonctions ci-dessus constituent la logique centrale permettant de conserver l'historique des images dans notre démonstration :

  • La fonction update_history() formate l'historique de session dans une liste déroulante. Chaque entrée est identifiée par son index et une brève description, et le menu déroulant sélectionne automatiquement l'élément le plus récent par défaut. Cela permet de synchroniser l'interface utilisateur sans nécessiter de logique de rafraîchissement manuel.
  • La fonction de rappel ` on_generate() ` exécute ` local_generate() ` pour créer l'image de base initiale. Il ajoute ensuite le résultat à l'historique sous le nom {"img": img, "label": "Generated Base"}. La fonction renvoie à la fois l'image et l'état actualisé de l'historique, ainsi qu'une mise à jour du menu déroulant afin que la nouvelle entrée soit immédiatement visible.
  • La fonction de rappel ` on_edit() ` est similaire, mais elle appelle plutôt ` bfl_edit() `. Il utilise l'image de travail actuelle et certaines images de référence facultatives, applique les modifications via l'API et ajoute le résultat à l'historique. Il renvoie également le résultat modifié en tant que nouvelle image ( base_img_state), ce qui signifie que les modifications futures s'appliqueront à l' la plus récente, à moins que l'utilisateur ne charge explicitement une version antérieure.
  • La fonction de rappel on_load() analyse l'entrée sélectionnée dans la liste déroulante, récupère l'image correspondante à partir de history_state et rétablit cette image comme image de travail active. Cela permet aux utilisateurs de bifurquer leurs modifications à partir de n'importe quel point de contrôle précédent.
  • Enfin, la fonction « on_clear() » réinitialise tout. Cela efface la sortie, efface l'état de l'image de base, réinitialise la liste d'historique et vide les choix du menu déroulant.

Intégrons ces fonctions dans une interface Gradio avec deux zones de texte, des téléchargements de références facultatifs et un historique des opérations.

Étape 6 : Interface utilisateur Gradio

Cette étape relie notre logique de génération, d'édition et d'historique à une interface Gradio simple. L'interface est développée à l'aide d'gr.Blocks, ce qui nous permet de contrôler précisément la mise en page. 

with gr.Blocks() as demo:
    gr.Markdown("## FLUX.2 Klein: Generate & Edit Images")
    with gr.Row():
        with gr.Column(scale=1):
            gen_prompt = gr.Textbox(label="1. Generate Base Image", placeholder="A young boy riding a scooter...")
            gen_btn = gr.Button("Generate Base Image", variant="primary")
            edit_prompt = gr.Textbox(label="2. Describe Edits", placeholder="Add the red hat and yellow glasses from the references...")
            with gr.Accordion("Reference Images (Optional)", open=False):
                r2 = gr.Image(label="Ref 1", type="pil")
                r3 = gr.Image(label="Ref 2", type="pil")
                r4 = gr.Image(label="Ref 3", type="pil")
            edit_btn = gr.Button("Apply Edit", variant="secondary") 
            history_dd = gr.Dropdown(label="Session History", choices=[])
            with gr.Row():
                load_btn = gr.Button("Load Selected")
                clear_btn = gr.Button("Clear All")
            status = gr.Textbox(label="Status", interactive=False)
        with gr.Column(scale=1):
            output_view = gr.Image(label="Current Image", type="pil")
    base_img_state = gr.State(None)
    history_state = gr.State([])
    gen_btn.click(
        on_generate, 
        [gen_prompt, history_state], 
        [output_view, base_img_state, history_state, history_dd, status]
    ) 
    edit_btn.click(
        on_edit, 
        [edit_prompt, r2, r3, r4, base_img_state, history_state], 
        [output_view, base_img_state, history_state, history_dd, status]
    ) 
    load_btn.click(
        on_load, 
        [history_dd, history_state], 
        [output_view, base_img_state, status]
    )
    clear_btn.click(
        on_clear, 
        None, 
        [output_view, base_img_state, history_state, history_dd, status]
    )
demo.launch(share=True, inline=True, debug = True)

Nous organisons l'interface utilisateur en deux colonnes, de sorte que la colonne de gauche contienne les entrées et les actions, tandis que la colonne de droite affiche l'image actuelle. Voici comment nous développons l'application Gradio :

  • La première zone de texte recueille la demande de génération, et le bouton «Générer l'image de base » déclenche la fonction d'on_generate(). Cette fonction de rappel exécute la génération locale, enregistre le résultat dans l'historique et met à jour à la fois l'image affichée et l'image de travail actuelle stockée dans base_img_state.
  • La deuxième zone de texte recueille une invite d'instruction d'édition. Lorsque l'utilisateur cliquesur « Appliquer les modifications » (Apply Edit) (), nous appelons la fonction «Appliquer les modifications » ( on_edit() ), qui utilise l'image de travail actuelle comme image de base et renvoie le résultat modifié. La sortie modifiée est également ajoutée à l'historique et devient la nouvelle image de travail pour les prochaines modifications.
  • Afin de rendre le flux de travail sensible à la session, nous incluons également une liste déroulante intitulée «Historique de session » ( ) de sorte que chaque entrée corresponde à une version enregistrée de l'image. Le bouton «Load Selected » (Charger la sélection) de l' permet de déclencher l'on_load(), qui restaure l'image historique choisie et la définit à nouveau comme image de travail actuelle. 
  • Enfin, le bouton Effacer tout réinitialise tout grâce à la fonction d'on_clear(), y compris l'affichage de la sortie, l'état de l'image de base et l'historique enregistré.

Les deux objets Gradio State suivants assurent la cohérence de l'ensemble :

  • base_img_state garantit que chaque modification s'applique à l'image appropriée.
  • history_state stocke l'historique complet des sorties pour la relecture et la ramification.

Enfin, demo.launch() lance l'application dans Colab, fournit un lien partageable, la rend en ligne et active les journaux de débogage pour aider à diagnostiquer les problèmes pendant le développement.

FLUX.2 Klein Exemples et observations

Pour comprendre comment FLUX.2 Klein se comporte dans la pratique. J'ai mené une série de petites expériences à l'aide de la version finale de l'application Generate and Edit. J'ai évalué trois principaux modèles d'interaction : la génération d'images de base, l'édition par invite uniquement et l'édition guidée par référence à l'aide d'une ou plusieurs images. J'ai également validé le flux de travail de l'historique des sessions afin de confirmer que je peux restaurer n'importe quelle sortie précédente et poursuivre l'édition à partir de ce point.

Génération d'images

J'ai commencé par une simple invite de génération afin de créer une image de base propre. Le modèle a produit un sujet cohérent avec un éclairage uniforme, des détails faciaux nets et une disposition stable de la scène. L'image de base obtenue semblait solide et utile pour des modifications ultérieures plutôt que pour une régénération.

image2.png

Édition d'images à partir d'une seule image de référence

Ensuite, j'ai testé une seule image de référence comme source de couleur et j'ai utilisé une instruction de modification telle que « Veuillez modifier la couleur de la robe pour qu'elle corresponde à celle de l'image de référence ». La modification a permis de transférer avec succès la couleur souhaitée tout en conservant la majeure partie de la structure originale de la scène.

D'après mon observation, les modifications de référence unique fonctionnent mieux lorsque l'invite est restreinte et limitée. Le transfert de couleur et la recoloration de la garde-robe sont particulièrement fiables, car ils ne nécessitent pas de modifications géométriques importantes. Lorsque l'instruction d'édition se concentre sur un seul attribut, l'identité du sujet et les détails contextuels restent stables.

image6.png

Modification d'images à l'aide d'une seule invite

Ensuite, j'ai tenté l'édition par invite uniquement avec une modification sémantique, telle que « Remplacer l'arrière-plan par une plage ». Le modèle a traité la substitution de l'arrière-plan de manière efficace, tout en conservant le sujet globalement cohérent. 

Lorsque l'arrière-plan change, le modèle ajuste souvent la température de couleur et l'intensité des ombres afin de conserver un résultat photoréaliste. Il s'agit généralement d'une fonctionnalité, mais cela signifie que l'image modifiée peut apparaître comme une photographie différente plutôt qu'un simple copier-coller.

image4.png

Conseils pour les poses

J'ai testé une modification basée sur la pose à l'aide d'une image de référence suggérant une position du corps, combinée à une invite telle que « Reproduisez la pose de l'image de référence ». L'image obtenue a modifié la pose du sujet tout en conservant une identité et un style similaires.

Voici l'image de référence que j'ai utilisée pour guider la pose :

Conseils pour la pose - image de référence

Les modifications de pose sont possibles, mais elles sont plus délicates que les modifications de couleur. Tout changement de pose peut entraîner des modifications secondaires telles que le drapé du tissu, le placement des membres et le cadrage de la caméra. Il m'a fallu plusieurs essais pour réussir cette pose, et j'ai encore rencontré des difficultés avec le placement des jambes.

image8.png

Édition d'images à l'aide de plusieurs images de référence

Enfin, j'ai testé les modifications multi-références à l'aide de plusieurs entrées, telles qu'une référence de palette de couleurs et une invite de modification indiquant explicitement « Ne modifier les couleurs d'arrière-plan qu'à l'aide de la palette des images de référence ». Veuillez ne pas remplacer l'arrière-plan par les images de référence. 

À ma grande surprise, l'édition multi-références

g est particulièrement efficace lorsque chaque image de référence a un rôle bien défini. 

Les références de palette fonctionnent bien lorsque l'invite indique explicitement « palette uniquement » et évite de demander au modèle d'utiliser le contenu de référence comme remplacement. 

Lorsque les références sont ambiguës, le modèle peut emprunter des éléments de texture ou de mise en page plutôt que la couleur uniquement.  Au cours de mon essai, j'ai remarqué quelques artefacts mineurs où des éléments ressemblant aux images de référence se sont subtilement infiltrés dans la scène, mais le résultat global restait convaincant et visuellement cohérent.

image1.png

Un avantage pratique de cette démonstration est que chaque image générée et modifiée est enregistrée dans l'historique de la session. Vous pouvez charger n'importe quelle entrée précédente et poursuivre la modification à partir de ce point précis. Cela accélère considérablement le processus d'expérimentation. Vous pouvez créer des branches à partir d'une version antérieure, comparer plusieurs directions d'édition et éviter de perdre un résultat intermédiaire satisfaisant. 

Conclusion

Dans ce tutoriel, nous avons mis en place un processus complet de génération et d'édition d'images à l'aide de FLUX.2 Klein 4B. En combinant la génération locale de texte en image via Diffusers avec l'API d'édition hébergée par Black Forest Labs, nous avons pu créer un éditeur d'images interactif.

FLUX.2 Les capacités de génération et d'édition unifiées à faible latence de Klein, ainsi que la prise en charge de plusieurs références, le rendent particulièrement adapté à ce type de flux de travail interactif. À partir de là, vous pouvez étendre les fonctionnalités de l'application avec l'édition par lots, les contrôles de paramètres, la persistance entre les sessions, ou même un agent piloté par LLM qui propose automatiquement des modifications. 

FLUX.2 Klein AQs

Puis-je supprimer l'API et effectuer toutes les opérations avec HF ?

Oui, mais l'édition peut être plus sensible aux versions de la bibliothèque et aux chemins de post-traitement. Si votre objectif est de disposer d'un flux de travail d'édition fiable, l'API est l'option la plus sûre.

Puis-je apporter des modifications à l'image historique chargée ?

Oui. Dans la conception actuelle, l'historique de chargement définit l'état de base de l'image. Toute modification ultérieure s'applique à cette base.

Est-il possible d'étendre l'historique pour afficher les vignettes ?

Oui, il est possible de remplacer l'historique déroulant par une galerie. La structure de l'État reste inchangée.

Quelles sont les exigences système pour exécuter FLUX.2 Klein 4B localement ?

Pour exécuter le modèle de manière efficace, il est nécessaire de disposer d'un GPU grand public avec environ 13 Go de VRAM. Bien qu'il fonctionne mieux sur du matériel haut de gamme tel que l'A100, il est spécialement optimisé pour fonctionner sur des GPU plus accessibles (tels que le NVIDIA T4) avec une latence légèrement plus élevée, ce qui le rend beaucoup plus léger que les modèles de base FLUX complets.

Puis-je utiliser FLUX.2 Klein à des fins commerciales ?

Oui. La variante FLUX.2 Klein 4B est distribuée sous licence Apache 2.0. Il s'agit d'une licence open source permissive qui autorise les développeurs à utiliser, modifier et distribuer le modèle pour des logiciels personnels et commerciaux sans les conditions restrictives souvent présentes dans d'autres licences de modèle.

En quoi « Klein » se distingue-t-il des autres variantes FLUX.2 ?

Klein est un modèle distillé (4 milliards de paramètres) qui privilégie la vitesse et l'interactivité plutôt que la flexibilité brute. Alors que les variantes « de base » plus importantes de FLUX.2 sont mieux adaptées à un réglage fin approfondi, Klein est conçu pour l'« intelligence visuelle interactive », ce qui signifie qu'il offre des temps d'inférence plus rapides et une itération en temps réel, ce qui en fait le choix idéal pour créer des interfaces utilisateur réactives et des outils d'édition.


Aashi Dutt's photo
Author
Aashi Dutt
LinkedIn
Twitter

Je suis experte Google Developers en ML (Gen AI), triple experte Kaggle et ambassadrice Women Techmakers, avec plus de trois ans d’expérience dans la tech. J’ai cofondé une startup dans le domaine de la santé en 2020 et je poursuis actuellement un master en informatique à Georgia Tech, avec une spécialisation en apprentissage automatique.

Sujets

Meilleurs cours DataCamp

Cursus

Principes fondamentaux de Hugging Face

Découvrez les derniers modèles d'IA open source, ensembles de données et applications, créez des agents IA et affinez les modèles d'apprentissage automatique (LLM) avec Hugging Face. Rejoignez dès aujourd'hui la plus grande communauté dédiée à l'intelligence artificielle.
Afficher les détailsRight Arrow
Commencer le cours

Cours

Modèles multimodaux avec Hugging Face

4 h
1.3K
Combinez du texte, des images, du son et de la vidéo avec les derniers modèles d'IA de Hugging Face, et générez de nouvelles images et vidéos.
Voir plusRight Arrow