AI Art

Tutoriel de Stable Diffusion : Créer une application de galerie de génération avec la recherche sémantique Chroma

Visual representation of creating a Generation Gallery App using AI for image generation.

Qu'est-ce que Stable Diffusion ?

Ces dernières années, une avancée majeure dans le domaine de l'intelligence artificielle a redessiné le paysage de l'art numérique : les images générées par l'IA. Depuis ce développement, diverses technologies de génération d'images ont émergé, captivant les audiences et faisant les gros titres à l'échelle mondiale. Parmi ces technologies pionnières, un modèle de génération d'images open-source se distingue - Stable Diffusion.

Stable Diffusion a rapidement gagné en popularité grâce à ses capacités impressionnantes et à son ouverture, inspirant une nouvelle génération de modèles. Avec sa capacité à générer une grande variété de styles à partir de courtes invites lisibles par les humains, Stable Diffusion a considérablement abaissé les barrières à la création d'art par IA.

Mais qu'est-ce qui distingue Stable Diffusion ? Elle offre des caractéristiques uniques comme l'inpainting et l'outpainting. L'inpainting permet aux utilisateurs d'éditer à l'intérieur de l'image, permettant des modifications et ajustements précis. L'outpainting, en revanche, permet aux utilisateurs d'étendre l'image au-delà de ses limites d'origine, parfait pour créer des vues panoramiques ou des scènes expansives. Stable Diffusion prend également en charge l'invite d'image à image, une fonctionnalité qui permet aux utilisateurs de créer une nouvelle image basée sur une image source. C'est comme avoir une conversation avec votre IA, où l'image source est votre invite et l'IA répond avec une image complètement nouvelle.

Qu'est-ce que Chroma et les Embeddings ?

Maintenant, plongeons dans un morceau de technologie passionnant appelé Chroma. Chroma est une base de données open-source conçue spécifiquement pour gérer les embeddings – un type de représentation de données largement utilisé dans l'IA, surtout dans le contexte des grands modèles de langage (LLMs). Un LLM est un modèle d'IA qui comprend et génère un texte semblable à celui des humains en fonction de l'entrée qu'il reçoit.

Chroma fonctionne comme un terrain de jeu pour ces modèles d'IA. Il facilite le développement d'applications IA en fournissant une plateforme pour stocker, interroger et analyser des embeddings multimédias. Ces médias peuvent aller de textes à des images, et dans de futures versions, à l'audio et à la vidéo.

Dans Chroma, chaque élément de média (comme un document texte ou une image) est transformé en une représentation mathématique connue sous le nom d'embedding. Chroma peut stocker ces embeddings ainsi que leurs métadonnées associées, transformant les médias en un format que les modèles d'IA peuvent facilement comprendre et interagir avec. En stockant les embeddings, Chroma permet une identification facile des éléments de médias similaires, une analyse des collections médiatiques, et bien plus encore.

Alors, qu'est-ce que sont exactement les embeddings ? En termes simples, les embeddings convertissent des mots ou des images en nombres, spécifiquement des vecteurs dans un espace multi-dimensionnel. Cette technique est puissante parce qu'elle positionne des éléments "similaires" proches les uns des autres dans cet espace. Par exemple, les embeddings de mots placent des mots de significations similaires près les uns des autres. Ce concept n'est pas limité aux mots ; vous pouvez avoir des embeddings pour des phrases, des paragraphes, des documents, ou même des images.

Dans le contexte des embeddings d'images, des images similaires (comme des photos de chats) ont des embeddings étroitement alignés et sont donc positionnées ensemble dans l'espace d'embeddings multi-dimensionnel. Cette caractéristique fait des embeddings un outil robuste pour des tâches comme la reconnaissance d'images ou les systèmes de recommandation. Combinez ce pouvoir avec les capacités de génération d'images de Stable Diffusion, et les possibilités sont infinies !

Qu'est-ce que le Framework HTTP Flask ?

Dans le paysage en évolution rapide du développement web, un framework qui se distingue constamment est Flask. Ce framework web basé sur Python est célébré pour sa simplicité et sa légèreté, tout en étant puissant et flexible, ce qui en fait un choix de prédilection pour les développeurs expérimentés et les débutants.

Flask est reconnu pour son approche minimaliste et pragmatique. Il n'impose pas de bibliothèques ou de modèles stricts, mais offre plutôt un framework léger qui permet aux développeurs de choisir ce qui convient le mieux à leur projet. Cette ouverture n'affaiblit pas sa fonctionnalité ; en fait, Flask est livré avec un ensemble de fonctionnalités robustes dès la sortie de la boîte.

Par exemple, Flask prend en charge le routage pour gérer élégamment les URL, permettant ainsi de guider les utilisateurs à travers les sites. Il offre des modèles pour créer facilement des pages HTML dynamiques, donnant vie aux applications web. De plus, le support de Flask pour les cookies et les sessions gère efficacement les données utilisateur.

La véritable merveille réside dans la manière dont Flask combine ces puissantes fonctionnalités avec un design simple et propre. Avec seulement une compréhension de base de Python, les développeurs peuvent rapidement configurer un serveur web Flask. Le mélange de puissance, de flexibilité et de facilité d'utilisation établit Flask comme un choix premier parmi les frameworks de développement web.

Pré-requis

  • Connaissances de base en Python et Flask
  • Accès à l'API Stability.ai
  • Une base de données Chroma configurée

Plan

  1. Initialiser le projet
  2. Configurer les bibliothèques nécessaires
  3. Écrire le fichier principal
  4. Tester le chatbot de base
  5. Configurer la base de données Chroma
  6. Tester le chatbot amélioré
  7. Discussion

Initialiser le projet

Plongeons dans le code ! Notre première étape est de configurer notre répertoire de projet, que nous appellerons chroma-sd. Ouvrez votre terminal préféré et naviguez jusqu'à votre répertoire de projets. Ensuite, créez et déplacez-vous dans le répertoire du projet en utilisant les commandes suivantes :

mkdir chroma-sd
cd chroma-sd

En tant que développeurs Python responsables, nous allons créer un nouvel environnement virtuel pour ce projet. Cette pratique garantit que les dépendances du projet sont séparées de l'environnement Python global, une étape essentielle lorsque vous travaillez sur plusieurs projets avec différentes dépendances. Un environnement virtuel permet également de "figer" les dépendances dans un fichier requirements.txt, les documentant pour référence future.

Pour créer notre environnement virtuel, exécutez :

python -m venv env

Ensuite, activez l'environnement virtuel. La commande varie selon votre système d'exploitation :

  • Windows : . envin éactiver
  • Linux/MacOS : source env/bin/activate

Une fois activé, le nom de votre environnement devrait apparaître au début de votre invite de terminal.

Configurer les Bibliothèques Nécessaires

Avant de coder, assurez-vous que toutes les bibliothèques nécessaires sont installées. Notre application utilisera principalement Flask et ChromaDB :

  • Flask : Un framework web Python léger et flexible.
  • ChromaDB : Une base de données robuste pour stocker et interroger des embeddings.

Assurez-vous d'utiliser Python 3, car Python 2 a atteint sa fin de vie. Vérifiez votre version de Python en tapant python --version dans votre terminal.

Pour installer les bibliothèques, utilisez le gestionnaire de paquets de Python, pip. Ces bibliothèques seront installées dans l'environnement virtuel :

pip install flask chromadb

Avec les bibliothèques nécessaires installées, nous sommes prêts à commencer à construire notre application.

Écrire les Fichiers du Projet

Maintenant, replongeons dans le code ! Avant de commencer, assurez-vous que vous êtes dans le répertoire racine du projet.

Ouvrez votre IDE préféré ou éditeur de code et créez un nouveau fichier. Puisque nous travaillons avec Flask, il est habituel de nommer le fichier principal app.py. La commande flask run recherche une application dans un fichier appelé app.py dans le répertoire courant.

Rappelez-vous, si votre fichier d'application principal a un nom différent, l'emplacement peut être spécifié en utilisant la variable d'environnement FLASK_APP.

app.py

Importation des Modules Nécessaires

Commencez par importer les modules nécessaires :

  • logging : Pour la journalisation des erreurs et le débogage.
  • os : Pour interagir avec le système d'exploitation.
  • flask : Pour créer et gérer l'application web.
  • requests : Pour effectuer des requêtes HTTP vers l'API de génération d'images.
  • dotenv : Pour charger des variables d'environnement à partir de notre fichier .env.

Configurer la Journalisation et l’Application Flask

Configurez la journalisation avec un niveau DEBUG pour capturer et imprimer tous les messages :

logging.basicConfig(level=logging.DEBUG)
app = Flask(__name__)

Charger les Variables d’Environnement

Utilisez load_dotenv() pour charger les variables d'environnement à partir d'un fichier .env, qui stocke des données sensibles comme des clés API :

load_dotenv()

Définir les Points de Terminaison de l’API

Définissez plusieurs points de terminaison de l'API qui gèrent différentes tâches. Chaque fonction décorée avec @app.route correspond à un chemin URL spécifique :

  • search_images : Gère les requêtes de recherche et retourne une liste de requêtes de génération d'images.
  • generate : Gère les requêtes de génération d'images.
  • home : Rendu de la page d'accueil.

Exécution de l’Application Flask

Assurez-vous que l'application Flask ne s'exécute que si le script est exécuté directement :

if __name__ == '__main__':
    app.run(debug=True)

index.html

Créez l'interface utilisateur en écrivant un fichier HTML basique avec quelques fonctionnalités JavaScript. Utilisez Tailwind CSS pour le style :

<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">

La fonction url_for() de Flask génère des URLs pour les fichiers statiques comme JavaScript et les images. Assignez des ID uniques pour l'interaction dans JavaScript.

script.js

Ce fichier JavaScript ajoute de l'interactivité à l'application Flask, permettant le chargement dynamique des images sans rafraîchir la page :

window.onload = function() {
    const searchBtn = document.getElementById("searchBtn");
    const generateBtn = document.getElementById("generateBtn");
}
searchBtn.addEventListener("click", sendInput);
generateBtn.addEventListener("click", generateImages); 

.env

Ce fichier sert à stocker des clés API et d'autres paramètres comme des variables d'environnement pour la sécurité et la flexibilité :

STABILITY_API_KEY=your_stability_api_key

requirements.txt

Pour gérer les dépendances, créez un fichier requirements.txt. Activez votre environnement et exécutez :

pip freeze > requirements.txt

Les utilisateurs peuvent installer les dépendances avec :

pip install -r requirements.txt

La Structure du Projet

Après avoir suivi les étapes ci-dessus, la structure de votre projet devrait ressembler à :

  • app.py
  • .env
  • requirements.txt
  • static/
  • templates/
  • .gitignore

Cette structure garantit la clarté pour naviguer et comprendre le projet.

Compléter les Fonctions des Points de Terminaison

Retournez à app.py pour finaliser les fonctions des points de terminaison tels que images() pour retourner les requêtes de génération d'images et generate() pour gérer les requêtes de génération d'images.

Tester l’Application de Génération d’Images

Pour tester notre application, exécutez la commande suivante :

flask run

Si tout est configuré correctement, vous verrez la sortie, vous permettant de naviguer vers localhost:5000 dans votre navigateur.

Générez des images en entrant une invite de texte et en cliquant sur le bouton "Générer", puis visualisez l'image générée sous le champ de saisie.

Ajouter une Fonctionnalité de Recherche par Terme Similaire

Ensuite, nous allons implémenter une fonctionnalité de recherche utilisant ChromaDB pour trouver des termes similaires au lieu de correspondances exactes. Cette fonctionnalité peut donner des résultats surprenants, permettant des recherches nuancées.

Commencez par initialiser ChromaDB et la fonction d'embedding, puis intégrez ChromaDB dans la fonction images() :

result_list = collection.query(search_term)

De plus, mettez à jour la fonction generate() pour stocker les invites de génération d'images et les chemins des images comme métadonnées dans ChromaDB :

collection.add(prompts)

Tester les Capacités de Recherche de l’Application de Galerie d’Images

Testez la fonctionnalité de recherche en générant des images distinctes et en recherchant des termes connexes, en observant comment les embeddings facilitent des résultats nuancés.

Conclusion

Nous avons atteint la fin de notre didacticiel, construisant une galerie de génération d'images tirant parti de Stable Diffusion et de la base de données Chroma. Bien que l'application actuelle serve de démonstration de base, le potentiel d'expansion reste vaste, y compris le stockage d'embeddings et des fonctionnalités de recherche sophistiquées.

Avec des fonctionnalités telles que l'inpainting pour des transformations créatives et des capacités de recherche améliorées, l'avenir de notre application promet des développements passionnants !

En lire plus

A screenshot of a Github repository showcasing project collaboration.
Midjourney tutorial for image generation on Discord.

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés.

Ce site est protégé par hCaptcha, et la Politique de confidentialité et les Conditions de service de hCaptcha s’appliquent.