151-490-1-PB.pdf
-
Upload
elsyherrerasant -
Category
Documents
-
view
13 -
download
2
Transcript of 151-490-1-PB.pdf
23
Algoritmo de Viola-Jones para detección de rostros
en procesadores gráficos
Tonathiuh Díaz Miranda y José Luis Viloria Rodríguez Dirigido por: Raisa Socorro Llanes y Osmany Ferrer Borges
Resumen. En este artículo se presenta la aplicación de las
tecnologías para uso de Propósito General de la Unidad de
Procesamiento de Gráficos (GPGPU, por sus siglas en inglés)
para dar respuesta a la demanda de procesamiento durante la
etapa de detección de rostros para el análisis de video. Para este
fin en el trabajo se propone el uso de la GPU como una
alternativa de gran capacidad a un costo económicamente bajo.
Como lenguajes de programación se utilizaron Open Computing
Language (OpenCL) y Compute Unified Device Architecture
(CUDA). Se implementó con CUDA C el algoritmo “Detección de
Objetos Viola-Jones” y se utilizó el marco de trabajo
OpenCloovision para OpenCL. Las pruebas realizadas arrojaron
que ejecutando el algoritmo paralelizado de detección de rostros
en el GPU se acelera el proceso de detección, en comparación a
cuando esto se hace utilizando el algoritmo secuencial de
detección en el CPU. Palabras clave: CUDA, Detección de rostros, GPGPU, OpenCL,
Viola-Jones.
I. INTRODUCCIÓN
El creciente uso de sistemas de video-vigilancia genera un
aumento del gasto en recursos materiales y humanos por parte
de la institución donde se emplee. Esta situación ha propiciado
la necesidad de optimizar el empleo de estos recursos
mediante el desarrollo de aplicaciones y herramientas
informáticas, para posibilitar el análisis inteligente de los
videos. Hoy en día la video-vigilancia inteligente tienes dos
modos de operar: el modo on-line y modo off-line. El análisis
de video requiere la aplicación de algoritmos de
reconocimiento de patrones como es el caso de la
identificación y detección de rostros, detección de objetos
abandonados, identificación de chapas, entre otros. Estos
algoritmos son excesivamente consumidores de tiempo por lo
que las respuestas del análisis son tardías. En este artículo se
expondrá cómo el uso de las tecnologías GPGPU son una
alternativa viable para acelerar el proceso de detección de
rostros.
II. MATERIALES Y MÉTODOS
Algunos de los elementos más importantes en este trabajo
que se deben tener en cuenta son: el reconocimiento de
patrones, el procesamiento de imágenes y la programación
paralela con las tecnologías de CUDA y OpenCL. En las
secciones siguientes se detallarán los aspectos necesarios para
comprensión de esta investigación.
A. Algoritmo de Viola-Jones [1]
Los ingenieros Paul Viola de Mitsubishi Electric Research
Labs y Michael Jones de Compaq CRL durante el desarrollo
de un algoritmo de detección de rostros en una imagen con un
costo computacional muy bajo, publicaron el día 13 de julio de
2001 un framework que constaba de dos partes principales: un
algoritmo de detección de objetos que emplea la clasificación
en cascada y un entrenador de clasificadores basado en
AdaBoost.
El algoritmo alcanza altas tasas de detección y, a diferencia
de otros algoritmos que utilizan información auxiliar, como:
el color del pixel o diferencias en la secuencia de video,
procesa solamente la información presente en una imagen en
escala de grises (formato YUV).
El algoritmo para la detección no utiliza directamente la
imagen sino una representación de la misma llamada imagen
integral. La obtención de esta representación se logra con tan
solo unas pocas operaciones por pixel. Hecho esto, buscar
características en subregiones de la nueva imagen se
transforma en una tarea de tiempo constante, sin importar la
escala de la subregión ni posición de la misma.
Para determinar si en una imagen se encuentra un rostro o
no, el algoritmo divide la imagen integral en subregiones de
tamaño variable y utiliza una serie de clasificadores (etapas),
cada uno con un conjunto de características visuales. Este tipo
de clasificación es denominada clasificación en cascada.
En cada etapa se determina si la subregión es un rostro o no.
Si la subregión es aceptada como rostro entonces es evaluada
por la siguiente etapa (más rigurosa) y si no es discriminada.
La clasificación en cascada garantiza la discriminación rápida
de subregiones que no sean un rostro. Esto significa un ahorro
considerable de tiempo, pues no se procesarán
innecesariamente subregiones de la imagen que con certeza no
contengan un rostro y solamente se invertirá tiempo en
aquellas que posiblemente sí contengan (ver Figura 1 ). Al
culminar solo llega la imagen que aprueba todas las etapas.
Este método, según [1], tiene una tasa de verdaderos-positivos
de 99,9%, mientras que tiene una tasa de falsos-positivos de
33,3%.
24
Figura 1. Proceso de detección de rostro en una imagen.
B. OpenCL
OpenCL (Open Computing Language) es un estándar de
código abierto para fines generales de programación en
paralelo a través de las CPUs, GPUs y otros procesadores. Le
proporciona a los desarrolladores de software acceso eficiente
a todos los dispositivos compatibles con OpenCL de los que
disponga la computadora. El código puede ser ejecutado tanto
en CPU como en GPU e incluso en ambos. Fue inicialmente
desarrollado por Apple. Inc y cedido bajo licencia al grupo
Khronos [2].
OpenCL es un lenguaje y un framework. En su desarrollo
han participado muchas empresas y es compatible con un gran
número de dispositivos, además de ser totalmente compatible
con OpenGL entre otros (ver Figura 2).
Figura 2. Integración de OpenCL con tecnologías orientadas al gráfico por
computadora.
El lenguaje está basado en C++ pero con algunas variantes
en su filosofía, por ejemplo: no permite la recursividad,
arreglos de longitud variable en tiempo de ejecución,
demonios, etc. También incorpora características orientadas al
paralelismo como, grupos de trabajo, elementos de trabajo,
colas de ejecución asincrónicas y sincronización entre
procesos.
C. CUDA
Compute Unified Device Architecture (CUDA) nombre que
hace referencia tanto a un lenguaje como a una arquitectura
creada por NVIDIA, que permite a los programadores usar las
tarjetas gráficas de NVIDIA para propósitos generales.
CUDA C, como parte del conjunto de herramientas de
CUDA es un lenguaje al estilo de C++ pero totalmente
orientado al paralelismo. Este lenguaje se aprovecha de la
arquitectura CUDA del GPU para explotar al máximo los
recursos de la tarjeta gráfica.
La filosofía de trabajo con CUDA C es muy similar a
OpenCL, incluso ambos lenguajes son muy parecidos desde
el punto de vista de la sintaxis. De manera similar a OpenCL,
CUDA es compatible con OpenGL y DirectCompute. (ver
Figura 3).
Figura 3. Integración de CUDA con tecnologías orientadas al gráfico por
computadora.
D. OpenClooVision
OpenCloovision es un framework de visión por
computadora basado en OpenCL y C#. Incorpora una interfaz
llamada “Cloo” como interfaz de OpenCL, la cual es una
librería de .NET desarrollada por el proyecto mono. El
framework soporta el conocido framework de Viola-Jones
para la detección de objetos. El mismo es de código abierto y
libre de cualquier tipo de restricción o cargo monetario, según
indica la licencia que tiene del MIT. Fue desarrollado por una
comunidad de internet que tiene lugar en un espacio llamado
CodePLex. Este sitio alberga varias comunidades, fue creado
por Microsoft para el desarrollo del software libre.
Actualmente OpenCloovision se encuentra en pleno
desarrollo y en fase alpha. La versión v0.4.2 es la más reciente
y contiene las siguientes características:
Tratamiento de imágenes de tipo byte y flotante.
Funciones para hacer box blur en GPU.
Función para escalado de grises en GPU.
Funciones para Histograma en GPU.
25
Funciones para hacer la Imagen Integral e imagen
integral al cuadrado en GPU.
Funciones para el SobelFilter.
Algoritmo Viola-Jones para la detección de
objetos en GPU.
E. El CPU vs GPU
Tradicionalmente los GPU estaban diseñados como
unidades de procesamiento de gráficos pero muchas
comunidades científicas han demostrado el uso extensivo de
los GPU en otros campos de investigación, como la
simulación física, bioinformática y la Minera de Datos.
¿Por qué usar un GPU para realizar los cálculos generales?
El CPU está diseñado con niveles de memoria caché (L1, L2
y L3) de gran tamaño para reducir la latencia hacia la memoria
de acceso aleatorio (RAM) del sistema. La memoria caché
ocupa una gran porción del diseño del CPU, espacio que
podría utilizarse para unidades de procesamiento adicionales
de la aritmética. El GPU adopta un enfoque muy diferente,
casi la totalidad de su diseño está constituido por una
arquitectura de ejecución multi-hilo (multi-procesador), con
ello logra hacer despreciable el valor de la latencia hacia la
memoria de video. Con un número suficiente de hilos
multiplexados en cada una de las unidades de procesamiento
del GPU, la latencia es realmente despreciable y el dispositivo
logra un gran rendimiento sin la necesidad de una memoria
caché.
La capacidad de procesamiento de un GPU es mucho mayor
que la de un CPU. Una computadora personal (PC), con un
CPU Intel Core i7 de una frecuencia de reloj de 2,67 GHz,
puede teóricamente ejecutar alrededor de 8,039 GFlop/s
(millones de operaciones de punto flotante por segundo); sin
embargo un GPU NVIDIA GTX 260 ejecuta cerca de 521,40
GFlop/s. En cuanto al ancho de banda entre la memoria y el
procesador (GPU o CPU) se refiere, que en la GPU pueden
alcanzarse tasas de 113,7 GB/seg mientras que en el CPU solo
se alcanzan tasas de hasta 25,6 GB/s.
El balance de carga es una característica fundamental que
hay que tener en cuenta. En aplicaciones comunes, la carga
(los cálculos que realiza algún algoritmo) es dirigida
totalmente al CPU y se ignora por completo la existencia del
GPU. Esto tiene como consecuencia una utilización
permanente del CPU, pues el tiempo de procesador que el
administrador de procesos del Sistema Operativo (SO) le
asigna a una aplicación, depende de la cantidad de operaciones
atómicas que la aplicación requiera. En una aplicación que
requiera de mucho procesamiento esto se traduciría en una
ralentización general de todo el SO.
En aplicaciones que aprovechen el GPU es posible que
ciertos segmentos del código de una aplicación, donde el nivel
de procesamiento aritmético sea muy grande, queden
totalmente a cargo del GPU; esto liberaría al CPU de cargas
innecesarias, incrementaría el rendimiento de la aplicación y
permitiría que el CPU se encargue de otras tareas.
Las desventajas del GPU consisten en que no se puede
implementar cualquier tipo de algoritmo en él y tampoco
puede ser visto como una plataforma de elección para la
implementación de algoritmos debido a su obligatoria
implementación en paralelo. Además, el soporte de
herramientas de programación para la GPU tales como:
depuradores de código y lenguajes de programación son muy
escasos a comparación los que existen para la CPU.
La principal razón que justifica la gran popularidad de las
arquitecturas GPU en aplicaciones científicas es el hecho de
que el GPU está especializada para cómputo intensivo,
computación paralela elevada (exactamente sobre lo que trata
el renderizado de gráficos) y por tanto se designan más
unidades de lógica aritmética (ALU) para el procesamiento de
datos, que para la recolección de datos y control de flujo (ver
Figura 4).
Figura 4. Estructura general del CPU y GPU.
III. IMPLEMENTACIÓN DE LAS PROPUESTAS
A. Detección de puntos de fuego
La detección de puntos de fuego se le aplica a los segmentos
del algoritmo o a las funciones que pueden ser paralelizadas y
que sean puntos de carga del algoritmo en cuestión.
Integral de la Imagen
El primer concepto introducido por Viola y Jones [3] fue la
integral de la imagen o las tablas de sumatoria de área (SAT).
La integral de la imagen en el punto contiene la suma de
los pixeles por encima y hacia la izquierda (ver ¡Error! No se
encuentra el origen de la referencia.).
La imagen integral de los rectángulos es una representación
de la imagen que permite calcular la covariancia en una
ventana (región de la imagen) muy rápidamente a partir de
cuatro referencias solamente. El cálculo de la suma de la
integral del rectángulo de interés definido [4] se hace como lo
muestra la Figura 5 y ¡Error! No se encuentra el origen de
la referencia..
Figura 5. Evaluación de características usando la integral de la imagen.
26
(1)
Ecuación 1. Integral de un rectángulo.
Una variante de la integral es almacenar el cuadrado de la
suma para el uso del cálculo de la desviación estándar
Ecuación 1 [4].
(2)
Ecuación 1 Cuadrado de la Imagen Integral
Cálculo de la integral de la imagen CPU y GPU [5]
En el CPU:
Solución: Ecuación para el cálculo integral de la imagen de
forma secuencial (ver ecuación 3).
(3)
F(x,y) : es el valor del pixel en esa posición (ver figura 6a).
En la GPU:
Problema: Dependencia de datos (ver ¡Error! No se
encuentra el origen de la referencia.
Solución: El cálculo de la integral es separable como se
muestra en la Ecuación 4.
(4)
Ecuación 4 Imagen Integral paralelizable
a) b)
Figura 6. Proceso de la integral de la imagen. a) en CPU. b) en GPU.
La implementación del cálculo de la integral de la imagen
en la GPU consta de dos partes, la integral por las filas (x) y
luego las columnas (y).
En la Figura 7 se muestra como se ejecuta el proceso
paralelizado del cálculo de la integral de la imagen:
Figura 7. Cálculo de la integral de la imagen por los ejes (x, y).
Cálculo de las características
A continuación se describen diferentes variantes para
paralelizar el cálculo de características del algoritmo de
detección de objetos de Viola-Jones (ver Figura 8) [6]:
Figura 8. Formas de paralelizar el cálculo de características.
1. Cálculo en paralelo de funciones: En este enfoque
cada hilo calcula todas las características simultáneamente
de todas las etapas de la cascada para una ventana en
particular. Este enfoque obliga a los hilos que se ejecutan en
una ventana, que posiblemente hubiese sido discriminada en
alguna etapa temprana de la cascada, a realizar la
comparación de las características de etapas superiores
innecesariamente.
2. Paralelizar factor de escala: Este enfoque permite
trabajar en las ventanas de diferentes tamaños al mismo
tiempo. Sin embargo, la escasez de los píxeles de los
factores de escala mayor es sustancial en comparación con
los factores de escala más pequeña, resultando menos
ventanas de factores de escala más grande. Este enfoque
asigna mucho más trabajo a los factores de escala menor
que a los factores de escala más grande, resultando un
desequilibrio en la distribución del trabajo, conocido como
desbalance de carga de trabajo.
3. Paralelizar ventanas: Ejecutar el algoritmo en varias
ventanas de la imagen al mismo tiempo. Este enfoque
divide el espacio de cálculo pero aún no resuelve el
problema de equilibrio de carga. En concreto una ventana
que no contiene un rostro fallará rápidamente, mientras que
las ventanas que encuentren un rostro realizan muchos más
cálculos. El funcionamiento de este método se caracteriza,
en primer lugar, por permitir a los hilos individuales
trabajar en ventanas únicas, en segundo lugar, por lograr la
1) 2) 3)
27
optimización (ya que se descompone la imagen) y en tercer
lugar, por proporcionar posibilidades de hacer métodos
híbridos en combinación con uno de los otros enfoques.
El 45% de los rostros falsos son eliminados en la primera
etapa, los restantes posibles rostros pasan a las siguientes
etapas (ver Figura 9) [5].
Figura 9. Resultado del macheo de la imagen contra la cascada en su
primera etapa.
Los puntos blancos representan en la imagen rostros
potenciales después de la primera etapa [5]. Ejemplo de la
salida de otras etapas (ver Figura 10).
Figura 10. Resultado del macheo de la imagen contra la cascada en
diferentes etapas.
Conversión de la imagen de RGB a YUV
El algoritmo de Viola-Jones recibe como parámetro de
entrada una imagen en formato YUV por lo que la imagen
debe ser preprocesada ya que en la actualidad las imágenes en
su mayoría son en formato RGB. La conversión de los
formatos puede ser paralelizada y es un punto de fuego a tener
en cuenta para el algoritmo. La conversión de una imagen
RGB a YUV se hace mediante la Ecuación 5, donde igray(x,y)
es la posición del pixel en la imagen destino, iR(x,y) es el
canal rojo , iG(x,y) es el canal verde y iB(x,y) es el canal azul
del pixel de la imagen a color.
(5)
Ecuación 5 Conversión de RGB a YUV
La Ecuación se puede ejecutar en paralelo para cada uno de
los pixeles de la imagen original debido a que no hay
dependencia de datos entre ellos.
B. Pseudocódigo del algoritmo en CUDA
A continuación se describe el algoritmo de detección de
rostros implementado en CUDA C. Para su implementación se
utilizó la librería de OpenCV para cargar las imágenes, videos
(on-line, off-line) y la cascada para la detección de objetos. El
algoritmo propuesto se estructura en varias capas de
implementación, la primera contiene las funciones de
detección en CUDA C (FaceGPU.cu) que se ejecutan en la
GPU (son las funciones llamadas kernel). La segunda contiene
las funciones que se ejecutan en el CPU, siendo las encargadas
de la construcción del grid para un kernel (CUDACV.cu). La
tercera capa es la interfaz de prueba, en este caso la función
main ().
Algoritmo 1 FaceDetectionGPU
Entrada: imagen a escala de grises, cascada, escalado,
tamaño minimo
Salida: lista de rectángulos detectados
Pasos:
si existen dispositivos CUDA en el sistema
entonces
Cargar la cascada en memoria de video.
Crear el grid y el bloque para los kernels.
Lanzar kernel integralRow(…) para el cálculo de
la integral de la imagen de las filas (ver Algoritmo 2)
Lanzar kernel integralCol (…) para el cálculo de
la integral de la imagen de las columnas(Ver
Algoritmo 3)
Lanzar kernel para el cálculo de características
RunHaarCascClassifierGPU (…) (ver Algoritmo 4)
Copiar la lista de rectagulos para la memoria del
host
retornar la lista de rectángulos
Algoritmo 2 integralRow
Entrada: imagen, imagen integral, imagen integral 2,
ancho y largo
Salida: Imagen integral de las filas
Pasos:
Determinar las coordenadas de la fila donde se va a
comenzar
hacer desde i=0 hasta el ancho de la imagen
Guardar el acumulado de cada pixel en la variable
imagen_integral de salida (ver Figura 11).
Guardar el cuadrado del acumulado de cada pixel en la
variable imagen_integral 2 de salida.
Etapa 3 Etapa 7
Etapa 20 Resultado
Etapa 1 Etapa 1
28
Figura 11. Integral de la imagen por las filas
Algoritmo 3 integralCol
Entrada: imagen, imagen integral, imagen integral 2,
ancho y largo
Salida: Imagen integral
Pasos:
Determinar las coordenadas de la columna donde se
va a comenzar
hacer desde i = 1 hasta el largo de la imagen
Guardar el acumulado de cada pixel en la variable
imagen_integral de salida (ver Figura 12).
Guardar el cuadrado del acumulado de cada pixel en la
variable imagen_integral 2 de salida.
Figura 12. Integral de la imagen por las columnas.
Algoritmo 4 RunHaarCascClassifierGPU
Entrada: cascada, imagen integral, imagen integral 2,
largo, ancho, paso a lo ancho, paso a lo largo, factor de
escala, tamaño mínimo de la ventana, lista de rectángulos
Salida: Lista de rectángulos
Pasos:
rostro = es un rostro (true)
Determinar las coordenadas de la columna donde se
va a comenzar
hacer desde i= 0 hasta el largo de la cascada
Cálcular las carácteristicas del rectángulo y el
umbral.
si umbral < umbral de la etapa entonces
rostro = No es un rostro (falso)
salir
sino pasar a la siguiente etapa
si rostro entonces guardar el rectángulo en la
lista.
C. Pseudocódigo del algoritmo en OpenCL
1. Inicializar entorno;
existen = Comprobar si existen dispositivos
OpenCL en el sistema;
si existen entonces dispositivo= Hallar dispositivo
compatible con imágenes;
sino fin de programa
crear contexto para dispositivo (ClooContextcontext
= ClooContext.FromDevice (device); A partir de la
información proporcionada por el dispositivo, se
crea el contexto que le corresponde.)
crear la queue (cola) de comandos para contexto;
(ClooCommandQueuequeue =
context.CreateCommandQueue(); La cola de
comandos es un objeto que controla el orden de la
copia/lectura de objetos de memoria al/desde el
dispositivo, así como el orden de ejecución de el o
los kernel (s).)
2. Abrir fichero de video y consultar el primer frame;
3. Crear buffers en el GPU, dado el tamaño del frame;
4. Inicializar el detector
faceDetector =
ClooHaarObjectDetector.CreateFaceDetector(cont
ext, queue, frame.Width, frame.Height);(En este
paso se carga la cascada y se envía a la memoria de
video.)
Definir el tamaño mínimo y máximo de la ventana
de barrido (faceDetector.MaxSize = new Size(300,
300);faceDetector. MinSize = new Size(24, 24);)
5. Iniciar recorrido para el video
I. Enviar frame a la memoria del GPU;(En el paso 3,
durante la creación de buffers se obtienen objetos de tipo
Buffer. Estos objetos contienen funciones para escribir a,
o leer de, la memoria de video.)
II. Ejecutar el Kernel para invertir los canales Rojo y
Azul; (La imagen que se envía a la memoria está
ordenada en la forma BGR, es necesario que esté
ordenada de forma RGB. Un kernel lee 3 valores (B, G, y
R) del buffer de la imagen de entrada (original) y escribe
3 valores (R, B y G) en un buffer temporal. Para procesar
la imagen completa, el kernel es instanciado miles de
veces de manera simultánea. Si la imagen es de
640X480, el número de instancias del kernel será de
307200.En una iteración se procesa la imagen completa.
(ver Figura 13)
Inicializar buffer para imagen de color; (modelo
RGB)
Inicializar buffer para imagen en escala de grises;
(modelo YUV)
Inicializar buffer para imagen temporal
29
Figura 13. Muestra la distribución del kernel de intercambio de canales.
III. Convertir la imagen a escala de grises; (El kernel de
conversión lee 3 valores del modo antes mencionado,
aplica la Ecuación y escribe el resultado en un buffer
temporal. De la misma forma que en el paso anterior, el
kernel es instanciado 307200 veces de manera
simultánea, así, la imagen es procesada en una iteración.
(ver Figura 14)
Figura 14. Muestra la distribución del kernel de conversión de formato.
IV. Realizar detección Facial
(faceDetector.ProcessFrame(imageTemp))
1. Calcular la imagen integral y la integral al
cuadrado; (Múltiples instancias del kernel programado
con el cálculo de la imagen integral se ejecutan
simultáneamente, para así, procesar la imagen en una
iteración (ver Figura 15)
Figura 15. Ejemplo visual de cómo los kernels procesan la imagen.
2. Iniciar el proceso de extracción de
características; (En esta fase, múltiples instancias del
Kernel son lanzadas, abarcando en la imagen un área de
forma rectangular. Dentro de esta área, el kernel
emplea funciones que de forma paralelizada extraen las
características de Haar de esa área. El kernel toma el
resultado del segundo y lo compara con la cascada. El
kernel devuelve su posición en la imagen en caso de
que ahí se encuentre un rostro. Al mismo tiempo el
resto de los kernels están siendo ejecutados a través de
toda la imagen (ver Figura 16). En la primera iteración
la imagen es procesada en su totalidad y, el tamaño
inicial del área que ocupara el kernel, es definido como
“tamaño mínimo de la ventana”, en el resto de las
iteraciones esa área crecerá proporcional a una escala
definida. El kernel es la ventana de barrido, la
ubicación en la imagen de esta ventana, dependerá del
paso que se defina. El número de iteraciones que habrá
para procesar la imagen en su totalidad, depende
directamente del tamaño de la imagen, la escala y el
paso que se haya definido.)
Figura 16. Deteción de rostro.
V. Leer resultados de la detección; (Como resultado se
obtiene un arreglo de posiciones, el cual está en memoria
de video.)
VI. Procesar los resultados (Por ejemplo, mostrarlos
inmediatamente.)
VII. si video entonces consultar siguiente frame
6. si video entonces repetir recorrido
7. Fin de programa
IV. RESULTADOS Y DISCUSIONES
Se expondrán los experimentos realizados con las variantes
propuestas del algoritmo de detección de objetos de Viola-
Jones. Las pruebas fueron realizadas con un mismo conjunto
de imágenes en ambos casos. Se implementó un pequeño
programa con la variante de OpenCV del algoritmo de Viola-
Jones con el fin de poder hacer una comparativa entre el
rendimiento del GPU vs CPU, dicha comparativa también fue
realizada con el mismo conjunto de imágenes que se usó para
el GPU. Se utilizarán distintos modelos de GPU y CPU para
exponer sus potencialidades de procesamiento y estos se
enumeran a continuación:
1. Intel Core i7 920 (8MB de cache, 2,66 GHz, 6GB RAM).
2. Intel Core 2 Quad 8300 (4MB de cache,2.5GHz, 2GB
RAM )
3. NVIDIA 260 GTX 2da Generación ( 576 MHz, 896MB
RAM)
4. NVIDIA 240 GT ( 550 MHz, 512MB RAM)
5. NVIDIA 9800 GT ( 600 MHz, 512MB RAM)
La memoria RAM que se requiere para la ejecución
eficiente del algoritmo de detección de objetos en CPU es de
512MB, una cantidad mayor de memoria no añadirá ningún
efecto en el rendimiento del mismo. En estos experimentos el
GPU NVIDIA 9800 GT sólo será usado en los pruebas con
OpenCL pues dicho GPU por ser de una revisión inferior a la
1,2 no permite el acceso simultáneo a memoria con
implementaciones en CUDA.
A. Prueba 1
Este experimento consiste medir el rendimiento del
algoritmo de detección de rostros utilizando imágenes con un
tamaño fijo variando la cantidad de rostros a detectar.
Se puede observar en la Figura 17 y
Figura 18 que medida que aumenta la cantidad de rostros la
variabilidad de tiempo de detección del algoritmo en cada uno
de los dispositivos es considerable para el caso de imágenes
640X480. Con imágenes de tamaño medio, el tiempo de
30
detección del algoritmo en CPU aumenta de manera creciente
a partir de 40 rostros. Esto se debe a que el proceso de
detección es de forma serializada y se invierte mucho más
tiempo en comparar con la cascada cada uno de los posibles
rostros detectados. El algoritmo en CUDA con la tarjeta 260
GTX se comporta de manera inestable debido a que el balance
de carga no fue contemplado en la implementación del mismo.
El comportamiento de la propuesta del algoritmo en CUDA
con la tarjeta 240GT es similar al comportamiento del
algoritmo en los CPUs, con la diferencia de que en CUDA se
mantiene una tasa de crecimiento de tiempo de detección poco
variable a medida que la cantidad de rostros aumenta. El
comportamiento general del algoritmo en OpenCL varía la
tasa de tiempo de detección en una escala muy pequeña. Todo
esto se debe a que en imágenes de tamaño medio como ésta, la
implementación paralelizada del algoritmo tiene mayor
rendimiento que de forma serializada.
Figura 17. Algoritmo en CUDA en distintos dispositivos con una imagen
de 640 x 480.
Figura 18. Algoritmo en OpenCL en distintos dispositivos con una imagen
de 640 x 480.
B. Prueba 2
Este experimento consiste en medir el rendimiento del
algoritmo de detección de rostros utilizando imágenes con un
tamaño variable manteniendo fija la cantidad de rostros a
detectar.
En las figuras 19, 20, 21 y 22 se puede apreciar como a
medida que aumenta el tamaño de la imagen el tiempo de
detección del algoritmo ejecutado en los CPUs y con CUDA
en la tarjeta 260 GTX, crece en mayor orden con respecto al
tiempo de detección de los algoritmos que utilizan
OpenCL(con todas las tarjetas) y CUDA con la tarjeta 240
GT. A pesar de que todas las imágenes usadas en la prueba
contienen la misma cantidad de rostros respectivamente, el
tiempo de detección del algoritmo en CPU no crece a una
razón estable. Esto se debe a que el algoritmo de Viola-Jones
en CPU barre la imagen entera a diferentes escalas, varias
veces, hasta que la escala mayor sea la propia imagen, esto se
traduce en decenas de miles de iteraciones, además del tiempo
empleado para calcular las características de cada sub-ventana
más su respectivo tiempo de comparación en la cascada.
Con respeto al tiempo de detección del algoritmo en CUDA
con la tarjeta 260 GTX, se puede apreciar con claridad cómo
el desbalance de la carga computacional hace que este se
comporte de manera no óptima. Estos resultados indican que
sólo el tamaño de la imagen ya es un problema en cuestiones
de rendimiento, además indican que en el caso de CUDA el
balance de carga es fundamental para un funcionamiento
correcto del mismo.
0,0
0,5
1,0
1,5
2,0
2,5
3,0
0 10 20 40 80 160
Tie
m p
o e
n s
egu
nd
os
(s)
Detección de rostros en una imagen de 640 x 480 píxeles
240GT 260 GTX Q8300 i7 920
0,0
0,5
1,0
1,5
2,0
2,5
3,0
0 10 20 40 80 160
Tie
mp
o e
n s
egu
nd
os
(s)
Detección de rostros en una imagen de 640 x 480 píxeles
9800 GT 240 GT 260 GTX
Q8300 i7 920
31
Figura 19. Detección de 40 rostros en 3 imágenes de distinto tamaño con
CUDA.
Figura 20. Detección de 40 rostros en 3 imágenes de distinto tamaño con
OpenCL.
Figura 21. Detección de 160 rostros en 2 imágenes de distinto tamaño con
CUDA.
Figura 22. Detección de 160 rostros en 2 imágenes de distinto tamaño con
OpenCL.
C. Análisis de costo beneficio
En este análisis tanto CPU como GPU serán considerados
sólo como un dispositivo de procesamiento sin tipo.
En la primera columna de la tabla 2 se enlistan dispositivos
utilizados en los experimentos y en la segunda columna se
enlistan sus respectivos precios. La tercera columna de la tabla
muestra el rendimiento del algoritmo de detección en cada uno
de los dispositivos con respecto al rendimiento del primer
dispositivo listado y en esta columna #x indica cuantas veces
fueron más rápidos. La cuarta columna de la tabla muestra el
costo por unidad de rendimiento (X).
0,0
0,5
1,0
1,5
2,0
2,5
3,0
3,5
4,0
320X240 640X480 640X1440
Tie
mp
o e
n s
egu
nd
os
(s)
Deteccion de rostros (40)
240 GT 260 GTX Q83002 i7 920
0,0
0,5
1,0
1,5
2,0
2,5
3,0
3,5
4,0
320X240 640X480 640X1440
Tie
mp
o e
n s
egu
nd
os
(s)
Detección de rostros (40)
9800 GT 240 GT 260 GTX Q83002 i7 920
0,0
1,0
2,0
3,0
4,0
5,0
6,0
7,0
8,0
640X480 640X1440
Tie
mp
o e
n s
egu
nd
os
(s)
Detección de rostros (160)
240 GT 260 GTX Q83002 i7 920
0,0
1,0
2,0
3,0
4,0
5,0
6,0
7,0
8,0
640X480 640X1440
Teim
po
en
se
gun
do
s(s)
Detección de rostros (160)
9800 GT 240 GT 260 GTX Q83002 i7 920
32
TABLA I
COSTO POR RENDIMIENTO (X)
Dispositivo Precio
($)
Rendimient
o
Cost
o por
unidad
de x
($)
Intel
Q8300
$
149.99
1x $
149.99
Intel core
i7 920
$
289.99
1.38x $
210.13
GeForce
9800 GT
$
109.99
8.3x $
13.25
GeForce
240 GT
$ 65.99 13.83x $
4.77
GeForce
260 GTX
$
180.99
18.44x $
9.81
En las figuras 23, 24 y 25 muestran de manera visual lo
expuesto en la tabla 1. En el primer gráfico es apreciable el
rendimiento del algoritmo de detección de objetos en los
distintos dispositivos. En el segundo gráfico se muestra el
precio de cada una de los dispositivos y el tercer gráfico
muestra la relación del costo por unidad de rendimiento, es
decir, hipotéticamente se muestra cuanto valdría el
rendimiento del primer dispositivo (Q8300, 1X) en
comparación con el resto de los dispositivos.
Figura 23. Rendimiento del algoritmo en los diferentes dispositivos.
Figura 24. Precio por dispositivo hardware.
Figura 25. Costo dado por el precio/ rendimiento en (x).
V. CONCLUSIONES
En este artículo se analizaron los diferentes métodos,
técnicas y bibliotecas actuales para la programación paralela,
en este análisis se seleccionaron a CUDA de NVIDIA y a
OpenCL de Khronos como tecnologías de GPGPU.
Se realizó un análisis del algoritmo del framework para
detección de objetos de Viola-Jones. Después del estudio del
algoritmo mencionado se logró determinar cuáles eran los
segmentos de mayor carga computacional (Integral de la
imagen y cálculo de características) y se determinó que estos
eran paralelizables. El algoritmo de Viola-Jones emplea una
imagen en escala de grises, por lo tanto para utilizar el
0x
2x
4x
6x
8x
10x
12x
14x
16x
18x
20x
1x 1.38x
8.3x
13.83x
18.44x
Rendimiento
Q8300 i7 920 9800 GT 240 GT 260 GTX
$50
$100
$150
$200
$250
$300
149.99$
289.99$
109.99$
65.99$
180.99$
Precio por dispositivo
Q8300 i7 920 9800 GT 240 GT 260 GTX
$0
$50
$100
$150
$200
$250
Costo por unidad de x
149.99$
210.13$
13.25$ 4.77$ 9.81$
Costo por una unidad de rendimiento (x)
Q8300 i7 920 9800 GT 240 GT 260 GTX
33
algoritmo es necesario preprocesar la imagen y se determinó
que la conversión del formato de imagen RGB al formato
YUV también es paralelizable.
Sobre la base del estudio de las tecnologías seleccionadas y
las técnicas de paralelización fue posible el diseño e
implementación los segmentos de mayor carga computacional
paralelizables del algoritmo de detección de rostros, para su
ejecución en GPU. Durante la implementación de los
algoritmos se determinó que el uso de OpenCL es mucho más
sencillo que el uso de CUDA.
Se diseñó un conjunto de experimentos para probar la
eficiencia de las propuestas paralelizadas del algoritmo en
GPU y la eficiencia del algoritmo implementado en CPU.
Dichos experimentos arrojaron resultados que permitieron
determinar que la eficiencia del algoritmo paralelizado para el
GPU es hasta 18,4 X veces mayor que el algoritmo serializado
para CPU. Durante la realización de las pruebas en GPU se
observó que el CPU no sobrepasaba una carga mayor al 10 %
mientras que las pruebas en el CPU consumieron más del 80
% de sus recursos.
Se realizó un análisis de costo beneficio a los dispositivos
utilizados en las pruebas y los resultados permitieron
determinar que el beneficio de utilizar estos GPUs, como
solución a las tareas de cálculo complejo, es mayor e incluso
menos costoso que el uso del CPU de última generación
probado.
En los resultados de este trabajo se determinó que es posible
disminuir el tiempo de respuesta del algoritmo de detección de
rostros en los sistemas de video-vigilancia inteligente, sin
necesidad de recurrir a soluciones hardware económicamente
muy costosas.
RECONOCIMIENTOS
Se les agradece a los tutores MSc. Raisa Socorro Llanes y
MSc. Osmany Ferrer Borges por su invaluable ayuda y
paciencia durante el desarrollo de esta investigación.
REFERENCIAS
[1] PAUL VIOLA, M. J., Robust Real-time Object Detection. July 13, 2001.
[2] GROUP, K., The OpenCl Specification, A. Munshi, Editor. 2010.
[3] JONES., P.V.M., Rapid Object Detection Using a Boosted Cascade of
Simple Features. 2004.
[4] HARVEY, J.P., GPU Acceleration of Object Classification Algorithms
Using NVIDIA CUDA. A Thesis Submitted in Partial Fulfillment of the
Requirements for the Degree of Master of Science in Computer
Engineering, in Rochester Institute of Technology. 2009: NY.
[5] ANTON OBUKHOV, N. Face Detection with CUDA, in GPU
Technology Conference. 2009: Fairmont Hotel, San Jose.
[6] DANIEL HEFENBROCK, J. O. Nhat Tan Nguyen Thanh, Ryan
Kastner, Scott B. Baden. Accelerating Viola-Jones Face Detection to
FPGA-Level using GPUs.