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.
- 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.
- 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:
- Detección de puntos clave: uso de detectores de esquina harris o FAST para encontrar puntos fácilmente localizables.
- 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.
- 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.
- 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.