Redes neuronales - Encuentra la mayoría de las imágenes similares

11

Estoy trabajando con Python, scikit-learn y keras. Tengo 3000 mil imágenes de relojes frontales como los siguientes: Watch_1 , Watch_2 , Watch_3 .

Quiero escribir un programa que reciba como entrada una foto de un reloj real que tal vez se haya tomado en condiciones menos ideales que las fotos de arriba (color de fondo diferente, rayos más oscuros, etc.) y encontrar los relojes más similares entre los 3000. Por similitud quiero decir que si doy como entrada una foto de un reloj redondo de color marrón con encaje fino, entonces espero como salida relojes de forma redonda, de color oscuro y con encaje fino.

¿Cuál es el algoritmo de aprendizaje automático más eficiente para hacer esto?

Por ejemplo, siguiendo este enlace tengo dos soluciones diferentes en mi mente:

1) Usando un CNN como un extractor de características y compare las distancias entre estas características para cada par de imágenes con referencia a la imagen de entrada.

2) Usar dos CNN en una red neuronal siamesa para comparar las imágenes.

¿Son estas dos opciones las mejores para esta tarea o sugeriría algo más?

¿Conoces alguna red neuronal pre-entrenada (con hiperparámetros predeterminados) para esta tarea?

He encontrado algunas publicaciones interesantes en StackOverflow sobre esto, pero son bastante antiguas: Post_1 , Post_2 , Post_3 .

Paria
fuente
Bienvenido al sitio! Aprenda una incrustación (recomiendo un hash binario para una recuperación rápida del orden de mil bits) y luego realice una búsqueda de similitud.
Emre
Es un placer estar aquí ... ¡jaja! ... Sí, es una buena idea y ya había leído este documento ...
Paria

Respuestas:

4

No creo que una arquitectura de alto nivel como tal sea la mejor opción, sino que depende de muchos factores y detalles. Por lo que sé, el primer enfoque es prometedor, especialmente cuando se extiende por pasos adicionales como se hace en TiefVision :

  1. Se utiliza una red de cuadro delimitador adicional para discriminar la parte relevante de la imagen del resto
  2. Los vectores de características no se comparan simplemente directamente, sino que se usan para entrenar una red de comparación utilizando tripletas (aprendizaje de similitud basado en vectores de características y ejemplos para casos más o menos similares).

Este trabajo es mucho más reciente (2016/17) de lo que has publicado y viene con un conjunto de herramientas agradable y un análisis más detallado del papel .

¿Por qué usar trillizos aka Deep Ranking?

Como se indica en los comentarios: ¿Por qué debería uno usar tripletes para similitud de imagen en lugar de aprender vectores de características y calcular su distancia? Los trillizos son una forma de formular la pregunta de similitud como un problema de aprendizaje en lugar de aprender vectores de características que básicamente no les importa la similitud. Este enfoque tiene especial sentido en los casos en que la similitud percibida por el ser humano es importante, lo que puede diferir de la percepción de la máquina.

Los trillizos funcionan así: proporciona 3 imágenes. Una para comparar, una imagen similar (cercana) y otra no tan similar (distante). Esta es su información de entrenamiento / prueba / validación. Capacitar a su red en esas muestras y predecir el orden correcto (clasificar imágenes similares a imágenes no similares) en general le permite a la red aprender a ordenar imágenes en función de su similitud.

En general, este enfoque es comparativamente complejo. Es posible que haya sido diseñado en exceso, pero también solicitó la mejor manera de hacerlo y Deep Ranking logra valores de precisión muy altos.

Gegenwind
fuente
Gracias por su respuesta. Este es uno interesante (lo voté). La idea sobre el triplete es buena, aunque no estoy exactamente seguro de por qué usar tripletas de imágenes es necesariamente mejor que usar pares de imágenes para mi tarea. Si lo desea, puede explicarlo más en su publicación. También echaré un vistazo a TiefVision.
Desterrado
@Universalis gracias por la pista (y el voto positivo). Actualicé mi respuesta con más detalles sobre los trillizos y el razonamiento. El documento también está muy bien escrito, así que eche un vistazo a todos los detalles. Sin embargo, puede haber nuevas formas elegantes de hacer esto desde que surgieron TiefVision y DeepRanking.
Gegenwind
Gracias de nuevo por su respuesta. Sí, eché un vistazo al periódico y quedó bastante claro lo que agregaste a tu respuesta. En este sentido, ya había entendido lo que agregó su respuesta y mi pregunta más clara fue la siguiente: ¿por qué no usar 2 imágenes (un par) en lugar de 3 imágenes (un triplete) para clasificar las imágenes según su similitud? ¿Cuál es el beneficio adicional de usar trillizos en lugar de pares?
Marginado
Hmm, tal vez entendí mal tu enfoque. El triplete proporciona información comparativa de que la imagen 1 está más cerca de la imagen 2 que de la imagen 3. Tener solo 2 imágenes y decir "estos 2 son similares" carece de un factor comparativo "similar en qué aspecto" porque en este enfoque se supone que la distancia simple del vector de características no te dice lo suficiente. en otras palabras: aprende similitudes por pedido y carece de eso sin tener al menos 2 artículos para ordenar.
Gegenwind
Gracias nuevamente por tu respuesta. Sin embargo, incluso ahora y después de leer un poco más detenidamente el documento, no me queda claro por qué necesita necesariamente trillizos y no pares de imágenes para este enfoque sin supervisión. Al usar etiquetas, está claro que al usar tripletes obtendrá una clasificación de similitud completa de las imágenes que no puede obtener con pares. Pero en este (tipo de) enfoque no supervisado que propone, ¿por qué no comparar los valores de la función de pérdida para cada par de imágenes (siempre una imagen del par es la imagen de entrada) para encontrar, por ejemplo, las 5 más similares a las imagen de entrada?
Desterrado
2

Elegiría un clasificador, como VGG-16, que funcione bien en las clases de imagenet. Luego, pasa las imágenes de tu reloj a través de él. Por supuesto, puede esperar que la salida sea principalmente "ver" con alta probabilidad.

Sin embargo, obtienes características adicionales: el nivel de activación de todas las demás categorías. Eso te da un vector de mil valores entre 0 y 1.

También puede extraer la activación en varios puntos de la red. Entonces, la similitud de esas activaciones y salidas debería ser similar entre dos casos solo si las imágenes son similares.

Jeffrey apoya a Monica
fuente
Gracias por su respuesta (voto a favor). Sí, tenía esto en mente y, en cierto sentido, está relacionado con la primera opción que proporcioné en mi publicación. Así que también estaba pensando en usar otros detectores como SURF ... Veré si estos son lo suficientemente exitosos ...
Outcast
2

Me centraría en el aumento de datos primero. Como sus imágenes tienen un fondo blanco, lo tiene un poco más fácil. Convierta el fondo blanco en un fondo transparente, reduzca la imagen, gírelo y colóquelo en fondos similares a los datos de destino.

Haga esto muchas veces con diferentes combinaciones y tenga una etiqueta para cada reloj. Entonces sugeriría que use una red neuronal convolucional regular para la clasificación. Cada etiqueta tendrá una puntuación, elija la que tenga la mayor confianza y esa debería ser la más similar .

Por ejemplo, supongamos que ejecuta el clasificador con una imagen y obtiene este resultado:

Watch1: 0.51

Watch2: 0.30

Watch3: 0.25

La CNN dice que tiene una confianza del 51% de que Watch1 es el reloj en la imagen de entrada. Pero también lo que es cierto es que es el que cree que se parece más, Watch2 sería el próximo más similar y así sucesivamente.

Si no obtiene buenos resultados, haga lo habitual. Experimente con los parámetros y / o agregue más capas. Intenta averiguar dónde está fallando. Después de tener esa información, puede usarla para elegir un tipo más especializado de red convolucional para su problema particular. Buscar eso sin un conocimiento previo de cómo funcionaría no es el enfoque correcto. Te sugiero que comiences con un modelo convolucional básico y luego trabajes desde allí.

zimio
fuente
1
Gracias por su respuesta (voto a favor). Sí, ya tenía el aumento de datos en mi mente. Sin embargo, su respuesta no está clara. ¿Qué quieres decir con "tener una etiqueta para cada reloj"? ¿Te refieres a etiquetar cada reloj individualmente o etiquetarlos como un par con otro dependiendo de si son similares o no? (Si es lo primero, entonces explique por qué esto es eficiente, por favor)
Paria
Es la sugerencia anterior, suponía que ya tenías una manera práctica de etiquetarlos a todos. Esta es básicamente la solución más básica, por lo que no será eficiente. Mi sugerencia fue que el modelo básico quizás podría darle suficiente información para que pueda perseguir un modelo más especializado. Mirar un ranking profundo parece muy prometedor, como dijo @Gegenwind. He actualizado mi respuesta para hacerlo un poco más claro.
zimio
Hm, sí, ahora está más claro lo que querías decir ... Esta es ciertamente una buena sugerencia general: comienza con lo básico y avanza paso a paso hacia cosas más complejas ... Gracias en cualquier caso ...
Desterrado