Graduado en Ingeniería Informática
Universidad Politécnica de Madrid
Escuela Técnica Superior deIngenieros Informáticos
TRABAJO FIN DE GRADO
Evaluación y optimización de un descriptor decaracterísticas
Autor: Alejandro Cobo Cabornero
Tutor: Iago Suárez
Director: Luis Baumela Molina
MADRID, 3 DE JUNIO DE 2019
ÍNDICE1. Introducción y Objetivos 1
2. Estado del Arte 32.1. Detección de Características . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.1. Detección de esquinas . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.2. Detección de manchas . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.3. Detección de segmentos rectilíneos . . . . . . . . . . . . . . . . 4
2.2. Descripción de Características . . . . . . . . . . . . . . . . . . . . . . . 4
2.2.1. Descriptores ingenieriles . . . . . . . . . . . . . . . . . . . . . . 4
2.2.2. Descriptores basados en aprendizaje automático . . . . . . . . . . 6
2.3. Matching de Características . . . . . . . . . . . . . . . . . . . . . . . . . 7
3. Evaluación de Riesgos 9
4. Evaluación y optimización de un descriptor de características 104.1. Evaluación del descriptor de características . . . . . . . . . . . . . . . . 10
4.2. Optimización del descriptor . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.3. Aplicación de Realidad Aumentada . . . . . . . . . . . . . . . . . . . . 16
5. Experimentos y resultados 185.1. Gráficas Precision-Recall . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2. Tiempos de ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
6. Conclusiones 22
7. Líneas futuras 23
8. Referencias 24
A. Guía sobre la Transparent API de OpenCV 27
ÍNDICE DE FIGURAS1. Ejemplo de sub-regiones e histograma empelados por SIFT en el proceso
de descripción de puntos característicos. Figura tomada de [2]. . . . . . . 5
2. Regiones de pares de muestras (primera fila) y heat maps de los pesos
espaciales (segunda fila) empleados por BRIEF, BRISK, ORB, BinBoost
y BELID. Figura tomada de [21]. . . . . . . . . . . . . . . . . . . . . . . 7
3. Funcionamiento de BELID. Se calculan los valores medios de gris de los
píxeles de las cajas rojas y azules. Luego, para cada par de cajas rojas
y azules (weak learner) se restan los valores medios de gris, obteniendo
f(x). Se aplican una serie de umbrales para obtener las respuestas h(x) y,
finalmente, se multiplica por la matriz B para producir el descriptor D(x).Figura tomada de [21]. . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4. Ejemplo del procedimiento de descripción de puntos característicos em-
pleado por BELID. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
5. Regiones de los weak learners sobre la imagen anterior rotada 45o. Puede
apreciarse que las cajas no rotan. . . . . . . . . . . . . . . . . . . . . . . 12
6. Distancia L2 entre descriptores del mismo punto y distintos puntos en
función del ángulo de giro de una imagen. (a) BELID, (b) ORB. . . . . . 13
7. Imagen utilizada en los experimentos. . . . . . . . . . . . . . . . . . . . 13
8. Comparación del porcentaje de correspondencias correctas según la tras-
lación aplicada a una imagen para (a) 500 puntos detectados con ORB y
(b) 500 puntos detectados con SIFT. . . . . . . . . . . . . . . . . . . . . 14
9. Comparación del porcentaje de correspondencias correctas según la esca-
la aplicada a una imagen para (a) 500 puntos detectados con ORB y (b)
500 puntos detectados con SIFT. . . . . . . . . . . . . . . . . . . . . . . 14
10. Comparación del porcentaje de correspondencias correctas según el ángu-
lo de rotación de la imagen entre varios descriptores con (a) 500 puntos
detectados con ORB y (b) 500 puntos detectados con SIFT. . . . . . . . . 15
11. Proceso de optimización llevado a cabo para el cálculo de los descriptores
a partir de las respuestas de los weak learners y sus pesos. . . . . . . . . 16
12. Captura del funcionamiento de la aplicación en la que un cubo es proyec-
tado sobre el patrón captado por la cámara. . . . . . . . . . . . . . . . . 17
13. Ejemplos de imágenes del dataset. (a) y (b): transformación de rotación
+ zoom. (c) y (d): cambio de perspectiva. (e) y (f): desenfoque. (g): com-
presión JPEG. (h): cambio de iluminación. . . . . . . . . . . . . . . . . 18
14. Ejemplo de correspondencias entre puntos característicos de dos imáge-
nes obtenidas con SURF. . . . . . . . . . . . . . . . . . . . . . . . . . . 19
15. Resultados obtenidos para cada conjunto de imágenes en el dataset. . . . 20
16. Resultado de la comparativa entre varios descriptores usando toda la base
de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
II
ÍNDICE DE CUADROS1. Tiempo medio de ejecución (en milisegundos) del proceso de descripción
de 2 imágenes para varios descriptores. . . . . . . . . . . . . . . . . . . . 21
III
Resumen
Distintas características como esquinas, manchas o segmentos rectilíneos
nos permiten reconocer objetos en imágenes digitales. Generar una descrip-
ción compacta, pero a la vez discriminativa de estas características es un pa-
so clave en muchas aplicaciones como Realidad Aumentada, Structure FromMotion, SLAM, etc. BELID es un reciente descriptor creado en el Grupo de
Visión por Computador y Robótica Aérea de la UPM y en este trabajo mos-
tramos un detallado análisis de su comportamiento en conjunto con una im-
plementación eficiente en C++ que permite su ejecución en dispositivos mó-
viles. Además se genera una guía de carácter general para la implementación
de algoritmos eficientes empleando la Transparent API de OpenCV.
Palabras clave: visión por computador, descriptor de imágenes, aprendi-
zaje automático, realidad aumentada.
IV
Abstract
Features like corners, blobs or line segments allow us to recognize objects
in digital images. Generating a compact but powerful description of these fea-
tures is a crucial step in several applications like Augmented Reality, Struc-
ture From Motion, SLAM, etc. BELID is a recent image feature descriptor
created by the Computer Vision for Aerial Robotics group of the UPM. In this
work we show a detailed analysis of its behavior and we propose an efficient
implementation in C++ code that allows its usage in low-poer devices such as
smartphones, tablets or robots. We also generate a general purpose guide of
how to implement efficient algorithms using the OpenCV’s Transparent API.
Keywords: computer vision, feature descriptor, machine learning, aug-
mented reality.
V
1. INTRODUCCIÓN Y OBJETIVOSEl reconocimiento de objetos es una de las tareas más complejas y demandadas en el
ámbito de la visión por computador. La dificultad de este reconocimiento reside princi-
palmente en la diversidad con la que un mismo objeto o patrón puede presentarse en una
imagen en función de las distintas condiciones de iluminación, perspectiva, etc.
Un problema añadido es la extensión de la información recibida, pues una imagen di-
gital puede constar de millones de píxeles y analizar todos ellos en tiempo real es compu-
tacionalmente muy costoso. Por este motivo es usual reconocer los patrones en base a un
conjunto de elementos o estructuras locales de la imagen, conocidos en la literatura ingle-
sa como “features” (características) de bajo nivel como pueden ser esquinas [1], manchas
[2] o líneas [3].
El flujo de trabajo más común para la detección de objetos en base a estas caracterís-
ticas suele requerir en un primer lugar de un método detector, que sea capaz de detectar
esas características de forma robusta a diferentes condiciones de iluminación, ruido, es-
cala o punto de vista. En segundo lugar, de un algoritmo descriptor que represente esas
características de una forma compacta y representativa. Por último un método de estima-
ción robusta de modelos que permita detectar si las características halladas en una imagen
corresponden a las del patrón aprendido.
En el Grupo de Visión por Computador y Robótica Aérea se ha desarrollado durante
los años 2018 y 2019 BELID, un descriptor de características que es capaz de describir de
forma rápida las características de interés detectadas en una imagen. El cometido de este
Trabajo Fin de Grado es el de evaluar y optimizar ese descriptor para así poder alcanzar
la eficiencia computacional necesaria para su uso en dispositivos móviles.
Las tecnologías que se han empleado para la evaluación y optimización de este des-
criptor son las siguientes:
C++: Lenguaje de programación creado en 1979 que añade al lenguaje C la mani-
pulación de objetos. Es un lenguaje de programación multiparadigma, puesto que
soporta varios paradigmas, como la programación estructurada y la programación
orientada a objetos. Se trata de un lenguaje que permite implementaciones muy
eficientes, por lo que resulta idóneo para labores de optimización de rendimiento.
OpenCV: Se trata de una librería con interfaces en Python, Java, C++ y C que con-
tiene funcionalidades útiles para aplicaciones de visión por computador y permite
el empleo de aceleración hardware para una implementación eficiente.
OpenCL: Herramienta utilizada por OpenCV que permite el desarrollo de aplica-
ciones que se ejecutan tanto en la CPU como en la GPU del computador.
Android: Sistema operativo presente en dispositivos móviles basado en Linux. Es,
actualmente, el sistema operativo móvil más extendido del mundo.
En la Sección 2 se explican los términos básicos del ámbito en el que se ha trabaja-
do en este TFG y se realiza un análisis del estado del arte de los diferentes algoritmos y
métodos existentes. En la Sección 3 se realiza una evaluación de los riesgos y ventajas
1
que tiene el uso del descriptor y se evalúan otras posibles soluciones. En la Sección 4 se
detalla el proceso de descripción de características empleado por el descriptor en el que se
centrará este TFG y se muestran los resultados obtenidos en varias pruebas que lo compa-
ran con otros descriptores, además de señalar el proceso de optimización llevado a cabo.
En la Sección 5 se describen los experimentos llevados a cabo y los resultados obtenidos.
En la sección 6 se aportan unas conclusiones sobre el trabajo realizado en este TFG. En
la Sección 7 se sugieren varias mejoras que pueden aumentar el rendimiento y reducir el
tiempo de cómputo del descriptor. Por último, se ha realizado en paralelo una guía sobre
el uso de la Transparent API de OpenCV, que permite usar aceleración hardware en có-
digo de OpenCV. Se ha redactado en inglés con el objetivo de ser publicada en Internet
para ayudar a usuarios de la Transparent API a entender mejor el funcionamiento de esta
herramienta. Se ha añadido en el Apéndice A.
2
2. ESTADO DEL ARTE
2.1. Detección de CaracterísticasPara representar y localizar objetos de forma eficaz es necesario discriminar de todos
los píxeles de una imagen cuáles de ellos son de mayor interés. Estas regiones de interés
corresponden con características físicas de los objetos como pueden ser bordes o cambios
de textura que en una imagen digital dan lugar a un cambio significativo de nivel de gris.
Este cambio de nivel de gris en la imagen es el que forma características como manchas,
esquinas o segmentos rectilíneos a través de los cuales un objeto puede reconocerse.
A continuación detallamos los algoritmos más conocidos para la detección de cada
uno de este tipo de características.
2.1.1. Detección de esquinas
La forma más intuitiva de localizar puntos de interés es buscar esquinas. Las esquinas
en una imagen presentan una variación de intensidad en los valores de los píxeles tanto
en la dirección horizontal como en la vertical, por lo que resulta sencillo encontrar su
posición exacta en varias imágenes.
Algunos de los detectores de esquinas más usados son:
Detector de esquinas de Harris [4]: Se trata de un algoritmo que detecta puntos
característicos (generalmente esquinas) como regiones en la que existe un cambio
significativo de niveles de gris en varias direcciones. Esto se puede hacer de forma
sencilla empleando la matriz de auto-correlaciones de los gradientes, en concreto
buscando regiones de la imagen donde los dos autovalores de la matriz son signi-
ficativos. El detector de puntos de Harris lo hace empleando el determinante y la
traza de la matriz mientras que el detector de esquinas de Shi-Tomasi[5] mira tan
solo el menor de los autovalores.
Features from Accelerated Segment Test (FAST) [6]: es una alternativa a otros
detectores que permite una detección rápida y resulta fácilmente integrable en apli-
caciones de tiempo real. Es un detector basado en Machine Learning que selecciona
aquellos píxeles en los que la intensidad de sus vecinos es lo suficientemente dife-
rente a la suya.
2.1.2. Detección de manchas
Una alternativa a la detección de esquinas es la detección de manchas o regiones
reconocibles en la imagen dados los valores de intensidad de los píxeles. Permiten obtener
información sobre la imagen que no se puede conseguir con detectores de esquinas. Estos
detectores suelen generar mejores resultados que los detectores de esquinas, pero son
también computacionalmente más costosos.
Los principales métodos empleados en los detectores de manchas son:
Laplaciana de la Gaussiana: consiste en aplicar un filtro gaussiano y seguida-
mente un operador laplaciano sobre la imagen. El resultado depende de la escala
3
utilizada (valor σ en el filtro gaussiano), de modo que se aplica varias veces con
distintas escalas, formando un espacio-escala y buscando los puntos en este espacio
3D.
Diferencia de Gaussianas: partiendo de la representación de la imagen como espacio-
escala, una aproximación al operador Laplaciano se puede conseguir mediante la
diferencia de dos imágenes suavizadas con filtros gaussianos a distintas escalas.
Determinante de la matriz Hessiana: dada la matriz Hessiana de la imagen en
espacio-escala, los máximos de la función definida por el determinante de esta ma-
triz permiten obtener regiones características de la imagen robustas a transforma-
ciones afines.
2.1.3. Detección de segmentos rectilíneos
Los segmentos rectilíneos son otras características importantes que suelen ser más
robustas ante cambios de iluminación que las esquinas o las manchas. La aproximación
clásica para la detección de líneas en una imagen suele consistir en el uso de la transforma-
da Hough [7] o de sus versiones optimizadas como la transformada Hough probabilística.
No obstante, todos estos métodos son demasiado costosos debido a su carácter global, en
consecuencia, han surgido nuevas aproximaciones basadas en el agrupamiento local de
píxeles como LSD [8] o EDLines [9]. Estos métodos agrupan un conjunto alineado de pí-
xeles que comparten una dirección común del gradiente y aseguran su validez empleando
un esquema probabilístico basado en el número de falsas alarmas (NFA). El punto más
destacable de estos detectores es que son computacionalmente muy eficientes y por tanto
son válidos para su uso en aplicaciones en tiempo real. Recientemente también se han
propuesto métodos que detectan líneas como varios segmentos alineados entre sí [3].
2.2. Descripción de CaracterísticasUna vez se han detectado las características de interés para el reconocimiento del
objeto, la siguiente tarea consiste en obtener una representación compacta y robusta de
estas “partes” de la imagen. Si esta representación se hace cuidadosamente, el descriptor
obtenido debería de ser robusto ante cambios de iluminación y en cierta medida robusto
a transformaciones geométricas como la isometría o la afinidad.
2.2.1. Descriptores ingenieriles
SIFT [2]: se trata de un detector y descriptor de puntos característicos, invarian-
tes frente a cambios de escala y rotación, y robustos ante transformaciones afines,
cambios de perspectiva, ruido y cambios de iluminación. Para la extracción de los
puntos, utiliza un filtrado en cascada sobre la imagen para reducir el coste compu-
tacional, de modo que las operaciones más caras solo se aplican sobre regiones de
la imagen que pasan un test inicial. Los pasos principales que se llevan a cabo son:
4
1. Detección de extremos en el espacio de escalas: se buscan posibles puntos de
interés en todas las escalas usando una diferencia de Gaussianas.
2. Obtención de puntos de interés: dados los posibles candidatos obtenidos en el
paso anterior, se seleccionan los puntos de interés en base a mediciones sobre
su estabilidad.
3. Asignación de orientación: se crea una rejilla de 4x4 con las orientaciones
y magnitudes del gradiente de la imagen en una región alrededor del punto.
Posteriormente, se utiliza un histograma de orientaciones que resume los con-
tenidos de las 4x4 sub-regiones. En la Figura 1 se muestra una representación
de este proceso.
4. Descripción de los puntos de interés: los gradientes locales de la imagen se
miden en la correspondiente escala en la región de cada punto de interés.
Figura 1: Ejemplo de sub-regiones e histograma empelados por SIFT en el proceso de
descripción de puntos característicos. Figura tomada de [2].
SURF [10]: este detector y descriptor de puntos característicos también emplea un
filtrado en cascada sobre la imagen, pero empleando la imagen integral y filtros
cuadrados para realizar una aproximación con menos coste computacional. Para
la detección de puntos característicos, se emplea el determinante de la matriz hes-
siana. En cuanto a la fase de descripción, para la asignación de la orientación se
emplean las respuestas del wavelet de Haar. Luego, se construye una región cua-
drada centrada en el punto de interés orientada según el paso anterior. Esta región
se subdivide en 16 regiones, en las que se calculan las respuestas del wavelet deHaar y se aplica un filtro gaussiano. Finalmente, el descriptor se construye con la
unión de estas respuestas.
BRISK [11]: los puntos de interés son seleccionados a través de la imagen y del es-
pacio de escalas. Para una mayor eficiencia computacional, los puntos de interés son
5
detectados en las capas de la pirámide de la imagen, y se emplea una función cua-
drática para obtener su localización y escala. El descriptor binario de cada punto de
interés se construye en base a la concatenación de los resultados de comparaciones
de iluminación siguiendo un patrón compuesto por círculos, tal como se muestra en
la Figura 2
2.2.2. Descriptores basados en aprendizaje automático
Recientemente, han surgido varios descriptores basados en aprendizaje automático
que realizan esta tarea de forma muy eficaz, superando a otros descriptores clásicos. Al-
gunos de los descriptores más utilizados que se han estudiado para este Trabajo Fin de
Grado son:
ORB [12]: es un detector y descriptor de puntos de interés basado en el detector
FAST y el descriptor BRIEF [13], añadiendo la orientación de los puntos obtenidos
con FAST (oFAST) y resolviendo los problemas que presenta BRIEF ante transfor-
maciones de rotación (rBRIEF). Este descriptor es uno de los primeros aprendidos
ya que aprende sus comparaciones binarias de tal modo que se minimiza la corre-
lación entre ellas.
VGG [14]: Descriptor de imágenes creado por el Oxford Visual Geometry Groupque aprende mediante optimización convexa las posiciones de la mancha detecta-
da donde debe realizar las mediciones. Este descriptor usa patrones geométricos
similares a DAISY [15] y genera un descriptor en coma flotante.
FP-Boost [16]: se trata de un framework basado en la técnica de Boosting [17]
para el aprendizaje automático de descriptores de características invariantes ante
cambios de perspectiva e iluminación. Se realiza una correspondencia no lineal
entre los patches de entrada y el espacio de características con el empleo de weaklearners (medidas locales sobre la imagen) basados en el gradiente.
Boosting es un meta-algoritmo de aprendizaje automático en que se entrenan distin-
tos clasificadores de manera incremental, en el que el conjunto de entrenamiento de
cada clasificador se muestrea de manera selectiva en función de aquellas instancias
mal clasificadas en el paso anterior.
BinBoost [18]: es una extensión de FP-Boost que permite entrenar descriptores
binarios, reduciendo considerablemente el tiempo de cálculo de correspondencias
entre descriptores. Cada bit del descriptor se calcula con una función hash binaria.
Deep Learning: recientemente han surgido varios algoritmos [19, 20] de apren-
dizaje automático que emplean Deep Learning para generar descriptores. Si bien
consiguen un rendimiento mejor que el de SIFT en muchos escenarios, su elevado
coste computacional los hace inviables en aplicaciones de tiempo real para disposi-
tivos móviles.
6
Figura 2: Regiones de pares de muestras (primera fila) y heat maps de los pesos espaciales
(segunda fila) empleados por BRIEF, BRISK, ORB, BinBoost y BELID. Figura tomada
de [21].
2.3. Matching de CaracterísticasUna vez calculados los descriptores, para reconocer un objeto representado por una
serie de ellos debemos ser capaces de determinar si los descriptores pertenecientes a las
características de una determinada imagen corresponden o no con aquellos que conoce-
mos de nuestro objeto. Para ello debe medirse la distancia entre los descriptores alma-
cenados (referencia) y los detectados en la misma imagen, obteniendo así las posibles
correspondencias.
Para los descriptores en coma flotante, la forma más habitual de medir la distancia es
la norma L2 (también llamada distancia euclídea). La norma L2 entre dos descriptores
D1 = d11, d12, ..., d1n y D2 = d21, d22, ..., d2n de tamaño n se define como:
‖D1−D2‖ =
√√√√n∑
i=1
(d1i − d2i)2
donde D1, D2 ∈ Rn y d1i, d2i ∈ R ∀i.
Para los descriptores binarios, se suele utilizar la distancia de Hamming, definida co-
mo el número de bits distintos entre los descriptores. Dados dos descriptores binarios
D1 = d11, d12, ..., d1n y D2 = d21, d22, ..., d2n de tamaño n:
dhamming(D1, D2) =n∑
i=1
(d1i ⊕ d2i)
donde D1, D2 ∈ {0, 1}n y d1i, d2i ∈ {0, 1} ∀i.Una distancia pequeña entre dos descriptores indica que seguramente estén descri-
biendo el mismo punto en dos imágenes distintas.
Los dos tipos de matchers más comúnmente utilizados son los siguientes:
7
1. Brute force matching: dados dos conjuntos de descriptores, D1 y D2, para cada
descriptor de D1 calcula la distancia con cada descriptor de D2 y lo empareja con
el que esté más cerca. También existe la opción de hacer cross check, de modo que
solo empareja el descriptor i de D1 con el j de D2 si j e i también son el mejor
emparejamiento al comparar los descriptores de D2 con los de D1.
2. FLANN Based matching [22]: se trata de una librería que contiene una colección
de varios algoritmos optimizados para la búsqueda del vecino más cercano en da-tasets grandes. Los dos tipos de algoritmos más usados son:
Basados en KD-Tree: permiten una aproximación eficiente del algoritmo de
búsqueda del vecino más cercano con el uso de árboles KD que van separan-
do los datos eligiendo una dimensión aleatoria entre las D dimensiones con
mayor varianza. Son generalmente usados con descriptores en coma flotante
(SIFT, SURF, etc.).
Basados en Local Sensitive Hashing: son algoritmos que usan funciones
hash para agrupar objetos similares en el mismo valor. Se usan con descripto-
res binarios (BRISK, ORB, etc.).
8
3. EVALUACIÓN DE RIESGOSLa principal ventaja que tiene el descriptor en el que se centrará este TFG, tal y como
se verá en la Sección 5, es el bajo coste computacional que tiene y su alto rendimiento.
Por otra parte, como se verá en la Sección 4, existen ciertos inconvenientes ligados al
método empleado para construir los descriptores, como es la robustez ante la rotación.
Para comparar este descriptor con otros del estado del arte, se han llevado a cabo ex-
perimentos que ponen en manifiesto el buen rendimiento y reducido coste computacional
del descriptor, siendo una opción viable para la integración en aplicaciones en tiempo
real, sobre todo en dispositivos de bajas capacidades computacionales.
9
4. EVALUACIÓN Y OPTIMIZACIÓN DE UN DESCRIP-TOR DE CARACTERÍSTICAS
Este Trabajo Fin de Grado presenta la implementación en C++ de un descriptor basa-
do en Machine Learning, concretamente en la técnica de Boosting, así como una demos-
tración en una aplicación de Realidad Aumentada en la plataforma Android.
Este descriptor permite identificar una superficie sobre la que se proyecta un objeto
3D virtual. Es importante, en este caso, la eficiencia con la que lo hace, pues debe ser
capaz de hacerlo en tiempo real y teniendo en cuenta las limitaciones de los dispositivos
móviles.
4.1. Evaluación del descriptor de característicasEl descriptor de imágenes en el que se centrará este Trabajo Fin de Grado es un des-
criptor desarrollado por el grupo de Visión por Computador y Robótica Aérea de la Es-
cuela Técnica Superior de Ingenieros Informáticos, llamado BELID (Boosted EfficientLocal Image Descriptor) [21].
Este descriptor utiliza la técnica de Boosting para entrenar un número de weak lear-ners cuyo trabajo es comparar el nivel medio de gris de dos regiones de la imagen para
determinar si representan la misma estructura. La eficiencia del descriptor surge del uso
de la imagen integral para el cálculo del nivel medio de gris de las regiones.
+1
-1
+1
-1
T
=
T
Figura 3: Funcionamiento de BELID. Se calculan los valores medios de gris de los píxeles
de las cajas rojas y azules. Luego, para cada par de cajas rojas y azules (weak learner) se
restan los valores medios de gris, obteniendo f(x). Se aplican una serie de umbrales para
obtener las respuestas h(x) y, finalmente, se multiplica por la matriz B para producir el
descriptor D(x). Figura tomada de [21].
La imagen integral es una estructura de datos que permite calcular el área de una
región cuadrada en tiempo constante con solo 4 accesos a memoria, independientemente
del tamaño de la región. Su valor para cada punto (x, y) en la imagen se define como:
I(x, y) =∑x′≤xy′≤y
i(x′, y′)
10
donde i(x, y) es el valor del píxel en el punto (x, y).Una vez calculada la imagen integral, para calcular la suma de los valores de los
píxeles en una región cuadrada con vértices A, B, C y D se realiza la siguiente operación:
I(D) + I(A)− I(B)− I(C)
En la Figura 4 pueden verse estas regiones cuadradas para un conjunto de puntos
característicos. Cada weak learner comparará los niveles de gris de la región en negro con
el de la región en blanco y, en función de si son lo suficientemente parecidos, devolverá 1 o
-1. En este caso, se han representado solo las regiones que utilizará el primer weak learner,
pero el descriptor usará varios para construir el resultado (actualmente hay versiones que
emplean 128, 256 y 512 weak learners).
Figura 4: Ejemplo del procedimiento de descripción de puntos característicos empleado
por BELID.
Uno de los problemas del descriptor es la rotación. Al rotar una imagen y sus puntos
característicos, las regiones de los weak learners no rotan y se obtienen peores resultados,
como se puede apreciar en la Figura 5.
11
Figura 5: Regiones de los weak learners sobre la imagen anterior rotada 45o. Puede apre-
ciarse que las cajas no rotan.
Para evaluar cómo puede afectar esto al proceso de descripción, se ha realizado un
experimento en el que se obtienen 500 puntos característicos de una imagen con ORB y,
a partir de ellos, sus descriptores con BELID. Entonces, la imagen se rota varias veces
junto con los puntos detectados. Para cada imagen rotada, se calculan los descriptores de
los puntos característicos rotados y se mide su norma L2 con los descriptores de la imagen
original.
En la Figura 6 se puede observar que la distancia L2 entre descriptores del mismo
punto varía en función del ángulo de rotación de la imagen. Concretamente, la distancia
es la mitad que la existente entre puntos distintos para BELID. En el caso de ORB, se ha
usado la norma L2 de Hamming, puesto que emplea descriptores binarios.
12
(a) BELID. (b) ORB.
Figura 6: Distancia L2 entre descriptores del mismo punto y distintos puntos en función
del ángulo de giro de una imagen. (a) BELID, (b) ORB.
A priori, esto podría parecer un problema, pero solo si afecta al proceso del cálculo
de correspondencias entre imágenes. Para poder comparar el rendimiento entre los des-
criptores ante distintas transformaciones sobre una misma imagen, se han llevado a cabo
varios experimentos en los que se calcula el porcentaje de inliers de los descriptores, es
decir, cuántos de los descriptores de la imagen transformada son los que se encuentran a
una menor distancia de sus correspondientes en la imagen original. Cada experimento se
ha realizado detectando puntos característicos en la imagen mostrada en la Figura 7, pri-
mero con ORB y luego con SIFT. En los resultados obtenidos con los puntos detectados
con SIFT no aparece ORB porque su implementación en OpenCV no es compatible con
estos puntos.
Figura 7: Imagen utilizada en los experimentos.
13
El primer experimento mide el rendimiento de los descriptores ante cambios de tras-
lación. En la Figura 8 se pueden observar los resultados obtenidos.
(a) Puntos ORB. (b) Puntos SIFT.
Figura 8: Comparación del porcentaje de correspondencias correctas según la traslación
aplicada a una imagen para (a) 500 puntos detectados con ORB y (b) 500 puntos detecta-
dos con SIFT.
Los resultados muestran que, excepto SURF y BRIEF, todos los descriptores son in-
variantes ante cambios de traslación.
El siguiente experimento realizado ha comprobado la robustez de los descriptores ante
cambios de escala. En la Figura 9 se muestran los resultados obtenidos.
(a) Puntos ORB. (b) Puntos SIFT.
Figura 9: Comparación del porcentaje de correspondencias correctas según la escala apli-
cada a una imagen para (a) 500 puntos detectados con ORB y (b) 500 puntos detectados
con SIFT.
Puede verse una gran diferencia en el rendimiento de BELID al usar puntos SIFT en
vez de puntos ORB. El descriptor es invariante a la escala al usar puntos ORB pero muy
sensible a ella al usar puntos SIFT.
Por último, se ha realizado un experimento que mide el rendimiento de los descriptores
ante cambios de rotación. En la Figura 10 pueden observarse los resultados obtenidos.
14
(a) Puntos ORB. (b) Puntos SIFT.
Figura 10: Comparación del porcentaje de correspondencias correctas según el ángulo de
rotación de la imagen entre varios descriptores con (a) 500 puntos detectados con ORB y
(b) 500 puntos detectados con SIFT.
Como puede observarse, al utilizar puntos detectados con ORB, el rendimiento del
descriptor supera al de los demás, obteniendo casi un 100 % de correspondencias correctas
para cualquier ángulo de giro.
Sin embargo, al emplear puntos detectados con SIFT, el rendimiento es menor y solo
se obtienen resultados aceptables ante rotaciones de 90o, 180o y 270o. Esto puede ser
debido a la diferencia del cálculo de la orientación de los puntos detectados con ambos
algoritmos. Lo mismo puede aplicarse a la escala.
4.2. Optimización del descriptorCon el objetivo de integrar el descriptor en una aplicación de realidad aumentada en
dispositivos Android, se ha llevado a cabo un proceso de optimización del descriptor para
reducir lo máximo posible el tiempo de descripción de una imagen.
Las optimizaciones realizadas son:
Cálculo de los descriptores de los puntos en los márgenes de la imagen por sepa-
rado. Como es necesario reubicar los weak learners para que no se salgan de los
márgenes de la imagen, se calculan por separado estos puntos.
Encabezados precompilados para guardar la información de los descriptores.
Umbrales convertidos de números en coma flotante a números enteros.
Uso de paralelismo en la CPU con la función parallel for de OpenCV.
Comparación de la suma de los valores de gris en vez del valor medio en las cajas.
Optimización del producto de matrices. Tal como se ha visto en la Figura 3, el
cálculo de los descriptores se realiza:
D = H ·B
15
donde D es la matriz N × nDims con los N descriptores, H la matriz N × nWLscon las respuestas de los weak learners y B la matriz nWLs × nDims con los
pesos de los weak learners.
Una forma de optimizar el producto entre matrices es utilizar BT en lugar de B y
multiplicar las matrices por filas para así acceder a posiciones de memoria conti-
guas, de modo que se hace un mejor uso de la memoria caché.
Por último, la matriz H solo contiene dos tipos de valores: 1 y −1, por lo que no
es necesario realizar el producto, sino que basta con comprobar su valor y tomar el
peso en B positivo o negativo y realizar la suma.
Figura 11: Proceso de optimización llevado a cabo para el cálculo de los descriptores a
partir de las respuestas de los weak learners y sus pesos.
4.3. Aplicación de Realidad AumentadaPara poner en manifiesto la eficacia del descriptor, se ha integrado en una aplicación
de realidad aumentada en Android que utiliza la cámara del dispositivo para procesar
imágenes y buscar un patrón sobre el que proyectar un objeto 3D.
Para detectar el patrón, se detectan los puntos característicos de la imagen con ORB
y se calculan sus descriptores con BELID. El siguiente paso es comparar los descriptores
de la imagen con los del patrón usando el matcher FLANN.
Si se encuentra el patrón en la imagen, se calcula una homografía que describe la
transformación que proyecta los puntos del patrón en la imagen y se utiliza para proyectar
un objeto virtual y mostrarlo por pantalla.
Una de las limitaciones es el uso de descriptores en coma flotante por parte del des-
criptor, que hace que el cálculo de correspondencias sea más lento que con el empleo de
16
descriptores binarios.
Figura 12: Captura del funcionamiento de la aplicación en la que un cubo es proyectado
sobre el patrón captado por la cámara.
17
5. EXPERIMENTOS Y RESULTADOSCon el objetivo de poner en manifiesto la eficiencia de los algoritmos basados en
Machine Learning, en especial el algoritmo que se optimizará en este Trabajo Fin de
Grado, se ha desarrollado una comparativa entre varios descriptores, basada en el trabajo
de Mikolajczyk [23].
En esta comparativa se evalúan las gráficas 1-Precision - Recall y los tiempos de
ejecución de los descriptores sobre la base de datos de Mikolajczyk. Existen 8 conjuntos
de imágenes con distintas transformaciones (boat, bark, graf, wall, bikes, trees, ubc y
leuven). Para cada conjunto, se compara la primera imagen con todas las demás imágenes
del conjunto. En la Figura 13 se muestran ejemplos de las imágenes empleadas.
(a) Boat (b) Bark
(c) Graf (d) Wall
(e) Bikes (f) Trees
(g) UBC (h) Leuven
Figura 13: Ejemplos de imágenes del dataset. (a) y (b): transformación de rotación +
zoom. (c) y (d): cambio de perspectiva. (e) y (f): desenfoque. (g): compresión JPEG. (h):
cambio de iluminación.
En cada conjunto hay 6 imágenes, por lo que, en total, se realizan 40 correspondencias
entre imágenes. Para cada par, se calculan los puntos de interés con SURF. Luego, con
cada algoritmo descriptor a evaluar, se calculan los descriptores de los puntos detectados
18
y se hace la correspondencia entre ellos, de modo que cada punto detectado en la imagen
de referencia se empareja con aquel que esté a menor distancia de la segunda imagen, en
base a la distancia L2 para los descriptores en coma flotante y a la distancia de Hamming
para los descriptores binarios.
Por último, se comprueban cuáles de estas correspondencias son válidas proyectando
los puntos de la imagen de referencia sobre la segunda con una homografía y comparando
el área de la intersección con el área de la unión de los puntos. Si el área de la intersec-
ción es igual o superior a la mitad del área de la unión se considera una correspondencia
correcta.
En la Figura 14 se puede observar un ejemplo de correspondencias válidas obtenidas
con este método sobre los descriptores de SURF.
Figura 14: Ejemplo de correspondencias entre puntos característicos de dos imágenes
obtenidas con SURF.
En base al número de correspondencias correctas e incorrectas, se obtiene la gráfica
1-precision - Recall. El Recall es el número de correspondencias correctas con respecto
al número total de correspondencias:
Recall =n◦ de corresp. correctas
n◦ total de corresp.
1-precision representa el número de correspondencias erróneas respecto a la suma entre
el número de correspondencias correctas e incorrectas.
1− precision =n◦ de corresp. incorrectas
n◦ de corresp. correctas + n◦ de corresp. incorrectas
5.1. Gráficas Precision-RecallEl resultado de esta comparativa se muestra en las Figuras 15 y 16. Se han comparado
los descriptores clásicos SIFT y SURF; los descriptores basados en Machine Learning e
implementados en OpenCV LBGM y BGM; la versión U-512 de BELID; y el descriptor
binario ORB. Un mayor área bajo la curva indica un mejor rendimiento del descriptor.
19
(a) Boat (b) Bark
(c) Graf (d) Wall
(e) Bikes (f) Trees
(g) Ubc (h) Leuven
Figura 15: Resultados obtenidos para cada conjunto de imágenes en el dataset.
20
Figura 16: Resultado de la comparativa entre varios descriptores usando toda la base de
datos.
5.2. Tiempos de ejecuciónTambién se han medido los tiempos de ejecución de los descriptores. El Cuadro 1
muestra los resultados obtenidos. En cada frame, cada algoritmo descriptor calcula los
descriptores de la imagen de referencia y otra imagen del mismo conjunto, y finalmente
se calculan los tiempos medios de todos los frames.
Descriptor Tiempo de ejecución (ms)SIFT 49.1948
SURF 9.45102
OpenCV LBGM 38.5759
OpenCV BGM 36.154
BELID-U-512 0.94258
ORB 0.6512721
Cuadro 1: Tiempo medio de ejecución (en milisegundos) del proceso de descripción de 2
imágenes para varios descriptores.
21
6. CONCLUSIONESDe la Figura 15 se pueden obtener las siguientes conclusiones:
BELID presenta más o menos el mismo rendimiento que SIFT ante transformacio-
nes de rotación y zoom. El rendimiento de ORB en estos casos es bastante peor que
el de los demás descriptores.
Si bien las imágenes de graf y wall presentan transformaciones de cambio de pers-
pectiva, resulta evidente que el problema de descripción de puntos característicos
en graf es más complicado, debido a la alta variación en las intensidades de los
píxeles. Puede apreciarse que el rendimiento de todos los descriptores es menor en
este caso.
BELID es especialmente eficaz en las pruebas de desenfoque, compresión JPEG y
cambios de iluminación.
En la Figura 16 se muestra un promedio del rendimiento de todos los descriptores
sobre toda la base de datos. BELID iguala a SIFT en cuanto a rendimiento, y supera a
ORB. Además, como se ha mostrado en el Cuadro 1, lo hace con un tiempo de ejecución
muy similar al de ORB y varios órdenes de magnitud inferior a SIFT.
El descriptor de características de imágenes ha logrado buenos resultados tanto de
rendimiento como de tiempos de ejecución, siendo comparable a SIFT en cuanto a calidad
de los descriptores generados y a ORB en cuanto a velocidad.
Los resultados obtenidos muestran que es mejor utilizar este descriptor con puntos ca-
racterísticos obtenidos con detectores de esquinas o con SURF. Su rendimiento es menor
al usar puntos SIFT.
El descriptor presenta un buen rendimiento en aplicaciones en tiempo real en disposi-
tivos con capacidad computacional limitada, resultando lo más costoso el cálculo de las
correspondencias debido al uso de descriptores en coma flotante.
22
7. LÍNEAS FUTURASAlgunas de las mejoras que se pueden realizar sobre el descriptor son las siguientes:
Binarizar los descriptores generados: el cálculo de la distancia de Hamming en
el proceso de matching es más rápido y eficiente que el de la distancia L2 entre
descriptores. Una forma de mejorar los tiempos de ejecución en una aplicación
en tiempo real es usar descriptores binarios, por lo que puede resultar interesante
experimentar con diferentes algoritmos de binarización [24].
Usar BinBoost para generar descriptores binarios: otra alternativa al empleo de
algoritmos de binarización es generar directamente descriptores binarios mediante
BinBoost en lugar de AdaBoost.
Emplear LDA para optimizar los pesos de AdaBoost: el Análisis Discriminante
Lineal (LDA) puede tomar como variables los cuadrados de las diferencias entre
h(x) y h(y), donde h es la respuesta del weak learner y x e y dos patches de
la base de datos. Al usar como pesos la proyección lineal calculada con LDA en
AdaBoost se puede incrementar el rendimiento sin añadir un coste computacional
relevante.
Uso de la Transparent API de OpenCV para el cálculo de la imagen integral:el tiempo del cálculo de la imagen integral puede reducirse al ejecutarse en la GPU
en vez de la CPU.
23
8. REFERENCIAS[1] E. Rosten, R. Porter y T. Drummond, «Faster and better: A machine learning ap-
proach to corner detection», IEEE transactions on pattern analysis and machineintelligence, vol. 32, n.o 1, págs. 105-119, 2008.
[2] D. G. Lowe, «Distinctive Image Features from Scale-Invariant Keypoints», Int.J. Comput. Vision, vol. 60, n.o 2, págs. 91-110, nov. de 2004, ISSN: 0920-5691.
DOI: 10.1023/B:VISI.0000029664.99615.94. dirección: https://doi.org/10.1023/B:VISI.0000029664.99615.94.
[3] I. Suárez, E. Muñoz, J. M. Buenaposada y L. Baumela, «FSG: A statistical ap-
proach to line detection via fast segments grouping», en 2018 IEEE/RSJ Internatio-nal Conference on Intelligent Robots and Systems (IROS), oct. de 2018, págs. 97-102.
DOI: 10.1109/IROS.2018.8594434.
[4] C. Harris y M. Stephens, «A combined corner and edge detector», en In Proc. ofFourth Alvey Vision Conference, 1988, págs. 147-151.
[5] J. Shi y C. Tomasi, «Good Features to Track», Ithaca, NY, USA, inf. téc., 1993.
[6] E. Rosten y T. Drummond, «Machine Learning for High-speed Corner Detection»,
en Proceedings of the 9th European Conference on Computer Vision - Volume PartI, ép. ECCV’06, Graz, Austria: Springer-Verlag, 2006, págs. 430-443, ISBN: 3-
540-33832-2, 978-3-540-33832-1. DOI: 10.1007/11744023_34. dirección:
http://dx.doi.org/10.1007/11744023_34.
[7] R. O. Duda y P. E. Hart, «Use of the Hough Transformation to Detect Lines and
Curves in Pictures», Commun. ACM, vol. 15, n.o 1, págs. 11-15, ene. de 1972,
ISSN: 0001-0782. DOI: 10.1145/361237.361242. dirección: http://doi.acm.org/10.1145/361237.361242.
[8] R. G. Von Gioi, J. Jakubowicz, J.-M. Morel y G. Randall, «LSD: A fast line seg-
ment detector with a false detection control», IEEE transactions on pattern analy-sis and machine intelligence, vol. 32, n.o 4, págs. 722-732, 2010.
[9] C. Akinlar y C. Topal, «Edlines: Real-time line segment detection by Edge Drawing
(ed).», en ICIP, B. Macq y P. Schelkens, eds., IEEE, 2011, págs. 2837-2840, ISBN:
978-1-4577-1304-0. dirección: http://dblp.uni-trier.de/db/conf/icip/icip2011.html#AkinlarT11.
[10] H. Bay, A. Ess, T. Tuytelaars y L. Van Gool, «Speeded-Up Robust Features (SURF)»,
Comput. Vis. Image Underst., vol. 110, n.o 3, págs. 346-359, jun. de 2008, ISSN:
1077-3142. DOI: 10.1016/j.cviu.2007.09.014. dirección: http://dx.doi.org/10.1016/j.cviu.2007.09.014.
[11] S. Leutenegger, M. Chli y R. Y. Siegwart, «BRISK: Binary Robust Invariant Scala-
ble Keypoints», en Proceedings of the 2011 International Conference on Compu-ter Vision, ép. ICCV ’11, Washington, DC, USA: IEEE Computer Society, 2011,
págs. 2548-2555, ISBN: 978-1-4577-1101-5. DOI: 10.1109/ICCV.2011.6126542. dirección: http://dx.doi.org/10.1109/ICCV.2011.6126542.
24
[12] E. Rublee, V. Rabaud, K. Konolige y G. Bradski, «ORB: An Efficient Alternative
to SIFT or SURF», en Proceedings of the 2011 International Conference on Com-puter Vision, ép. ICCV ’11, Washington, DC, USA: IEEE Computer Society, 2011,
págs. 2564-2571, ISBN: 978-1-4577-1101-5. DOI: 10.1109/ICCV.2011.6126544. dirección: http://dx.doi.org/10.1109/ICCV.2011.6126544.
[13] M. Calonder, V. Lepetit, C. Strecha y P. Fua, «BRIEF: Binary Robust Independent
Elementary Features», en Proceedings of the 11th European Conference on Com-puter Vision: Part IV, ép. ECCV’10, Heraklion, Crete, Greece: Springer-Verlag,
2010, págs. 778-792, ISBN: 3-642-15560-X, 978-3-642-15560-4. dirección: http://dl.acm.org/citation.cfm?id=1888089.1888148.
[14] K. Simonyan, A. Vedaldi y A. Zisserman, «Learning local feature descriptors using
convex optimisation», IEEE Transactions on Pattern Analysis and Machine Intelli-gence, vol. 36, n.o 8, págs. 1573-1585, 2014.
[15] E. Tola, V. Lepetit y P. Fua, «A fast local descriptor for dense matching», en
2008 IEEE conference on computer vision and pattern recognition, IEEE, 2008,
págs. 1-8.
[16] T. Trzcinski, M. Christoudias, V. Lepetit y P. Fua, «Learning image descriptors
with the boosting-trick», en Advances in neural information processing systems,
2012, págs. 269-277.
[17] ——, «Learning Image Descriptors with the Boosting-Trick», en Advances in Neu-ral Information Processing Systems 25, F. Pereira, C. J. C. Burges, L. Bottou
y K. Q. Weinberger, eds., Curran Associates, Inc., 2012, págs. 269-277. direc-
ción: http://papers.nips.cc/paper/4848-learning-image-descriptors-with-the-boosting-trick.pdf.
[18] T. Trzcinski, M. Christoudias y V. Lepetit, «Learning image descriptors with boos-
ting», IEEE transactions on pattern analysis and machine intelligence, vol. 37,
n.o 3, págs. 597-610, 2015.
[19] X. Han, T. Leung, Y. Jia, R. Sukthankar y A. C. Berg, «MatchNet: Unifying Fea-
ture and Metric Learning for Patch-Based Matching», en The IEEE Conference onComputer Vision and Pattern Recognition (CVPR), jun. de 2015.
[20] Y. Tian, B. Fan y F. Wu, «L2-Net: Deep Learning of Discriminative Patch Des-
criptor in Euclidean Space», en 2017 IEEE Conference on Computer Vision andPattern Recognition (CVPR), jul. de 2017, págs. 6128-6136. DOI: 10.1109/CVPR.2017.649.
[21] I. Suárez, G. Sfeir, J. M. Buenaposada y L. Baumela, «BELID: Boosted Efficient
Local Image Descriptor», en IbPRIA 2019: 9th Iberian Conference on Pattern Re-cognition and Image Analysis, 2019, págs. 1-12.
25
[22] M. Muja y D. G. Lowe, «Fast Approximate Nearest Neighbors with Automatic
Algorithm Configuration.», en VISAPP (1), A. Ranchordas y H. Araújo, eds., INS-
TICC Press, 2009, págs. 331-340, ISBN: 978-989-8111-69-2. dirección: http://dblp.uni-trier.de/db/conf/visapp/visapp2009-1.html#MujaL09.
[23] K. Mikolajczyk y C. Schmid, «A performance evaluation of local descriptors»,
Pattern Analysis and Machine Intelligence, IEEE Transactions on, vol. 27, n.o 10,
págs. 1615 -1630, oct. de 2005, ISSN: 0162-8828. DOI: 10.1109/TPAMI.2005.188. dirección: http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=1498756&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D1498756.
[24] J. Wang, W. Liu, S. Kumar y S.-F. Chang, «Learning to Hash for Indexing Big
Data - A Survey.», CoRR, vol. abs/1509.05472, 2015. dirección: http://dblp.uni-trier.de/db/journals/corr/corr1509.html#WangLKC15.
26
A. GUÍA SOBRE LA TRANSPARENT API DE OPENCV
27
OpenCV Transparent API performanceevaluation
A detailed report on the usage of hardwareacceleration in computer vision
Alejandro Cobo, Iago Suarez, Luis Baumela
Technical University of Madrid
June 3, 2019
Contents1 Introduction 2
1.1 Using the Transparent API . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Example code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Performance comparison 52.1 Chaining several consecutive operations . . . . . . . . . . . . . . . . . . 6
3 Supported functions 6
4 Good practices 74.1 Checking if the data is in GPU or CPU . . . . . . . . . . . . . . . . . . . 7
5 References 9
1
1 IntroductionOpenCV Transparent API (or T-API) is a mechanism to add hardware acceleration to
some OpenCV features, reducing drastically the execution time of some tasks. This was
first introduced in OpenCV 2.4 with the Open CL (OCL) Module.
Since OpenCV 3.0, this module is hidden behind an interface called “Transparent
API”. This makes the function execution path to be selected dynamically at runtime. The
T-API encapsulates the data exchange with OCL devices and makes their usage very
simple.
1.1 Using the Transparent APIIn order to use the T-API you need to have at least one OpenCL compatible device. You
can check whether your computer have it or not by running clinfo on Linux:
sudo apt-get install clinfoclinfo
This should list all the devices you can use with OpenCL. Then, you must compile
OpenCV to work with OpenCL. You can run the following commands to compile and
install OpenCV:
# Dependenciessudo apt-get install build-essentialsudo apt-get install cmake git libgtk2.0-dev \pkg-config libavcodec-dev libavformat-dev libswscale-dev# Clone OpenCV repository:git clone https://github.com/opencv/opencv# If you want to use extra modules:git clone https://github.com/opencv/opencv_contrib# Create the build directory and the install folder:cd opencvmkdir build && cd buildmkdir install# Compile OpenCV:cmake \-D CMAKE_BUILD_TYPE=RELEASE \-D OPENCV_ENABLE_NONFREE=ON \-D WITH_OPENCL=YES \-D CMAKE_INSTALL_PREFIX=./install \-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \..
makesudo make install
2
1.2 Example codeHere’s an example of how minimal are the changes that have to be done to the code to
use hardware acceleration. First, we write a simple program that reads an image, detects
and computes its keypoints with SURF and displays the execution time in seconds. I
recommend using a large image, like this one.
Python:
import cv2, time
start = time.time()img = cv2.imread("example.jpg", cv2.IMREAD_GRAYSCALE)
surf = cv2.xfeatures2d.SURF_create()kps = surf.detect(img)kps, desc = surf.compute(img, kps)
print(time.time() - start)
C++:
#include <iostream>
#include <opencv2/xfeatures2d.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui.hpp>
int main(int argc, char** argv){
double start = cv::getTickCount();cv::Mat img = cv::imread("../../example.jpg",
cv::IMREAD_GRAYSCALE);↪→
cv::Ptr<cv::Feature2D> surf =cv::xfeatures2d::SURF::create();↪→
std::vector<cv::KeyPoint> kps;surf->detect(img, kps);cv::Mat desc;surf->compute(img, kps, desc);
std::cout << ((double)cv::getTickCount() -start)/cv::getTickFrequency() << std::endl;↪→
}
3
To make this code run on the GPU, we only have to convert the image from Mat to
UMat. Here’s the resulting code:
Python:
import cv2, time
start = time.time()img = cv2.UMat(cv2.imread("example.jpg",
cv2.IMREAD_GRAYSCALE))↪→
surf = cv2.xfeatures2d.SURF_create()kps = surf.detect(img)kps, desc = surf.compute(img, kps)
print(time.time() - start)
C++:
#include <iostream>
#include <opencv2/xfeatures2d.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui.hpp>
int main(int argc, char** argv){
double start = cv::getTickCount();cv::UMat img;cv::imread("../../example.jpg",
cv::IMREAD_GRAYSCALE).copyTo(img);↪→
cv::Ptr<cv::Feature2D> surf =cv::xfeatures2d::SURF::create();↪→
std::vector<cv::KeyPoint> kps;surf->detect(img, kps);cv::Mat desc;surf->compute(img, kps, desc);
std::cout << ((double)cv::getTickCount() -start)/cv::getTickFrequency() << std::endl;↪→
}
4
This minor change has made the code run 10 times faster. Also, if we execute this
code in a computer without any OpenCL compatible device, we won’t get any error and
it will automatically run on the CPU.
It should be considered, however, that moving the image to the GPU takes some time,
and using the T-API only makes sense if we are doing some expensive operations on it.
The aim of this guide is to provide some good practices in the use of the T-API on
common computer vision tasks.
2 Performance comparisonIn order to measure the performance boost we can get using hardware acceleration, we
are going to compare SURF and ORB execution times both in the CPU and the GPU. To
do so, we will use the image dataset used in [1] and run both descriptors on all images.
In each iteration, we will read an image, copy it to the GPU, and perform the following
operations on both copies:
• Convert them to gray scale.
• Detect and compute their keypoints with SURF.
• Detect and compute their keypoints with ORB.
Note that we are using OpenCV default constructors for the descriptors, so SURF will
detect as many keypoints as possible whereas ORB will only detect 500.
The computer this test was executed on has the following hardware specifications:
• CPU: 8 x Intel Xeon E5620 @ 2.40GHz.
• GPU: NVIDIA Quadro K4200.
Table 1 shows the results we have obtained. We can see that the most expensive op-
erations (SURF detection and description) are also the ones with the biggest performance
boost. There are 48 images in total, and the average size is 889 x 646 pixels.
Process CPU GPUUpload process to the GPU - 0.353099
Color conversion 0.134374 0.14149
SURF Detection 43.4989 8.93069
SURF Description 111.656 5.49074
ORB Detection 9.599 10.6355
ORB Description 5.13525 5.90021
Total 170.023524 31.451729
Table 1: Average execution time (in milliseconds) of several operations performed over
an image.
5
There are a couple of tasks that run faster on the CPU. First, if we measure the execu-
tion time of the color conversion with a big image, like the one we used in Section 1, then
it is reduced from 31.4118 ms on the CPU to 4.1735 ms on the GPU. However, unless we
are working with very big images, the execution time of the color conversion alone will
generally be worse if we use the GPU. Second, the reason why ORB is executing faster
on the CPU is because we are only using 500 keypoints, but if we use 10000, then the
detection time is reduced from 15.363 ms to 12.77 ms and the description time is reduced
from 14.3557 ms to 7.35523 ms. ORB implementation in OpenCV makes it difficult to
truly take advantage of GPU capabilities.
2.1 Chaining several consecutive operationsThis time we are going to compare the execution time of some operations chained together
and executed first on the CPU and then on the GPU. These are the operations we are going
to test:
• Gray scale conversion.
• ORB detection.
• ORB description.
• Brute Force Matching.
Using the same dataset as before, the average execution times for each image are:
• 14.7477 ms using the CPU.
• 19.0385 ms using the GPU.
GPU is a bit slower using 500 keypoints. Again, by using 5000 keypoints the results
change:
• 122.025 ms using the CPU.
• 20.7836 ms using the GPU.
3 Supported functionsThe list of available functions in the T-API is continually growing and you can check
which one is implemented by taking a look at OpenCV’s Github page. Here are some of
them:
• features2d module: AKAZE, Brute Force Match, FAST, ORB.
• xfeatures2d module: SURF.
• imgproc module: canny, cvtColor, filter2D, GaussianBlur, integral, Laplacian, me-
dianBlur, moments, warpAffine, warpPerspective.
• video module:BackgroundSubtractorKNN, BackgroundSubtractorMOG2.
6
4 Good practicesUnless you are working with very small images and a very reduced number of keypoints,
is it always recommended to use UMat instead of Mat when reading an image.
When using fast descriptors, like ORB, beware of the number of keypoints that are
being computed. If this number is too small, it should be considered to execute it on the
CPU and check if it runs faster.
In C++, there are two ways to convert a Mat to UMat:
cv::Mat imgCPU = cv::imread("example.jpg");cv::Umat imgGPU = imgCPU.getUMat(cv::ACCESS_READ);
cv::Mat imgCPU = cv::imread("example.jpg");cv::UMat imgGPU;imgCPU.copyTo(imgGPU);
By doing some tests, we have found that using getUMat doesn’t allocate the object in
the GPU, while using copyTo does. For example, if you read an image with getUMatand convert it to gray scale, the execution times are:
• getUMat: 8.50085 ms.
• Color conversion: 22.7733 ms.
Using copyTo:
• copyTo: 30.8753 ms.
• Color conversion: 3.81341.
Using getUMat makes the object to wait for an operation to allocate the image in the
GPU.
4.1 Checking if the data is in GPU or CPUUnfortunately, there aren’t any flags in the UMat class that can tell us if it has been
uploaded to the GPU.
The UMat object is allocated in the GPU when the function copyTo is called. OpenCV
checks if OpenCL is available and uses an special allocator, called OpenCLAllocatorwhich allocates the data in the GPU. Here’s an UML diagram that shows some methods
and implementations of the MatAllocator class.
7
Figure 1: UML diagram of the MatAllocator class.
8
5 References[1] K. Mikolajczyk and C. Schmid, “A performance evaluation of local descriptors”,
Pattern Analysis and Machine Intelligence, IEEE Transactions on, vol. 27, no. 10,
pp. 1615 –1630, Oct. 2005, ISSN: 0162-8828. DOI: 10.1109/TPAMI.2005.188. [Online]. Available: http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=1498756&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D1498756.
9
Este documento esta firmado porFirmante CN=tfgm.fi.upm.es, OU=CCFI, O=Facultad de Informatica - UPM,
C=ES
Fecha/Hora Mon Jun 03 22:11:07 CEST 2019
Emisor delCertificado
[email protected], CN=CA Facultad deInformatica, O=Facultad de Informatica - UPM, C=ES
Numero de Serie 630
Metodo urn:adobe.com:Adobe.PPKLite:adbe.pkcs7.sha1 (AdobeSignature)