42 points par xguru 2025-02-03 | 5 commentaires | Partager sur WhatsApp
  • J’ai tenté un projet consistant à entraîner pendant quelques heures mon propre modèle d’images IA pour créer des photos qui donnent l’impression d’avoir été prises de moi directement
    • Exemple : générer une photo de moi déguisé en « Superman »
  • Pourquoi avoir essayé : cela me semblait amusant, c’est sympa à faire avec les enfants, et cela permet d’en apprendre davantage sur les modèles personnalisés et les aspects plus avancés de l’IA
  • Il y a 12 à 18 mois, ce travail était assez complexe, mais il est désormais devenu très simple
  • J’ai créé un modèle et obtenu les images souhaitées en moins de deux heures ; le plus important a été d’identifier rapidement les bons outils

Choisir le modèle / la méthode d’entraînement

  • Éléments nécessaires
    • modèle de base (base model)
    • technique d’entraînement / de fine-tuning
    • jeu de données d’entraînement (quelques photos de soi, par exemple)
  • Beaucoup d’IA recommandent Stable Diffusion, mais j’ai choisi le modèle Flux utilisé par Pieter Levels, car il semblait offrir de meilleures performances
    • Ce n’est pas totalement le tout dernier modèle SOTA, mais il est largement assez bon
  • Pour la méthode d’entraînement, j’ai utilisé LoRA (Low-Rank Adaptation)
    • Au lieu de réentraîner l’ensemble du modèle, on n’entraîne que la partie liée à un « mot magique » spécifique
    • Exemple : apprendre au modèle un mot rare comme « czue », afin qu’en l’utilisant dans le prompt, il reflète les caractéristiques du jeu de données correspondant

Créer l’ensemble d’entraînement

  • Il faut préparer plusieurs photos de la personne à apprendre (environ 10 à 15)
    • Plus les expressions, les arrière-plans, l’éclairage et les angles sont variés, mieux c’est
    • Il est préférable qu’il n’y ait qu’une seule personne par photo
  • Pendant l’entraînement, une description textuelle est nécessaire, et elle doit inclure le mot magique
    • Exemple : "a photo of czue on the beach, wearing a blue shirt"
  • Mais les outils récents génèrent automatiquement les légendes des images, donc il n’est plus nécessaire de saisir soi-même les descriptions

Entraîner le modèle

  • Au départ, je pensais faire l’entraînement en local, mais le manque de GPU et de RAM a rendu cela difficile
  • Il est possible d’exécuter soi-même le code sur un serveur cloud avec GPU, mais j’ai finalement utilisé Replicate
    • C’est un service de location de GPU qui permet d’utiliser directement des recettes déjà prêtes
  • Dans ce cas, j’ai utilisé la recette ostris/flux-dev-lora-trainer
    • Après avoir créé un compte Replicate, il faut configurer les informations de facturation
  • Paramètres principaux
    • input_images : photos d’entraînement (zip)
    • trigger_word : mot magique, par ex. « czue »
    • hf_repo_id, hf_token : dépôt / token Hugging Face
    • autocaption_prefix : texte à ajouter au début des légendes générées automatiquement (par ex. "A photo of czue,")

Enregistrer le modèle sur Hugging Face

  • Hugging Face est une plateforme pour stocker et partager des modèles
  • Replicate stocke aussi le modèle entraîné quelque part, mais le publier sur Hugging Face facilite l’intégration avec d’autres outils
  • Après avoir créé un compte et un modèle, on transmet hf_repo_id
  • Une fois l’entraînement terminé, un gros fichier nommé lora.safetensors (environ 180 Mo) est envoyé sur Hugging Face

Générer des images avec le modèle

  • Une fois l’entraînement terminé, on passe à l’inférence : on donne du texte au modèle pour produire des images
  • Là aussi, on peut essayer en local, mais j’ai de nouveau utilisé Replicate
    • Il suffit de renseigner le champ hf_lora dans lucataco/flux-dev-lora
      • ID d’un dépôt public Hugging Face ou lien vers le modèle entraîné mis en ligne sur Replicate
  • Exemple : en entrant "a photo of czue surfing", on obtient une image de soi en train de surfer, comme ci-dessous

Exécuter le modèle de façon programmatique

  • Si l’on veut tester différents prompts et enregistrer automatiquement les résultats, les appels d’API sont pratiques
  • J’ai écrit le script Python ci-dessous en exemple (le code complet est sur Github)
    # /// script  
    # requires-python = ">=3.12"  
    # dependencies = [  
    #     "replicate",  
    # ]  
    # ///  
    import argparse  
    import os  
    import re  
    import replicate  
    import uuid  
    
    DEFAULT_MODEL = "czue/me-v1"  
    DEFAULT_COUNT = 1  
    
    def get_input(prompt, model=DEFAULT_MODEL, count=DEFAULT_COUNT):  
        return {  
            "prompt": prompt,  
            "hf_lora": model,  
            "num_outputs": count  
        }  
    
    def main():  
        parser = argparse.ArgumentParser()  
        parser.add_argument("prompt", help="Prompt for the photo")  
        parser.add_argument("--model", default=DEFAULT_MODEL,  
                          help="Model to use (default: %(default)s)")  
        parser.add_argument("--count", default=DEFAULT_COUNT,  
                          help="Number of photos to generate (default: %(default)s)", type=int)  
        args = parser.parse_args()  
    
        input = get_input(args.prompt, args.model, args.count)  
        output = replicate.run(  
            "lucataco/flux-dev-lora:091495765fa5ef2725a175a57b276ec30dc9d39c22d30410f2ede68a3eab66b3",  
            input=input  
        )  
    
        output_dir = "output"  
        os.makedirs(output_dir, exist_ok=True)  
    
        prompt_slug = "-".join(args.prompt.split(" ")[-3:])  
        prompt_slug = re.sub(r'[^a-zA-Z0-9\-]', '', prompt_slug).lower()  
    
        for index, item in enumerate(output):  
            file_id = uuid.uuid4().hex[:5]  
            output_path = os.path.join(output_dir, f"{prompt_slug}-{file_id}.webp")  
            with open(output_path, "wb") as file:  
                file.write(item.read())  
                print(f"Saved photo {output_path}")  
    
    if __name__ == "__main__":  
        main()  
    
  • Exemple d’utilisation
    uv run main.py "a photo of czue, a 40 year old man, writing a blog post" \  
     --model="czue/me-v1" \  
     --count=4  
    

Résultats

  • Les performances du modèle sont inégales
    • Il capture parfois assez bien les traits de la personne, mais produit parfois quelqu’un d’autre
    • Si l’on précise davantage dans le prompt l’âge, le genre, etc., les résultats deviennent plus exacts
  • Par exemple, "a photo of czue, a 40 year old man, writing a blog post" produit des images relativement cohérentes
  • En revanche, "a photo of czue writing a blog post" donnait des résultats bien plus variables
  • Si l’on ajoute une autre personne, on rencontre des problèmes de mélange des visages
    • J’ai essayé de générer une photo avec Barack Obama, et certaines parties de mon visage se retrouvaient sur Obama, et inversement
  • Malgré cela, c’était suffisamment amusant et utile pour faire de nombreux essais avec les enfants

Coût

  • Ce n’est pas gratuit, mais ce n’est pas très cher non plus
  • J’ai entraîné 3 modèles au total pour moi et mes enfants, à environ 2,50 $ chacun
  • La génération d’images revient à environ 0,03 $ par image, donc même 30 images coûtent autour de 1 $
  • L’ensemble de l’expérience m’a coûté moins de 10 $, et j’ai été satisfait de voir que cela restait plus abordable que prévu
  • Si vous vous intéressez à l’entraînement de modèles IA et à la génération d’images, cela vaut la peine d’essayer : c’est plus simple qu’on ne l’imagine

5 commentaires

 
cladio 2025-02-04

J’ai essayé par curiosité, et c’est vraiment facile.
(https://www.youtube.com/watch?v=sNpQ9ULDMoo)
Je me suis bien marré à fabriquer toutes sortes de choses...

 
botplaysdice 2025-02-04

Au final, avant de mourir, n’essaierons-nous pas de téléverser sur le réseau un modèle entraîné pour nous ressembler, puis de partir ? Comme un instinct de survie... Mais ce ne serait pas vraiment « moi ».

 
sollscherr 2025-02-03

Cette technologie m’a fait penser à un roman, alors je me permets de le recommander. Il s’agit de « Chronos », une nouvelle incluse dans le recueil Bisutbangul Pong de la romancière Lee Yu-ri. Le texte traite d’une IA qui enregistre et apprend les données d’une personne, autrement dit d’elle-même. Un peu comme le chat dans ce commentaire. Une mère atteinte de démence l’utilise avant que ses symptômes ne s’aggravent davantage. Puis ses enfants sont en conflit. Ils y trouvent du réconfort, mais éprouvent aussi de la culpabilité. Si cette technologie, ou encore l’histoire de ce chat, vous intéresse, essayez de le lire.

 
xguru 2025-02-03

Un commentaire sur Hacker News attire l’attention

  • J’ai fait ça pour mon chat adoré qui est mort. Le résultat me plaisait, mais à un moment donné, j’ai soudain eu des frissons en pensant à ce que j’étais en train de faire
    • Je pense que cela pourrait devenir un énorme business. J’ai probablement envoyé des centaines de milliers d’e-mails, de SMS, de messages de chat, etc., donc il est tout à fait possible d’entraîner un corpus des communications d’un proche afin de pouvoir « discuter » avec « lui » après sa mort
    • Après la mort de mon père, j’ai fait cela avec sa voix, et j’ai configuré une fonction permettant de parler avec un assistant prenant en charge un LLM afin qu’il réponde avec la voix et la manière de parler de mon père. C’était une période où je gérais très étrangement le deuil et la tristesse, et j’ai fini par me dire que ce que je faisais était vraiment bizarre
    • C’est similaire à l’épisode « Be Right Back » de Black Mirror

Un commentaire informatif également

  • Dans le cas de Flux, l’encodeur de texte a bien plus de capacités, et on peut écrire des prompts avec des phrases bien plus significatives et complètes
    • Par conséquent, on peut réduire les anciennes formulations brèves séparées par des virgules que l’on voyait dans Stable Diffusion
  • Il faut aussi faire la même chose pour les images d’entraînement. Il est conseillé d’ajouter des légendes à tout ce dont on ne veut pas que le modèle se souvienne comme étant « moi » (ce qu’on est en train de faire, les vêtements portés, les personnes présentes, les accessoires, etc.)
 
humblebee 2025-02-03

« Toute technologie suffisamment avancée est indiscernable de la magie. - Arthur C. Clarke »

Il y a à peine deux ans, cela semblait tout droit sorti d’un film de science-fiction, et pourtant nous assistons en temps réel au moment où la magie devient réalité 😳