Академический Документы
Профессиональный Документы
Культура Документы
(2)
Ecuacin 1 Cuadrado de la Imagen Integral
Clculo de la integral de la imagen CPU y GPU [5]
En el CPU:
Solucin: Ecuacin para el clculo integral de la imagen de
forma secuencial (ver ecuacin 3).
(3)
F(x,y) : es el valor del pixel en esa posicin (ver figura 6a).
En la GPU:
Problema: Dependencia de datos (ver Error! No se
encuentra el origen de la referencia.
Solucin: El clculo de la integral es separable como se
muestra en la Ecuacin 4.
(4)
Ecuacin 4 Imagen Integral paralelizable
a) b)
Figura 6. Proceso de la integral de la imagen. a) en CPU. b) en GPU.
La implementacin del clculo 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 clculo de la integral de la imagen:
Figura 7. Clculo de la integral de la imagen por los ejes (x, y).
Clculo de las caractersticas
A continuacin se describen diferentes variantes para
paralelizar el clculo de caractersticas del algoritmo de
deteccin de objetos de Viola-Jones (ver Figura 8) [6]:
Figura 8. Formas de paralelizar el clculo de caractersticas.
1. Clculo en paralelo de funciones: En este enfoque
cada hilo calcula todas las caractersticas simultneamente
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
comparacin de las caractersticas de etapas superiores
innecesariamente.
2. Paralelizar factor de escala: Este enfoque permite
trabajar en las ventanas de diferentes tamaos al mismo
tiempo. Sin embargo, la escasez de los pxeles de los
factores de escala mayor es sustancial en comparacin con
los factores de escala ms pequea, resultando menos
ventanas de factores de escala ms grande. Este enfoque
asigna mucho ms trabajo a los factores de escala menor
que a los factores de escala ms grande, resultando un
desequilibrio en la distribucin 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 clculo pero an no resuelve el
problema de equilibrio de carga. En concreto una ventana
que no contiene un rostro fallar rpidamente, mientras que
las ventanas que encuentren un rostro realizan muchos ms
clculos. El funcionamiento de este mtodo 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
optimizacin (ya que se descompone la imagen) y en tercer
lugar, por proporcionar posibilidades de hacer mtodos
hbridos en combinacin 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 despus 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.
Conversin de la imagen de RGB a YUV
El algoritmo de Viola-Jones recibe como parmetro de
entrada una imagen en formato YUV por lo que la imagen
debe ser preprocesada ya que en la actualidad las imgenes en
su mayora son en formato RGB. La conversin de los
formatos puede ser paralelizada y es un punto de fuego a tener
en cuenta para el algoritmo. La conversin de una imagen
RGB a YUV se hace mediante la Ecuacin 5, donde igray(x,y)
es la posicin 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)
Ecuacin 5 Conversin de RGB a YUV
La Ecuacin 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. Pseudocdigo del algoritmo en CUDA
A continuacin se describe el algoritmo de deteccin de
rostros implementado en CUDA C. Para su implementacin se
utiliz la librera de OpenCV para cargar las imgenes, videos
(on-line, off-line) y la cascada para la deteccin de objetos. El
algoritmo propuesto se estructura en varias capas de
implementacin, la primera contiene las funciones de
deteccin 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 construccin del grid para un kernel (CUDACV.cu). La
tercera capa es la interfaz de prueba, en este caso la funcin
main ().
Algoritmo 1 FaceDetectionGPU
Entrada: imagen a escala de grises, cascada, escalado,
tamao minimo
Salida: lista de rectngulos 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 clculo de
la integral de la imagen de las filas (ver Algoritmo 2)
Lanzar kernel integralCol () para el clculo de
la integral de la imagen de las columnas(Ver
Algoritmo 3)
Lanzar kernel para el clculo de caractersticas
RunHaarCascClassifierGPU () (ver Algoritmo 4)
Copiar la lista de rectagulos para la memoria del
host
retornar la lista de rectngulos
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, tamao mnimo de la ventana, lista de rectngulos
Salida: Lista de rectngulos
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
Clcular las carcteristicas del rectngulo 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 rectngulo en la
lista.
C. Pseudocdigo del algoritmo en OpenCL
1. Inicializar entorno;
existen = Comprobar si existen dispositivos
OpenCL en el sistema;
si existen entonces dispositivo= Hallar dispositivo
compatible con imgenes;
sino fin de programa
crear contexto para dispositivo (ClooContextcontext
= ClooContext.FromDevice (device); A partir de la
informacin 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 ejecucin de el o
los kernel (s).)
2. Abrir fichero de video y consultar el primer frame;
3. Crear buffers en el GPU, dado el tamao 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 enva a la memoria de
video.)
Definir el tamao mnimo y mximo 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 creacin 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 enva 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 simultnea. Si la imagen es de
640X480, el nmero de instancias del kernel ser de
307200.En una iteracin 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 distribucin del kernel de intercambio de canales.
III. Convertir la imagen a escala de grises; (El kernel de
conversin lee 3 valores del modo antes mencionado,
aplica la Ecuacin 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
simultnea, as, la imagen es procesada en una iteracin.
(ver Figura 14)
Figura 14. Muestra la distribucin del kernel de conversin de formato.
IV. Realizar deteccin Facial
(faceDetector.ProcessFrame(imageTemp))
1. Calcular la imagen integral y la integral al
cuadrado; (Mltiples instancias del kernel programado
con el clculo de la imagen integral se ejecutan
simultneamente, para as, procesar la imagen en una
iteracin (ver Figura 15)
Figura 15. Ejemplo visual de cmo los kernels procesan la imagen.
2. Iniciar el proceso de extraccin de
caractersticas; (En esta fase, mltiples 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
caractersticas de Haar de esa rea. El kernel toma el
resultado del segundo y lo compara con la cascada. El
kernel devuelve su posicin en la imagen en caso de
que ah se encuentre un rostro. Al mismo tiempo el
resto de los kernels estn siendo ejecutados a travs de
toda la imagen (ver Figura 16). En la primera iteracin
la imagen es procesada en su totalidad y, el tamao
inicial del rea que ocupara el kernel, es definido como
tamao mnimo 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
ubicacin en la imagen de esta ventana, depender del
paso que se defina. El nmero de iteraciones que habr
para procesar la imagen en su totalidad, depende
directamente del tamao de la imagen, la escala y el
paso que se haya definido.)
Figura 16. Detecin de rostro.
V. Leer resultados de la deteccin; (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 expondrn los experimentos realizados con las variantes
propuestas del algoritmo de deteccin de objetos de Viola-
Jones. Las pruebas fueron realizadas con un mismo conjunto
de imgenes en ambos casos. Se implement un pequeo
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 tambin fue
realizada con el mismo conjunto de imgenes que se us para
el GPU. Se utilizarn distintos modelos de GPU y CPU para
exponer sus potencialidades de procesamiento y estos se
enumeran a continuacin:
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 2
da
Generacin ( 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 ejecucin
eficiente del algoritmo de deteccin de objetos en CPU es de
512MB, una cantidad mayor de memoria no aadir ningn
efecto en el rendimiento del mismo. En estos experimentos el
GPU NVIDIA 9800 GT slo ser usado en los pruebas con
OpenCL pues dicho GPU por ser de una revisin inferior a la
1,2 no permite el acceso simultneo a memoria con
implementaciones en CUDA.
A. Prueba 1
Este experimento consiste medir el rendimiento del
algoritmo de deteccin de rostros utilizando imgenes con un
tamao 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 deteccin del algoritmo en cada uno
de los dispositivos es considerable para el caso de imgenes
640X480. Con imgenes de tamao medio, el tiempo de
30
deteccin del algoritmo en CPU aumenta de manera creciente
a partir de 40 rostros. Esto se debe a que el proceso de
deteccin es de forma serializada y se invierte mucho ms
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 implementacin 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 deteccin poco
variable a medida que la cantidad de rostros aumenta. El
comportamiento general del algoritmo en OpenCL vara la
tasa de tiempo de deteccin en una escala muy pequea. Todo
esto se debe a que en imgenes de tamao medio como sta, la
implementacin 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 deteccin de rostros utilizando imgenes con un
tamao 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 tamao de la imagen el tiempo de
deteccin del algoritmo ejecutado en los CPUs y con CUDA
en la tarjeta 260 GTX, crece en mayor orden con respecto al
tiempo de deteccin de los algoritmos que utilizan
OpenCL(con todas las tarjetas) y CUDA con la tarjeta 240
GT. A pesar de que todas las imgenes usadas en la prueba
contienen la misma cantidad de rostros respectivamente, el
tiempo de deteccin del algoritmo en CPU no crece a una
razn 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, adems del tiempo
empleado para calcular las caractersticas de cada sub-ventana
ms su respectivo tiempo de comparacin en la cascada.
Con respeto al tiempo de deteccin del algoritmo en CUDA
con la tarjeta 260 GTX, se puede apreciar con claridad cmo
el desbalance de la carga computacional hace que este se
comporte de manera no ptima. Estos resultados indican que
slo el tamao de la imagen ya es un problema en cuestiones
de rendimiento, adems 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
T
i
e
m
p
o
e
n
s
e
g
u
n
d
o
s
(
s
)
Deteccin de rostros en una
imagen de 640 x 480 pxeles
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
T
i
e
m
p
o
e
n
s
e
g
u
n
d
o
s
(
s
)
Deteccin de rostros en una
imagen de 640 x 480 pxeles
9800 GT 240 GT 260 GTX
Q8300 i7 920
31
Figura 19. Deteccin de 40 rostros en 3 imgenes de distinto tamao con
CUDA.
Figura 20. Deteccin de 40 rostros en 3 imgenes de distinto tamao con
OpenCL.
Figura 21. Deteccin de 160 rostros en 2 imgenes de distinto tamao con
CUDA.
Figura 22. Deteccin de 160 rostros en 2 imgenes de distinto tamao con
OpenCL.
C. Anlisis de costo beneficio
En este anlisis tanto CPU como GPU sern considerados
slo 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 deteccin en cada uno
de los dispositivos con respecto al rendimiento del primer
dispositivo listado y en esta columna #x indica cuantas veces
fueron ms rpidos. 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
T
i
e
m
p
o
e
n
s
e
g
u
n
d
o
s
(
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
T
i
e
m
p
o
e
n
s
e
g
u
n
d
o
s
(
s
)
Deteccin 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
T
i
e
m
p
o
e
n
s
e
g
u
n
d
o
s
(
s
)
Deteccin 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
T
e
i
m
p
o
e
n
s
e
g
u
n
d
o
s
(
s
)
Deteccin 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 grfico es apreciable el
rendimiento del algoritmo de deteccin de objetos en los
distintos dispositivos. En el segundo grfico se muestra el
precio de cada una de los dispositivos y el tercer grfico
muestra la relacin del costo por unidad de rendimiento, es
decir, hipotticamente se muestra cuanto valdra el
rendimiento del primer dispositivo (Q8300, 1X) en
comparacin 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 artculo se analizaron los diferentes mtodos,
tcnicas y bibliotecas actuales para la programacin paralela,
en este anlisis se seleccionaron a CUDA de NVIDIA y a
OpenCL de Khronos como tecnologas de GPGPU.
Se realiz un anlisis del algoritmo del framework para
deteccin de objetos de Viola-Jones. Despus del estudio del
algoritmo mencionado se logr determinar cules eran los
segmentos de mayor carga computacional (Integral de la
imagen y clculo de caractersticas) 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 conversin del formato de imagen RGB al formato
YUV tambin es paralelizable.
Sobre la base del estudio de las tecnologas seleccionadas y
las tcnicas de paralelizacin fue posible el diseo e
implementacin los segmentos de mayor carga computacional
paralelizables del algoritmo de deteccin de rostros, para su
ejecucin en GPU. Durante la implementacin de los
algoritmos se determin que el uso de OpenCL es mucho ms
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 realizacin 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 ms del 80
% de sus recursos.
Se realiz un anlisis de costo beneficio a los dispositivos
utilizados en las pruebas y los resultados permitieron
determinar que el beneficio de utilizar estos GPUs, como
solucin a las tareas de clculo complejo, es mayor e incluso
menos costoso que el uso del CPU de ltima generacin
probado.
En los resultados de este trabajo se determin que es posible
disminuir el tiempo de respuesta del algoritmo de deteccin de
rostros en los sistemas de video-vigilancia inteligente, sin
necesidad de recurrir a soluciones hardware econmicamente
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 investigacin.
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.