¿Qué algoritmos pueden detectar si dos imágenes / objetos son similares o no?

“Similar” es una palabra subjetiva, pero por lo que deduzco, dos imágenes son similares en su contexto si tienen objetos relacionados.

Naturalmente, una comparación píxel por píxel no va a funcionar. Desea representar cada imagen usando algunas características que capturan información de objetos a un alto nivel y luego comparar las características.

Probablemente uno de los mejores algoritmos para usar aquí sería pasar su imagen a través de un ConvNet previamente entrenado [como uno entrenado en ImageNet], y usar la salida de una capa intermedia como el vector de características. Debido a que esta red está específicamente entrenada para el reconocimiento de objetos, debe asignar características similares a imágenes con objetos similares.

Otra opción para generar características es usar métodos convencionales de extracción de características en imágenes, como SIFT y SURF, pero debido a que estos métodos extraen características generales que pueden usarse para diferentes tareas, además del reconocimiento de objetos, es posible que no obtenga un rendimiento tan bueno como con ConvNets.

No intente medir la distancia euclidiana directa, sufre la maldición de la dimensionalidad para los vectores de alta dimensión debido al hecho de que las imágenes contienen demasiadas características irrelevantes. Por lo tanto, debe diseñar cuidadosamente el sistema de coincidencia de imágenes teniendo esto en cuenta.

Daré dos enfoques, pero no sé cuál de ellos funcionará mejor para usted.

  1. Enfoque 1 : use las técnicas clásicas de visión por computadora (CV) de extracción de características utilizando detectores de punto clave y extracción de descriptores seguidos de ajuste del modelo, luego haciendo análisis de probabilidad.
  2. Enfoque 2 : Aprenda la métrica de disimilitud / distancia utilizando redes neuronales convolucionales siamesas (convNet).

Veamos un poco más profundo, en cada caso que desee implementar una función:

[matemáticas] y = f (x_1, x_2) [/ matemáticas]

donde [math] y \ in [0,1] [/ math], [math] x [/ math] ‘s son las imágenes que se comparan.

[matemática] y = 1 [/ matemática] si las imágenes coinciden y [matemática] o [/ matemática] de lo contrario

Enfoque 1 :

Esto consiste en:

  1. Detección de puntos clave: uso de detectores de esquina harris o FAST para encontrar puntos fácilmente localizables.
  2. Extracción del descriptor: extraiga un pequeño parche alrededor de los puntos clave, estos parches no necesitan ser valores de píxeles, pueden basarse en el histograma de gradientes o aprendidos. La idea es preservar la mejor información mientras se descarta la información innecesaria como la iluminación. Por lo tanto, estos descriptores están normalizados e indexados en una estructura de datos de búsqueda.
  3. Coincidencia: los descriptores de [matemática] x_1 [/ matemática] y [matemática] x_2 [/ matemática] se combinan usando una estrategia de fuerza bruta con tiempo de ejecución [matemático] O (n ^ 2) [/ matemático] basado en el número de descriptores por imagen Pero esto puede acelerarse utilizando hashing como hashing sensible a la localidad (LSH) con tiempo de ejecución de [math] O (n) [/ math] o usando un árbol Kd con la mejor estrategia de búsqueda de bin first (BBF) como se usa en la escala invariante algoritmo de transformación de características (SIFT). Esto resuelve el problema de correspondencia, pero necesita una última cosa más que hacer.
  4. Ajuste del modelo: el ajuste de una matriz de homografía al conjunto de puntos correspondientes ayuda a identificar entrantes y atípicos. La homografía se estima utilizando el algoritmo de consenso de muestra aleatoria (RANSAC). Después de lo cual, utilizando un análisis probabilitista de valores entrantes y atípicos, el algoritmo puede decidir si las dos imágenes coinciden o no.

Sí, los algoritmos anteriores son bastante complejos de entender, pero hacen un buen trabajo al unir imágenes en aplicaciones como la costura panorámica automática. Puede usar OpenCV para ayudarlo a implementar el enfoque 1:

El enfoque de aprendizaje automático (ML) como se describe a continuación es probablemente lo que debe probar primero, ya que es un poco más fácil de implementar y comprender.

Enfoque 2 :

Usando dos convNets siameses, la idea es aprender una métrica de distancia de alto nivel entre dos imágenes. Sin embargo, esto requiere que recopiles muchos ejemplos de entrenamiento. Entonces convNet debería aprender un nuevo mapeo:

[matemáticas] z = g (x) [/ matemáticas]

Tal que

[matemáticas] d = || z_1 – z_2 || [/ matemáticas]

Representa una medida de distancia de alto nivel que puede umbral para decidir si las dos imágenes coinciden o no.

[matemáticas] y = h (- (d – d_ {th})) [/ matemáticas]

Donde [math] h [/ math] = función de paso de heaviside, [math] d_ {th} [/ math] = umbral de distancia.

Durante el entrenamiento [math] d [/ math] se minimiza en todos los ejemplos de entrenamiento similares, mientras que se maximiza en todos los ejemplos de entrenamiento diferentes. De esta forma, convNet aprende una incrustación de imágenes en la que imágenes similares tienen vectores similares.

Sin embargo, aplicar un umbral arbitrario es una mala idea, por lo que podemos usar una máquina de vectores de soporte (SVM) que se alimenta directamente de los vectores [math] z [/ math] para aprender el hiperplano divisorio. En ese caso, la salida del SVM se puede alimentar directamente a través de la función de paso de cabecera para obtener la salida binaria.

Espero que esto ayude.

Procesamiento de imágenes Las personas no responden su pregunta, porque es extremadamente básica. No necesita aprendizaje automático para comparar dos imágenes. Lo que buscas se llama métrica.

La métrica más básica se construye utilizando la norma vectorial euclidiana. Por lo tanto, solo calcule las diferencias en píxeles, cuadrátelas y sume sobre ellas (olvídese de la raíz cuadrada porque no cambia el significado). Cuanto mayor es el valor, más diferentes son las imágenes.

Esto solo proporcionará resultados sensibles si la escala de las imágenes que desea comparar es la misma. Si no, podría considerar la correlación cruzada normalizada.

Hay toneladas de otras métricas por ahí, con diferentes implicaciones sobre lo que es similar.

La idea clave es identificar características (descriptores) en ambas imágenes y luego compararlas.

Se pueden usar varias técnicas. Por ejemplo, puedes;

  1. Generar descriptor binario, por ejemplo, BREVE (Binary Robust Independent Elementary Features). Este enfoque básicamente crea una cadena de bits para un parche de la imagen al comparar la intensidad de un par de píxeles (p1, p2) y asigna 1 si p1> p2, 0 de lo contrario. En su caso, tendrá una cadena de bits para cada imagen. Luego compare las cadenas usando Hamming Distance para que coincidan con su similitud. El beneficio es que es mucho más rápido extraerlo y requiere menos almacenamiento.

Vea su implementación en OpenCV Python

BREVE (Características elementales independientes binarias robustas)

  1. Use una técnica basada en histograma. Genere histograma para las regiones de interés de cada una de las imágenes y simplemente compare los histogramas.
  2. Utilice SIFT, SURF.

Puede lograrlos fácilmente en MATLAB, OpenCV (Python, C ++).

Solía ​​analizar este problema como parte de un trabajo posdoctoral en ciencias farmacéuticas. Estaba comparando mapas 2D completamente abstractos pero muy interesantes y altamente alineados con la representación fotográfica digital. De todos modos, este es un campo enorme. No estoy seguro de cuál debería ser el papel del aprendizaje automático en lo que quieres hacer, pero esta respuesta de Quora es un buen comienzo. La respuesta de Mert Kilickaya a ¿Cuál es el mejor algoritmo de extracción de características para comparar dos imágenes?

Podría usar un algoritmo llamado Información mutua. Google, por favor.

La idea detrás de este cálculo es que puede indicar que dos imágenes son similares en términos de formas que aparecen en ellas, mientras que tienen un dominio de valor diferente, en otras palabras, si tienen un color diferente.

Lo que necesita en general se llama Métricas de similitud de imagen.

Y trate de no reinventar la rueda, a menos que sea un investigador experimentado en el campo. Solución estándar de Google como esta: métricas de similitud de imagen

CNN ha logrado un gran éxito en visión por computadora. Puede aplicar cualquier arquitectura CNN popular como VGG, Inception, Resnet para extraer características de ambas imágenes. Una vez que extraiga las características, debería poder usar alguna métrica de distancia, probablemente una similitud de coseno para identificar cuán similares son las dos imágenes. Puede echar un vistazo a cómo se implementa la transferencia de estilo en cualquiera de los marcos populares como Keras, Tensorflow, Pytorch para tener una idea de cómo hacerlo.

En realidad, su pregunta fue el punto central de mi tesis doctoral. Sin embargo, para obtener una respuesta precisa, debe definir cuál es la similitud.

Por ejemplo, las capturas de pantalla de dos páginas web son imágenes. Por otro lado, dos retratos / fotos de paisajes también son imágenes. En este punto, ¿podemos decir que los factores que afectan la similitud percibida son los mismos? Obviamente no. Mientras que las capturas de pantalla de la página web son sintéticas, las otras son naturales. En el primer caso, generalmente es útil y suficiente para considerar direcciones de borde sin ninguna restricción de invariancia de escala. Sin embargo, las imágenes naturales tienen estructuras mucho más complicadas que deberían representarse / capturarse con descriptores más sofisticados. Es decir, primero debe tener en cuenta el contenido. ¿Qué será importante? Textura, color, forma?

Por cierto, aunque parece un poco complicado a primera vista, no es tan difícil. Trate de leer el documento del núcleo de coincidencia de pirámide espacial de Lazebnik … Este documento me ha pensado mucho cuando comencé.

Como la gente ya dijo, la similitud es algo difícil de definir, por ejemplo, en las imágenes de personas puede definir la similitud como:

  1. Actitud
  2. Expresión facial
  3. Apariencia: cabello / piel / ojos …

Una vez que definió lo que es similitud, extrae “características” que identifican esas similitudes, esto se puede hacer de varias maneras, encontrando puntos clave, curvas de croquis, información de color, etc.

Una vez que los haya extraído, si están bien representados, puede tomar la distancia euclidiana directa, de lo contrario, debe usar algún tipo de técnica múltiple, para “mapear sus características en un espacio euclidiano” para que pueda tomar distancia o usar una distancia diferente. medida de distancia

Si desea probar algo simple, como identificar rostros, por ejemplo, y tienen una iluminación, posición y postura algo estándar, puede comenzar con el Análisis de componentes principales, después de comprender qué tan amplias y simples pueden ser las cosas. imágenes muy fáciles o muy difíciles de combinar, puedes pasar a cosas más sofisticadas.

Eche un vistazo a la biblioteca pHash que crea un hash perceptual de la imagen y se puede comparar.

Inicio de pHash, la biblioteca de hash perceptual de código abierto

El mejor algoritmo es probablemente una máquina de vectores de soporte, pero si está dispuesto a complicarse un poco más, use una red neuronal de convoluciones.