# Tecnologías multimedia e interacción/Curso 2015-2016: Caso 5
## Proyecto de Reconocimiento Facial MAV (Me Alegra Verte)
### Objetivo

El objetivo del presente proyecto es desarrollar un Sistema Empotrado Distribuido que actúe de forma interactiva como una Smart cámara de reconocimiento facial. Para ello contará con una cámara web que permitirá identificar rostros y a partir de estas identificaciones accionará el movimiento del robot, simulando una mascota que reconoce a su dueño.

## Fundamentos tecnológicos

Para el desarrollo del proyecto se han utilizado diferentes elementos en hardware y software los cuales describiremos brevemente a continuación.

### Arduino

Arduino es una plataforma de electrónica "open-source" o de código abierto cuyos principios son contar con software y hardware fáciles de usar. Es una forma sencilla de realizar proyectos interactivos.
Los entornos de desarrollo y lenguaje de programación de Arduino y las placas en las que se ejecutan han sido desarrollados de la mano, por lo que proveen compatibilidad y sencillez de desarrollo. Un Arduino está formado por un microcontrolador y un entorno de desarrollo(IDE), diseñado para facilitar el uso de la electrónica en proyectos multidisciplinarios.
El hardware consiste en una placa de circuito impreso con un microcontrolador, usualmente Atmel AVR, y puertos digitales y analógicos de entrada/salida,4 los cuales pueden conectarse a placas de expansión (shields) que expanden las características de funcionamiento de la placa arduino.
Por otro lado, el software consiste en un entorno de desarrollo (IDE) basado en el entorno de Processing y lenguaje de programación basado en Wiring, así como en el cargador de arranque (bootloader) que es ejecutado en la placa. El microcontrolador de la placa se programa a través de un computador, haciendo uso de comunicación serial mediante un convertidor de niveles. Arduino se puede utilizar para desarrollar objetos interactivos autónomos o puede ser conectado a software tal como Adobe Flash, Processing, Max/MSP, Pure Data.
Una tendencia tecnológica es utilizar Arduino como tarjeta de adquisición de datos desarrollando interfaces en software como JAVA, Visual Basic y LabVIEW. Las placas se pueden montar a mano o adquirirse. El entorno de desarrollo integrado libre se puede descargar gratuitamente.
Más información

### Raspberry Pi 3

La Raspberry Pi es un ordenador de tamaño de tarjeta de crédito que se conecta a un monitor de ordenador o un televisor, y utiliza un teclado y un ratón estándar. Se trata de un pequeño dispositivo capaz que permite explorar la computación, y permite aprender a programar en lenguajes como Scratch y Python . Es capaz de hacer todo lo que espera una computadora de escritorio, desde la navegación por Internet y reproducción de vídeo de alta definición, a la toma de hojas de cálculo, procesador de textos, y jugar juegos.
Es un ordenador de placa reducida o placa única de bajo coste desarrollado en Reino Unido por la Fundación Raspberry Pi, con el objetivo de estimular la enseñanza de ciencias de la computación en las escuelas.
El software es open source, siendo su sistema operativo oficial una versión adaptada de Debian, denominada RaspBian, aunque permite otros sistemas operativos, incluido una versión de Windows 10.
Más Información

### Driver Puente H L298N

El módulo puente H L298N es una tarjeta para el control de motores de corriente directa, motores a pasos, solenoides y en general cualquier otra carga inductiva. La tarjeta está construida en torno al circuito integrado L298N, el cual dispone en su interior de 2 puentes H independientes con capacidad de conducir 2 amperios constantes o 4 amperios en picos no repetitivos.
La tarjeta expone las conexiones hacia el motor a través de bloques de terminales, mientras que las entradas de control y habilitación del puente H se exponen a través de headers macho estándar para facilitar todas las conexiones.Esta tarjeta es ideal para controlar motores en pequeños robots.

### Sensor De Ultrasonido (Hc-sr04)

El sensor HC-SR04 es un módulo que incorpora un par de transductores de ultrasonido que se utilizan de manera conjunta para determinar la distancia del sensor con un objeto colocado enfrente de éste.
Su funcionamiento se basa en el envío de un pulso de alta frecuencia, no audible por el ser humano. Este pulso rebota en los objetos cercanos y es reflejado hacia el sensor que dispone de un receptor adecuado para esa frecuencia.

### Algoritmo de Reconocimiento Facial

El sistema de reconocimiento facial es una aplicación dirigida por ordenador que identifica automáticamente a una persona en una imagen digital. Esto es posible mediante un análisis de las características faciales del sujeto extraídas de la imagen o de un fotograma clave de una fuente de video, y comparándolas con una base de datos.

### OpenCV

Open Source Computer Vision es liberado bajo una licencia BSD y por lo tanto está libre tanto para uso académico y comercial. Tiene interfaces de C ++, C, Python y Java y es compatible con Windows, Linux, Mac OS, iOS y Android.
OpenCV fue diseñado para la eficiencia computacional y con un fuerte enfoque en aplicaciones en tiempo real. Escrito en optimizado C / C ++, la biblioteca puede tomar ventaja de procesamiento multi- núcleo. Se activa con OpenCL, se puede aprovechar la aceleración de hardware de la plataforma de computación heterogénea subyacente.
Es una biblioteca libre de visión artificial originalmente desarrollada por Intel. Desde que apareció su primera versión alfa en enero de 1999, se ha utilizado en infinidad de aplicaciones. Desde sistemas de seguridad con detección de movimiento, hasta aplicaciones de control de procesos donde se requiere reconocimiento de objetos. Esto se debe a que su publicación se da bajo licencia BSD, que permite que sea usada libremente para propósitos comerciales y de investigación con las condiciones en ella expresadas.
Contiene más de 500 funciones que abarcan una gran gama de áreas en el proceso de visión, como reconocimiento de objetos (reconocimiento facial), calibración de cámaras, y visión robótica.
El proyecto pretende proporcionar un entorno de desarrollo fácil de utilizar y altamente eficiente. Esto se ha logrado realizando su programación en código C y C++ optimizados, aprovechando además las capacidades que proveen los procesadores multinúcleo. OpenCV puede además utilizar el sistema de primitivas de rendimiento integradas de Intel, un conjunto de rutinas de bajo nivel específicas para procesadores Intel.
Las funcionalidades de esta biblioteca son compatibles con:
* Captura en tiempo real
* Importación de archivos de vídeo
* Tratamiento de la imagen básica
* Detección de objetos
* Reconocimiento de regiones
Más Información

### Haar Cascade

La detección utilizando Haar basados en características de clasificadores en cascada es un método de detección de objetos efectivo propuesto por Pablo Viola y Michael Jones en su artículo, "Detección rápida de Objetos usando una cascada de características Simple" en el año 2001. Se trata de un enfoque basado en el aprendizaje de las máquinas donde una función de cascada es entrenada en una gran cantidad de imágenes positivas y negativas.
Entonces se utiliza para detectar objetos en otras imágenes. Inicialmente, el algoritmo necesita una gran cantidad de imágenes positivas (imágenes de rostros) y las imágenes negativas (imágenes sin caras) para entrenar el clasificador. Entonces tenemos que extraer las características de la misma. Para esto, se utilizan características Haar. Son como el kernel de convolución. Cada característica es un solo valor obtenido restando la suma de los píxeles bajo rectángulo blanco de suma de píxeles bajo rectángulo negro.
Una desventaja es que de todas las características calculadas, la mayoría son irrelevantes. ¿Cómo seleccionamos las mejores características de cada 160000+ características? Esto se logra mediante Adaboost, se aplican todas las funciones en todas las imágenes de entrenamiento, se encuentra el mejor de umbral para clasificar las caras a positivo y negativo.
Para disminuir el error, se seleccionan las características con tasa de error mínimo, lo que significa que son las que mejor clasifican la cara y no cara imágenes, cada imagen se le da un peso igual en el principio.
Después de cada clasificación, los pesos de imágenes mal clasificadas se incrementan. Por otra parte mismo proceso que se hace. Las nuevas tasas de error son calculadas, también los pesos nuevos. El proceso se continúa iterativamente hasta que se alcanza la tasa de precisión o error admitida.
Más Información

## Diseño del sistema

El sistema digital del presente proyecto consta de dos componentes:
* El módulo identificador de usuarios. A través de una cámara conectada a la Raspberry Pi 3 reconocerá al usuario que está frente al dispositivo y le mandará un identificador de rostro detectado al módulo ejecutor.
* El módulo ejecutor del robot. Recibirá el identificador de rostro, y en función de él (si el id es igual 0, es porque detecta a Covadonga entonces se mueve hacia delante, si es igual a 1, es porque detecta a Mariela, entonces gira en sentido horario) la placa Arduino Uno moverá el robot en una dirección hasta que detecte algún objeto a menos de 21 cm, que provocará su detención.

## Implementación

En esta sección se describen los detalles de implementación del sistema. Se hablará con profundidad de las funcionalidades realizadas por cada uno de los componentes.

### Raspberry Pi 3

Para poder realizar la implementación necesaria para el funcionamiento del sistema digital previamente se instala en la Raspberry PI el Sistema Operativo Raspbian (distribución del GNU/Linux basado en Debian Wheezy (Debian 7.0) para la Raspberry Pi).
Posteriormente se instala y configura todas las librerías y aplicaciones necesarias para poder compilar y ejecutar los siguientes programas:
* El programa C++ (facerec_video.cpp) de reconocimiento facial basado en el uso de las librerías OpenCV, que permite detectar el rostro del usuario que se sitúe enfrente de la cámara. Además de reconocer que hay un rostro, el sistema va a identificar cuál de nosotras dos es la que está situada delante de la cámara. Para ello es necesario utilizar una base de datos de nuestros rostros (consiste en un fichero CSV indicando la ruta de cada una de nuestras fotografías y un id que nos identifique).
* El programa C (Arduino_Rasp.ino) que controla la placa Arduino, el sensor de ultrasonidos y los motores que mueven las ruedas.
* El programa en Python (RaspDuino.py) implementado para iniciar el sistema y que sirve como interfaz de comunicación entre la Raspberry, la cámara y Arduino. Si se detecta algún rostro, este programa recoge la información (en un char) y lo envía por puerto serie al Arduino.

### Arduino UNO

Se implementa un programa en el lenguaje C para mover los motores de las ruedas del robot. El robot se moverá hacia delante si identifica el rostro de Covadonga (identificador = 0) y si identifica el de Mariela (identificador = 1) el robot girará en sentido horario.
Además, se activa un sensor de ultrasonido para comprobar si delante del robot hay algún objeto. Si se localiza alguno a una distancia menor o igual a 20 cm, se procede a detener los motores del robot. En el momento que el robot se para, se envía un mensaje a la Raspberry para informarle de que se ha detenido.

### Conexiones

Las conexiones realizadas son las siguientes:

#### Raspberry Pi 3

Las conexiones son las siguientes:
* Con la cámara: a través de cable USB.
* Con la Arduino UNO: cable USB para la comunicación serie entre ambos.
* Con el monitor: cable HDMI.

#### Arduino UNO

Las conexiones son las siguientes:
* Con Raspberry Pi a través de cable USB para la conexión serie entre ambos.

#### Sensor de Ultrasonidos

Vcc al pin de 5V de Arduino. GND al pin de tierra de Arduino. Trig al pin 8 como OUTPUT (indica cuando se envía la señal). Echo al pin 7 como INPUT (indica cuando se ha detectado el retorno del sonido).

#### Driver Puente H L298N

El controlador posee un conector de 6 pines para conectar las señales TTL que controla los motores, una bornera de tres pines para la alimentación, y dos borneras de 2 pines para la salida a los motores.
La bornera de tres pines para la alimentación:
* 5V al pin digital 4 de Arduino
* GND al interruptor que está en el chasis del robot
* 6-12 al rack de 4 pilas tipo AA.
El conector de 6 pines que controla el módulo:
* Los pines IN1, IN2 correspondes a las entradas para controlar el MOTOR A (OUT1 y OUT2)
* De igual manera IN3, IN4 permiten controlar el MOTOR B (OUT3 y OUT4)

## Ejecución

Para ejecutar la aplicación es necesario tener conectadas la Rapberri, Arduino y la cámara. Para que el motor se accione es necesario comprobar que el rack contiene las 4 pilas tipo AA.
Una vez comprobado que todo está correctamente conectado sólo hay que ejecutar el programa RaspDuino.py sin ningún parámetro adicional para de esta forma iniciar el reconocimiento facial.
* Para ver el video de ejecución del Proyecto
* Para ver la presentación del Proyecto

## Referencias Bibliográficas

* http://www.grimaldos.es
* https://es.wikiversity.org/wiki/Formatos_y_procesamiento_de_imagen
* https://es.wikipedia.org/wiki/Grafico_vectorial#Formatos_graficos_vectoriales
* https://es.wikipedia.org/wiki/Imagen_generada_por_computadora
* http://aulacm.com/programas-para-editar-imagenes/
* http://www.relpe.org/thinglink-imagenes-interactivas/
* https://es.finance.yahoo.com/fotos
* http://es.slideshare.net/guestd52308/modelado-de-personajes-3d
* https://www.youtube.com/watch?v=LZVGA0uWsR8
* http://www.thepaintingfool.com/index.html
* González R, Woods R E., Digital Image Processing, Second Edition, Prentice Hall.
* http://vector-conversions.com/vectorizing/raster_vs_vector.html
* A novel kernelized fuzzy C-means algorithm with application in medical image segmentation. Zhang & Chen. Artificial Intelligence in Medicine (2004) 32, 37—50.
* The Visible Human Project. Disponible online vía: https://www.nlm.nih.gov/research/visible/visible_human.html
* https://editarfotosonline.com

## Alumnas Desarrolladoras

* Covadonga Díez Sanmartín
* Mariela Paola Espinoza

## Participantes Activos

Grupo 5