¿El extractor de características SIFT basado en la GPU para iOS?

He estado jugando con la excelente biblioteca GPUImage, que implementa varios detectores de características: Harris, FAST, ShiTomas, Noble. Sin embargo, ninguna de esas implementaciones ayuda con la extracción de características y la parte correspondiente. Simplemente emiten un set de puntos de esquina detectados.

Mi comprensión (que es shakey) es que el siguiente paso sería examinar cada uno de esos puntos de esquina detectados y extraer la característica de ahí, lo que daría como resultado un descriptor, es decir, un número de 32 o 64 bits que podría usarse para indexar el punto cerca de otros, puntos similares.

A partir de la lectura del Capítulo 4.1 de [Aplicaciones y algorithms de visión por computadora, Szeliski], entiendo que usar un enfoque BestBin ayudaría a encontrar eficientemente las configuraciones vecinas para que coincidan, etc. Sin embargo, en realidad no sé cómo hacer esto y estoy buscando algún código de ejemplo que lo haga.

Encontré este proyecto [https://github.com/Moodstocks/sift-gpu-iphone] que dice implementar tanto como sea posible la extracción de características en la GPU. También he visto alguna discusión que indica que podría generar errores descriptores.

Y, en cualquier caso, ese código no se enciende para mostrar cómo las características extraídas se adaptarían mejor a otra image.

Mi caso de uso si trato de encontrar objects en una image.

¿Alguien tiene algún código que lo haga, o al less una buena implementación que muestre cómo se combinan las características extraídas? Espero no tener que reescribir todo el set de algorithms.

Gracias, Rob.

En primer lugar, debe tener cuidado con las implementaciones de SIFT, porque el algorithm SIFT está patentado y los propietarios de esas patentes requieren tarifas de licencia para su uso. Intencionalmente he evitado usar ese algorithm como resultado.

Encontrar buenos methods de detección y extracción de características que también funcionen bien en una GPU es un poco complicado. Los detectores de esquina Harris, Shi-Tomasi y Noble en GPUImage son todos derivados de la misma operación base, y probablemente no sean la forma más rápida de identificar características.

Como puede ver, mi detector de esquina FAST aún no está operativo. La idea es usar una textura de búsqueda basada en un patrón binary local (por qué construí ese filter primero para probar el concepto), y para tener ese retorno, ya sea que sea un punto de esquina o no. Eso debería ser mucho más rápido que los detectores de esquina Harris, etc. También necesito terminar mi extractor de puntos de pirámide de histogtwig para que la extracción de características no se realice en un ciclo extremadamente lento en la GPU.

El uso de una textura de búsqueda para un detector de esquina FAST está inspirado en este artículo de Jaco Cronje en una técnica a la que se refieren como BFROST. Además de utilizar la búsqueda rápida y basada en texturas para la detección de características, el documento propone usar el patrón binary como un descriptor rápido para la function. Hay un poco más que eso, pero en general eso es lo que proponen.

La coincidencia de características se realiza mediante la distancia de Hamming, pero aunque hay instrucciones rápidas de CPU y CUDA para calcularlo, OpenGL ES no tiene una. Se podría requerir un enfoque diferente allí. Del mismo modo, no tengo una buena solución para encontrar una mejor coincidencia entre los grupos de características más allá de algo de la CPU, pero aún no he pensado mucho.

Es mi objective principal tener esto en el marco (es una de las razones por las que lo construí), pero no he tenido time de trabajar en esto últimamente. Lo anterior es, al less, mis pensamientos sobre cómo abordaría esto, pero le advierto que esto no será fácil de implementar.

Para el reconocimiento de objects / en estos días (a partir de hace un par de semanas) es mejor usar tensorflow / Convolutional Neural Networks para esto. Apple tiene un código de muestra de metal recientemente agregado. https://developer.apple.com/library/content/samplecode/MetalImageRecognition/Introduction/Intro.html#//apple_ref/doc/uid/TP40017385

Para hacer la detección de características dentro de una image, llamo su atención a una list de salida: el algorithm KAZE / AKAZE con opencv. http://www.robesafe.com/personal/pablo.alcantarilla/kaze.html

Para ios, pegué la class Akaze junto con otra muestra de costura para ilustrar.

detector = cv::AKAZE::create(); detector->detect(mat, keypoints); // this will find the keypoints cv::drawKeypoints(mat, keypoints, mat); // this is the pseudo SIFT descriptor .. [255] = { pt = (x = 645.707153, y = 56.4605064) size = 4.80000019 angle = 0 response = 0.00223364262 octave = 0 class_id = 0 } 

https://github.com/johndpope/OpenCVSwiftStitch

introduzca la descripción de la imagen aquí

    Intereting Posts