1. Introduction
Dernière mise à jour : 12/10/2023
Génération d'images Imagegen
Google Imagen est un puissant modèle de langage de grande taille 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 l'inspiration de leur utilisateur en éléments visuels de haute qualité, en quelques secondes. En plus de la génération d'images à partir de texte, il prend également en charge la modification d'images via des requêtes textuelles, le sous-titrage d'images, les questions-réponses visuelles et l'ajustement du modèle d'image 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 requête, à partir de laquelle une image est générée. Toutefois, pour générer une image photoréaliste de haute qualité, une expertise en matière de 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, la fabrication, etc. Une approche plus simple pour concevoir une requête consiste à fournir un ensemble de mots clés au modèle Text Bison.
L'approche globale est la suivante :

Interface utilisateur de 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 à l'aide de quelques lignes de code. Vous pouvez intégrer l'interface graphique de Gradio directement dans votre notebook Jupyter ou la partager avec n'importe qui sous forme de lien. Gradio prend en charge un large éventail de types de contenus, 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érera une requête textuelle à l'aide de mots clés ou d'expressions ; la requête générée pourra également être modifiée manuellement ;
- générera des images à partir de la requête générée dans l'interface utilisateur.
Points abordés
- Comment utiliser l'apprentissage zero-shot et few-shot avec le modèle text-bison par programmation pour générer des requêtes spécifiques à Imagen pour la génération d'images
- Comment générer des images à l'aide du modèle Imagen via l'API et la requête
- 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
- API Vertex AI activée
- Exigences réseau pour Gradio : URL publique d'accès à l'instance de notebook
2. Configuration
Créer le notebook
- Connectez-vous 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.
- 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 bibliothèques requises
- Installer l'application Gradio
- Importer les API Vertex AI pour Text-Bison et la génération d'images
- Importer 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.
Par exemple : personnage, sujet, arrière-plan, éclairage et 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ête 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 exemple à partir duquel 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.
Toutefois, la requête zero-shot peut également être très créative, car le modèle n'est pas limité par des exemples préexistants.
La requête 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. Cela peut être plus facile que la requête zero-shot, car le modèle reçoit des indications sur ce qu'il doit générer. Toutefois, la requête few-shot peut également être limitative, 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. Using the provided phrases and keywords, concatenate them and add on some realistic details to generate logical and Meaningful prompt that can be used for image generation.
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. Help me write a list of meaningful prompts for Image Generation Model specifically including the words: "{params_list_str}". Remember to include these words in the prompt and make the prompt meaningful."""
Génération d'images à l'aide d'Imagen
Utilise une requête d'entrée utilisateur et une requête 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'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 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 non décoré parmi un groupe d'arbres. Éclairage froid, image de haute qualité et détaillée prise de loin par un photographe professionnel."
negative_prompt = "Distorted and unattractive faces"
generated_images_list = image_generation(user_prompt,negative_prompt)
#show one of the generated image
generated_images_list[0].show()
Résultat :

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, des 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 de l'application à 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 les 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 blocs afin d'ajouter de la flexibilité et de la complexité.
flux de données vers l'application. En plus des blocs, plusieurs composants Gradio sont
utilisés, y compris :
- Lignes et colonnes pour des mises en page appropriées
- Bouton, zone de texte, menu déroulant et curseur pour obtenir les fonctionnalités requises et faciliter l'utilisation
- Composant Image pour afficher les résultats
- Autres assistants tels que EventData, mise à jour pour prendre en charge les modifications dynamiques de l'interface utilisateur
Vous trouverez ci-dessous un extrait de code utilisé pour générer des images à partir d'une 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, saisissez simplement une requête textuelle et cliquez 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 les types d'images qu'Imagen peut générer.
Vous trouverez ci-dessous une capture d'écran de la génération de requêtes dans l'application Gradio.

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

Quelques exemples :
Exemple 1 :
[Image de gauche] Requête (à l'aide de 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. Les hommes portent une chemise et se tiennent debout sur un bateau. Éclairage naturel, haute qualité, photo 4K prise par un photographe professionnel.

Exemple 2 :
[Image de gauche] Requête (à l'aide de 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.

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 avez déployé une application Gradio pour créer des requêtes et des images avec l'API Google Text-Bison et l'API Imagen.