151-490-1-PB.pdf

11
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%.

Transcript of 151-490-1-PB.pdf

Page 1: 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%.

Page 2: 151-490-1-PB.pdf

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.

Page 3: 151-490-1-PB.pdf

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.

Page 4: 151-490-1-PB.pdf

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)

Page 5: 151-490-1-PB.pdf

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

Page 6: 151-490-1-PB.pdf

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

Page 7: 151-490-1-PB.pdf

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

Page 8: 151-490-1-PB.pdf

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

Page 9: 151-490-1-PB.pdf

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

Page 10: 151-490-1-PB.pdf

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

Page 11: 151-490-1-PB.pdf

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.