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 performant de Google, capable de 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 leur imagination en assets visuels de haute qualité, en quelques secondes. Outre la génération d'images à partir de texte, il permet également de modifier des images à l'aide de requêtes de texte, de sous-titres d'images, de questions/réponses visuelles et de Réglage de modèles d'images basés sur des styles.

Génération d'invites

Pour créer une image à l'aide d'Imagen, vous devez fournir une description textuelle de l'image, appelée requête, à l'aide de laquelle l'image est générée. Cependant, pour générer une image photoréaliste de haute qualité, une expertise en requêtes est requise. Cela peut également dépendre du domaine si vous souhaitez générer une image liée à des domaines d'activité spécifiques tels que la vente au détail, l'industrie, etc. Une approche plus simple pour concevoir une requête consiste à attribuer un ensemble de mots clés au modèle Text Bison.

L'approche globale est la suivante :

fbb3826592b2816d.png

Interface utilisateur de Gradio

Gradio est une bibliothèque Python Open Source qui vous permet de créer rapidement, avec quelques lignes de code, 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. Vous pouvez intégrer l'IUG Gradio directement dans votre notebook Jupyter ou la partager sous forme de lien avec n'importe qui. GRadio est compatible avec une grande variété de types de contenus, y compris du texte, des images, des vidéos et du contenu 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 une requête textuelle à l'aide de mots clés ou d'expressions. La requête générée peut également être modifiée manuellement.
  • Générer des images à partir de la requête générée dans l'interface utilisateur

Points abordés

  • Comment utiliser de manière programmatique l'apprentissage zero-shot et few-shot avec un modèle text-bison pour générer des requêtes spécifiques à une image afin de générer des images
  • Comment générer des images à l'aide du modèle Imagen via l'API et une requête.
  • 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 permettant de créer Vertex AI Workbench
  • API Vertex AI activée.
  • Configuration réseau requise pour Gradio: URL publique d'accès à l'instance de notebook

2. Configuration

Créer le notebook

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

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

Obtenir le code

Nous avons placé le fichier de code ici. Ce notebook peut être importé dans votre environnement et exécuté tel quel (sauf pour modifier les détails de votre projet).

3. Exécuter le code

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

  • Installer l'application Gradio
  • Importer les API Vertex AI pour générer du texte-bison et des 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 de mots clés ou d'expressions séparés par une virgule, qui peuvent être utilisés pour construire une phrase décrivant l'image à générer.

Exemples : persona, sujet, arrière-plan, éclairage et autres descriptions.

La fonction qui génère la requête est indiquée comme suit:

Ⰳdef prompt_generation(persona,signal,thème, éclairage, qualité, 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

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

Cependant, les requêtes zero-shot peuvent aussi se révéler très créatives, car le modèle n'est pas limité par des exemples préexistants.

Une requête few-shot est une technique de génération de texte qui consiste à fournir au modèle un petit nombre d'exemples à partir desquels il doit générer du texte. Cela peut être plus facile que les requêtes zero-shot, car le modèle peut vous indiquer ce qu'il doit générer. Cependant, les requêtes few-shot peuvent également être contraignantes, car le modèle risque de ne pouvoir générer que du texte semblable aux exemples fournis.

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

尃**# Quelques invites de prises de vue utilisées dans le code**

few_shot_prompt = f"""Vous maîtrisez la rédaction de requêtes pour les modèles de génération d'images. À l'aide des expressions et mots clés fournis, concaténez-les et ajoutez des détails réalistes pour générer une requête logique et pertinente qui peut être utilisée pour générer des 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"""Vous êtes un expert de la rédaction de requêtes pour les modèles de génération d'images. Aide-moi à écrire une liste de requêtes pertinentes pour le modèle de génération d'images, 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 à l'aide d'Imagen

Utilise une requête d'entrée utilisateur et une requête négative(facultatif), et transmet la même chose au modèle (imagegeneration@002).

Catalogue d'images_generation_completion(entrée, requête_négative):

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'une requête d'entrée utilisateur et d'une requête négative. Le code final utilise la requête générée par le modèle text-bison.

ఃfrom sommetxai.preview.vision_models importer 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 = "Prompt (Invite) : Une jeune femme présentant et vendant un sapin de Noël frais non décoré provenant de plusieurs arbres. Éclairage froid, photos détaillées de haute qualité prises de loin par un photographe professionnel."

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

generate_images_list = image_generation(user_prompt,exemple_négatif)

#afficher l'une des images générées

generated_images_list[0].show()

Résultat –

db04a6bfdd78693b.jpeg

4. Déployer l'application Gradio

Gradio est utilisé pour l'interface, où les utilisateurs peuvent saisir les mots clés et générer des requêtes structurées. Ces invites peuvent être utilisées directement ou modifiées par l'utilisateur, puis intégrées à Imagen pour générer des images conformément aux entrées. Gradio est une bibliothèque Python qui permet de créer des interfaces utilisateur pour les modèles de machine learning. Pour cette application, les blocs lui permettent d'ajouter de la flexibilité et des flux de données complexes. Blocks permet de gérer la mise en page des applications à l'aide de lignes et de colonnes:

Consultez la démo avec gr.Blocks() :

#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")

avec gr.Row():

    btn = gr.Button("Submit")

avec gr.Row():

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

requises

Pour gérer les entrées et sorties utilisateur, Gradio fournit plusieurs composants tels que Image, Video, Slider, Dropdown, Textbox, Radio et plus encore. Ces composants offrent aux développeurs la flexibilité et le contrôle dont ils ont besoin pour accepter les entrées des utilisateurs et les transmettre à l'outil Test-bison, à l'imagen ou à tout autre modèle de ML.

Pour ce projet, l'application est créée à l'aide de Blocks pour plus de flexibilité et de complexité

de flux de données vers 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:

Ⰳ #Pièce de génération d'images

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 une requête textuelle et de cliquer sur le bouton "Générer". Imagen générera une image en fonction de votre requête. Vous pouvez essayer différentes requêtes pour voir quels types d'images Imagen peut générer.

Voici la capture d'écran de la génération d'invites dans l'application Gradio.

70331c9645b1e91b.png

Voici la 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 (en utilisant des mots-clés simples comme requêtes) : Deux amis font du bateau.

[Image de droite] Requête (utilisant les requêtes générées par Text-Bison) : une photo de deux jeunes hommes en train de pêcher sur un bateau, entourés d'arbres sombres dans les bois. Des hommes en chemise se tiennent sur un bateau. Photo 4K de haute qualité, éclairage naturel, photographiée par un photographe professionnel.

c2f5fabd10baf42.jpeg abc9b8204a9fdf7f.jpeg

Exemple 2 -

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

[Image de droite] Requête (utilisant des 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 à l'arrière-plan. Photo HDR de haute qualité prise de loin par un photographe professionnel, avec un éclairage chaleureux.

f10cf9f52ffd92c7.jpeg cce36df7a439b309.jpeg

5. Effectuer un nettoyage

Pour nettoyer vos ressources,

  • Arrêtez l'application gradio.
  • Arrêtez/Supprimez le notebook Workbench.

6. Félicitations

Félicitations ! Vous venez de déployer une application Gradio pour créer des requêtes et des images avec les API Text-Bison et Imagen de Google.