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 .
fuente
Respuestas:
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 :
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.
fuente
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.
fuente
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:
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í.
fuente