miércoles, mayo 27, 2020

Raspberry Pi, Machine Learning & Teachable Machine: Cómo detectar si lleva puesta la mascarilla con Visión Artificial

En estos tiempos complicados que nos ha tocado vivir es cuando más que nunca tenemos que utilizar todos los recursos que tengamos a nuestro alcance para resolver los problemas que más nos afectan y sobre todo, ayudar a los demás. El movimiento Maker (nuestro compañero Sergio Sancho Azcoitia del equipo de Ideas Locas en CDCO ha sido uno de ellos) se movilizó en su día para crear las viseras que utiliza el personal sanitario para protegerse, justo cuando más lo necesitaba por falta de stock

Figura 1: Raspberry Pi, Machine Learning & Teachable Machine:
Cómo detectar si lleva puesta la mascarilla con Visión Artificia
l

La tecnología está cada vez al alcance de todos y ese es justo el objetivo de este artículo, poner a disposición de todos, las herramientas más avanzadas al menor coste posible para poder contribuir a encontrar soluciones que nos ayuden a superar esta pandemia. Por cierto, si quieres iniciarte en el mundo Maker, el libro de nuestro buen amigo y compañero Álvaro Núñez-Romero, es un excelente punto de partida.

Figura 2: Arduino para Hackers: PoCs & Hacks Just for fun
en 0xWord de Álvaro Núñez-Romero

Y junto a este libro, el artículo de nuestro compañero Sergio Sancho titulado "Raspberry Pi Zero para "Makers": 6 PoCs & Hacks Just for Fun", tienes seis proyectos para realizar con tu Raspberry Pi Zero que te van a meter de lleno en el mundo de los makers.

Presentación de la PoC

Gracias a herramientas como nuestra querida Teachable Machine, es posible exportar modelos entrenados a dispositivos menos potentes, como por ejemplo una Raspberry Pi B+. De esta forma, el pesado trabajo del entrenamiento ya está realizado y, por lo tanto, lo único que debemos tener en cuenta es entrenar un modelo lo suficientemente ligero para que la Raspberry Pi pueda procesarlo con fluidez. No es la primera vez que hablamos de Teachable Machine, y ya explicamos cómo utilizarlo para “detectar” posibles casos de Covid-19 partiendo de diferentes radiografías

Figura 3: Componentes utilizados para esta PoC

Esta vez, vamos a exportar todo ese conocimiento a la Raspberry Pi para crear un simple detector de mascarillas. Este es el listado de materiales y el precio de cada uno seleccionados en Amazon. Debes tener en cuenta que la crisis actual del Covid-19 también ha afectado a la fabricación de componentes electrónicos y, por lo tanto, se ha notado un incremento en coste de estos. 

 
 
Cámara Raspberry Pi: 13,99€
 

Total aproximado: 83,9 €

Eso sí, si te buscas las piezas con tiempo en varias tiendas, y compras una carcasa más barata - sin ventilador de refrigeración, por ejemplo, puedes conseguir que el proyecto completo salta por unos 70 €. Aparte de estos componentes, hemos utilizado también un par de leds con sus correspondientes resistencias y un breadboard para las pruebas.

Preparando la Raspberry Pi

Como sistema operativo base de la Raspberry Pi para esta PoC hemos utilizado Raspbian. En este enlace tienes todos los pasos para su instalación (para el resto de la PoC, hemos utilizado este enlace para recopilar todos los pasos y las herramientas necesarias). 

Figura 4: Aspecto final de nuestra Raspberry Pi montada con la cámara

Una vez tenemos acceso a la Raspberry Pi (es recomendable conectarla a un monitor HDMI en vez de conectar en remoto, por ejemplo por SSH), instalaremos los siguientes componentes (primero, como suele ser habitual en entornos GNU/Linux, actualizar la Raspberry Pi):
sudo apt update
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y python3-pip
pip3 install --upgrade setuptools
A continuación, una lista de otros paquetes que necesitaremos instalar los cuales podemos realizarlo con la siguiente acción:
sudo apt-get install -y libatlas-base-dev libhdf5-dev libc-ares-dev libeigen3-dev
                        build-essential libsdl-ttf2.0-0 python-pygame festival
En este punto, ya deberíamos de tener la cámara active, Podemos probarlo con el siguiente comando:
raspistill -t 0
Tensorflow y rpi-vision

Como vamos a utilizar la Raspberry Pi exclusivamente para este proyecto, no vamos a crear un entorno virtual para su ejecución, pero si la compartes con otro tipo de aplicaciones no estaría mal crear uno.  El servicio que vamos a crear es un ejemplo claro de cómo utilizar técnicas de Machine Learning a Ciberseguridad, en este caso para detectar medidas de seguridad personal, pero tienes muchos más ejemplos en nuestro libro.

Figura 5: Machine Learning aplicado a Ciberseguridad

Dicho esto, el siguiente paso en nuestra PoC será instalar algunos componentes fundamentales como Pillow (gestión de imágenes), numpy (librería matemática) y pygame (librería para la creación de videojuegos que nos permitirá gestionar más fácilmente la cámara):
pip3 install Pillow numpy pygame
El siguiente paso será descargar las utilidades de rpi-vision. Podemos hacerlo desde varios repositorios, nosotros hemos utilizado el siguiente:
git clone --depth 1 https://github.com/tutRPi/rpi-vision
De esta forma ya tenemos las utilidades principales preparadas (luego volveremos a ellas para realizar algunas modificaciones). La Raspberry Pi utilizará Tensorflow 2.0 para ejecutar el modelo que le vamos a introducir. Para asegurarnos que funciona bien (aunque con versiones superiores también funciona), hemos descargado e instalado la versión 2.0.0 de Tensorflow. Estos son los pasos que realizar:

1) Descargamos y ejecutamos el siguiente script:
 

2) Al ejecutarlo descargaremos la versión 2.0.0 de Tensorflow para la Raspberry Pi. Una vez descargados tenemos que proceder a su instalación de la siguiente manera:
pip3 install tensorflow-2.0.0-cp37-cp37m-linux_armv7l.whl
pip3 install -e .
3) Finalmente haremos un reboot y ya tendremos todas las herramientas preparadas.

Creación del modelo con Teachable Machine

Antes de continuar con la Raspberry Pi, el siguiente paso será entrenar nuestro modelo. Para ello utilizaremos, como hemos comentado antes, Teachable Machine. El entrenamiento básico que hemos realizado consta solamente de dos de muestras, con y sin mascarilla. Para ello hemos generado 467 imágenes sin mascarilla en diferentes posiciones (giros, barbilla arriba, abajo, perfil, etcétera) y, por otro lado, 450 muestras con la mascarilla puesta (con las mismas posiciones variadas).

Figura 6: Captura de las muestras con Teachable Machine. 

En principio, este entrenamiento ha sido suficiente pero claro, cuantas más muestras (como, por ejemplo, con otras mascarillas de colores, otras posiciones, etcétera) mejores resultados obtendremos, pero a su vez, perderemos agilidad en la ejecución en la Rasbperry Pi.

Figura 7: Exportación del modelo Tensorflow desde Teachable Machine

Una vez realizado el entrenamiento, el siguiente paso será exportar el modelo creado. Para ello, utilizaremos el botón “Export Model”, seleccionamos la pestaña “Tensorflow” y finalmente la opción “Saved Model”. Al pulsar en el botón “Download my model”, obtendremos el fichero con la extensión .h5 que será el que utilizaremos en nuestra Raspberry Pi.

Preparación del código principal y activación de los leds

El siguiente paso y final, será importar dicho fichero .h5 (aunque lo empaquetará como un fichero .zip) con el modelo entrenado en la Raspberry Pi. Esto es algo trivial ya que tenemos en rpi-vision un fichero Python que realizará todo el proceso. La única modificación que hemos realizado al fichero pitft_teachablemachine.py del repositorio (dentro de la carpeta tests), es incluir la activación de los leds

Figura 8: Libro de Python para Pentesters

Por supuesto, esto es una tarea sencilla, pero simboliza lo fácil que sería activar cualquier otro tipo de dispositivo como por ejemplo un altavoz, un relé, un panel led para mostrar mensajes, etcétera. Antes de nada, vamos a explicar cómo activar los dos leds, algo muy sencillo. Primero añadimos el import:
import RPi.GPIO as gpio
Utilizaremos los puertos GPIO 11 y 13 de la Raspberry Pi y la activación de los leds los haríamos dentro del bucle for que se encuentra en la línea 95, de la siguiente manera:
for p in prediction:
            label, name, conf = p
            if conf > CONFIDENCE_THRESHOLD:
                print("Detected", name)
	
			gpio.setup(11, gpio.OUT)
			gpio.setup(13, gpio.OUT)

			if name==’Sin_Mascarilla’:
				gpio.output(11, True)
				gpio.output(13, False)
			elif name==’Con_Mascarilla’:
				gpio.output(13, True)
				gpio.output(11, False)
                
persistant_obj = False  
                last_seen.append(name)
                last_seen.pop(0)
			…
De esta forma, cada vez que se detecte la etiqueta “Con_Mascarilla” o “Sin_Mascarilla” activará un led y apagará el otro. Y ya está. Ahora ya sólo queda probar todo el sistema y ver si funciona en la Raspberry Pi.

Ejecución de la PoC en la Raspberry Pi

El primer paso será copiar el fichero con el model (.h5) a la Raspberry Pi (por ejemplo, con scp) y lo copiaremos en la carpeta rpi-vision. Finalmente, ejecutaremos como root el siguiente comando:
sudo python3 tests/pitft_teachablemachine.py ../converted_mimodel.zip
Una vez ejecutado (tardará un poco en levantarse) podemos empezar a hacer las pruebas, simplemente al colocarnos delante de la cámara, debería de detectar y mostrar en pantalla la etiqueta “Con_Mascarilla” o “Sin_Mascarilla”:

Figura 9: Ejecución y salida de la PoC en la Raspberry Pi

Además de la salida por pantalla, también veremos como se activan los leds. El de color verde cuando llevemos la mascarilla y el rojo cuando no. Por supuesto, esta PoC no es perfecta, pero cumple decentemente con su cometido.

Figura 10: PoC de reconocer si lleva la mascarilla en
Raspberry Pi usando Machine Learning & Teachable Machine

De hecho, podríamos ampliar las muestras de entrenamiento en el modelo y de esa forma obtener una salida mucho más precisa, eso sí, deberíamos de utilizar otro modelo de Raspberry Pi con más memoria, pero sobre todo con más CPU (Raspberry Pi 4 por ejemplo).  En el vídeo de la Figura 10 mostramos cómo es la ejecución real de proceso de detección.

Notas finales

Al principio, nuestra idea utilizar Pose en esta PoC, ya que nuestra primera aproximación era crear un detector de caídas (por ejemplo, para personas mayores). Pero nos encontramos con el problema de la limitación de procesamiento de la Raspberry Pi, lo que hacía que se ejecutara bastante lento. Pose registra más información que la captura de imágenes y esto genera un modelo más pesado que el anterior. 

Además, registrar los puntos de las articulaciones es un proceso más complejo de procesar. De todas formas, aquí tenemos todo un campo de exploración, siempre teniendo en cuenta las limitaciones de la Raspberry Pi. Por ejemplo, podríamos conectar otro tipo de sensores para dar más potencia a la detección como un altavoz y un micrófono, detección de guantes, etcétera.

El objetivo final de esta PoC es sencillamente demostrar que es posible integrar tecnología muy potente, como el Machine Learning, en dispositivos IoT los cuales suelen tener una tecnología más modesta. De esta manera, aumentamos las posibilidades del IoT para resolver problemas que antes parecían imposibles de solucionar. Y como decíamos al principio, si además lo utilizamos para un bien social (ya sean monitorizar a nuestros mayores o simplemente detectar si alguien lleva o no mascarilla), pues mucho mejor.

Happy Hacking Hackers!!!

Autores:

Fran Ramírez, (@cyberhadesblog) es investigador de seguridad y miembro del equipo de Ideas Locas en CDO en Telefónica, co-autor del libro "Microhistorias: Anécdotas y Curiosidades de la historia de la informática (y los hackers)", del libro "Docker: SecDevOps", también de "Machine Learning aplicado a la Ciberseguridad” además del blog CyberHades. Puedes contactar con Fran Ramirez en MyPublicInbox.


 Figura 11: Contactar con Fran Ramírez en MyPublicInbox

Enrique Blanco, (@eblanco_h) es Investigador en el departamento de Ideas Locas CDCO de Telefónica. Puedes contactar con Enrique Blanco en su buzón público en MyPublicInbox.

Figura 12: Contactar con Enrique Blanco

No hay comentarios:

Publicar un comentario