IA générative – Génération d'images à partir de mots clés

1. Introduction

Dernière mise à jour : 12/10/2023

Génération d'images Imagegen

Google Imagen est un grand modèle de langage puissant de Google qui peut générer des images réalistes et créatives à partir de descriptions textuelles. Imagen sur Vertex AI permet aux utilisateurs de créer des produits d'IA nouvelle génération qui transforment en quelques secondes l'inspiration de leur utilisateur en éléments visuels de haute qualité. En plus de la génération d'images à partir de texte, il prend également en charge la retouche d'images à l'aide de requêtes textuelles, le sous-titrage d'images, le système de questions-réponses visuelles et l'ajustement de modèles d'images en fonction du sujet et du style.

Génération de requêtes

Pour créer une image à l'aide d'Imagen, vous devez fournir une description textuelle de l'image, appelée "prompt", à partir de laquelle une image est générée. Toutefois, pour générer une image photoréaliste de haute qualité, il faut maîtriser l'art du prompting. Il peut également dépendre du domaine si vous souhaitez générer une image liée à des domaines d'activité spécifiques tels que le commerce de détail, l'industrie manufacturière, etc. Une approche plus simple pour concevoir un prompt consiste à fournir un ensemble de mots clés au modèle Text Bison.

L'approche globale est la suivante :

fbb3826592b2816d.png

Interface utilisateur Gradio

Gradio est une bibliothèque Python Open Source qui vous permet de créer rapidement des composants d'interface utilisateur personnalisables et faciles à utiliser pour votre modèle de machine learning, n'importe quelle API ou même une fonction Python arbitraire en quelques lignes de code. Vous pouvez intégrer l'interface utilisateur graphique Gradio directement dans votre notebook Jupyter ou la partager sous forme de lien avec n'importe qui. Gradio est compatible avec un large éventail de types de contenus multimédias, y compris le texte, les images, les vidéos et l'audio. Il fournit également un certain nombre de composants d'interface utilisateur prédéfinis, tels que des champs de saisie, des boutons, des curseurs et des menus déroulants.

Objectifs de l'atelier

Dans cet atelier de programmation, vous allez déployer une application Gradio qui :

  • Générez un prompt textuel à l'aide de mots clés ou d'expressions. Vous pouvez également modifier manuellement la requête générée.
  • Générez des images à partir du prompt généré dans l'UI.

Points abordés

  • Comment utiliser l'apprentissage zero-shot et l'apprentissage few-shot avec le modèle text-bison de manière programmatique pour générer des prompts spécifiques à Imagen pour la génération d'images.
  • Générer des images à l'aide du modèle Imagen via l'API et une requête
  • Découvrez comment créer, déployer et tester une application Gradio à partir d'un notebook Vertex AI Workbench.

Prérequis

  • Accès à un projet GCP, par exemple "Cloud-llm-preview4"
  • Accès pour créer Vertex AI Workbench
  • L'API Vertex AI est activée.
  • Exigences réseau pour Gradio : URL publique d'accès à l'instance de notebook

2. Configuration

Créer le notebook

  • Se connecter au projet
  • Accédez à Workbench dans le menu de navigation de gauche.
  • Sous NOTEBOOKS GÉRÉS PAR L'UTILISATEUR, créez un notebook avec les options par défaut.
  • Une fois l'instance provisionnée, cliquez sur OUVRIR JUPYTERLAB.

Remarque : Le démarrage du notebook peut prendre quelques minutes s'il est à l'état arrêté.

Obtenir le code

Nous avons placé le fichier de code ici. Vous pouvez importer ce notebook dans votre environnement et l'exécuter tel quel (sauf pour modifier les détails de votre projet).

3. Exécuter le code

Installer/Importer les dépendances et bibliothèques requises

  • Installer l'application Gradio
  • Importez les API Vertex AI pour Text-Bison et la génération d'images.
  • Importez toutes les autres bibliothèques requises.

Génération de requêtes à l'aide de Text-Bison

Utilise une entrée utilisateur contenant des mots clés et/ou une expression, c'est-à-dire une liste d'éléments séparés par une virgule de mots clés ou d'expressions, qui peuvent être utilisés pour construire une phrase décrivant l'image à générer.

Par exemple, le persona, le sujet, l'arrière-plan, l'éclairage et d'autres descriptions.

La fonction qui génère la requête est la suivante :

def prompt_generation(persona,signal,theme, lighting, quality, extra_desc):

model = TextGenerationModel.from_pretrained("text-bison")

response_few_shot = model.predict(

    few_shot_prompt,

    **parameters

)

response_single_shot = model.predict(

    prompt,

    **parameters

)

Requêtes few-shot et zero-shot

Le prompting zero-shot est une technique de génération de texte dans laquelle le modèle ne reçoit aucun contexte ni aucun exemple pour générer du texte. Cela peut être difficile, car le modèle doit s'appuyer sur ses propres connaissances pour générer un texte cohérent et informatif.

Cependant, le prompting zero-shot peut également être très créatif, car le modèle n'est pas limité par des exemples préexistants.

Le prompting few-shot est une technique de génération de texte dans laquelle le modèle reçoit un petit nombre d'exemples à partir desquels générer du texte. Cette approche peut être plus facile que le prompting zero-shot, car le modèle dispose de quelques indications sur ce qu'il doit générer. Cependant, le prompting few-shot peut également être limité, car le modèle ne peut générer que du texte semblable aux exemples qui lui ont été fournis.

Vous trouverez ci-dessous l'exemple de code pour les requêtes Few-Shot et Zero-Shot.

**# Requête few-shot utilisée dans le code**

few_shot_prompt = f"""You are an expert in writing prompts for Image Generation Models. À l'aide des expressions et des mots clés fournis, concaténez-les et ajoutez des détails réalistes pour générer une requête logique et pertinente pouvant être utilisée pour la génération d'images.

input: people, gardening, house garden, colorful plants, Real, HD image, Photo.

output: A Photo of people gardening in a house garden landscape with few coloured flowering plants. Realistic FULL HD Images, Elegant and natural facial and eye features taken by professional photographer

input: plumber, faucet, kitchen, high quality, natural lighting, Photo

output: A Photo of a plumber fixing a faucet in the kitchen. High quality image with natural indoor lighting.

input: house and garden, halloween, warm lighting, high quality image, Sketch

output: A Sketch of Beautiful House and Garden with Halloween Decorations. Warm lighting, High Quality, 4K photograph taken by professional photographer from front.

input: nice living room, warm lighting,Professional Photographer from far, Photo

output: A photo of a Well designed Living Room. Warm lighting, High Quality, 4K photograph taken by Professional Photographer from far

input: {params_list_str}

output:

"""

# Requête zero-shot utilisée dans le code

prompt = f"""You are an expert in writing prompts for Image Generation Models. Aide-moi à rédiger une liste de requêtes pertinentes pour le modèle de génération d'images, en incluant spécifiquement les mots "{params_list_str}". N'oubliez pas d'inclure ces mots dans la requête et de la rendre pertinente."""

Génération d'images avec Imagen

Utilise une invite de commande d'entrée utilisateur et une invite de commande négative(facultative) et les transmet au modèle (imagegeneration@002).

def image_generation_completion(input, negative_prompt):

input_prompt = input

model = ImageGenerationModel.from_pretrained("imagegeneration@002")

response = model.generate_images(

    prompt=input_prompt,

    number_of_images=4, #kept to static value of 4

    negative_prompt=negative_prompt

)

Le code suivant est inclus pour générer des images à partir d'un prompt et d'un prompt négatif saisis par l'utilisateur. Le code final utilise le prompt généré par le modèle text-bison.

from vertexai.preview.vision_models import ImageGenerationModel

def image_generation(input, negative_prompt):

input_prompt = input

model = ImageGenerationModel.from_pretrained("imagegeneration@002")

response = model.generate_images(

    prompt=input_prompt,

    number_of_images=4, #kept to static value of 4.. can be a max value of 8

    negative_prompt=negative_prompt

)

images = response.images

return images

user_prompt = "Requête : Une jeune femme présente et vend un sapin de Noël frais et non décoré provenant d'un groupe d'arbres. Éclairage froid, image de haute qualité et détaillée prise de loin par un photographe professionnel."

negative_prompt = "Visages déformés et peu attrayants"

generated_images_list = image_generation(user_prompt,negative_prompt)

#show one of the generated image

generated_images_list[0].show()

Sortie :

db04a6bfdd78693b.jpeg

4. Déployer l'application Gradio

Gradio est utilisé pour le frontend, où les utilisateurs peuvent saisir les mots clés et générer des requêtes structurées. Ces requêtes peuvent être utilisées directement ou être modifiées par l'utilisateur, puis transmises à Imagen pour générer des images en fonction des entrées. Gradio est une bibliothèque Python qui peut être utilisée pour créer des interfaces utilisateur pour les modèles de machine learning. Pour cette application, les blocs sont utilisés pour ajouter de la flexibilité et des flux de données complexes. Les blocs permettent de gérer la mise en page des applications à l'aide de lignes et de colonnes :

with gr.Blocks() as demo:

#Prompt Generation Part

with gr.Row():

    with gr.Column(scale=1):

        Persona = gr.Textbox(label="Persona", info = "Customer segment such as Plumber, Electrician etc.")

    with gr.Column(scale=1):

        Signals = gr.Textbox(label="Signals", info = "Main content of banner such as Faucet, Lamp etc.")

    with gr.Column(scale=1):

        Theme = gr.Textbox(label="Theme", info = "Context of the banner such as Halloween, Kitchen etc.")

with gr.Row():

    with gr.Column(scale=1):

        photo_modifiers = gr.Textbox(label="Photography Modifiers", info = "Photography specific modifiers and parameters such as Lighting(Dramatic/Natural/Warm/Cold), Camera Proximity etc.")

    with gr.Column(scale=1):

        quality_modifiers =  gr.Textbox(label="Image Quality Modifier", info = "Quality Modifiers like high-quality, beautiful, stylized. 4K, HDR, By a professional etc")

    with gr.Column(scale=1):

        other_desc =  gr.Textbox(label="Any Other Description", info = "Other Descriptions for Image such as Style (Painting/Photo/Sketch), Bakground/Foreground Context")

with gr.Row():

    btn = gr.Button("Submit")

with gr.Row():

    returned_prompts = gr.Textbox(label="Result Prompts", interactive = True)    

btn.click(fn=prompt_generation, inputs=[Persona, Signals,Theme, photo_modifiers, quality_modifiers, other_desc], outputs = returned_prompts)

Pour gérer les entrées et sorties utilisateur, Gradio fournit plusieurs composants tels que Image, Video, Slider, Dropdown, Textbox, Radio et d'autres options. Ces composants offrent aux développeurs la flexibilité et le contrôle nécessaires pour accepter les entrées des utilisateurs et les transmettre à Test-bison, Imagen ou tout autre modèle de ML.

Pour ce projet, l'application est créée à l'aide de Blocks pour ajouter de la flexibilité et des fonctionnalités complexes.

les données sont transmises à l'application. En plus des blocs, plusieurs composants Gradio sont

utilisés, y compris :

Vous trouverez ci-dessous un extrait de code utilisé pour générer des images à partir d'une requête d'entrée et d'une requête négative :

 #Image Generation part

with gr.Row():

    with gr.Column(scale=1):

        image_prompt = gr.Textbox(label="Image Generation Prompt")

with gr.Accordion("Advanced options", open=False): #Let's hide the advanced options!

    with gr.Row():

        negative_prompt = gr.Textbox(label="Negative prompt", info = "Specify What not to Include in Image ex. Bad Quality Image")

with gr.Row():

    with gr.Column(scale=1):    

        img_btn = gr.Button("Generate Images")

with gr.Row():

    with gr.Column():

        output_image_1 = gr.Image(label = "Result Image 1", visible = False)

    with gr.Column():

        output_image_2 = gr.Image(label = "Result Image 2", visible = False)

with gr.Row():

    with gr.Column():

        output_image_3 = gr.Image(label = "Result Image 3", visible = False)

    with gr.Column():

        output_image_4 = gr.Image(label = "Result Image 4", visible = False)

returned_prompts.select(populate_image_prompt, inputs = [returned_prompts], outputs = image_prompt)

img_btn.click(fn=image_generation_completion, inputs=[image_prompt,negative_prompt], outputs = [output_image_1,output_image_2,output_image_3,output_image_4])       

Pour exécuter et tester l'application Gradio, il vous suffit de saisir un prompt textuel et de cliquer sur le bouton « Générer ». Imagen génère une image en fonction de votre requête. Vous pouvez essayer différents prompts pour voir les types d'images qu'Imagen peut générer.

Vous trouverez ci-dessous une capture d'écran de la génération de prompts dans l'application Gradio.

70331c9645b1e91b.png

Vous trouverez ci-dessous une capture d'écran de la génération d'images dans l'application Gradio.

a7261e8fafab7073.png

Voici quelques exemples :

Exemple 1 :

[Image de gauche] Requête (utiliser des mots clés simples comme requêtes) : un couple d'amis fait du bateau.

[Image de droite] Requête (à l'aide de requêtes générées par Text-Bison) : photo de deux jeunes hommes pêchant sur un bateau entouré d'arbres sombres dans les bois. Des hommes portant une chemise se tiennent debout sur un bateau. Éclairage naturel, haute qualité, photo 4K prise par un photographe professionnel.

c2f5fabd10baf42.jpeg abc9b8204a9fdf7f.jpeg

Exemple 2 :

[Image de gauche] Requête ((Utiliser des mots clés simples comme requêtes)) : un sapin de Noël

[Image de droite] Requête (à l'aide de requêtes générées par Text-Bison) : Un sapin de Noël dans une pièce avec une lampe et des meubles. L'arbre est décoré de lumières et d'ornements. Il est placé près d'une fenêtre, et un mur est visible en arrière-plan. Éclairage chaud, haute qualité, photo HDR prise de loin par un photographe professionnel.

f10cf9f52ffd92c7.jpeg cce36df7a439b309.jpeg

5. Effectuer un nettoyage

Pour libérer de l'espace dans vos ressources,

  • Arrêtez l'application Gradio.
  • Arrêtez ou supprimez le notebook Workbench.

6. Félicitations

Félicitations, vous avez déployé une application Gradio pour créer des requêtes et des images avec les API Google Text-Bison et Imagen.