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 :
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 –
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 des 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:
- Lignes, colonnes pour des mises en page appropriées.
- Bouton, zone de texte, menu déroulant et curseur pour obtenir les fonctionnalités requises et la simplicité d'utilisation
- Image pour afficher les résultats.
- D'autres assistants, tels que EventData, mettent à 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 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.
Voici la capture d'écran de la génération d'images dans l'application Gradio.
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.
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.
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.