AI Art

Tutorial de Stable Diffusion: Construye una aplicación de galería de generación con búsqueda semántica Chroma

Visual representation of creating a Generation Gallery App using AI for image generation.

¿Qué es Stable Diffusion?

En los últimos años, un avance significativo en el ámbito de la Inteligencia Artificial ha remodelado el paisaje del arte digital: las imágenes generadas por IA. Desde este desarrollo, han surgido varias tecnologías de generación de imágenes, cautivando audiencias y haciendo titulares a nivel mundial. Entre estas tecnologías pioneras, un modelo de generación de imágenes de código abierto destaca: Stable Diffusion.

Stable Diffusion rápidamente ganó tracción debido a sus impresionantes capacidades y apertura, inspirando a una nueva generación de modelos. Con su capacidad para generar una amplia variedad de estilos a partir de breves indicaciones legibles por humanos, Stable Diffusion ha reducido significativamente las barreras para la creación de arte con IA.

¿Pero qué distingue a Stable Diffusion? Ofrece características únicas como inpainting y outpainting. Inpainting permite a los usuarios editar dentro de la imagen, habilitando alteraciones y ajustes precisos. Outpainting, por otro lado, empodera a los usuarios para extender la imagen más allá de sus límites originales, perfecto para crear vistas panorámicas o escenas expansivas. Stable Diffusion también soporta image-to-image prompting, una característica que permite a los usuarios crear una nueva imagen basada en una imagen fuente. Es como tener una conversación con tu IA, donde la imagen fuente es tu indicación, y la IA responde con una imagen completamente nueva.

¿Qué son Chroma y los Embeddings?

Ahora, profundicemos en una pieza emocionante de tecnología llamada Chroma. Chroma es una base de datos de código abierto diseñada específicamente para manejar embeddings, un tipo de representación de datos ampliamente utilizada en IA, especialmente en el contexto de Modelos de Lenguaje Grande (LLMs). Un LLM es un modelo de IA que entiende y genera texto similar al humano basado en la entrada que recibe.

Chroma actúa como un parque de juegos para estos modelos de IA. Facilita el desarrollo de aplicaciones de IA al proporcionar una plataforma para almacenar, consultar y analizar embeddings de medios. Los medios pueden variar desde texto hasta imágenes, y en futuras versiones, audio y video.

En Chroma, cada pieza de medio (como un documento de texto o una imagen) se transforma en una representación matemática conocida como un embedding. Chroma puede almacenar estos embeddings junto con sus metadatos asociados, convirtiendo los medios en un formato que los modelos de IA pueden entender e interactuar fácilmente. Al almacenar los embeddings, Chroma permite la identificación fácil de elementos de medios similares, análisis de colecciones de medios, y mucho más.

Entonces, ¿qué son exactamente los embeddings? En términos simples, los embeddings convierten palabras o imágenes en números, específicamente vectores en un espacio multidimensional. Esta técnica es poderosa porque posiciona elementos "similares" cerca uno del otro en este espacio. Por ejemplo, los embeddings de palabras colocan palabras con significados similares cerca unas de otras. Este concepto no se limita a palabras; puedes tener embeddings para oraciones, párrafos, documentos o incluso imágenes.

En el contexto de los embeddings de imágenes, imágenes similares (como fotos de gatos) tienen embeddings alineados de cerca y, por lo tanto, están posicionados juntos dentro del espacio de embedding multidimensional. Esta característica hace que los embeddings sean una herramienta robusta para tareas como el reconocimiento de imágenes o sistemas de recomendación. Combina este poder con las capacidades de generación de imágenes de Stable Diffusion, y ¡las posibilidades son infinitas!

¿Qué es el marco de trabajo HTTP Flask?

En el paisaje de desarrollo web en rápida evolución, un marco que se destaca constantemente es Flask. Este marco web basado en Python es celebrado por su simplicidad y naturaleza ligera, mientras que su potencia y flexibilidad lo convierten en una elección preferida tanto para desarrolladores experimentados como para principiantes.

Flask es reconocido por su enfoque minimalista y pragmático. No impone estrictas bibliotecas o patrones, en su lugar, proporciona un marco esbelto que permite a los desarrolladores elegir lo que mejor se adapta a su proyecto. Esta apertura no resta funcionalidad; de hecho, Flask viene con un conjunto sólido de características desde el primer momento.

Por ejemplo, Flask soporta el enrutamiento para manejar elegantemente las URL, permitiendo guiar a los usuarios a través de los sitios. Ofrece plantillas para la fácil creación de páginas HTML dinámicas, dando vida a las aplicaciones web. Además, el soporte de Flask para cookies y sesiones maneja los datos del usuario de manera efectiva.

La verdadera maravilla radica en cómo Flask combina estas potentes características con un diseño simple y limpio. Con solo un entendimiento básico de Python, los desarrolladores pueden configurar rápidamente un servidor web de Flask. La combinación de poder, flexibilidad y facilidad de uso establece a Flask como una elección premier entre los marcos de desarrollo web.

Requisitos previos

  • Conocimientos básicos de Python y Flask
  • Acceso a la API de Stability.ai
  • Una base de datos Chroma configurada

Esquema

  1. Inicializando el Proyecto
  2. Configurando las Bibliotecas Requeridas
  3. Escribiendo el Archivo Principal
  4. Probando el Chatbot Básico
  5. Configurando la Base de Datos Chroma
  6. Probando el Chatbot Mejorado
  7. Discusión

Inicializando el Proyecto

¡Vamos a sumergirnos en el código! Nuestro primer paso es configurar nuestro directorio del proyecto, que llamaremos chroma-sd. Abre tu terminal favorita y navega a tu directorio de proyectos. Luego, crea y muévete al directorio del proyecto usando los siguientes comandos:

mkdir chroma-sd
cd chroma-sd

Como desarrolladores de Python responsables, crearemos un nuevo entorno virtual para este proyecto. Esta práctica asegura que las dependencias del proyecto estén separadas del entorno global de Python, un paso esencial al trabajar en múltiples proyectos con diferentes dependencias. Un entorno virtual también nos permite "congelar" las dependencias en un archivo requirements.txt, documentándolas para futuras referencias.

Para crear nuestro entorno virtual, ejecuta:

python -m venv env

A continuación, activa el entorno virtual. El comando varía según tu sistema operativo:

  • Windows: . envin exto
  • Linux/MacOS: source env/bin/activate

Una vez activado, el nombre de tu entorno debería aparecer al inicio de tu aviso de terminal.

Configurando las Bibliotecas Requeridas

Antes de codificar, asegúrate de que todas las bibliotecas necesarias estén instaladas. Nuestra aplicación usará principalmente Flask y ChromaDB:

  • Flask: Un marco web ligero y flexible de Python.
  • ChromaDB: Una base de datos robusta para almacenar y consultar embeddings.

Asegúrate de estar usando Python 3, ya que Python 2 ha llegado a su fin de vida. Verifica tu versión de Python escribiendo python --version en tu terminal.

Para instalar las bibliotecas, usa el gestor de paquetes de Python, pip. Estas bibliotecas se instalarán dentro del entorno virtual:

pip install flask chromadb

Con las bibliotecas necesarias instaladas, estamos listos para comenzar a construir nuestra aplicación.

Escribiendo los Archivos del Proyecto

Ahora, volvamos a sumergirnos en la codificación. Antes de comenzar, asegúrate de estar en el directorio raíz del proyecto.

Abre tu IDE o editor de código preferido y crea un nuevo archivo. Dado que estamos trabajando con Flask, es convencional nombrar el archivo principal app.py. El comando flask run busca una aplicación en un archivo llamado app.py en el directorio actual.

Recuerda, si tu archivo principal de aplicación tiene un nombre diferente, la ubicación se puede especificar usando la variable de entorno FLASK_APP.

app.py

Importando Módulos Necesarios

Comienza importando los módulos necesarios:

  • logging: Para el registro de errores y depuración.
  • os: Para interactuar con el sistema operativo.
  • flask: Para crear y gestionar la aplicación web.
  • requests: Para hacer solicitudes HTTP a la API de generación de imágenes.
  • dotenv: Para cargar variables de entorno desde nuestro archivo .env.

Configurando el Registro y la Aplicación Flask

Configura el registro con un nivel DEBUG para capturar e imprimir todos los mensajes:

logging.basicConfig(level=logging.DEBUG)
app = Flask(__name__)

Cargando Variables de Entorno

Usa load_dotenv() para cargar las variables de entorno desde un archivo .env, que almacena datos sensibles como llaves API:

load_dotenv()

Definiendo Endpoints de API

Define varios endpoints de API que manejan diferentes tareas. Cada función decorada con @app.route corresponde a una ruta URL específica:

  • search_images: Maneja las solicitudes de búsqueda y devuelve una lista de solicitudes de generación de imágenes.
  • generate: Gestiona las solicitudes de generación de imágenes.
  • home: Renderiza la página de inicio.

Ejecutando la Aplicación Flask

Asegúrate de que la aplicación Flask se ejecute solo si el script se ejecuta directamente:

if __name__ == '__main__':
    app.run(debug=True)

index.html

Crea la interfaz de usuario escribiendo un archivo HTML básico con alguna funcionalidad de JavaScript. Usa Tailwind CSS para el estilo:

<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">

La función url_for() de Flask genera URLs para archivos estáticos como JavaScript e imágenes. Asigna ID únicos para la interacción en JavaScript.

script.js

Este archivo de JavaScript agrega interactividad a la aplicación Flask, permitiendo la carga dinámica de imágenes sin recargar la página:

window.onload = function() {
    const searchBtn = document.getElementById("searchBtn");
    const generateBtn = document.getElementById("generateBtn");
}
searchBtn.addEventListener("click", sendInput);
generateBtn.addEventListener("click", generateImages); 

.env

Este archivo sirve para almacenar claves API y otras configuraciones como variables de entorno para seguridad y flexibilidad:

STABILITY_API_KEY=your_stability_api_key

requirements.txt

Para gestionar dependencias, crea un archivo requirements.txt. Activa tu entorno y ejecuta:

pip freeze > requirements.txt

Los usuarios pueden instalar las dependencias con:

pip install -r requirements.txt

Estructura del Proyecto

Después de seguir los pasos anteriores, la estructura de tu proyecto debería parecerse a:

  • app.py
  • .env
  • requirements.txt
  • static/
  • templates/
  • .gitignore

Esta estructura asegura claridad al navegar y entender el proyecto.

Completando las Funciones de Endpoints

Vuelve a app.py para finalizar funciones de endpoints como images() para devolver solicitudes de generación de imágenes y generate() para manejar solicitudes de generación de imágenes.

Probando la Aplicación de Generación de Imágenes

Para probar nuestra aplicación, ejecuta el siguiente comando:

flask run

Si está configurado correctamente, verás la salida, permitiéndote navegar a localhost:5000 en tu navegador.

Genera imágenes ingresando un texto indicativo y haciendo clic en el botón "Generar", luego mira la imagen generada debajo del campo de entrada.

Agregando la Función de Búsqueda por Término Similar

A continuación, implementaremos una función de búsqueda utilizando ChromaDB para encontrar términos similares en lugar de coincidencias exactas. Esta función puede arrojar resultados sorprendentes, permitiendo búsquedas matizadas.

Comienza inicializando ChromaDB y la función de embedding, luego integra ChromaDB en la función images():

result_list = collection.query(search_term)

Además, actualiza la función generate() para almacenar indicaciones de generación de imágenes y rutas de imágenes como metadatos en ChromaDB:

collection.add(prompts)

Probando las Capacidades de Búsqueda de la Aplicación de Galería de Imágenes

Prueba la función de búsqueda generando imágenes distintas y buscando términos relacionados, observando cómo los embeddings facilitan resultados matizados.

Conclusión

Hemos llegado a la conclusión de nuestro tutorial, construyendo una galería de generación de imágenes aprovechando Stable Diffusion y la base de datos Chroma. Mientras que la aplicación actual sirve como una demostración básica, el potencial de expansión sigue siendo vasto, incluyendo almacenamiento de embeddings y funcionalidad de búsqueda sofisticada.

Con características como inpainting para transformaciones creativas y capacidades de búsqueda mejoradas, ¡el futuro de nuestra aplicación promete desarrollos emocionantes!

Puede que te interese

A screenshot of a Github repository showcasing project collaboration.
Midjourney tutorial for image generation on Discord.

Dejar un comentario

Todos los comentarios se revisan antes de su publicación.

Este sitio está protegido por hCaptcha y se aplican la Política de privacidad de hCaptcha y los Términos del servicio.