Reconocimiento de patrones en tiempo real mediante transformada de Wavelet y computación paralela

Este proyecto trata sobre la detección de rostros en tiempo real, usando un ordenador, y de manera autónoma. Utilizamos una base de datos con muchas imágenes de cada individuo a reconocerse. La 1ra fase es utilizar un un detector de piel basado en la compresión de imágenes mediante transformada de wavelet-Daubechies, para obtener sus bajas frecuencias de intensidad de color de piel, para así evaluarlas con un RN( red neuronal) perceptrón y poder detectar la piel humana, y así obtenr nuestra región de interés para analizar. Finalmente se usa una RN tipo Konohen para relacionar los datos de entrada con nuestra base de datos.

Para implementar la transformada de wavelet-Daubechies en tiempo real se utiliza un paradigma de programación paralela (GPGPU General Purpose Graphic Processing Unit).
Este trabajo se presentó en el INTERCON 2010. Los autores son: Pablo Crovetto, Daniel Palomino, Santiago Cortijo y el asesor fue el Dr. C. Javier Solano S. Pueden ver el artículo en Reconocimiento de patrones faciales en tiempo real mediante transformada de wavelet y computacion paralela.pdf

Análisis de modo de caminar de una persona en tiempo real utilizando un algoritmo de esqueletización

Mediante una imagen (video) en tiempo real se detecta una persona de perfil y, usando un ordenador, el objetivo es afirmar autónomamente si está caminando, corriendo o cojeando. Se usan los procedimientos de «Foreground detection», eliminiación de ruido, y esqueletiación.

Este trabajo se presentó en el INTERCON 2010. Los autores son: Pablo Crovetto, Daniel Palomino, Santiago Cortijo y el asesor fue el Dr. C. Javier Solano S.
Pueden ver el artículo en Gait_Analysis_2da_fase.pdf

CUDA : Compute Unified Device Architecture

En el año 2006 NVIDIA presenta la tecnología CUDA en su última generación de tarjetas gráficas,la serie 8. Utiliza una filosofía integradora con un lenguaje de programación genérico como es C++ y la arquitectura paralela de una GPU, desvinculándose además del pipeline gráfico.

Trabajar con CUDA resulta asequible, en primer lugar porque es barato, de hecho las tarjetas gráficas NVIDIA están muy extendidas en los ordenadores personales de los aficionados a los vídeo-juegos. En segundo lugar porque su curva de aprendizaje es reducida para aquellos programadores cercanos a lenguajes tipo C o C++.

La arquitectura que presenta CUDA es un conjunto de multiprocesadores MIMD (Múltiple Instructions stream, Multiple Data stream). Cada multiprocesador posee un conjunto de procesadores SIMD (Single Instruction, Multiple Data). Existen numerosos modelos de memoria conviviendo en esta arquitectura: cada procesador SIMD posee una serie de registros a modo de memoria local (sólo accesible para ese procesador), a su vez cada multiprocesador posee una memoria compartida (accesible por todos los procesadores SIMD de un multiprocesador) y finalmente la memoria global sería aquella accesible por todos los multiprocesadores y, por ende, por todos y cada uno de los procesadores SIMD.

Ejemplo de flujo de procesamiento CUDA

  1. Se copian los datos de la memoria principal a la memoria de la GPU
  2. La CPU encarga el proceso a la GPU
  3. La GPU lo ejecuta en paralelo en cada núcleo
  4. Se copia el resultado de la memoria de la GPU a la memoria principal

El modelo de computación vincula el término de procesador SIMD con un hilo y cada multiprocesador con un bloque. Normalmente para llevar a cabo una implementación en CUDA se parte de una estrategia de solución en CPU. Habrá ocasiones en que la solución CPU sea fácilmente extensible a CUDA, sin embargo en otras se deberá estudiar su viabilidad.

Las estructuras de datos en CPU deben adaptarse a otras más simples tipo  matriz o vector, para hacerlas compatibles con las de GPU. Posteriormente se sigue el esquema genérico del flujo de procesamiento, donde se declaran las estructuras de datos en GPU y se habilita memoria para ellas. El siguiente paso consiste en traspasar los datos desde CPU a GPU, para posteriormente repartir estos datos de entrada entre los diferentes hilos (procesadores) y bloques (multiprocesadores). Todos los procesadores SIMD ejecutan el mismo trozo de código pero  con diferentes datos. Una vez terminado el proceso, los resultados se devuelven a CPU.

Precisamente, los algoritmos más adecuados para ser ejecutados en cuda son aquellos fácilmente paralelizables, es decir, que ejecutan siempre la misma secuencia de código para todos los datos de entrada. Las ventajas en tiempo con respecto a CPU son mayores cuando:

  • El algoritmo tiene un orden de ejecución cuadrático o superior : el tiempo necesario para realizar el traspaso de CPU a GPU tiene un gran coste que no suele verse compensado por el bajo  coste computacional de un método lineal.
  • Es mayor la carga de cálculo computacional en cada hilo: de nuevo para compensar el tiempo de traspaso de información conviene que cada hilo tenga cierta carga computacional.
  • Es menor la dependencia entre los datos para realizar los cálculos: esta situación se da cuando cada procesador SIMD sólo necesita de datos albergados en memoria local o compartida y no necesita acceder a memoria global, de acceso más lento.
  • Es menor el trasiego de información entre CPU y GPU, siendo óptimo cuando este proceso sólo se realiza una vez, al comienzo y al final del proceso: lo que significa que los datos de entrada al sistema siempre son los mismos y que el proceso no se retroalimenta con la CPU en estados intermedios.
  • No existen secciones críticas, es decir, varios procesos no necesitan escribir en las mismas posiciones de memoria: mientras la lectura de memoria global y compartida puede ser simultánea,la escritura en la misma posición de memoria plantea un mecanismo de acceso bloqueo y espera que siempre ralentiza el proceso global. Este mecanismo está disponible en CUDA mediante las operaciones atómicas (a partir de CUDA 1.1)

El dominio de las aplicaciones 3D en tiempo real posee varias caracteristicas que lo diferencia de los campos computacionales mas generales . Las aplicaciones 3D necesitan de gran poder computacional. La construccion de un hardware que utilize el paralelismo intrinseco de la aplicación permite un alto desempeño en las aplicaciones graficas .

Luego de la instalación , la cual esta documenta en varios sitios . Se pueden probar los ejemplos que bienen con el sdk.

La GeForce 8800 de la serie G8 tiene 16 GPU chips (Streaming Multiprocessors – SMs). Cada SM tiene 8  nucleos que actualmente funcionan a 1.35 GHz. Un nucleo tiene una presicion de punto flotante de 32 bits pero tambien puede trabajar con enteros (La serie G9 ya soporta operaciones de 64 bits).

Cada SM tambien tiene dos unidades de funciones especiales (SFU) que son compartidas por los ocho nucleos.
El ancho de banda en la memoria global es de 86.4 GB/s (El ancho de banda entre la cpu y la ram esta entre 5 GB/s y 1′ GB7s).

Un kernel se ejecuta como una malla (grid) de bloques de hilos, ademas todos los hilos comparten la memoria de datos .

Un bloque de hilos es un lote de hilos que pueden cooperar entre ellos :

  • Sincronizandose
  • Compartiendo datos mediante una memoria compartida de muy baja lantencia

Datos de otras tarjetas que soportan cuda :

GeForce Serie 9

Nvidia Quadro

Nvidia Tesla

Nvidia Fermi