- 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- Le token d’accès peut être généré depuis settings/tokens
- 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
- Il suffit de renseigner le champ hf_lora dans lucataco/flux-dev-lora
- 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
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...
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 ».
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.
Un commentaire sur Hacker News attire l’attention
Un commentaire informatif également
« 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é 😳