1. Introducción
Última actualización: 12/10/2023
Generación de imágenes con Imagegen
Google Imagen es un potente modelo de lenguaje grande de Google que puede generar imágenes realistas y creativas a partir de descripciones de texto. Imagen en Vertex AI permite a los usuarios crear productos de IA de nueva generación que transforman la creatividad de sus usuarios en recursos visuales de alta calidad, en segundos. Además de la generación de imágenes a partir de texto, también admite la edición de imágenes a través de instrucciones de texto, subtítulos de imágenes, preguntas y respuestas visuales, y ajuste de modelos de imágenes basados en temas y estilos.
Generación de instrucciones
Para crear una imagen con Imagen, debes proporcionar una descripción de texto de la imagen, conocida como instrucción, con la que se genera una imagen. Sin embargo, para generar una imagen fotorrealista de alta calidad, se requiere experiencia en la creación de instrucciones. También podría depender del dominio si deseas generar una imagen relacionada con dominios comerciales específicos, como el comercio minorista, la fabricación, etcétera. Una forma más sencilla de diseñar una instrucción es proporcionar un conjunto de palabras clave al modelo Text Bison.
El enfoque general es el siguiente:

IU de Gradio
Gradio es una biblioteca de Python de código abierto que te permite crear rápidamente componentes de IU personalizables y fáciles de usar para tu modelo de aprendizaje automático, cualquier API o incluso una función de Python arbitraria con unas pocas líneas de código. Puedes integrar la GUI de Gradio directamente en tu notebook de Jupyter o compartirla como un vínculo con cualquier persona. Gradio admite una amplia variedad de tipos de medios, incluidos texto, imágenes, videos y audio. También proporciona varios componentes de IU precompilados, como campos de entrada, botones, controles deslizantes y menús desplegables.
Qué compilarás
En este codelab, implementarás una app de Gradio que hará lo siguiente:
- Generar una instrucción de texto con palabras clave o frases. La instrucción generada también se puede editar de forma manual.
- Generar imágenes a partir de la instrucción generada en la IU.
Qué aprenderás
- Cómo usar el aprendizaje sin ejemplos y con varios ejemplos con el modelo text-bison de forma programática para generar instrucciones específicas de imagen para la generación de imágenes
- Cómo generar imágenes con el modelo Imagen a través de la API y la instrucción
- Cómo compilar, implementar y probar la aplicación de Gradio desde el notebook de Vertex AI Workbench
Requisitos
- Acceso a un proyecto de GCP, por ejemplo, “Cloud-llm-preview4”
- Acceso para crear Vertex AI Workbench
- API de Vertex AI habilitada
- Requisitos de redes para Gradio: URL pública de acceso a la instancia de notebook
2. Cómo prepararte
Crea el notebook
- Accede al proyecto.
- Navega a Workbench desde el menú de navegación de la izquierda.
- En "NOTEBOOKS ADMINISTRADOS POR EL USUARIO", crea un notebook nuevo con las opciones predeterminadas.
- Haz clic en "ABRIR JUPYTERLAB" una vez que se aprovisione la instancia.
Nota: Si el notebook está detenido, es posible que tarde unos minutos en iniciarse.
Obtén el código
Colocamos el archivo de código aquí. Este notebook se puede importar en tu entorno y ejecutar tal como está (excepto por el cambio de los detalles del proyecto).
3. Ejecuta el código
Instala o importa las dependencias y bibliotecas requeridas
- Instala la app de Gradio.
- Importa las APIs de Vertex AI para Text-Bison y la generación de imágenes.
- Importa todas las demás bibliotecas requeridas.
Generación de instrucciones con Text-Bison
Usa una entrada del usuario que contenga palabras clave o frases, es decir, una lista separada por comas de palabras clave o frases que se pueden usar para construir una oración que describa la imagen requerida que se generará.
Por ejemplo, persona, tema, fondo, iluminación y otras descripciones.
La función que genera la instrucción se proporciona de la siguiente manera:
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
)
Instrucción sin ejemplos y con varios ejemplos
La instrucción sin ejemplos es una técnica de generación de texto en la que no se le proporciona al modelo contexto ni ejemplos para generar texto. Esto puede ser un desafío, ya que el modelo debe basarse en su propio conocimiento para generar texto coherente e informativo.
Sin embargo, la instrucción sin ejemplos también puede ser muy creativa, ya que el modelo no está restringido por ningún ejemplo preexistente.
La instrucción con varios ejemplos es una técnica de generación de texto en la que se le proporciona al modelo una pequeña cantidad de ejemplos para generar texto. Esto puede ser más fácil que la instrucción sin ejemplos, ya que el modelo tiene algunas instrucciones sobre qué generar. Sin embargo, la instrucción con varios ejemplos también puede ser limitante, ya que es posible que el modelo solo pueda generar texto similar a los ejemplos que se le proporcionaron.
A continuación, se muestra el código de muestra para las instrucciones sin ejemplos y con varios ejemplos.
**# Instrucción con varios ejemplos que se usa en el código**
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:
"""
# Instrucción sin ejemplos que se usa en el código
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."""
Generación de imágenes con Imagen
Usa una instrucción de entrada del usuario y una instrucción negativa(opcional) y las envía al modelo (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
)
Se incluye el siguiente código para generar imágenes a partir de una instrucción de entrada del usuario y una instrucción negativa. El código final usa la instrucción generada por el modelo 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 = "Prompt: A Young Woman Showcasing and selling an undecorated Fresh Christmas Tree from A bunch of trees. Cold Lighting, High Quality and detailed Image Taken By Professional Photographer from far."
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()
Resultado:

4. Implementa la app de Gradio
Gradio se usa para el frontend, en el que los usuarios pueden ingresar las palabras clave y generar instrucciones estructuradas. Estas instrucciones se pueden usar directamente o el usuario puede editarlas y, luego, enviarlas a Imagen para generar imágenes según las entradas. Gradio es una biblioteca de Python que se puede usar para crear interfaces de usuario para modelos de aprendizaje automático. Para esta aplicación, se usan bloques para agregar flexibilidad y flujos de datos complejos a esta aplicación. Los bloques proporcionan la administración del diseño de la aplicación con filas y columnas:
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)
Para controlar las entradas y salidas del usuario, Gradio proporciona varios componentes, como imagen, video, control deslizante, menú desplegable, cuadro de texto, botón de selección y otras opciones. Estos componentes brindan a los desarrolladores flexibilidad y control sobre cómo aceptar entradas de los usuarios y enviarlas a Test-bison, imagen o cualquier otro modelo de AA.
Para este proyecto, la aplicación se crea con bloques para agregar flexibilidad y complejidad.
flujos de datos a la aplicación. Además de los bloques, se usan varios componentes de Gradio,
incluidos los siguientes:
- Filas y columnas para diseños adecuados
- Botón, cuadro de texto, menú desplegable y control deslizante para lograr la funcionalidad requerida y la facilidad de uso
- Componente de imagen para mostrar los resultados
- Otros asistentes, como EventData, se actualizan para admitir cambios dinámicos en la IU.
A continuación, se muestra un fragmento de código que se usa para generar imágenes a partir de la entrada y la instrucción negativa:
#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])
Para ejecutar y probar la aplicación de Gradio, simplemente escribe una instrucción de texto y haz clic en el botón Generar. Imagen generará una imagen basada en tu instrucción. Puedes probar diferentes instrucciones para ver qué tipos de imágenes puede generar Imagen.
A continuación, se muestra una captura de pantalla de la generación de instrucciones en la app de Gradio.

A continuación, se muestra una captura de pantalla de la generación de imágenes en la app de Gradio.

Algunos ejemplos:
Ejemplo 1:
[Imagen de la izquierda] Instrucción (con palabras clave simples como instrucciones) : Una pareja de amigos navegando.
[Imagen de la derecha] Instrucción (con instrucciones generadas por Text-Bison) : Una foto de 2 hombres jóvenes pescando en un bote rodeado de árboles oscuros en el bosque Los hombres visten una camisa y están parados en un bote. Iluminación natural, alta calidad, foto en 4K tomada por un fotógrafo profesional

Ejemplo 2:
[Imagen de la izquierda] Instrucción (con palabras clave simples como instrucciones) : Un árbol de Navidad
[Imagen de la derecha] Instrucción (con instrucciones generadas por Text-Bison) : Un árbol de Navidad en una habitación con una lámpara y muebles El árbol está decorado con luces y adornos. Se coloca cerca de una ventana y se ve una pared en el fondo. Iluminación cálida, alta calidad, foto HDR tomada por un fotógrafo profesional desde lejos

5. Corrección
Para limpiar tus recursos, haz lo siguiente:
- Detén la app de Gradio.
- Detén o borra el notebook de Workbench.
6. Felicitaciones
Felicitaciones. Implementaste correctamente una aplicación de Gradio para crear instrucciones e imágenes con la API de Google Text-Bison y la API de Imagen.