viernes, octubre 28, 2022

Cómo funciona Stable Diffusion - y Dalle-2 o Midjourney -: Open Source Generative-IA que crea imágenes artísticas (1 de 2)

El campo de la Generative-AI se ha convertido en un mundo muy dinámico y con constante innovación, sobre todo respecto a la generación de imágenes artísticas o directamente en competencia con el arte. Todos los meses aparecen nuevas investigaciones con nuevos avances en este ámbito, y adaptarse a ellos para ponerse al día con cada una de las contribuciones está siendo, cuando menos, desafiante.

Figura 1: Cómo funciona Stable Diffusion - y Dalle-2 o Midjourney -.
Open Source Generative-IA que crea imágenes artísticas (1 de 2)

Para ponernos en contexto, este año 2022 comenzamos alrededor de abril con la puesta en escena de Dalle-2, que seguro ya conocéis, ya que por aquí se habló de Crayon - basado den Dall-e mini - en los artículos de "Haciéndome un selfie con CrAIyon (Dall-e mini)", en el que veíamos "Cómo Dall-e mini (CrAIyon) pinta a personajes populares" o "Cómo Dall-e y OpenAI pintan con sesgos de género". Esta IA supuso una gran revolución, y aunque antes ya se habían presentado modelos similares, ésta fue la que realmente hizo gran acto de presencia, porque se empezaron a usar los llamados modelos de difusión (explicaré en qué consiste más adelante en este artículo) dejando boquiabiertos a todos aquellos que la probaban por sus fantásticas creaciones.
Desde ese momento, nuevas IA de este estilo surgieron como Midjourney, creada por un laboratorio independiente con este mismo nombre, IMAGEN, de Google (ésta aún no es accesible), o Stable Diffusion, creada por la startup Stability.AI. Recuerda que, siempre que hablamos de Machine Learning, recomendamos este libro el cual abarca los principios fundamentales del Machine Learning y además aplicado al mundo de la ciberseguridad.

Figura 3: Libro de Machine Learning aplicado a Ciberseguridad de
Carmen TorranoFran Ramírez, Paloma Recuero, José Torres y Santiago Hernández

El nivel de calidad de estas IA es excepcional, cada una de ellas con sus peculiaridades, lo que puede hacer que te inclines por usar una u otra dependiendo de tu objetivo (o, por qué no, integrar varias de ellas a tu proceso creativo). El caso es que, o bien porque aún no son accesibles o porque no son productos libres, crear imágenes con ellas cuesta dinero, excepto una.

Stable Diffusion, parte 1

Stable Diffusion, que es una Generative-AI Open Source que permite generar imágenes artísticas en local en nuestros equipos utilizando nuestras GPUs (con más o menos mínimo 5GB de VRAM) o bien en la entornos Cloud con tarjetas gráficas alojadas (por ejemplo, con Google Colab, sin tener cuenta de pago). En este artículo veremos cómo funcionan en general estos modelos de difusión que son el corazón de estas Generative-AI, y en concreto, entenderemos cómo funciona Stable Diffusion que, al ser Open Source, tenemos acceso a su código completo.

Modelos de difusión

Para entender en qué consiste un modelo de difusión, observa este GIF, imagina que echamos una gota de pintura en un vaso de agua. Justo al caer la gota al agua, la densidad de la pintura será muy alta en un punto, y cero en otras partes. Al cabo de un tiempo, la gota se difundirá en el agua hasta alcanzar un equilibrio. Pensad que el hecho de que la gota de pintura esté en un punto equivale a tener una imagen en claro, sin ruido, y que con el paso del tiempo perdemos la información totalmente de la imagen, se “difunde en el agua”.

Figura 3: Difusión de pintura en el agua

La pregunta que nos hacemos ahora es, ¿qué pasaría  si pudiéramos revertir este proceso? Es decir, que, a partir de la pintura difuminada, podamos volver al punto donde la gota justo cae al agua. Obviamente, en nuestro mundo físico esto es imposible (no podemos volver atrás en el tiempo), pero en los modelos de difusión sí que es posible, es decir, podemos volver desde una imagen llena de ruido hasta su correspondiente imagen en claro, sin ruido. Los modelos de difusión funcionan replicando este proceso, es decir, a partir de una imagen, se va añadiendo ruido a ésta hasta tener una imagen totalmente llena de ruido, y después aprendiendo cómo revertir este proceso. 


Este ruido se aplica siguiendo una Cadena de Markov. Esta cadena básicamente significa que un determinado evento en un momento (t) solo depende únicamente del momento anterior (t-1). Es decir, se va aplicando ruido en sucesivos momentos (formando una cadena), pero la adición de ruido a la imagen en un determinado paso de esta cadena solo se realiza sobre la imagen del paso anterior. Esto es importante, porque es lo que nos va a permitir invertir estas adiciones de ruido posteriormente.

Añadir ruido a las imágenes

En los modelos de difusión, el ruido que se añade es el llamado Ruido Gaussiano. Básicamente, esto quiere decir que a la hora de elegir cómo aplicar el ruido en cada momento se sigue una distribución gaussiana. Si observamos la imagen, diferentes valores que forman esta distribución hace que esta se haga más ancha o estrecha y que se desplace a un lado u otro, pero la forma de campana sigue permaneciendo. 

Cuanta más estrecha sea la campana (color azul en la imagen) más probable es que de manera aleatoria el valor que se escoja sea muy cercano al valor sobre el que está centrada la distribución (en este caso, la distribución azul está centrada en 0, por lo que serán valores con más probabilidad cercanos a 0), y cuanta más ancha sea la campana (color naranja en la imagen), los valores aleatorios que se escojan serán más variados.


Veamos un ejemplo de cómo añadir ruido utilizando distribuciones gaussianas a una imagen. Para simplificarlo, suponemos que la imagen solo tiene dos píxeles (170 y 150). Podemos observar en la siguiente imagen cómo la distribución gaussiana se centra sobre la imagen, mientras que la anchura de la campana es un valor constante que se fija con anterioridad. De esta manera, añadir ruido significa seleccionar una posición aleatoria dentro de esta distribución, por lo que cambiarán los píxeles de la imagen y también la distribución se irá centrando en diferentes posiciones (dependiendo de los píxeles resultantes escogidos).

Figura 6: Ejemplo adición de ruido a imagen con distribución gaussiana

Como vimos antes, dependiendo de la anchura de la campana será más o menos probable que los nuevos píxeles escogidos sean cercanos a los píxeles originales. En este ejemplo, la campana es estrecha por lo que el punto coloreado de verde es más probable que sea escogido frente al punto rojo. Por lo que, por ejemplo, los nuevos píxeles escogidos serían (173,152), es decir, el punto verde, y la distribución gaussiana se centrará en ese nuevo punto.

La predicción del ruido con CNN

En los modelos de difusión, obviamente, se trabaja con ejemplos de muchas más dimensiones. Normalmente, la Cadena de Markov suele ser de una longitud del orden de unas 1.000 adiciones de ruido. Además, el ruido que se va aplicando en cada paso no siempre es el mismo, esto se va regulando con un planificador que va cambiando poco a poco las formas de la distribución gaussiana (si quieres entender toda la matemática que hay detrás, puedes leer este artículo). De esta manera, finalmente tras todas estas iteraciones se pierde totalmente la información de la imagen original.

El hecho de realizar muchos pasos en la cadena (unos 1.000), nos permite llegar a tener una imagen con mucho ruido pero que se han ido añadiendo a cantidades muy pequeñas, lo que facilitará posteriormente el proceso de “predecir” cuánto ruido se ha utilizado en cada paso y poder ir eliminándolo. Ahora bien, ¿cómo revertimos las adiciones de ruido? Invertir este proceso significa ir recuperando los valores de los píxeles hasta tener una imagen resultante que se parezca a la original, y aquí es donde entran en juego las Redes Neuronales Convolucionales (CNNs), en concreto, la red conocida como U-Net.


Como podéis ver, esta arquitectura tiene forma de U. Esta recibe una imagen de entrada y la va procesando mediante convoluciones hasta recoger la información más crítica en un espacio de menos dimensiones (espacio latente), y a partir de esta información crítica se van construyendo características de más dimensiones hasta lograr las requeridas (por ejemplo, se puede entrenar una U-Net que reciba imágenes en escala de grises y genere su respectiva imagen a color). 

En este caso, la U-Net se utiliza para predecir cuánto ruido se ha utilizado en un paso de la cadena. Es decir, dado por ejemplo como entrada la imagen con más ruido acumulado y el paso de la cadena en el que fue creada (que se correspondería con el momento T, el último paso de la cadena) le pedimos a la U-Net que genere la imagen del momento T-1, que tendrá algo menos de ruido, es decir, al fin y al cabo, estamos prediciendo el ruido utilizado en ese paso, el cual eliminándolo tendremos la imagen del momento T-1.

Aún hay más …

Volveremos a la U-Net más adelante en la segunda parte de este artículo y entenderemos mejor cómo se entrena esta red. Solo comentaros que, en realidad, esta arquitectura en forma de U no se utiliza en este caso exactamente como os he explicado. Por lo que se volvieron tan famosas estas nuevas Generative-AI generativas basadas en modelos de difusión es porque tú las puedes introducir un texto (concepto conocido como "input prompt") y te genera contenido artístico basado en el texto que has introducido, y sin embargo esto ni siquiera lo he mencionado de momento. Entonces, ¿cómo funciona la generación de imágenes basadas en los "prompts" de entrada?

Dalle-2, Stable Diffusion, Midjourney… todos estos modelos de difusión pueden recibir además entradas como por ejemplo textos (text2image) u otras imágenes (image2image). Estas entradas se las conocen como elementos de condicionamiento, ya que, como bien dice su nombre, condicionan la salida para ajustarse a lo que hemos pedido. En este artículo quiero centrarme en el caso text2image, el más famoso, donde introduces un texto a la IA y te genera contenido basándose en este texto. Y para explicar esto, vamos a ver cómo funciona Stable Diffusion en la siguiente parte del artículo.

Saludos,

Autor: Javier del Pino DíazIntership en Ideas Locas CDO

No hay comentarios:

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares