Skip to content

Latest commit

 

History

History
477 lines (323 loc) · 21.1 KB

File metadata and controls

477 lines (323 loc) · 21.1 KB

Créer des applications de génération d’images

Créer des applications de génération d’images

Les LLM ne servent pas uniquement à générer du texte. Il est également possible de créer des images à partir de descriptions textuelles. Disposer d’images comme modalité peut être très utile dans de nombreux domaines, de la MedTech à l’architecture, en passant par le tourisme, le développement de jeux, et bien plus encore. Dans ce chapitre, nous allons explorer les deux modèles de génération d’images les plus populaires : DALL-E et Midjourney.

Introduction

Dans cette leçon, nous aborderons :

  • La génération d’images et son utilité.
  • DALL-E et Midjourney : ce qu’ils sont et comment ils fonctionnent.
  • Comment créer une application de génération d’images.

Objectifs d’apprentissage

À l’issue de cette leçon, vous serez capable de :

  • Créer une application de génération d’images.
  • Définir les limites de votre application avec des méta-prompts.
  • Travailler avec DALL-E et Midjourney.

Pourquoi créer une application de génération d’images ?

Les applications de génération d’images sont un excellent moyen d’explorer les capacités de l’IA générative. Elles peuvent être utilisées, par exemple, pour :

  • L’édition et la synthèse d’images. Vous pouvez générer des images pour divers cas d’usage, comme l’édition ou la synthèse d’images.

  • Appliquées à différents secteurs. Elles peuvent aussi servir à créer des images pour divers secteurs tels que la MedTech, le tourisme, le développement de jeux, et plus encore.

Scénario : Edu4All

Dans le cadre de cette leçon, nous continuerons à travailler avec notre startup Edu4All. Les étudiants créeront des images pour leurs évaluations ; le choix des images leur revient, mais il pourrait s’agir d’illustrations pour leur propre conte, de la création d’un nouveau personnage pour leur histoire, ou d’une aide à la visualisation de leurs idées et concepts.

Voici ce que les étudiants d’Edu4All pourraient générer, par exemple, s’ils travaillent en classe sur des monuments :

Edu4All startup, classe sur les monuments, Tour Eiffel

avec un prompt comme

"Chien à côté de la Tour Eiffel au lever du soleil"

Qu’est-ce que DALL-E et Midjourney ?

DALL-E et Midjourney sont deux des modèles de génération d’images les plus populaires, ils permettent d’utiliser des prompts pour créer des images.

DALL-E

Commençons par DALL-E, un modèle d’IA générative qui crée des images à partir de descriptions textuelles.

DALL-E est une combinaison de deux modèles, CLIP et diffused attention.

  • CLIP est un modèle qui génère des embeddings, c’est-à-dire des représentations numériques des données, à partir d’images et de textes.

  • Diffused attention est un modèle qui génère des images à partir de ces embeddings. DALL-E est entraîné sur un ensemble de données d’images et de textes et peut être utilisé pour créer des images à partir de descriptions textuelles. Par exemple, DALL-E peut générer une image d’un chat avec un chapeau, ou d’un chien avec une crête.

Midjourney

Midjourney fonctionne de manière similaire à DALL-E, il génère des images à partir de prompts textuels. Midjourney peut aussi être utilisé pour créer des images avec des prompts comme « un chat avec un chapeau » ou « un chien avec une crête ».

Image générée par Midjourney, pigeon mécanique
Crédit image Wikipedia, image générée par Midjourney

Comment fonctionnent DALL-E et Midjourney

Commençons par DALL-E. DALL-E est un modèle d’IA générative basé sur l’architecture transformer avec un transformer autorégressif.

Un transformer autorégressif définit comment un modèle génère des images à partir de descriptions textuelles : il génère un pixel à la fois, puis utilise les pixels générés pour créer le pixel suivant. Le processus passe par plusieurs couches dans un réseau de neurones, jusqu’à ce que l’image soit complète.

Grâce à ce procédé, DALL-E contrôle les attributs, objets, caractéristiques, et plus encore dans l’image qu’il génère. Cependant, DALL-E 2 et 3 offrent un contrôle encore plus précis sur l’image générée.

Créer votre première application de génération d’images

Alors, que faut-il pour créer une application de génération d’images ? Vous aurez besoin des bibliothèques suivantes :

  • python-dotenv, il est fortement recommandé d’utiliser cette bibliothèque pour garder vos secrets dans un fichier .env séparé du code.
  • openai, cette bibliothèque vous permettra d’interagir avec l’API OpenAI.
  • pillow, pour manipuler les images en Python.
  • requests, pour faciliter les requêtes HTTP.
  1. Créez un fichier .env avec le contenu suivant :

    AZURE_OPENAI_ENDPOINT=<your endpoint>
    AZURE_OPENAI_API_KEY=<your key>
    

    Vous trouverez ces informations dans le portail Azure pour votre ressource, dans la section « Keys and Endpoint ».

  2. Rassemblez les bibliothèques ci-dessus dans un fichier nommé requirements.txt comme suit :

    python-dotenv
    openai
    pillow
    requests
    
  3. Ensuite, créez un environnement virtuel et installez les bibliothèques :

    python3 -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt

    Sous Windows, utilisez les commandes suivantes pour créer et activer votre environnement virtuel :

    python3 -m venv venv
    venv\Scripts\activate.bat
  4. Ajoutez le code suivant dans un fichier nommé app.py :

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
    
    # import dotenv
    dotenv.load_dotenv()
    
    # Get endpoint and key from environment variables
    openai.api_base = os.environ['AZURE_OPENAI_ENDPOINT']
    openai.api_key = os.environ['AZURE_OPENAI_API_KEY']
    
    # Assign the API version (DALL-E is currently supported for the 2023-06-01-preview API version only)
    openai.api_version = '2023-06-01-preview'
    openai.api_type = 'azure'
    
    
    try:
        # Create an image by using the image generation API
        generation_response = openai.Image.create(
            prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils',    # Enter your prompt text here
            size='1024x1024',
            n=2,
            temperature=0,
        )
        # Set the directory for the stored image
        image_dir = os.path.join(os.curdir, 'images')
    
        # If the directory doesn't exist, create it
        if not os.path.isdir(image_dir):
            os.mkdir(image_dir)
    
        # Initialize the image path (note the filetype should be png)
        image_path = os.path.join(image_dir, 'generated-image.png')
    
        # Retrieve the generated image
        image_url = generation_response["data"][0]["url"]  # extract image URL from response
        generated_image = requests.get(image_url).content  # download the image
        with open(image_path, "wb") as image_file:
            image_file.write(generated_image)
    
        # Display the image in the default image viewer
        image = Image.open(image_path)
        image.show()
    
    # catch exceptions
    except openai.InvalidRequestError as err:
        print(err)

Expliquons ce code :

  • Tout d’abord, nous importons les bibliothèques nécessaires, y compris OpenAI, dotenv, requests et Pillow.

    import openai
    import os
    import requests
    from PIL import Image
    import dotenv
  • Ensuite, nous chargeons les variables d’environnement depuis le fichier .env.

    # import dotenv
    dotenv.load_dotenv()
  • Puis, nous configurons l’endpoint, la clé pour l’API OpenAI, la version et le type.

    # Get endpoint and key from environment variables
    openai.api_base = os.environ['AZURE_OPENAI_ENDPOINT']
    openai.api_key = os.environ['AZURE_OPENAI_API_KEY']
    
    # add version and type, Azure specific
    openai.api_version = '2023-06-01-preview'
    openai.api_type = 'azure'
  • Ensuite, nous générons l’image :

    # Create an image by using the image generation API
    generation_response = openai.Image.create(
        prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils',    # Enter your prompt text here
        size='1024x1024',
        n=2,
        temperature=0,
    )

    Le code ci-dessus répond avec un objet JSON contenant l’URL de l’image générée. Nous pouvons utiliser cette URL pour télécharger l’image et la sauvegarder dans un fichier.

  • Enfin, nous ouvrons l’image et utilisons le visualiseur d’images standard pour l’afficher :

    image = Image.open(image_path)
    image.show()

Plus de détails sur la génération d’image

Examinons plus en détail le code qui génère l’image :

generation_response = openai.Image.create(
        prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils',    # Enter your prompt text here
        size='1024x1024',
        n=2,
        temperature=0,
    )
  • prompt est le texte utilisé pour générer l’image. Ici, nous utilisons le prompt « Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils ».
  • size correspond à la taille de l’image générée. Ici, nous créons une image de 1024x1024 pixels.
  • n est le nombre d’images générées. Ici, nous en générons deux.
  • temperature est un paramètre qui contrôle l’aléa dans la sortie d’un modèle d’IA générative. La température varie entre 0 et 1, où 0 signifie que la sortie est déterministe et 1 que la sortie est aléatoire. La valeur par défaut est 0,7.

Il y a encore plus de choses que vous pouvez faire avec les images, que nous aborderons dans la section suivante.

Capacités supplémentaires de la génération d’images

Vous avez vu jusqu’ici comment générer une image avec quelques lignes en Python. Cependant, il existe d’autres possibilités avec les images.

Vous pouvez également :

  • Effectuer des modifications. En fournissant une image existante, un masque et un prompt, vous pouvez modifier une image. Par exemple, vous pouvez ajouter un élément à une partie de l’image. Imaginez notre image du lapin, vous pouvez lui ajouter un chapeau. Pour cela, vous fournissez l’image, un masque (identifiant la zone à modifier) et un prompt textuel indiquant ce qui doit être fait.

    response = openai.Image.create_edit(
      image=open("base_image.png", "rb"),
      mask=open("mask.png", "rb"),
      prompt="An image of a rabbit with a hat on its head.",
      n=1,
      size="1024x1024"
    )
    image_url = response['data'][0]['url']

    L’image de base ne contiendrait que le lapin, mais l’image finale aurait le chapeau sur le lapin.

  • Créer des variations. L’idée est de prendre une image existante et de demander la création de variations. Pour créer une variation, vous fournissez une image, un prompt textuel et un code comme suit :

    response = openai.Image.create_variation(
      image=open("bunny-lollipop.png", "rb"),
      n=1,
      size="1024x1024"
    )
    image_url = response['data'][0]['url']

    Note : cette fonctionnalité est uniquement prise en charge par OpenAI.

Température

La température est un paramètre qui contrôle l’aléa dans la sortie d’un modèle d’IA générative. La température varie entre 0 et 1, où 0 signifie que la sortie est déterministe et 1 que la sortie est aléatoire. La valeur par défaut est 0,7.

Voyons un exemple de fonctionnement de la température, en lançant ce prompt deux fois :

Prompt : "Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils"

Lapin sur un cheval tenant une sucette, version 1

Maintenant, lançons le même prompt une seconde fois pour voir que nous n’obtiendrons pas la même image deux fois :

Image générée d’un lapin sur un cheval

Comme vous pouvez le voir, les images sont similaires, mais pas identiques. Essayons de changer la valeur de la température à 0,1 et observons ce qui se passe :

 generation_response = openai.Image.create(
        prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils',    # Enter your prompt text here
        size='1024x1024',
        n=2
    )

Modifier la température

Essayons donc de rendre la réponse plus déterministe. Nous avons pu constater avec les deux images générées que la première montre un lapin et la seconde un cheval, donc les images varient beaucoup.

Modifions donc notre code pour fixer la température à 0, comme ceci :

generation_response = openai.Image.create(
        prompt='Bunny on horse, holding a lollipop, on a foggy meadow where it grows daffodils',    # Enter your prompt text here
        size='1024x1024',
        n=2,
        temperature=0
    )

Lorsque vous exécutez ce code, vous obtenez ces deux images :

  • Température 0, v1
  • Température 0, v2

Ici, vous pouvez clairement voir que les images se ressemblent beaucoup plus.

Comment définir les limites de votre application avec des méta-prompts

Avec notre démo, nous pouvons déjà générer des images pour nos clients. Cependant, il est nécessaire de définir certaines limites pour notre application.

Par exemple, nous ne voulons pas générer d’images inappropriées pour le travail ou pour les enfants.

Nous pouvons faire cela avec des méta-prompts. Les méta-prompts sont des prompts textuels utilisés pour contrôler la sortie d’un modèle d’IA générative. Par exemple, nous pouvons utiliser des méta-prompts pour garantir que les images générées sont sûres pour le travail ou adaptées aux enfants.

Comment ça fonctionne ?

Alors, comment fonctionnent les méta-prompts ?

Les méta-prompts sont des prompts textuels placés avant le prompt principal, utilisés pour contrôler la sortie du modèle. Ils sont intégrés dans les applications pour encadrer la sortie du modèle, en encapsulant à la fois le prompt principal et le méta-prompt dans un seul prompt textuel.

Un exemple de méta-prompt serait le suivant :

You are an assistant designer that creates images for children.

The image needs to be safe for work and appropriate for children.

The image needs to be in color.

The image needs to be in landscape orientation.

The image needs to be in a 16:9 aspect ratio.

Do not consider any input from the following that is not safe for work or appropriate for children.

(Input)

Voyons maintenant comment utiliser les méta-prompts dans notre démo.

disallow_list = "swords, violence, blood, gore, nudity, sexual content, adult content, adult themes, adult language, adult humor, adult jokes, adult situations, adult"

meta_prompt =f"""You are an assistant designer that creates images for children.

The image needs to be safe for work and appropriate for children.

The image needs to be in color.

The image needs to be in landscape orientation.

The image needs to be in a 16:9 aspect ratio.

Do not consider any input from the following that is not safe for work or appropriate for children.
{disallow_list}
"""

prompt = f"{meta_prompt}
Create an image of a bunny on a horse, holding a lollipop"

# TODO add request to generate image

À partir du prompt ci-dessus, vous pouvez voir que toutes les images générées prennent en compte le méta-prompt.

Exercice – donnons aux étudiants les moyens d’agir

Nous avons présenté Edu4All au début de cette leçon. Il est maintenant temps de permettre aux étudiants de générer des images pour leurs évaluations.

Les étudiants créeront des images pour leurs évaluations contenant des monuments, le choix des monuments leur revenant. Ils sont invités à faire preuve de créativité pour placer ces monuments dans différents contextes.

Solution

Voici une solution possible :

import openai
import os
import requests
from PIL import Image
import dotenv

# import dotenv
dotenv.load_dotenv()

# Get endpoint and key from environment variables
openai.api_base = "<replace with endpoint>"
openai.api_key = "<replace with api key>"

# Assign the API version (DALL-E is currently supported for the 2023-06-01-preview API version only)
openai.api_version = '2023-06-01-preview'
openai.api_type = 'azure'

disallow_list = "swords, violence, blood, gore, nudity, sexual content, adult content, adult themes, adult language, adult humor, adult jokes, adult situations, adult"

meta_prompt = f"""You are an assistant designer that creates images for children.

The image needs to be safe for work and appropriate for children.

The image needs to be in color.

The image needs to be in landscape orientation.

The image needs to be in a 16:9 aspect ratio.

Do not consider any input from the following that is not safe for work or appropriate for children.
{disallow_list}"""

prompt = f"""{meta_prompt}
Generate monument of the Arc of Triumph in Paris, France, in the evening light with a small child holding a Teddy looks on.
""""

try:
    # Create an image by using the image generation API
    generation_response = openai.Image.create(
        prompt=prompt,    # Enter your prompt text here
        size='1024x1024',
        n=2,
        temperature=0,
    )
    # Set the directory for the stored image
    image_dir = os.path.join(os.curdir, 'images')

    # If the directory doesn't exist, create it
    if not os.path.isdir(image_dir):
        os.mkdir(image_dir)

    # Initialize the image path (note the filetype should be png)
    image_path = os.path.join(image_dir, 'generated-image.png')

    # Retrieve the generated image
    image_url = generation_response["data"][0]["url"]  # extract image URL from response
    generated_image = requests.get(image_url).content  # download the image
    with open(image_path, "wb") as image_file:
        image_file.write(generated_image)

    # Display the image in the default image viewer
    image = Image.open(image_path)
    image.show()

# catch exceptions
except openai.InvalidRequestError as err:
    print(err)

Bravo ! Continuez à apprendre

Après avoir terminé cette leçon, consultez notre collection d’apprentissage sur l’IA générative pour continuer à approfondir vos connaissances en IA générative !

Rendez-vous à la leçon 10 où nous verrons comment créer des applications IA avec peu de code

Avertissement :
Ce document a été traduit à l’aide du service de traduction automatique Co-op Translator. Bien que nous nous efforcions d’assurer l’exactitude, veuillez noter que les traductions automatiques peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d’origine doit être considéré comme la source faisant foi. Pour les informations critiques, une traduction professionnelle réalisée par un humain est recommandée. Nous déclinons toute responsabilité en cas de malentendus ou de mauvaises interprétations résultant de l’utilisation de cette traduction.