This graph shows how many times the word ______ has been mentioned throughout the history of the program.
¿Se imaginan que hará una ASMR?
Algoritmo de YouTube, por favor, trata bien este vídeo, ¿vale?
No lo desmonetices.
Yo sé que vamos a tratar un tema un poco delicado, que a lo mejor sale alguna imagen
en su vida de tono, que en algún momento a lo mejor mencionamos el borg, y bueno, sé
que es sensible hacer desmonetizado, pero por favor, afina el tiro en este caso, ¿vale?
Este es un vídeo educativo, de hecho vamos a aprender muchísimas cosas sobre machine
learning, deep learning, modelos generativos, el modelo PIX2PIX, cómo trabajar encontrando
tu dataset cuando tienes complejidades por la tarea que quieres resolver, es decir, es
un vídeo donde vamos a ver muchos contenidos muy interesantes y que van a servir para
que mucha gente aprenda.
Así que de nuevo, no desmonetices este vídeo, se vena volante.
Atentamente, dot ccv.
Vale, hablemos de los deepnewts.
Muchos conoceréis esta noticia y algunos no, pero sin duda estaré hablando del tema
más peliagudo que ha ocurrido en el campo del machine learning de las últimas semanas.
Estoy hablando de deepnewt, una aplicación que lo que ofertaba era, pues en base a inteligencia
artificial que tu pudieras subir a un servicio, a una aplicación, una imagen de una persona
vestida y efectivamente utilizando deep learning, pues poder generar, poder sintetizar una imagen
de esa misma persona completamente desnuda.
Es decir, estamos hablando aquí de una red neuronal que ha aprendido a que para una imagen
dada de una persona vestida, podamos obtener su contrapartida de esa persona completamente,
pues como diez la trajo el mundo.
Como podrán imaginar, este es un tema que ha generado muchísimos titulares, muchísimos
artículos en prensa, muchísima opinión en redes sociales, pero creo que en pocos lugares,
por no decir en ninguno, he visto que alguien se pare a detallar cómo funciona internamente
este sistema, cuál es la tecnología que está detrás y qué hace funcionar a esto
y que como se podrán imaginar, pues está relacionado con la inteligencia artificial
del machine learning.
Puesto que estamos en un canal de inteligencia artificial y machine learning, se puede decir
que estamos en el lugar perfecto para analizar el funcionamiento de deep newt.
Así que vamos a ver a deep newt al desnudo.
Pues para hablar del funcionamiento de deep newt, tenemos que volver a referirnos a este
tipo de modelos que siempre mencionamos cuando estamos hablando de generar contenidos.
Efectivamente me refiero a las redes generativas adversarias, de las cuales hemos hablado muchas
veces en el canal.
Como este ha sido el caso, pues no me quiero parar mucho en esto, pero solamente quiero
recordaros que es un tipo de arquitectura en el que tenemos a dos redes neuronales que
van a aprender a resolver dos tareas diferentes.
Por un lado tenemos una red que es la red generadora, que va a tener que aprender a
resolver la tarea de generar el contenido que nosotros queramos.
Este es el núcleo de este sistema generador.
Por otro lado vamos a tener otro tipo de red que es la red discriminadora, y su tarea
va a ser intentar discriminar, intentar aprender a saber si el contenido que está observando,
el que le insertamos como entrada, ha sido un contenido generado artificialmente por
la red generadora, o si por el contrario es un contenido del dataset original, es decir,
si es una imagen real o es una imagen generada artificialmente.
Aquí lo que estamos hablando es que vamos a tener un sistema que se va a encargar de
generar contenido, y otro que se va a encargar de aprender a discriminar si ese contenido
es real o es falso.
Si te das cuenta estas dos tareas son tareas antagónicas, tareas adversarias, y cada una
de estas redes va a intentar competir con la otra para intentar engañarla.
De ahí el nombre de esta arquitectura, redes generativas adversarias.
Ok, esto ya lo sabíamos, pero hoy me quiero centrar en la parte generadora de esta arquitectura,
porque realmente cuando decimos que una red neuronal genera contenido, ¿cómo lo hace?
¿Cómo es posible que una red neuronal pueda generar una imagen por ejemplo?
Pues fíjate porque no es tan complicado.
Porque si lo piensan cualquier tipo de dato que queramos generar, ya sea una secuencia
de texto, un fichero de audio, una imagen, no deja de ser un conjunto de datos que vienen
representados por valores numéricos.
Por ejemplo, una imagen viene compuesta como una matriz de píxeles, donde cada píxel
viene representado por una intensidad en cada uno de los canales de colores que compongan
a la imagen, y básicamente cada uno de estos píxeles vendría representado por un valor
numérico.
Claro, al igual que nosotros podemos tener una red neuronal convolucional que toma como
input una imagen y que poco a poco va a ir procesando la información, los valores numéricos
de esta imagen, capa tras capa, hasta acabar con un valor numérico final, que a lo mejor
nos va a indicar cuál es la clase del objeto que viene representado en esta imagen, por
ejemplo en este caso que hay un perrete, pues este procesamiento a partir de los valores
de una imagen y obtener un valor final, lo podemos invertir.
Cuando lo invertimos, lo que tenemos ahora es un tipo de red neuronal convolucional invertida,
donde cada una de las operaciones que se suceden son la operación inversa, en vez de hacer
una convolución hacemos una convolución inversa, en vez de hacer un downscaling hacemos
un upscaling, etc.
Todas las operaciones se invierten y lo que estamos haciendo ahora es que nuestra red
neuronal tenga que predecir a partir de un valor numérico que le vamos a especificar
cuáles son cada uno de los valores numéricos que conformarían a los píxeles de la imagen.
Estamos generando una imagen.
Pues genial, ya sabes cómo se puede generar una imagen con una red neuronal, claro que
a lo mejor te estás preguntando, oye Carlos, muy bien entiendo este sistema, más o menos
intuitivamente lo comprendo, pero qué valor le estás insertando como entrada a tu red,
tú me has dicho que has invertido la red, con lo cual tú ahora tienes un canal de entrada,
qué le especificas ahí, qué le vas a meter dentro a la red neuronal para que te genere
esta imagen de aquí, buena pregunta, posiblemente la pregunta que hubiera hecho en este punto
del vídeo.
Pues a ver, cuando las redes generativas adversarias se presentaron allá en el 2014 por Ian Goodfellow,
el diseño que él presentó planteaba lo siguiente, cada vez que nosotros fuéramos a generar
un contenido con nuestra red generadora en nuestro sistema de redes generativas adversarias,
el input que nosotros le íbamos a especificar iba a ser un número o un vector de números
elegido aleatoriamente, esto lo que hace es que cada vez que nosotros generemos una imagen,
esta va a venir producida por un vector de números aleatorios especificados, este vector
de números aleatorios va a funcionar como una especie de identificador, para el mismo
vector de números obtendremos siempre la misma imagen.
Este vector aleatorio funciona algo así como un identificador, pero además de esto tiene
otras tantas propiedades muy interesantes, esto ya lo hemos explicado en otro vídeo
en el que hablamos sobre redes generativas adversarias y que les recomiendo que vean
si les interesa el tema, hablamos de cómo generar caras artificialmente, etcétera.
Ahí les comento cuáles son estas otras propiedades muy interesantes de estos vectores latentes
que es como se le conocen, tenéis el vídeo por aquí arriba que ahora mismo ya ni me
acuerdo.
Para este vídeo solamente me interesa que entiendas esto, que cada vector numérico
aleatorio funciona como un identificador de lo que vamos a generar, pero claro, te estarás
preguntando oye Carlos, ¿y qué pasa si quiero tener más control de lo que quiero generar?
Si lo que le estoy metiendo por aquí son números aleatorios, vectores aleatorios,
¿cómo puedo saber si por ejemplo quiero generar un contenido de una clase determinada?
Si yo por ejemplo en un dataset con diferentes frutas quiero generar exactamente un plátano,
¿cómo lo especifico esto si estamos utilizando vectores aleatorios?
Buenísima pregunta, justo lo que hubiera hecho también en esta parte del vídeo.
Y esto se soluciona de la siguiente manera y es una solución muy muy sencilla, porque
si nosotros tenemos a nuestra red aquí donde nosotros insertamos como entrada durante el
entrenamiento un vector aleatorio y con esto vamos permitiendo que la red aprenda a generar
contenido.
Lo que vamos a hacer ahora es que si también contamos por ejemplo con un vector de clases
donde venga asignado que la clase que vamos a generar ahora es una clase de tipo plátano,
que eso vendría marcado con un 1 en la posición del plátano, pues vamos a coger este vector
de etiquetas y se lo vamos a suministrar a la red neuronal por la entrada, es decir si
antes teníamos un vector de números aleatorios, lo que podremos hacer ahora será coger el
vector de etiquetas y el de números aleatorios y sumarlos o concatenarlos, es decir de alguna
manera introducir esta información dentro de la red neuronal durante la fase de entrenamiento.
Así lo que le estaremos diciendo a la red es que cada vez que genera un plátano le
estaremos indicando que la etiqueta de este elemento que estamos generando efectivamente
es un plátano.
Esto lo podremos hacer de manera repetida diciéndole plátano, pera, pera, manzana,
pera, plátano, pera, pera, pera, coco, coco, pera, manzana y te montas un cóctel de frutas
hasta que al final tu red neuronal no solo ha aprendido a generar contenido, no solo
ha aprendido a generar imágenes de frutas, sino que también lo estará haciendo en función
de la etiqueta que nosotros marquemos como entrada a nuestra red neuronal.
Si te das cuenta lo que estamos haciendo aquí es condicionar el resultado de lo que se va
a generar en nuestra red generadora en función del input que nosotros estamos especificando,
es decir, estamos condicionando el output en función del input.
Y este condicionamiento que estoy explicando es básicamente lo que da nombre a este tipo
de redes, que son Redes Neuronales Generativas Adversarias Condicionadas, o en inglés Conditional
Generative Adversarial Networks.
Y este esquema de trabajo es muy interesante porque esto de condicionar el output en función
del input puede ser más flexible que el ejemplo que acabamos de ver, que sí, perfecto, tú
puedes condicionar el output a un vector de etiquetas que la especificas como entrada.
Esto es algo que ya hemos visto por ejemplo en el caso de Big Gun, si se acuerdan este
era un tipo de red neuronal que te permitía generar imágenes en alta resolución para
cada una de las clases que estaban especificadas dentro del dataset ImageNet, en este caso
tú condicionas en función del input de etiquetas que le pasas a la red neuronal, perfecto.
Pero otra cosa que podrías hacer sería condicionar el output de la red generadora en función
de una secuencia de texto que la especifices como entrada.
Lo que te permitiría hacer esto sería que tú pudieras por ejemplo redactar lo que quieres
que se genere, por ejemplo, hay un pájaro azul subido a una rama negra, y que el modelo
generador pueste generar una imagen de un pájaro azul subido a una rama negra.
O por ejemplo en el paper que vimos el año pasado, Everybody Dance Now, ahí lo que hacíamos
era generar imágenes de personas reales condicionadas a la estructura tridimensional de su esqueleto,
es decir, estábamos utilizando la información de las poses para condicionar el output que
estábamos generando.
Y es dentro de este esquema de trabajo donde condicionamos el output con el input, donde
tendríamos un ejemplo que también es muy interesante, que sería el de generar una
imagen condicionada a partir de otra imagen dada como input, es decir, estamos hablando
de predecir los píxeles de una imagen a partir de los píxeles de otra imagen, From Pics
to Pics, que es básicamente el nombre que se le dio a uno de los papers más icónicos
que resuelven esta tarea, y es Pics to Pics.
Traducir imágenes de un dominio a otro dominio.
Esto es un esquema de trabajo que tiene múltiples aplicaciones, por ejemplo, coger una imagen
normal y aplicarle un estilo artístico, o coger una imagen solamente en sus bordes
y generar una imagen real de dichos bordes, o por ejemplo obtener una imagen en blanco
y negro y obtener su contrapartida en color, o por ejemplo obtener un mapa de segmentación
como ya vimos en las Gaugans y obtener como resultado una imagen realista de esto.
Si te fijas hay muchísimos ejemplos que además hemos visto en este canal que se encajarían
dentro de este formato de trabajo.
Pero a ver, a ver, a ver, a ver, Carlos, ¿qué rollo me estás contando?, yo he venido aquí
a ver gente desnuda, deepnewts, ¿por qué me estás hablando de modelos generativos
Pics to Pics?
Si además, si estás en una encuesta en Instagram, eh chicos, ¿qué queréis que
sea el tema siguiente del vídeo del canal?
¿Pics to Pics o Deepnewts?
Y todo potamos Deepnewts, que somos unos viciosillos.
Claro, esa encuesta estaba muy bien, pero poca gente se dio cuenta que había un asterisco
y ese asterisco te derivaba a un pie de página que te indicaba que tenía trampa.
¿Y qué trampa tiene?
Es que básicamente los dos temas son la misma cosa, porque si estamos hablando hoy de Pics
to Pics y de cómo generar una imagen condicionada a partir de otra imagen, es porque este esquema
de trabajo también se aplicaría a los Deepnewts, porque si te fijas aquí lo que estaríamos
haciendo sería el generar una imagen de una persona desnuda condicionada a una imagen
de una persona vestida.
¿Te das cuenta?
Y con esta idea en mente, no deberías sorprenderte saber que la aplicación de Deepnewts está
basada en el código del paper de Pics to Pics, y no exactamente en el paper presentado
en 2016, sino en su evolución presentada por NVIDIA en agosto de 2018, en el que básicamente
se hacían mejoras a esta arquitectura, siempre con la misma idea de generar imágenes a partir
de imágenes, pero en este caso en alta resolución.
Un paper que se conoce como Pics to Pics HD, en este caso no se curraron mucho el naming.
¿Y cómo funciona esto?
Pues como ya hemos mencionado, con una arquitectura de red generativa adversaria, en la que si
hacemos zoom en la parte del generador nos encontraremos con esta arquitectura de red
convolucional invertida que hemos mencionado anteriormente.
Tenemos una entrada de números que veremos ahora, y poco a poco ese valor numérico se
va a ir incrementando capa tras capa hasta acabar prediciendo los pixeles de la imagen
que queremos generar.
Claro, en este caso queremos condicionar la imagen generada por otra imagen que vamos
a insertar como input.
¿Qué pasa?
Que esa imagen tiene que ser también analizada con una red neuronal, y en este caso utilizaremos
efectivamente una red neuronal convolucional que va a tomar los pixeles de esta imagen
y poco a poco los irá procesando y comprimiendo la información hasta llegar a un vector de
valores numéricos.
Con lo cual tenemos esta parte de aquí, esta parte de acá, y lo que tenemos que hacer
es conectarlas.
Cuando las conectamos lo que obtenemos es una arquitectura en forma de reloj de arena,
se le conoce así, donde a esta parte de aquí se le llama el encoder, el codificador de
la información, y a esta parte de aquí se le llama el decoder.
Solamente un apunte y es que estas arquitecturas no solo funcionan con redes de tipo convolucionales,
sino que podría funcionar con cualquier tipo de arquitectura que quieras explorar.
En este caso lo que estamos haciendo es coger una imagen de entrada comprimiendo la información
y a partir de esa información comprimida, que te va a especificar cuál es el contenido
de la imagen, cuál es la información relevante para la tarea que queremos resolver, vamos
a coger y introducirlo en el decoder para generar así una imagen de lo que queramos
resolver.
Y si me estoy parando a explicar esto, no es porque yo tengo una tendencia natural de
utilizar mi canal de YouTube para explicar temas avanzados de deep learning de manera
subconsciente escondidos tras títulos sugerentes y atractivos para el espectador, nada que
ver.
Lo que pasa es que esta arquitectura en forma de reloj de arena, en forma de encoder decoder,
se utiliza muchísimo y os lo vais a encontrar en muchísimos artículos, proyectos, papers,
y yo creo que es de bastante interés, así que si tú lo entiendes, yo ya me doy por satisfecho,
¿lo entiendes?
Perfecto, porque todavía hay un problema.
Porque si te fijas lo que tenemos aquí en esta arquitectura es un encoder donde la imagen
ha sido comprimida capa tras capa hasta llegar a este punto de aquí, a este cuello de botella
donde la información está comprimida, abstraída, procesada, y donde va a ser el punto de partida
para comenzar a decodificar en el decoder.
Y qué pasa, que esta información que se comprime en este punto, en este cuello de
botella, en ocasiones no es suficiente para que el decoder pueda realizar su tarea correctamente.
Es decir, si estuviéramos trabajando en un problema de segmentación de imágenes donde
metemos una imagen y queremos obtener su mapa semántico, posiblemente la información analizada
y que pasa por este cuello de botella será suficiente para poder decir, ok, entiendo
que a lo mejor en esta parte de la imagen hay un tipo de objeto, en esta otra hay otro
tipo de objeto, etc.
Pero sin embargo este cuello de botella posiblemente no deje pasar la información suficiente para
poder generar las máscaras de segmentación a un nivel de precisión de píxeles, con
lo cual no estaremos resolviendo este problema con la calidad que necesitamos.
Falta algo más.
Y esa solución es muy sencilla y es algo que ya hemos mencionado con anterioridad y
son las Skip Connections o conexiones de salto, que lo que van a hacer es que si esta es nuestra
arquitectura y el problema que tenemos es que la información se comprime demasiado
al pasar por este cuello de botella como para ser después decodificada en el problema que
queremos resolver, pues vamos a establecer una serie de conexiones que van a servir como
atajo para que la información pueda pasar por el cuello de botella o pueda decidir saltarse
una serie de capas, es decir, lo que estamos haciendo aquí es delegar en la red neuronal
la decisión de si quiere tomar la información que ha pasado por el cuello de botella y que
por tanto está más procesada, más analizada pero también más comprimida o si directamente
quiere observar periodos anteriores de la fase de procesamiento.
Esta solución, este truco en la utilización de las Skip Connections se utilizan en arquitecturas
como por ejemplo en la UNET, que es básicamente una arquitectura en forma de reloj de arena
donde lo que estamos haciendo es concatenar el output de cada nivel de procesamiento del
encoder en el mismo nivel equivalente del decoder, con esto lo único que estamos haciendo
es decirle, oye mira, en este punto de aquí, en este nivel, tú tienes acceso a la información
que ha pasado por el cuello de botella pero también te estamos dejando ver cuál era
el nivel de procesamiento antes de pasar por el cuello de botella, ¿se entiende?
Otro ejemplo de la utilización de Skip Connections sería la utilización de bloques residuales,
que básicamente es la misma idea, es generar un atajo que se va a saltar una serie de capas
de procesamiento y que va a agregar la información saltándose estas capas, con lo cual lo que
estamos haciendo es decir, oye, en este punto de aquí tú puedes decidir si quieres observar
la información procesada a través de estas capas de aquí o directamente ver cómo era
el procesamiento previo, es la misma idea.
Como digo, todas estas ideas son súper importantes de entender y estas dos arquitecturas que
acabamos de mencionar, tanto las UNEDs o el uso de bloques residuales, también es muy
interesante conocerlas porque se utilizan muchísimo.
Como ejemplo, en el paper original de Pix2Pix, del cual nos estamos refiriendo hoy y que
es la tecnología detrás de DeepNude, pues nos encontramos que el generador de la arquitectura
generativa adversaria viene implementado por una red de tipo UNED, a diferencia de por
ejemplo el paper de Pix2Pix HD, que en este caso utilizan una arquitectura que hace uso
de bloques residuales, como ven en las dos tecnologías que justamente acabamos de mencionar.
Estas diferencias en la arquitectura del generador no son las únicas diferencias que nos encontramos
entre el paper de Pix2Pix y Pix2Pix HD, que recordemos que es este el que se usa en DeepNude.
Hay más diferencias, recordemos que la evolución que introduce Nvidia es para poder generar
imágenes condicionadas por imágenes pero en alta resolución, eso requiere añadir
una serie de modificaciones tanto en el generador como en el discriminador de la arquitectura,
pero que no vamos a meternos a hablar ya en este vídeo porque sería profundizar demasiado
en cosas que ya se salen un poco fuera de lo que es DeepNude.
Porque a ver, DeepNude, ok entiendo cuál es su arquitectura, pero ¿cuáles son los
datos que han utilizado?
Porque para resolver este problema, por ejemplo de forma supervisada, ¿no requerirían de
tener imágenes de personas vestidas y personas desnudas al mismo tiempo?
¿Cómo han conseguido hacer esto?
¿Cómo han generado ese dataset?
Pues atento porque esto es muy interesante.
Porque a ver, imagínate que tú te quieres enfrentar a este problema, ¿qué solución
se te ocurre?
En serio, piénsalo, párate un momento a pensarlo, ¿cómo solucionarías este problema?
Porque aquí lo que estamos buscando si optamos por la opción supervisada es encontrar un
dataset de personas vestidas y desnudas en la misma pose, con las mismas características,
mismas iluminación, etc.
Eso significaría que buscar el dataset online sería algo impráctico porque no te vas a
encontrar este tipo de imágenes desnudas y vestidas.
Tendrías que optar por tanto por generar tú mismo el dataset.
Eso significaría que podrías optar por pagar a modelos y que les tomes tú las fotografías
desnudos y vestidos, lo cual sería muy costoso, o podrías optar por la opción de generarte
tú de manera sintética este dataset, es decir, coger imágenes de personas vestidas
y con Photoshop, ir generando su contrapartida desnuda o optar por la opción contraria,
que sería lo mismo.
Requeriría mucho tiempo, sería igualmente costoso en el caso de que nuestro recurso
fuera el tiempo, hacer todas estas ediciones.
Entonces, ¿cómo lo haríamos?
A lo mejor aquí alguien estará diciendo, pues sí, no se puede de forma supervisada,
podríamos optar por la versión no supervisada.
Ya lo vimos en un vídeo, en el vídeo de la Cycle Gun, en el que hablábamos de cómo
se podían hacer estas transformaciones de imagen a imagen de manera no supervisada.
Pero hay que decir que para este tipo de problemas donde queremos generar una imagen de una persona
realista, el utilizar esta opción no supervisada no lo va a generar unos resultados tan fieles
como los que estamos buscando, con lo cual para este caso descartamos esa opción.
Entonces, ¿qué hacemos?
Ya se te ha ocurrido alguna idea?
¿No?
¿Sí?
Yo les voy a contar la que han hecho ellos, porque es muy ingeniosa.
Básicamente lo que han cogido ha sido decir, oye, mi tarea es impractica de, por ejemplo,
generarme yo de manera sintética un dataset con Photoshop, de hacer esta edición, pues
desnudar a gente con miles, miles y miles de fotos.
Pero lo que podemos hacer es dividir la tarea entre tareas diferentes, entre subtareas,
una estrategia que básicamente viene a ser un divide y vencerás.
En este caso, la tarea resolver se divide entre subtareas diferentes.
La primera tarea sería la de obtener, a partir de una imagen de una persona vestida, una
imagen cuya ropa ha sido segmentada.
Esta imagen será utilizada en la tarea número dos, que sería, pues eso, a partir de la
imagen cuya ropa ha sido segmentada, obtener una imagen donde se identifiquen aquellas
entidades que son relevantes para el proceso de generación, que en este problema pues
sería la identificación de la localización de pechos, ombligos y vagina.
A partir de esta imagen, cuyas entidades ya han sido detectadas, vamos a la tarea número
tres, a partir de la imagen cuyas entidades han sido localizadas, generar la imagen final
de la persona desnuda.
Si se dan cuenta, estas tres subtareas concatenadas nos llevarían al proceso original que estábamos
buscando, que sería el de, a partir de una persona vestida, obtener una imagen de la
persona desnuda.
Pero sin embargo hay una diferencia, y la diferencia es que ahora para resolver estas
tres subtareas, lo único que tienes que hacer es generar tres subdatasets diferentes, que
si te das cuenta son mucho más sencillos de generar.
Pero por ejemplo, para la tarea número uno, lo único que tendrías que hacer ahora sería
efectivamente dedicar un buen rato en el Photoshop, pero resolver una tarea mucho más sencilla,
que sería la de marcar donde está localizada la ropa de cada persona.
También para el entrenamiento de la tarea número dos, tendrías que dedicarle un buen
tiempo al Photoshop a estar generando estas imágenes donde aquellas entidades de interés
son localizadas.
Y para la tarea número tres, también tendrías que hacer este proceso de edición, para a
partir de imágenes que encuentres de gente desnuda en internet, puedes también hacer
la localización de aquellas entidades que sean de interés.
Si te fijas, al haber dividido en tres subproblemas diferentes esta tarea que en un principio
parecía irresoluble de encontrar datos, lo que hemos conseguido ha sido desacoplar el
hecho de que el input y el output tengan que ser iguales.
Tú ahora mismo tendrías que ocuparte de generar estos tres subtatasets dedicándole
el tiempo que requiera en Photoshop, pero ya no tendrías que encontrar imágenes que sean
iguales en el input y en el output.
Es decir, hemos creado una subdivisión de tareas que nos sirven como proxy para poder
encontrar una solución a la tarea total que estábamos encontrando.
Este planteamiento me parece muy interesante porque no es trivial de encontrarlo, y yo
creo que más allá de este problema, el de Deep Knewt, puede servirnos para resolver
múltiples problemas donde en ocasiones nos enfrentamos al hecho de que no encontramos
de manera supervisada un dataset que nos pueda servir.
Es interesante mantener esta filosofía de divide y vencerás.
Pues el resultado de todas estas horas de trabajo, generando estos subtatasets y mezclando
los con la arquitectura Pix2PixHD, da como resultado la aplicación Deep Knewt, que como
ya hemos dicho te permite efectivamente eso, coger una imagen de internet de una persona
que esté vestida y obtener el resultado en la contrapartida de la persona desnuda.
He tenido la posibilidad de probar la aplicación, la he podido encontrar, he estado haciendo
diferentes pruebas, y he de decir que si los resultados no son 100% perfectos y en muchas
ocasiones incluso nefastos, es decir, imágenes que no te muestran nada lógico, hay muchas
ocasiones en las que si acierta, ¿vale?
Quiero decir que el resultado es coherente a nivel semántico, es decir, tú ves la
imagen y dices, oye, ha hecho un buen trabajo, más o menos respeta la forma del cuerpo,
es decir, si estamos frente a una constitución más delgada, más gruesa, un color de piel
oscuro, un color de piel claro, pero también es cierto que se notan que aparecen una serie
de artefactos que hacen que la imagen te hagan sospechar que efectivamente sí está manipulada.
Pero claro, esto es algo que de aquí a un futuro seguramente se vaya depurando y vaya
mejorando.
Si tuviéramos que establecer este nivel de generación en una escala que me acabo de
inventar, más o menos estaría situada en este punto de aquí, ¿vale?
Y esto es un problema, primero porque aunque no lo haya especificado durante el vídeo,
creo que se hace evidente que esta aplicación solo funciona para cuerpos femeninos.
El creador de esta aplicación comentaba que, bueno, que lo había entrenado solamente con
fotos de mujeres porque había encontrado difícil encontrar fotos masculinas con el
que entrenar a este sistema, claro, esto podría ser a priori lo que se conoce como un sesgo
de selección a la hora de generar ese dataset, pero cuando ya hemos entendido cómo es el
proceso de generar estos subdatasets y cómo es el proceso de entrenar a este sistema,
notamos cuenta que lo único que necesita son imágenes de personas vestidas y personas desnudas
que no necesariamente tienen que coincidir y encontrar fotos masculinas en internet no
es tan complicado, lo cual me hace pensar que todo esto es una excusa donde lo que realmente
ha buscado el creador con esta aplicación, que en parte era de pago, era contentar una
demanda en la que sabe que esta aplicación va a ser más utilizada sobre fotos de mujeres.
Y claro, eso significaría que en este caso estaríamos utilizando la inteligencia artificial
para seguir incentivando en un sesgo que existe en nuestra sociedad, por la cual esta aplicación
va a ser utilizada más sobre imágenes de mujeres. El hecho de que esta herramienta
existe no favorece a que este sesgo desaparece, sino que lo acabe incentivando. Pero más
allá de esto de si sirve para hombres o para mujeres, el problema es que esta aplicación
atenta contra la privacidad de las personas. Porque de la misma manera que a mí no me
gustaría que se utilizara tecnologías como el deepfake para generar un vídeo falso mío
donde mi persona está siendo usurpada, pues tampoco me gustaría que esta tecnología
se utilizara sobre otras personas para coger imágenes públicas de ellas y hacer manipulaciones
donde aparezca esta persona desnuda. Nos podemos imaginar muchísimo de los problemas que se
podrían generar con esto, donde podrían aparecer incluso extorsiones sobre imágenes
falsas.
Usted me dirá, pero Carlos, esta tecnología es muy impresionante, pero esto ya se podía
hacer con Photoshop. Yo puedo coger una imagen tuya y hacer una manipulación más o menos
realista en Photoshop. Perfecto, pero eso a lo mejor lo puedes hacer tú porque tienes
la capacidad. Pero lo que permite esta herramienta, al igual que lo comentábamos en el vídeo
del modelo generador de texto, es que estas manipulaciones, estas estafas, se puedan realizar
a escala. Es decir, que cualquier persona tenga conciencia o no tenga conciencia se
dedique a utilizar estas herramientas de manera fraudulenta. Y esto, como digo, es un problema.
Por este motivo, el recorrido de esta aplicación ha sido bastante corto. Se hizo pública,
incluso con una versión de pago, como ya he dicho, y cuando la propia aplicación se
volvió viral, recibiendo crítica desde la opinión pública y también desde muchos
sectores del campo del Machine Learning, el creador decidió retirarla. Claro, ya en ese
momento pues en internet ya se habían generado en diferentes foros, pues Ilot, donde se compartían
versiones craqueadas de la propia herramienta. A partir de ese momento, el creador decidió
pues decir, oye, si ya está la aplicación disponible para todos, pues voy a hacer público
el código que he utilizado y al menos que sirva como conocimiento público. Y hizo un
repositorio en GitHub, donde publicó el código de esta aplicación. A partir de ahí pues
GitHub decidió retirar este repositorio y creo que a día de hoy han vuelto a ponerlo
disponible. No sé exactamente cómo ha sido el hilo de mensajes que habrán tenido, pero
creo que estos repositorios vuelven a estar disponibles. En este caso, lo único que puedo
apelar desde este canal es que si te encuentras con esta herramienta y tienes curiosidad por
utilizarla, lo utilices con responsabilidad. Porque creo, y esto no lo sé con seguridad,
pero tarde o temprano el uso de estas herramientas de manera fraudulenta para manipular imágenes,
extorsionar, etcétera, van a acabar suponiendo un problema legal. Pero más allá de lo legal,
creo que es responsabilidad de todos nosotros mantener todos estos avances que la Inteligencia
Artificial permite dentro del campo de la moral y de la ética. Al menos en este canal
hemos utilizado este episodio, los Deep Nudes, para explicar muchos conceptos que yo creo
que son muy relevantes dentro del campo del Deep Learning y al menos hemos utilizado esto
como una forma de aprendizaje muy interesante. Espero que les haya gustado y quiero comentar
una cosita y es que se está acabando la temporada, yo normalmente pienso que todos los vídeos
que hago en DotCSU es una temporada desde septiembre hasta más o menos finales de julio,
principio de agosto, y pues ya estamos en veranito, ya empieza a ser sol y se está
acabando la temporada. En ese caso pues quería hacer un poco de promoción, quería contaros
que si este canal de YouTube les ha servido en algún momento para motivaros a aprender
Inteligencia Artificial, si les ha servido como apoyo para algún curso online de entender
mejor los conceptos, si te ha servido para estudiar informática o para estudiar un máster
de estos, si te ha servido para encontrar trabajo, si te ha servido para algo, si tiene
un valor para ti, pues te invito a que si quieres apoyar este canal, quieres agradecermelo
de alguna manera, si quieres transmitirme este valor, pues que tienen disponible el
Patreon de DotCSU, tenéis el link abajo en la descripción, lo pondré también en el
comentario fijado y yo creo que es una buena oportunidad para valorar todo lo que hemos
ido haciendo este año y que más o menos pues se vea recompensado este trabajo, que
yo creo que es bastante útil el tener toda esta información abierta disponible en YouTube,
toda esta formación de Inteligencia Artificial. A partir de ahí pues nada más, simplemente
agradecer que estén todos aquí, no significa que esto se vaya a acabar ya, todavía quedan
un par de vídeos que quiero sacar, posiblemente implementemos en un IAN Notebook un Pix2Pix,
pero bueno eso está todavía por preparar. Y nada, si les gusta la Inteligencia Artificial
y es la primera vez que están aquí, pues ya saben que se pueden suscribir, me lo pueden
comentar abajo, me pueden dejar un like y pueden seguir disfrutando de la Inteligencia
Artificial aquí en DOT, CCV, España, YouTube. Adiós.