Cómo aplicar el aprendizaje métrico a distancia al problema de la calle a la tienda

Comencemos con una definición de problema de calle a tienda: identificar un artículo de moda en una imagen de usuario y encontrarlo en una tienda en línea. ¿Alguna vez has visto a alguien en la calle y pensaste "Wow, este es un lindo vestido, me pregunto dónde puedo comprarlo?" No lo he hecho. Pero para mí, fue una tarea genial probar técnicas de aprendizaje métrico a distancia. Espero que también lo encuentres interesante.

Conjunto de datos

En primer lugar, necesitamos un conjunto de datos para ello. En realidad, llegué a esta idea después de descubrir que hay toneladas de imágenes tomadas por los usuarios en Aliexpress. Y pensé "Wow, puedo hacer una búsqueda por imagen usando estos datos, por diversión, por supuesto". He decidido centrarme en la mejor ropa de mujer para simplificar.

A continuación se muestra la lista de las categorías que utilicé para el desguace:

  • Vestidos
  • Blusas y camisas
  • Sudadera
  • Suéteres
  • Chaquetas y Abrigos

Usé solicitudes y BeautifulSoup para desguace. Las imágenes del vendedor se pueden obtener de la página principal del artículo, pero para las imágenes del usuario, debemos pasar por las páginas de comentarios. Hay una cosa llamada "colores" en la página del elemento. El color puede ser solo un elemento de otro color o incluso completamente otros elementos. Por lo tanto, consideraremos diferentes colores como diferentes elementos.

Puede encontrar el código que he utilizado para obtener toda la información sobre un artículo (desecha incluso más de lo que necesitamos para nuestra tarea) mediante el enlace https://github.com/movchan74/street_to_shop_experiments/blob/master/get_item_info.py.

Todo lo que necesitamos es pasar por las páginas de búsqueda por cada categoría, tomar las URL de todos los elementos y usar la función anterior para obtener la información sobre cada elemento.

Finalmente, tendremos dos conjuntos de imágenes para cada elemento: imágenes de un vendedor (URL de campo para cada elemento initem ['colores']) e imágenes de usuarios (imgs de campo para cada elemento initem ['feedbacks']).

Para cada color, solo tenemos una imagen de un vendedor, pero puede ser más de una imagen para cada color de los usuarios (a veces no hay imágenes para el color).

¡Excelente! Tenemos datos Sin embargo, el conjunto de datos recopilados es ruidoso:

  • Hay imágenes ruidosas de los usuarios (fotos de cajas de paquetes, fotos de textura o solo una parte de un elemento, elementos desempaquetados, fotos no relacionadas).
Ejemplos de ruido en las imágenes del usuario.

Para mitigar este problema, he etiquetado 5000 imágenes en dos categorías: buenas imágenes e imágenes de ruido. Al principio, mi plan era entrenar un clasificador para dos categorías y usarlo para limpiar el conjunto de datos. Pero luego decidí dejar esta idea para futuros trabajos y solo agregué imágenes limpias a los conjuntos de prueba y validación.

  • El segundo problema es que hay artículos que venden varios vendedores. Los vendedores incluso tienen las mismas imágenes en algún momento (o imágenes ligeramente editadas). ¿Pero cómo lidiar con eso? La forma más fácil es no hacer nada y usar un algoritmo robusto para el aprendizaje métrico a distancia. Sin embargo, puede afectar la validación porque podemos tener el mismo elemento en los datos de validación y capacitación. Por lo tanto, conduce a una fuga de datos. Otra forma es usar algo para encontrar imágenes similares (o incluso idénticas) y fusionarlas en un solo elemento. Podemos usar el hash perceptual para encontrar imágenes idénticas (como phash o whash), o podemos entrenar a un modelo en datos ruidosos y aplicar el modelo para encontrar imágenes similares. Elegí la segunda opción porque permite combinar incluso imágenes ligeramente editadas.

Aprendizaje métrico a distancia

Uno de los métodos de aprendizaje métrico a distancia más populares es la pérdida de triplete:

donde max (x, 0) es la función de bisagra, d (x, y) es la función de distancia entre x e y, F (x) es la red neuronal profunda, M es el margen, a es el ancla, p es el positivo punto, n es el punto negativo.

F (a), F (p), F (n) son puntos en un espacio de alta dimensión (incrustaciones) producidos por una red neuronal profunda. Vale la pena mencionar que las incrustaciones a menudo deben normalizarse para tener una longitud unitaria, es decir, || x || = 1, para ser robusto a los cambios de iluminación y contraste y para la estabilidad del entrenamiento. El ancla y las muestras positivas pertenecen a la misma clase, la muestra negativa es la instancia de otra clase.

Entonces, la idea principal de la pérdida de triplete es separar las incrustaciones del par positivo (ancla y positivo) de las incrustaciones del par negativo (ancla y negativo) por un margen de distancia M.

Pero, ¿cómo seleccionar el triplete (a, p, n)? Podemos seleccionar muestras al azar como un triplete, pero causa los siguientes problemas. En primer lugar, hay N³ trillizos posibles. Significa que necesitamos mucho tiempo para atravesar todos los trillizos posibles. Pero en realidad, no necesitamos hacerlo, porque después de algunas iteraciones de entrenamiento habrá muchos trillizos que no violan la restricción del trillizo (dar cero pérdida). Significa que estos trillizos son inútiles para un entrenamiento.

Una de las formas más comunes de selección de tripletas es la minería dura negativa:

La selección de los aspectos negativos más difíciles puede en la práctica conducir a mínimos locales malos al principio del entrenamiento. Específicamente, puede resultar en un modelo colapsado (es decir, F (x) = 0). Para mitigar esto, podemos utilizar la minería negativa semidura.

Las muestras negativas semiduras están más alejadas del ancla que la muestra positiva, pero siguen siendo duras (violan la restricción del triplete) porque se encuentran dentro del margen M.

Condiciones para un triplete con muestra negativa semidura

Hay dos formas de generar muestras negativas semiduras (y duras): en línea y fuera de línea.

  • En línea significa que seleccionamos aleatoriamente muestras del conjunto de datos del tren como un mini lote y seleccionamos trillizos de las muestras dentro de él. Sin embargo, necesitamos tener un tamaño de mini lote grande para el método en línea. No es posible en mi caso porque solo tengo un GTX 1070 con 8Gb de RAM.
  • En el método fuera de línea, debemos dejar de entrenar después de un tiempo, predecir incrustaciones para una cierta cantidad de muestras, seleccionar trillizos y modelo de entrenamiento con estos trillizos. Significa que tenemos que hacer un pase directo dos veces, pero es el precio del método fuera de línea.

¡Bueno! Ya podemos comenzar a entrenar el modelo con la pérdida de triplete y la minería negativa semidura fuera de línea. ¡Pero! Siempre hay un "pero" en este mundo imperfecto. Necesitamos un truco más para resolver con éxito el problema de la calle a la tienda. Nuestra tarea es encontrar la imagen del vendedor más similar a la imagen del usuario. Sin embargo, generalmente las imágenes del vendedor tienen una calidad mucho mejor (en términos de iluminación, cámara, posición) que las imágenes del usuario, por lo que tenemos dos dominios: las imágenes del vendedor y las imágenes del usuario. Para obtener un modelo eficiente, necesitamos reducir una brecha entre estos dos dominios. Este problema se llama adaptación de dominio.

Izquierda: imagen del usuario, derecha: imagen del vendedor

Propongo una técnica realmente simple para reducir la brecha de dominio: seleccionemos anclajes de las imágenes del vendedor, muestras positivas y negativas de las imágenes del usuario. ¡Eso es todo! Simple pero efectivo.

Implementación

Para implementar mis ideas y hacer experimentos rápidos, he usado la biblioteca Keras con el backend Tensorflow.

Elegí el modelo Inception V3 como base CNN para mi modelo. Como de costumbre, inicialicé CNN con pesos ImageNet. He agregado dos capas completamente conectadas después de la agrupación global con normalización L2 al final de la red. El tamaño de incrustación es 128.

También necesitamos implementar la función de triple pérdida. Pasamos el ancla, las muestras positivas / negativas como un mini lote único y lo dividimos en 3 tensores dentro de la función de pérdida. La función de distancia es la distancia euclidiana al cuadrado.

Y compilar modelo:

Resultados experimentales

Resultados de recuperación. Primera columna: consulta (imagen del usuario), siguiente 5: imágenes del vendedor más similares.

El rendimiento se mide en términos de recuperación en K (R @ K).

Veamos cómo calcular R @ K. La imagen de cada usuario del conjunto de validación se usó como una consulta y necesitamos encontrar la imagen del vendedor correspondiente. Tomamos una imagen de consulta, calculamos el vector de incrustación y buscamos los vecinos más cercanos de este vector entre los vectores de todas las imágenes del vendedor. Utilizamos no solo las imágenes del vendedor del conjunto de validación, sino también las imágenes del conjunto del tren porque permite aumentar la cantidad de distractores y hace que nuestra tarea sea más desafiante.

Así que tenemos una imagen de consulta y una lista de las imágenes de vendedor más similares. Si hay una imagen del vendedor correspondiente en las K imágenes más similares, entonces devolvemos 1 para esta consulta, de lo contrario, devolvemos 0. Ahora tenemos que hacerlo para la imagen de cada usuario en el conjunto de validación y encontrar un promedio de puntajes de cada consulta. Será R @ K.

Como dije antes, limpié la pequeña cantidad de imágenes de usuario de imágenes ruidosas. Así que he medido la calidad del modelo en dos conjuntos de datos de validación: conjunto de validación completo y un subconjunto de solo imágenes limpias.

R @ K para datos de validación

Los resultados están lejos de ser ideales, hay muchas cosas que hacer:

  • Limpie las imágenes del usuario del ruido. Ya di el primer paso en esta dirección limpiando un conjunto pequeño.
  • Combinar elementos con mayor precisión (al menos en el conjunto de validación).
  • Disminuir la brecha de dominio. Supongo que se puede hacer mediante un aumento específico de dominio (por ejemplo, aumento de iluminación) y mediante métodos especializados (como este https://arxiv.org/abs/1409.7495).
  • Aplicar otra técnica de aprendizaje métrico a distancia. He probado este https://arxiv.org/abs/1703.07464, pero funciona peor en mi caso.
  • Recopila más datos, por supuesto.

Demo, código y modelo entrenado

He hecho una demostración del modelo. Puede consultarlo aquí: http://vps389544.ovh.net:5555/. Puede cargar su propia imagen para buscar o usar una imagen aleatoria del conjunto de validación.

Código y modelo entrenado: https://github.com/movchan74/street_to_shop_experiments

Gracias por leer. Si disfrutas el artículo, avísame aplaudiendo. Si desea más información, puede conectarse conmigo en LinkedIn.