abril 30, 2020 10:00 am

Jesús

A lo largo de las últimas semanas hemos estudiado múltiples formas de representar una imagen en un formato resumido, típicamente vectorial, usando técnicas avanzadas, y en ocasiones, complejas, tales como GFTT, Harris, ORB entre muchas otros.

Así mismo, entendimos la diferencia entre descriptores globales y locales, sus ventajas, sus flaquezas y los contextos específicos en los que cada uno brilla.

Lo grandioso de estos detectores es que podemos encontrar implementaciones fáciles de usar en las librerías más importantes de computer vision, como OpenCV y scikit-image.

Sin embargo, no todo son buenas noticias.

Existen una serie de aspectos negativos que impiden que estos algoritmos sean utilizados en mayor medida. De este tema hablaremos en el artículo que nos ocupa, así como de una alternativa interesante, un tanto descabellada en principio, pero que funciona sorprendentemente bien en la práctica: descriptores binarios.

¿Por Qué no Usamos Descriptores Locales Siempre?

Más allá de los incontestables pros de los algoritmos que hemos estudiado recientemente, éstos poseen una serie de desventajas que les impiden ser más versátiles, como:

  • Suelen tomar un tiempo considerable, lo que los vuelve inutilizables en aplicaciones en tiempo real.
  • Tienden a representar una imagen utilizando vectores de números reales, incrementando su costo en espacio, dependiendo de la aplicación donde se usen.
  • Algunas implementaciones no están aprobadas para uso comercial, lo que obliga a investigadores, profesionales y aficionados a la visión artificial a buscar alternativas open source (ejemplos de esto son SIFT y SURF).

Es por este motivo que han surgido alternativas más que llamativas, especialmente diseñadas para contrarrestar o, más bien, cubrir las falencias mencionadas ut supra.

Descriptores Binarios

Entonces, recapitulemos qué es lo que queremos:

  • Mayor velocidad sin sacrificar precisión.
  • La capacidad de usar un descriptor sin ninguna restricción.
  • La posibilidad de describir imágenes en tiempo real.
  • Ahorrar espacio en memoria, de ser posible.

Vaya lista de exigencias, ¿no?

¿Existe, acaso, uno o varios descriptores capaces de cumplir con tales demandas?

¿Qué crees? ¡Sí! Sí existen y los conocemos como descriptores binarios

Su cualidad binaria se desprende del hecho de que producen vectores binarios, representados como cadenas de 1 y 0, lo cual, como podemos esperar, los hace increíblemente eficientes en términos de espacio y cómputo, puesto que en vez de comparar cantidades reales para determinar qué tan alejados están dos vectores entre sí, nos basta con comparaciones a nivel de bits, mediante operandos como XOR, AND y OR.

Los descriptores binarios consisten, en la mayoría de los casos, de las siguientes piezas:

  • Un patrón de muestreo: Como su nombre indica, es el patrón o mecanismo que se utiliza para delimitar la región de interés alrededor de un punto clave. Dicho patrón varía de descriptor a descriptor, y en algunos casos, no se realiza muestreo alguno, mientras que en otros el patrón aplicado es bastante complejo.
  • Muestreo de pares: Una vez se han muestreado los píxeles de interés circundantes a un punto clave, es tiempo de escoger los pares de pixeles que se compararán. Naturalmente, la estrategia implementada para dicha labor también cambia dependiendo del descriptor.
  • Compensación de orientación: Muchos descriptores binarios incluyen un componente para compensar o corregir rotaciones en las regiones de una imagen. Esto es importante, puesto que de lo contrario el descriptor consideraría que dos regiones son diferentes, cuando en la realidad se tratan de la misma sección de una imagen, solo difiriendo en el ángulo de rotación. 

El vector binario resultante se construye comparando cada par de píxeles muestreado en el paso dos descrito previamente. Digamos que P1 simboliza el primer píxel del par, mientras que P2 hace lo propio con el segundo. La cadena binaria se calcula así:

  • P1 >= P2 → 1.
  • P1 < P2 → 0.

La longitud del vector dependerá del número de pares construidos. Por ejemplo, si el descriptor muestrea 128 pares, la cadena de bits contendrá 128 elementos, los cuales se pueden representar compactamente en un vector de 16 números enteros sin signo de 8 bits (128 / 8 = 16). 

Finalmente, para comparar dos vectores basta con contar el número de bits en ambas cadenas que difieren entre sí. Por ejemplo, si comparamos la cadena 1101 con la 1011, tenemos que 2 bits difieren. Normalizando esta cifra al dividir 2 / 4 (la longitud de las cadenas de bits), la distancia resultante entre los vectores es, por tanto, 1.

En conclusión, los descriptores binarios son una alternativa fabulosa a los descriptores tradicionales que hemos visto hasta los momentos. No obstante, es insensato pensar que podemos resolver cualquier problema con descriptores binarios. Como todo en el mundo de la visión artificial, la escogencia de un algoritmo específico está fuertemente condicionada por las necesidades y características de un proyecto. Por ejemplo, si no requerimos procesar imágenes en tiempo real, podemos optar por un descriptor de puntos clave, ya que la velocidad no es un factor crucial. Si, por el contrario, estamos desarrollando una aplicación destinada a correr en hardware limitado, entonces el espacio y la velocidad de cómputo se vuelven elementos a tener en cuenta, por lo que un descriptor binario tendría sentido en dicho contexto.

¿Qué opinas de estos descriptores? ¿Has usado alguno en tus proyectos? Házmelo saber en los comentarios.

¡Adiós!

Sobre el Autor

Jesús Martínez es el creador de DataSmarts, un lugar para los apasionados por computer vision y machine learning. Cuando no se encuentra bloggeando, jugando con algún algoritmo o trabajando en un proyecto (muy) cool, disfruta escuchar a The Beatles, leer o viajar por carretera.

Paso 2/2: Celebra tu NUEVO EMPLEO en Machine Learning ?

A %d blogueros les gusta esto: