martes, 22 de septiembre de 2020

Visual Search (PyAr)

Motivación y orientación

Esta entrada está orientada a un público general y busca dar una visión global sobre posibles aplicaciones de machine learning. Traté de que sea entendible para cualquiera (es decir, sin importar que haya tenido contacto previo con la temática) pero al mismo tiempo que no sea una lectura engorrosa para los que ya sepan del tema (que seguramente sepan más de lo que sé yo).

Las palabras que están subrayadas
asítooltip
tienen una pequeña descripción asociada que se muestra al posicionar el mouse encima, y son de utilidad sobre todo para los que no están empapados en la jerga de los programadores/
data scientistscientíficos de datos
/
IT guyspersonal de IT (tecnología de información)
.

Python es un lenguaje de programación que ha sabido mantener durante la última década una relevancia altísima, colocándolo en el segundo puesto del ranking de lenguajes con mayor cantidad de
pull requestscontribuciones de código
en
GitHubplataforma de desarrollo comunitario de software
(quedando en ese lugar sólo por detrás del omnipresente JavaScript), lo cual demuestra la versatilidad y utilidad del mismo en cualquier desarrollo Web, sea de
front-endtodo lo de una página Web con lo que el usuario interactúa
o de
back-endcapa de acceso a datos
.

Quien escribe admite ser desarrollador (muy) novato de Python. Sin embargo, incluso al sólo rozar la espuma sobre la superficie fluida que es Python, es más que evidente la fuerte presencia de
librariescolección de rutinas preprogramadas
y
frameworksestructuras abstractas sobre las que se da fundamento a los desarrollos de software
de este lenguaje a lo largo y ancho de todos los temas que abarca
DataScienceciencia de datos
. Mi apreciación es que este es justamente el motivo principal por el que los integrantes de la comunidad de Python tienen tanto amor por este lenguaje.

Al igual que el resto de las entradas que estarán subiéndose a este blog durante las siguientes semanas, esta entrada se está haciendo en el contexto de una crisis pandémica global prolongada desde principios de año. Una de las consecuencias que tiene estar en este marco temporal radica en la suspensión de cualquier tipo de actividad que implique el contacto estrecho entre personas - o bien, la migración a plataformas digitales donde se pueda hacer un intercambio de conocimiento sin que existan riesgos de bioseguridad.

Por este motivo, hace poco el comité organizador de PyCon Latam directamente decidió suspender la convención de este año, y anunció que la siguiente se hará recién el 29 de agosto de 2021. Pero por suerte los
developersdesarrolladores
de Python no nos quedamos con las manos vacías: el día 19 de agosto de 2020 PyAr (Python Argentina) organizó un Meetup (virtual, obviamente); y también organizará la PyConAr entre el 16 y 27 de noviembre de este año. (Muchas gracias a Sofía por aclararme la confusión que se me había generado entre estos nombres!)

Lo que sigue son mis impresiones de la primera de un ciclo de tres exposiciones que tomaron lugar en ese Meetup, sobre un proyecto llamado 
Visual Searchbúsqueda visual
 presentado por Sofía Denner. Sofía es programadora en MercadoLibre, desarrolla en Python y se dedica a la parte técnica de
machine learningaprendizaje de máquinas
. Esta charla se encuentra grabada y subida al canal de YouTube de PyAr, y puede verse en el siguiente link.

Contexto y premisa del proyecto

Visual Search es un proyecto que busca resolver el problema de encontrar algo que uno quiere comprar, pero sin saber ponerlo en palabras: muchas veces no es posible saber exactamente con qué palabras un vendedor describe cierto producto, y resultaría mucho más fácil poder tomar una fotografía de ese producto, y basar la búsqueda en esa foto.

En sí, Visual Search surgió dentro de algo llamado Nugget!, el cual es un espacio de aprendizaje orientado a personal de IT donde se les permite volcar conocimientos adquiridos en otros cursos y así poder crear algo más bien práctico. Es un lugar de encuentro con otros data scientists, que tienen mucha más experiencia en temas de machine learning y quieren ayudarlos.

El proyecto fue llevado a cabo por únicamente 3 personas: Sofía Denner, Francisco Yackel y Faustino Gagneten.

Esto implica que el proyecto no es productivo y que no está en los objetivos de MercadoLibre pasar este proyecto a la etapa de producción en el futuro cercano; y además que tuvo limitaciones de tiempo, debido a que no es la actividad principal que ninguno de ellos realiza en MercadoLibre.

Intuición del proyecto

Casi siempre que se busque resolver una problemática implementando machine learning, lo que se busca implementar tras bambalinas es una red neuronal (o varias). Una red neuronal es, en breve, una fórmula matemática muy grande que se representa gráficamente como un conjunto de varios nodos y flechitas, a la cual ingresan varias
inputsentradas
y de la cual salen varias
outputssalidas
. Cada nodo o neurona toma valores numéricos de una o más entradas, las procesa y se las pasa a una o varias más neuronas. De esta forma, se pueden agrupar las neuronas en varias capas, de la cual lo único que podemos ver desde "afuera" es la capa de outputs.

Ejemplo de una red neuronal bicapa. Fuente

Con el objetivo de convertir la información de la imagen en números que puedan ser las inputs de la red neuronal, comúnmente se obtienen 3 valores (RGB) para cada píxel de la imagen. A medida que la información de estas entradas va atravesando las sucesivas capas de la red, cada neurona calcula números que intentan interpretar información sobre los colores, texturas, formas, contornos, etc. de la imagen. A la salida de la red neuronal normalmente se obtiene una clasificación, por ejemplo, la probabilidad de que en la imagen haya un pájaro, una puesta de sol, un perro, un gato, etc.

En el proyecto se utilizaron redes neuronales que ya estaban entrenadas con muchos millones de imágenes que ya estaban subidas a Internet, las cuales son bastante precisas en su tarea de detectar qué hay en una imagen.

El otro modelo que se utiliza es el algoritmo KNN (
K-nearest-neighboursK vecinos más cercanos
). En éste, se representa un
datasetconjunto de datos
n-dimensional de distintos conjuntos de elementos; y al incorporarse un nuevo elemento, se evalúa la distancia de los K vecinos más cercanos con el objetivo de asumir a qué conjunto pertenece ese nuevo elemento.

Visualización del algoritmo KNN. Fuente

Este algoritmo se utiliza en el proyecto no para clasificar, sino para poder encontrar imágenes "cercanas" en relación a las matrices RGB que presenten en relación a otras que existan en el dataset.

Implementación

Las redes neuronales que se probaron en el proyecto fueron VGG16 y mobilenet.

El vector que representa cada imagen en VGG16 es de 4096 dimensiones, y en mobilenet, de 1024 dimensiones. Este dato no es menor, ya que mientras más dimensiones tenga cada vector, el costo computacional del algoritmo se vuelve mucho mayor.

En este sentido, mobilenet es mucho más eficiente que VGG16, por lo cual se optó por la primera.

Para la implementación del algoritmo KNN se hicieron pruebas con las librerías nmslib y pysparnn, y finalmente se optó por la primera.

Limitaciones

El proyecto es altamente ambicioso debido a que el dataset se compone de muchos millones de imágenes. Para ejemplificar, Sofía menciona que sólo en el
websitesitio Web
de Argentina hay 60 millones de publicaciones, cada una con entre 1 y 10 fotos. Por este motivo, y a pesar de que la capacidad de cómputo de MercadoLibre es bastante grande, se volvió muy necesario optimizar todo para que sea factible.

Sólo se utilizó un
subsetsubconjunto
de imágenes y no todo el sitio (en particular, la categoría de
fashionmoda
). Además, soló se trabajó con la primera foto de cada publicación, que usualmente es la más descriptiva.

También se aplicó un PCA para reducir el tamaño dimensional del dataset. Luego de aplicarlo, se logró mantener un 85% de la varianza (representativa de la distancia entre cada imagen dentro del dataset), pero se redujo de 1024 dimensiones a sólo 436. 

Visualización de la acción de una PCA. Fuente


El dataset utilizado finalmente fue de ~300 mil imágenes de la categoría fashion.



Comentarios finales

Elegí como mi primera entrada al blog escribir sobre este proyecto y charla por varios motivos. 

Personalmente siempre me pareció fascinante la idea del machine learning (y obviamente no soy el primero ni el último), que es un concepto que parece haber pasado de un plano de ciencia ficción a la realidad con una increíble velocidad (dos amigos míos me matarían si no aprovechara esta oportunidad para mencionar las obras del genial Isaac Asimov).

Esta charla fue excelente en lograr hacer entender las ideas principales de machine learning a oyentes como yo, que no tenemos realizados estudios formales sobre ciencias de la computación (es decir, los que formamos parte del resto de los mortales) pero sin sacrificar datos técnicos que me parecieron vitales para conectar estas ideas. 

Quizás esto sea justamente por la naturaleza de los integrantes del proyecto - en el primer minuto de charla Sofía se presentó a si misma como desarrolladora de Python; no es data scientist, y por eso tiene una habilidad nata en comunicar estos conceptos de forma clara y concisa. Espero haber podido aportar yo también un granito de arena en esta tarea. Si leyeron hasta acá, ¡muchas gracias!

(Queremos agradecer nuevamente a Sofía tanto por la charla, por dejarnos compartir esta nota y por darnos una atenta devolución, sos lo más! 😊)

Autor: Franco Abosso

5 comentarios:

  1. Interesante artículo. Es una buena introducción sobre un tema actual.

    ResponderBorrar
  2. Muy buen trabajo. Me gusta como está redactado para que todos entiendan de qué se trata. Me encanta que escriban en primera persona y comenten su experiencia propia. Sería bueno poner nombre/s.

    ResponderBorrar
  3. Articulo muy interesante sobre el tratamiento actual de la aplicación de la tecnología a la solución de problema real.

    ResponderBorrar