IA generativa: Generación de imágenes a partir de palabras clave

1. Introducción

Última actualización: 12/10/2023

Generación de imágenes de Imagegen

Google Imagen es un potente modelo grande de lenguaje 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 los 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, leyendas de imágenes, preguntas y respuestas visuales, y Ajuste de modelo de imagen basado en el estilo.

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 necesita experiencia en las instrucciones. También podría depender del dominio si quieres generar una imagen relacionada con dominios específicos de la empresa, como la venta minorista, la fabricación, etc. Un enfoque más sencillo para diseñar una instrucción es proporcionar un conjunto de palabras clave al modelo Text Bison.

El enfoque general es lo siguiente:

fbb3826592b2816d.png

IU de Gradio

Gradio es una biblioteca de código abierto de Python que te permite crear rápidamente componentes de IU fáciles de usar y personalizables para tu modelo de aprendizaje automático, cualquier API o incluso una función arbitraria de Python 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 quien quieras. Gradio es compatible con una amplia variedad de tipos de contenido multimedia, como texto, imágenes, videos y audio. También proporciona una serie de 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 usando 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 ejemplos limitados con un modelo text-bison de manera programática para generar instrucciones específicas con imágenes para la generación de imágenes.
  • Cómo generar imágenes con el modelo Imagen a través de la API y las instrucciones
  • 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 Herramientas 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" (USER-MANAGED NOTEBOOKS), crea un notebook nuevo con las opciones predeterminadas.
  • Haz clic en “ABRIR JUPYTERLAB”. una vez que la instancia se aprovisionó.

Nota: Es posible que el notebook tarde unos minutos en iniciarse si está detenido.

Obtén el código

Colocamos el archivo de código aquí. Este notebook se puede importar en tu entorno y ejecutarse tal como está (excepto si cambias los detalles del proyecto).

3. Ejecuta el código

Instala o importa las dependencias y bibliotecas necesarias

  • Cómo instalar la app de Gradio
  • Importar las APIs de Vertex AI para la generación de imágenes y Text-Bison
  • 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 de palabras clave o frases separadas por comas que se pueden usar para construir una oración que describa la imagen requerida que se debe generar.

Por ejemplo, la persona, el asunto, el fondo, la iluminación y otras descripciones.

La función que genera la instrucción se proporciona de la siguiente manera:

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 ejemplos limitados y sin ejemplos

La instrucción sin ejemplos es una técnica de generación de texto en la que al modelo no se le proporciona contexto ni ejemplos para generar texto. Esto puede ser desafiante, ya que el modelo tiene que confiar en su propio conocimiento para generar un texto que sea informativo y coherente.

Sin embargo, las instrucciones sin ejemplos también pueden ser muy creativas, ya que el modelo no está limitado por ningún ejemplo preexistente.

La instrucción con ejemplos limitados es una técnica de generación de texto en la que el modelo recibe 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 orientación sobre qué generar. Sin embargo, las instrucciones con ejemplos limitados también pueden ser limitantes, ya que es posible que el modelo solo pueda generar texto similar a los ejemplos que se le dieron.

A continuación, encontrarás el código de muestra para las instrucciones con ejemplos limitados y sin ejemplos.

📔

few_shot_prompt = f"""Eres un experto en escribir instrucciones para modelos de generación de imágenes. Con las frases y palabras clave proporcionadas, concatenalas y agrega algunos detalles realistas para generar instrucciones lógicas y significativas que se puedan 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 tomas utilizada 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 esas palabras en la instrucción y hacerla significativa."""

Generación de imágenes con Imagen

Usa un mensaje de entrada del usuario y un mensaje negativo(opcional), y envía el mismo mensaje al modelo (imagegeneration@002).

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 utiliza la instrucción que generó el modelo text-bison.

⧫desde vertexai.preview.vision_models importa 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: Una mujer joven muestra y vende un Árbol de Navidad fresco sin decoración de un montón de árboles. Iluminación fría, alta calidad e imagen detallada tomada desde lejos por un fotógrafo profesional."

negative_prompt = "Rostros poco atractivos y distorsionados"

generate_images_list = generación_de_imagen(user_prompt,negative_prompt)

#muestra una de la imagen generada

generated_images_list[0].show()

Resultado:

db04a6bfdd78693b.jpeg

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, que pueden usarse directamente o el usuario puede editarlas y, luego, incorporarlas 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. En esta aplicación, los bloques se usan para agregar flexibilidad y flujos de datos complejos a la aplicación. Blocks permite la administración del diseño de la aplicación a través de filas y columnas:

⁕ con gr.Blocks() como demostración:

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

con gr.Row():

    btn = gr.Button("Submit")

con gr.Row():

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

btn.click(fn=prompt_generation, inputs=[Persona, Indicadores,Tema, photo_modifiers, quality_modifiers, other_desc], output_prompts)

Para manejar las entradas y salidas del usuario, Gradio proporciona varios componentes, como imagen, video, control deslizante, menú desplegable, cuadro de texto, radio y otras opciones. Estos componentes les brindan a los desarrolladores flexibilidad y control sobre cómo aceptar las entradas de los usuarios y alimentarlas al modelo Test-bison, image o cualquier otro modelo de AA.

En este proyecto, se crea la aplicación con Blocks para agregar flexibilidad y complejidad

flujos de datos a la aplicación. Además de los bloques, se usan varios componentes de Gradio

utilizados, entre ellos:

A continuación, se muestra un fragmento de código que se usa para generar imágenes a partir de una entrada y un mensaje negativo:

Њ #parte de la 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 Gradio, simplemente escribe una indicació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.

70331c9645b1e91b.png

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

a7261e8fafab7073.png

Estos son algunos ejemplos:

Ejemplo 1:

[Left image] Instrucción (con palabras clave simples como instrucciones) : Un par de amigos paseando.

[Imagen derecha] Consigna (con instrucciones generadas por Text-Bison) : Una foto de 2 hombres jóvenes pescando en un barco rodeado de árboles oscuros en el bosque. Algunos hombres usan una camiseta y están de pie sobre un bote. Iluminación natural, fotos en 4K de alta calidad tomadas por un fotógrafo profesional.

c2f5fabd10baf42.jpeg abc9b8204a9fdf7f.jpeg

Ejemplo 2:

[Left image] Instrucción ((con palabras clave simples como indicaciones)) : Un árbol de Navidad

[Right image] Consigna (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 hay una pared visible en el fondo. Iluminación cálida, alta calidad, foto HDR tomada desde lejos por un Fotógrafo profesional.

f10cf9f52ffd92c7.jpeg cce36df7a439b309.jpeg

5. Corrección

Para limpiar tus recursos,

  • Detén la app de graduación.
  • Detén o borra el notebook de Workbench.

6. Felicitaciones

Felicitaciones, implementaste correctamente una aplicación de Gradio para crear imágenes y mensajes con la API de Text-Bison de Google y la API de Imagen.