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 imaginación 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, la generación de subtítulos para imágenes, las preguntas y respuestas visuales, y el ajuste del modelo de imágenes basado 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 una serie de componentes de IU compilados previamente, 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:
- Genera 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 con cero ejemplos y con pocos ejemplos con el modelo de 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 de Imagen a través de la API y la instrucción
- Cómo compilar, implementar y probar una aplicación de Gradio desde un notebook de Vertex AI Workbench
Requisitos
- Acceso a un proyecto de GCP, por ejemplo, "Cloud-llm-preview4"
- Acceso para crear Vertex AI Workbench
- Se habilitó la API de Vertex AI.
- Requisitos de redes para Gradio: URL pública de acceso a la instancia de notebook
2. Cómo prepararte
Crea el cuaderno
- Accede al proyecto
- En el menú de navegación de la izquierda, ve a Workbench.
- 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 a tu entorno y ejecutar tal como está (excepto por los detalles de tu proyecto).
3. Ejecuta el código
Instala o importa las bibliotecas y dependencias 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 contiene 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, sujeto, fondo, iluminación y otras descripciones.
La función que genera la instrucción se proporciona a continuación:
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 con varios ejemplos y sin ejemplos
La instrucción sin ejemplos es una técnica de generación de texto en la que no se le proporciona al modelo ningún 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á limitado por ningún ejemplo preexistente.
La instrucción con algunos 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 las instrucciones sin ejemplos, ya que el modelo tiene cierta orientación sobre lo que debe generar. Sin embargo, las instrucciones con pocos ejemplos también pueden ser limitantes, ya que el modelo solo puede 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 ejemplos limitados que se usó en el código**
few_shot_prompt = f"""Eres un experto en escribir instrucciones para los modelos de generación de imágenes. Con las frases y palabras clave proporcionadas, concaténalas y agrega algunos detalles realistas para generar un mensaje lógico y significativo que se pueda usar para la generación de imágenes.
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"""Eres un experto en escribir instrucciones para modelos de generación de imágenes. Ayúdame a escribir una lista de instrucciones significativas para el Modelo de generación de imágenes que incluya específicamente las palabras "{params_list_str}". Recuerda incluir estas palabras en la instrucción y hacer que tenga sentido""".
Generación de imágenes con Imagen
Usa una instrucción de entrada del usuario y una instrucción negativa(opcional), y alimenta el modelo con la misma (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
)
El siguiente código se incluye 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 = "Mensaje: Una mujer joven muestra y vende un árbol de Navidad fresco sin decorar de un montón de árboles. Iluminación fría, imagen detallada y de alta calidad tomada por un fotógrafo profesional desde lejos".
negative_prompt = "Rostros distorsionados y poco atractivos"
generated_images_list = image_generation(user_prompt,negative_prompt)
#muestra una de las imágenes generadas
generated_images_list[0].show()
Salida:

4. Implementa la app de Gradio
Gradio se usa para el frontend, donde los usuarios pueden ingresar las palabras clave y generar instrucciones estructuradas. Estas instrucciones se pueden usar directamente o el usuario puede editarlas aún más y, luego, ingresarlas en 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. En esta aplicación, se usan bloques para agregar flexibilidad y flujos de datos complejos. Los bloques proporcionan 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 Image, Video, Slider, Dropdown, Textbox, Radio y otras opciones. Estos componentes les brindan a los desarrolladores flexibilidad y control sobre cómo aceptar entradas de los usuarios y proporcionárselas 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.
los datos fluyen hacia la aplicación. Además de los bloques, hay 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 Image para mostrar los resultados.
- Otros asistentes, como EventData, update 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 una entrada y una instrucción negativa:
#Parte de generación de imágenes
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 la captura de pantalla de la generación de instrucciones en la app de Gradio.

A continuación, se muestra la 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) : Un par de amigos en bote.
[Imagen de la derecha] Instrucción (con instrucciones generadas por Text-Bison) : Una foto de 2 jóvenes pescando en un bote rodeado de árboles oscuros en el bosque. Hombres con camisas de pie 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 ((Uso de 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. Está 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 liberar espacio en 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 y generar imágenes con las APIs de Google Text-Bison y Imagen.