Arte e Inteligencia Artificial: entrevista a Santiago Iglesias, creador de mAIro

Publicado por @SpainML el May 6, 2019, 7:14 p.m.
Hoy entrevistamos a Santiago Iglesias, un apasionado de la tecnología que actualmente se dedica a la creación de Apps y videojuegos con su empresa [Metodica.es][1] de la que es cofundador. En el [laboratorio de Metódica][2] hacen investigación con el estado del arte de la tecnología e intentan enfocarla a productos para una experiencia muy valiosa en nuevos campos como Machine Learning, Inteligencia artificial, AR, VR ó la creación de videojuegos. Una de las aplicaciones que ha desarrollado con más relevancia desde el punto de vista del Machine Learning es mAIro, y hoy Santi nos trae todos sus detalles para la [comunidad SpainML][3] de la cual él también es miembro. ### **¿Qué es mAIro y cómo surgió la idea?** ### mAIro es una inteligencia artificial que pinta cuadros únicos para ti basados en artistas y estilos diferentes. Es uno de los proyectos que han salido de Metódica Labs,y actualmente está implementada como una aplicación móvil que ya podéis encontrar en el [Google Play][4]. Desarrollada en Flutter y por lo tanto en breve también en App Store. Después de empezar con ML hace algo más de un año y hacer varios pruebas con temas que me llamaban la atención como NLP, análisis de sentimientos, reconocimiento facial, análisis de valores bursátiles, etc. Fui haciendo cada vez cosas más complejas hasta que me comenzó a llamar la atención lo que llaman el “state of art”. Por aquel entonces había ganado mucha fuerza la arquitectura de redes neuronales GAN (Generative Adversarial Networks), redes semi-supervisadas. Me parecía un tema complejo y lejano, pero me tiraba mucho y como mi opinión sobre esto es que cuando más se aprende es cuando te metes a hacer algo, me puse a darle vueltas para encontrar a alguna idea que pudiera implementar usando GANs. Así nació mAIro. Existen aplicaciones de filtros hechos con IA, “Style Tranfer” y otras técnicas, pero mAIro es algo más, es básicamente un pintor artificial. Con la App puedes navegar su espacio latente en los diferentes modelos que tenemos entrenados para ver los bocetos que genera en tiempo real, bocetos casi infinitos y todos únicos, y que puedes imprimir en un cuadro que te llevaremos a la puerta de tu casa en unos días. Tendrás colgado en tu pared no sólo una obra de arte única sino también una de las primeras obras generadas por una red neuronal y la obra del primer artista artificial 100% autónomo. ¿Suena bien verdad? ### **Has mencionado las GANs como base de mAIro. ¿Nos puedes resumir en qué consisten y qué tipos concretos has utilizado?** ### mAIro está creado con Redes Generativas Antagónicas, una idea de un genio llamado Ian Goodfellow en 2014 y desde las primeras que salieron han sido sin duda una de las arquitecturas más llamativas por sus espectaculares resultados. La idea que las implementa es simple cuando la entiendes aunque parezca muy compleja al principio. Creas dos redes, una de ellas pinta cuadros basándose en un dataset de cuadros originales (generadora) y la otra aprende a diferenciar cuadros pintados por la primera de los originales (crítica). Mientras estas dos redes estén balanceadas durante su entreno podrás concatenar la primera a la segunda y así poder entrenar a la generadora con lo que la crítica a aprendido después de haber entrenado a clasificar cuadros reales de generados. ![Ejemplos del primer modelo de mAIro][5] Una vez entiendes el concepto te pones a probar. Para llegar a algo aceptable hemos pasado por una cantidad de arquitecturas que ya no puedo contar. Como todos empecé con pruebas a resoluciones muy pequeñas (64x64, 128x128, etc.) y de aquí sacamos nuestras primeras conclusiones, la primera red de mAIro fue una DCGAN, una GAN convolucional simple ( muy parecida a cualquier ejemplo de tutorial que hay por la red ) y sacamos resultados muy prometedores, pero pronto te das cuenta que tus resultados en 128 no son los mismos que tus resultados a 512 o resoluciones mayores a HD. La cantidad de neuronas que acaban teniendo las últimas capas las hace tener una infinidad de caminos nuevos y son mucho más difíciles de hacer converger. Hemos probado condicionales, con autoencoders, wassertein, con gradient penalty, con embeddings, inventadas.. de todo. Las funciones de pérdida son lo más importante a la hora de montar una arquitectura y wasserstein a día de hoy creo que se lleva la palma en GANs, sobretodo si se utiliza con Gradient Penalty, es más lento de entrenar pero funciona muy bien. Sin entrar en detalles otra tip que también funciona bastante bien es hacerlas condicionales para, entre otras cosas aumentar tu dataset y aprender los elementos comunes entre las diferentes condiciones. A día de hoy.. con todo lo que he aprendido si volviera a empezar no me enfocaría tanto en darle tantas vueltas a la arquitectura, que hemos afinado muchísimo, sino en conseguir un dataset con el máximo de calidad y la mayor cantidad de datos posibles. En Machine Learning tu input es tu mejor activo para sacar un buen resultado sin lugar a dudas. Fijaos por ejemplo en los últimos avances que han salido, por poner un ejemplo obvio, GPT-2 no es un avance considerable en la arquitectura de la red sobre GPT-1, pero la cantidad ingente de datos con la que lo han entrenado hace que los resultados sean sorprendentes. En mAIro nos ha pasado igual, al final la primera arquitectura da mejores resultados que la mejor que hemos conseguido si tiene más dataset. ### **El producto final cuenta con cuadros en alta resolución, pero partiste de un modelo de resoluciones bajas. ¿Cómo fue esa transición al modelo HD?** ### Lo normal cuando montas un proyecto basado en IA es utilizar una de las arquitecturas ya publicadas con sus parámetros asociados, que algún otro ha hecho con muchos más recursos que tú, y si es necesario amoldarla a tu modelo. El objetivo de mAIro fue aprender desde el principio, así que nos embarcamos en un proceso de investigación que quizás en Google hubieran tardado una semana y a mí me ha costado un año, pero el conocimiento que nos ha dado es impagable. Una de las escollos más importantes que aprendimos es que casi todas las arquitecturas funcionan muy bien en resoluciones bajas, pero no lo hacen en resoluciones altas. A parte, el primer modelo tampoco funcionó correctamente para generalizar un dataset de pinturas menos abstractas. Así que una vez tuvimos la primera versión, enfocamos otro proceso de investigación para ir a por el segundo modelo. ![Ejemplos del nuevo modelo][6] Durante este proceso aprendimos que si quieres hacer imagen HD con GANs, tu mejor apuesta de arquitectura/forma de entreno (sobretodo si escasean tus recursos) es una ProGAN. Con las “[Progressive Growing of GANs][7]” o ProGANs se crea un generador y un discriminador para un tamaño concreto de imágen, y una vez la tienes entrenada saltas al tamaño siguiente agregando las capas nuevas a las redes y dejando una serie de epochs donde el resultado de tu vieja red se va difuminando poco a poco a favor del resultado de tu nueva red. De esta manera el conocimiento se va incrementando sin perder el anterior y cada salto de la red se enfoca a mejorar el detalle de la anterior, lo cual es un problema mucho más sencillo que entrenar la red completa desde cero. Estas redes avanzan muy rápido en el entreno en las primeras capas y son las únicas que pueden extrapolar los resultados obtenidos en capas de resolución baja a un resultado final en HD. Por tanto van muy bien para probar rápido y descartar “pronto” versiones menos útiles. ### **El dataset siempre es una parte esencial en cualquier proyecto de ML. ¿Cómo lo conseguiste para crear mAIro?** ### Puff conseguir el dataset es la tarea menos agradecida de todo el proceso pero a la vez la más importante. Comencé creando un [spider][8] para hacerlo de manera automática usando un clasificador ML para diferenciar las imágenes que entraban en el dataset de las malas, pero pronto me dí cuenta que perdía más tiempo haciendo el clasificador y limpiando el resultado que directamente cogiendolas a mano. Así que actualmente el dataset de mAIro está creado buscando a través de Google Imágenes y echando unas tardes buenas. Esta técnica es lenta aunque saques un dataset de calidad y encontrar imágenes de la resolución que se necesita para ser impresas y además que sean del estilo o pintor que buscas es bastante complejo, así que actualmente los modelos se entrenan con un dataset de unos 250 imágenes, un número bajísimo si lo comparas con las 70.000 imágenes con las que se ha entrenado StyleGAN de NVIDIA. Para sacar partido a este dataset hay que hacer malabares. Primero jugar con que queremos hacer Arte y no replicar una foto por lo tanto un poco de variabilidad en el resultado final no nos viene mal. Pero después hay que perder agilidad y tiempo mientras entrenas para aumentar ese dataset haciendo giros, zooms, crops y demás variaciones en cada batch que le das a comer a tu arquitectura, es la única forma de sacar algún resultado con tan poco dato. ### **Uno de los puntos débiles de las GANs suele ser la dificultad a la hora de entrenarlas. ¿Cómo ha sido el proceso de entrenamiento en tu caso?** ### Ha habido muchísimas piedras en el camino para hacer mAIro, la primera y quizás la más insalvable ha sido la capacidad de computación. En imágen, cuando saltas a resoluciones altas, la salida de tu red son 3 puntos por cada píxel, usando el RGB estándar. Esa última capa ya está gestionando en el caso de HD más de 3 millones de neuronas (1024 x 1024 x 3). Pero una convolucional así sóla no va a hacer nada.. hay que poner muchas y los gradientes para afinar los pesos de cada una de esas neuronas además se calculan en Batches. Suma y sigue.. el resultado es que tuvimos que comprar una tarjeta de cómo mínimo 12 Gigas de memoria o gastarnos 700€ cada mes en un servidor. Nosotros optamos por la tarjeta y no me arrepiento porque desde que la tengo no ha parado de entrenar y al final sale a cuenta. Cuando consigues “encajar” tu arquitectura en la memoria de tu tarjeta el siguiente problema a solucionar es el tiempo. Entrenar a una red así cuesta mucho, actualmente cada prueba que lanzamos en el PC de entreno tarda alrededor de 1 mes en dar resultados. Esto complica muuuucho la investigación y la búsqueda de arquitectura, y por eso las grandes empresas tienen una ventaja competitiva importante en este campo. El tiempo sin duda es nuestro gran rival aqui, para enfrentarse a él es importante utilizar todos los medios posibles, a día de hoy Tensorflow o Pytorch son frameworks más rápidos que Keras y preprocesando el input para hacer el data augmentation con alguna política menos agresiva que la que suele venir por defecto también te puede ayudar a ganar un tiempo precioso. Otro buen truco es hacer un circuito ágil de investigación, yo suelo dividir el research en fases. Uso Google Colab para la investigación pura y dura porque entre otras cosas puedo levantar más de uno en paralelo, de esta manera puedes comprobar varias arquitecturas y suposiciones a la vez en Colab. Cuando llego a una conclusión, paso la arquitectura al PC de entreno y ahí saco las salidas reales y conclusiones finales iterando este proceso cada vez que se me ocurre algo nuevo que añadir. ### **En los últimos días hemos podido ver cómo se ha introducido en la app una nueva funcionalidad llamada Draw2Art. ¿En qué consiste?**### Otra de las arquitecturas que hemos probado aprovechando el dataset que tanto ha costado montar es Pix2Pix. Se trata también de una GAN donde el input aporta algo más de control sobre la salida de la misma. En las GAN normales la entrada se trata de un vector de ciertos elementos aleatorios que llamamos espacio latente, la teoría es que da igual la entrada que le metas a la red porque la propia función que se crea modela únicamente el espacio del dataset y por tanto sólo saldrán ouputs que estén en el dominio del dataset. Con las Pix2Pix este espacio latente se transforma en algo con más significado, acercándose más a lo que es una red supervisada (Tal input tiene que sacar tal output) pero continuando con la estructura de las GAN para hacer esa generación más natural y artística. En el caso de mAIro lo hemos usado para dejar al usuario pintar sus propios cuadros con trazos de colores en el móvil y que la red los acabe transformando en obras de arte, a esta herramienta la llamamos Draw2Art y ya se puede probar en la aplicación. Aunque la versión actual es una simple prueba de concepto, está hecha con muy poco dataset y no tiene casi calidad, es una de las cosas que más se está usando en la aplicación. A la gente parece encantarle el juguetear con esta herramienta. ### **Por último, cuéntanos un poco más sobre el futuro de mAIro. ¿Cuáles son los siguientes pasos?** ### Ahora mismo hemos tenido un impás importante por tener que acabar otros proyectos, estos agujeros en investigación nos ayudan también a asentar los modelos que tenemos funcionando, pero tenemos varios temas sobre la mesa. Lo primero que queremos hacer es sacar la App en iOS también, el desarrollo está hecho en Flutter para tener esa agilidad en multiplataforma y en teoría debería ser rápido pasar a ese entorno. En temas de Machine Learning en cuanto tengamos un rato montaremos el dataset de Draw2Art en condiciones y entrenaremos con una resolución aceptable el modelo que ya actualmente tenemos comprobado que funciona. Nos encantaría también, una vez tengamos este modelo, sacar en pantalla grande y táctil algo así. Y por otra parte nos gustaría empezar a probar los embeddings en las ProGAN, si no me equivoco nadie ha hecho este tipo de redes condicionales y por la experiencia que tenemos creemos que puede dar unos resultados mucho mejores que los que salieron de la red original del paper de NVIDIA. **Santi nos ha enseñado todos los entresijos que rodean a mAIro de forma transparente, de los que además podemos extraer valiosas lecciones para proyectos relacionados con GANs. Aquí os dejamos su contacto así como más ejemplos de mAIro que os recomendamos ver.** - [Web mAIro][9] - [Twitter mAIro (@mairoart)][10] - [Twitter Santi (@ianholing)][11] - [Web empresa][12] **Ejemplos** Lienzos normales primer modelo (Estilo Miró-Abstracto): [I][13], [II][14], [III][15]. Modelos nuevos: [Real Miró vs nuevo modelo mAIro][16], [Cuadros menos abstractos (Modelo Retrato - Abstracto)][17], [Cuadros vivientes (baja resolución con el modelo antiguo)][18]. Draw2art: [prueba de concepto][19] ---------- Si os ha resultado interesante la entrevista no dudéis en compartirla por vuestras redes sociales. Si además queréis estar al día de todo lo que pasa en el día a día del mundillo del Machine Learning estaremos encantados de recibiros en nuestro [canal de Slack][20] y también estamos presentes en [Twitter][21] e [Instagram][22]. Nos encantaría que nos recomendaseis nuevos candidatos para futuras entrevistas :) [1]: http://www.metodica.es/ [2]: http://www.metodica.es/lab.html [3]: http://bit.ly/JoinSpainML [4]: https://play.google.com/store/apps/details?id=es.metodica.painterapp [5]: https://pbs.twimg.com/media/Dwi3OTlX4AEXasg.jpg [6]: https://pbs.twimg.com/media/D5zMygJW0AAQmfW.jpg [7]: https://arxiv.org/abs/1710.10196 [8]: https://github.com/ianholing/image_dataset_creator_for_ML [9]: http://www.mairoart.com/ [10]: https://twitter.com/mairoart/ [11]: https://twitter.com/ianholing [12]: http://www.metodica.es/ [13]: https://twitter.com/mairoart/status/1083317175014830082 [14]: https://twitter.com/ianholing/status/1067333588058865664 [15]: https://twitter.com/mairoart/status/1063743358923874304 [16]: https://twitter.com/mairoart/status/1084945622166372353 [17]: https://twitter.com/mairoart/status/1124999184615137286 [18]: https://www.youtube.com/watch?v=ehrXJg-M86g [19]: https://twitter.com/mairoart/status/1105510890487668736 [20]: http://bit.ly/JoinSpainML [21]: https://twitter.com/spainML_ [22]: https://www.instagram.com/spain_ml/