Tabla de contenido:

Sistema de seguridad de reconocimiento facial para un refrigerador con Raspberry Pi: 7 pasos (con imágenes)
Sistema de seguridad de reconocimiento facial para un refrigerador con Raspberry Pi: 7 pasos (con imágenes)

Video: Sistema de seguridad de reconocimiento facial para un refrigerador con Raspberry Pi: 7 pasos (con imágenes)

Video: Sistema de seguridad de reconocimiento facial para un refrigerador con Raspberry Pi: 7 pasos (con imágenes)
Video: Reconocimiento Facial Raspberry pi 4 y OpenCV 2024, Mes de julio
Anonim
Image
Image
Sistema de seguridad de reconocimiento facial para un refrigerador con Raspberry Pi
Sistema de seguridad de reconocimiento facial para un refrigerador con Raspberry Pi
Sistema de seguridad de reconocimiento facial para un refrigerador con Raspberry Pi
Sistema de seguridad de reconocimiento facial para un refrigerador con Raspberry Pi

Navegando por Internet descubrí que los precios de los sistemas de seguridad varían de 150 $ a 600 $ y más, pero no todas las soluciones (incluso las más caras) se pueden integrar con otras herramientas inteligentes en su hogar. Por ejemplo, no puede instalar una cámara de seguridad en la puerta de su casa para que automáticamente abra la puerta para usted o sus amigos.

¡He decidido hacer una solución simple, barata y poderosa, que puedes usar en cualquier lugar! Hay muchos manuales sobre cómo crear sistemas de seguridad caseros y baratos, sin embargo, quiero demostrar una aplicación realmente no trivial de esos: ¡sistema de seguridad para un refrigerador con reconocimiento facial!

¿Como funciona? La cámara IP colocada en la parte superior de un refrigerador, los sensores (dos botones) detectan cuando una persona abre la puerta del refrigerador, luego Raspberry Pi toma una foto de esa persona (con cámara IP), luego la envía a Microsoft Face API. para analizar la imagen y recibir el nombre de la persona. Con esta información, Raspberry Pi escanea la “lista de acceso”: si la persona no tiene permiso para acceder al refrigerador, ¡Raspberry notifica al propietario por correo electrónico, mensaje de texto y twitter! (Vea las imágenes de arriba)

¿Por qué? El sistema le permite controlar a los miembros de su familia, especialmente cuando están a dieta o tienen problemas para no comer después de la medianoche. ¡O utilícelo solo por diversión!

Además, puede configurar la cámara en la puerta de su casa y configurar el sistema para abrir la puerta cuando usted, sus familiares o amigos se acerquen. ¡Y este no es el final! ¡Las posibilidades de la aplicación son infinitas!

¡Vamos a empezar!

Paso 1: preparación

Preparación
Preparación

Necesitará:

  • Raspberry Pi 3 (puede usar versiones anteriores, pero la tercera generación tiene Wi-Fi, por lo que es muy conveniente)
  • Botones
  • Alambres
  • Antiguo teléfono inteligente o cámara Raspberry Pi

Lo primero que tienes que hacer es configurar tu Raspberry Pi. Puede encontrar instrucciones detalladas sobre cómo hacerlo aquí y aquí, pero cubriremos los pasos más importantes en este manual.

  1. Descargue Win32 DiskImager desde aquí (si usa Windows)
  2. Descarga SD Formatter desde aquí
  3. Inserte la tarjeta SD en su computadora y formatee con SD Formatter
  4. Descargue la imagen de Raspbian desde aquí (elija "Raspbian Jessie con píxel")
  5. Ejecute Win32 DiskImager, elija su tarjeta SD, especifique la ruta a la imagen Raspbian, haga clic en "Escribir"
  6. ¡Inserta la tarjeta SD en tu Raspberry Pi y enciéndelo!

Además, deberá configurar su Raspberry Pi para tener acceso al sistema a través de SSH. Hay muchas instrucciones en Internet, puede usar esto, por ejemplo, o puede conectar un monitor y un teclado.

¡Ahora tu Pi está configurado y estás listo para continuar!

Paso 2: hacer un sensor

Hacer un sensor
Hacer un sensor
Hacer un sensor
Hacer un sensor
Hacer un sensor
Hacer un sensor

Descripción del paso: En este paso haremos un sensor que detecta cuando una persona abre la puerta de un frigorífico y activa la Raspberry Pi.

Para configurarlo, necesitaría los 2 botones que preparó originalmente. El primer botón detectará cuándo se abre la puerta, el segundo botón detectará cuándo se abre la puerta hasta el punto en que estemos tomando una foto de una persona.

  1. Suelde los cables a los botones.
  2. Coloque el primer botón en la puerta del refrigerador para que se presione cuando la puerta esté cerrada (vea la imagen de arriba)
  3. Coloque el segundo botón en la puerta del refrigerador como se muestra en la foto de arriba. Este botón debe soltarse en todo momento, excepto cuando la puerta llega al punto en el que el sistema toma una fotografía. Para configurarlo, debe colocar algo en su refrigerador para que este botón se presione cuando la puerta se abra en la medida deseada (vea las fotos de arriba).
  4. Conecte los cables de los botones a la Raspberry Pi: primer botón a GPIO 23 y tierra, segundo botón a GPIO 24 y tierra (consulte el diagrama de fritzing).

Nota: Yo uso el pinout BCM (no el tablero), lea más sobre la diferencia aquí.

Una vez conectado a su Raspberry Pi a través de SSH, para ejecutar el shell de Python, escriba en la terminal:

python3

Si está conectando el monitor y el teclado a Raspberry Pi, simplemente ejecute "Python 3 IDLE" desde el menú.

El siguiente paso es hacer que Raspberry Pi funcione con los botones. Adjuntaremos oyentes especiales a los pines GPIO 23 y 24, que escucharán el evento de "borde ascendente" y el evento de "borde descendente" en esos pines. En el caso del evento, los oyentes llamarán a las funciones que hemos definido. “Borde ascendente” significa que el botón se presionó y ahora se soltó (primer botón - la puerta está abierta), “borde descendente” significa que el botón se soltó y ahora se presionó (segundo botón - la puerta ha alcanzado un punto específico). Más sobre la funcionalidad de los botones, aquí.

Primero, importa la biblioteca que nos da acceso a los pines:

importar RPi. GPIO como GPIO

Ahora defina funciones especiales a las que se llamará cuando se active el evento:

def sensor1 (canal): imprimir ("sensor 1 disparado") def sensor2 (canal): imprimir ("sensor 2 disparado)

Establecer tipo de pinout:

GPIO.setmode (GPIO. BCM)

Configurar pines:

GPIO.setup (23, GPIO. IN, pull_up_down = GPIO. PUD_UP) GPIO.setup (24, GPIO. IN, pull_up_down = GPIO. PUD_UP)

Adjuntar oyentes:

GPIO.add_event_detect (23, GPIO. RISING, callback = sensor1, bouncetime = 300) GPIO.add_event_detect (24, GPIO. FALLING, callback = sensor2, bouncetime = 300)

¡Ahora puedes probarlo! Si presiona el botón 1 verá un mensaje en el terminal "sensor 1 disparado", el botón 2 le da un mensaje "sensor 2 disparado".

Nota: Cuando haya terminado de experimentar, no olvide llamar a la siguiente función: GPIO.cleanup ().

¡Configuremos una función más que se llama cuando la puerta llega al punto donde tomamos una foto! Puede hacerlo usted mismo o usar mi implementación que he adjuntado aquí (sensor.py)

Nota: sensor.py se usa solo para fines de prueba, los archivos con funcionalidad completa que he adjuntado al último paso.

Paso 3: configurar la cámara IP

Configurar cámara IP
Configurar cámara IP
Configurar cámara IP
Configurar cámara IP
Configurar cámara IP
Configurar cámara IP

Descripción del paso: Ahora vamos a configurar el teléfono inteligente antiguo como una cámara IP.

El uso de un teléfono inteligente como una cámara IP se realiza a través de la aplicación. Hay diferentes aplicaciones para Android, iOS, Windows Phone que puede usar. Elegí el que se llama "IP Webcam" para Android. Esta es una aplicación gratuita y fácil de configurar.

Ejecute la aplicación, vaya a "Preferencias de vídeo" para configurar la resolución de las fotos que proporcionará la aplicación. Luego toque "Iniciar servidor" (Primera imagen de arriba). En la parte inferior de la pantalla, debe ver la dirección IP de la cámara (vea la segunda imagen de arriba). En el navegador, puede escribir https://cam_ip_address/photo-j.webp

Finalmente, coloque la cámara en el refrigerador (última imagen arriba).

Paso 4: API facial

API de cara
API de cara

Descripción del paso: En este paso hablaremos sobre la API Face de Microsoft que hace reconocimiento facial e identifica a las personas.

Face API de Microsoft es un servicio de reconocimiento facial, a través del cual podemos analizar fotos e identificar personas en ellas.

Primero, necesita una cuenta de Microsoft Azure. Si no tiene uno, puede crearlo gratis aquí.

En segundo lugar, vaya a https://portal.azure.com, haga clic en "Nuevo" en el lado izquierdo, escriba en el formulario "API de servicios cognitivos", selecciónelo y haga clic en "Crear". O puede abrir este enlace. Ahora debe ingresar el Nombre de su servicio, seleccionar el tipo de suscripción, el tipo de API que necesita (en nuestro caso es Face API), la ubicación, el nivel de precios, el grupo de recursos y aceptar los Términos legales (vea la captura de pantalla agregada a este paso).

En tercer lugar, haga clic en "Todos los recursos", seleccione su servicio Face API y vea las estadísticas de uso, credenciales, etc.

Los detalles de Face API se pueden encontrar aquí, se proporcionan ejemplos en diferentes lenguajes de programación. Para este proyecto estamos usando Python. Puede leer la documentación y crear su propio conjunto de funciones o puede utilizar el que se proporciona aquí (este no es el conjunto completo de funciones proporcionado por Microsoft, solo los puntos que se necesitan para este proyecto). Mis archivos de Python se adjuntan a este paso.

Pasemos a la estructura del trabajo con Face API. Para usar la funcionalidad de "Identificación", tenemos que crear una biblioteca de personas usando el servicio Face API que reconocerá las fotos que está tomando la aplicación. Para configurarlo, siga los pasos:

  1. Crear un grupo
  2. Agregar personas a este grupo
  3. Agregar caras a estas personas
  4. Grupo de tren
  5. Envíe foto con la persona que desea identificar (debe proporcionar foto e identificación de grupo en el que el servicio buscará candidatos)
  6. Resultado: En respuesta, obtendrá una lista de candidatos que pueden aparecer en la foto que envió.

He creado tres archivos con funcionalidad específica que permite trabajar con grupos, personas individuales y fotos individuales:

  • PersonGroup.py: contiene funciones que permiten: crear un grupo, obtener información sobre el grupo, obtener una lista de todos sus grupos, capacitar al grupo y obtener el estado de la capacitación
  • Person.py: contiene características que permiten: crear una persona, obtener información de la persona, enumerar todas las personas en un grupo específico, agregar caras a una persona específica
  • Face.py: contiene funciones que permiten: detectar la cara en la imagen, identificar a la persona, obtener el nombre de la persona identificada

En el archivo llamado "Recognition.py" proporciono características que le permiten verificar si la imagen contiene una cara y agregar caras a la persona especificada (agrega automáticamente la cara de muchas imágenes de la carpeta especificada).

Descargue el archivo adjunto a este paso, descomprímalo, cambie la variable global 'KEY' en estos tres archivos: PersonGroup.py, Person.py y Face.py a su propia clave que puede encontrar: portal.azure.com> todos los recursos > servicio de api facial (o cómo lo llamó)> pestaña de teclas. Puede utilizar cualquiera de las dos claves.

Nota: aquí vamos a entrenar el servicio Face API para que reconozca a las personas, por lo que las siguientes acciones se pueden realizar desde cualquier computadora (no se necesita Raspberry Pi para eso): los cambios se guardan en el servidor de Microsoft.

Después de cambiar la CLAVE, ejecute Recognition.py e ingrese el siguiente comando en el shell de Python:

PersonGroup.create ("family", 'fff-fff')) // puedes usar tu propio nombre e identificación para

grupo printResJson (PersonGroup.getPersonGroup ('fff-fff'))

Tienes que ver los datos sobre el grupo que acabas de crear. Ahora ingrese:

printResJson (Person.createPerson ('fff-fff', 'nombre de la persona'))

Ahora obtienes la identificación de la persona. Cree una carpeta con imágenes de esta persona para que todas las imágenes contengan el rostro de esta persona. Puede utilizar la función detectFaceOnImages en Recognition.py, que le muestra en qué fotos se detecta la cara. Ahora, ejecute el comando:

addFacesToPerson ('carpeta con imágenes', 'ID de persona que obtuvo después del comando anterior', 'fff-fff')

Luego tenemos que capacitar nuestro servicio ingresando lo siguiente:

PersonGroup.trainPersonGroup ('fff-fff') printResJson (PersonGroup.getPersonGroupTrainingStatus ('fff-fff'))

Ahora nuestro grupo está capacitado y listo para identificar a una persona.

Para comprobar la persona en la imagen, puede:

Face.checkPerson (imagen, 'fff-fff')

En respuesta, obtendrá una lista de candidatos y la probabilidad de quién está en la foto.

Nota: cada vez que agrega caras a una persona o persona a un grupo, ¡debe entrenar al grupo!

Paso 5: Configuración Node-Red

Configuración Node-Red
Configuración Node-Red

Descripción del paso: En este paso, crearemos un flujo Node-Red que le notificará sobre la infracción de acceso a su refrigerador =)

Si su Raspberry Pi se ejecuta en Raspbian Jessie de noviembre de 2015 o una versión posterior, no es necesario que instale Node-Red, porque ya está preinstalado. Solo necesitas actualizarlo. Utilice el manual aquí.

Ahora, tenemos que instalar el nodo Twilio en Node-Red, para que podamos activar un mensaje de texto. Abra el terminal y escriba:

cd ~ /.node-rednpm instalar node-red-node-twilio

Más sobre el nodo Twilio aquí. Después de eso, ejecute Node-Red escribiendo en la terminal:

nodo-rojo

Luego vaya a: https://127.0.0.1:1880/ - si abre el navegador en su Raspberry Pihttps:// {raspberry_pi_ip}: 1880 / - si desea abrir el editor Node-Red desde otra computadora

Para saber la dirección IP de raspberry pi, use esta instrucción.

Ahora debe encontrar el nodo Twilio en la lista de nodos en su editor Node-Red (generalmente aparece después del grupo 'social').

¡Es hora de crear el flujo!

Nota: puedes usar mi flujo adjunto a este paso, pero no olvides configurar los nodos: correo electrónico, twitter y twilio. Leer sobre eso más tarde.

Nuestro flujo comienza con el nodo "notificar" que acepta la solicitud POST de nuestro programa principal con algunos datos sobre la violación de acceso (se puede encontrar un ejemplo de los datos en el nodo de comentarios "sobre la recepción de objetos"). Este nodo responde inmediatamente con el mensaje "Ok", por lo que el programa principal sabe que se recibieron los datos (Flujo: / notificar> respuesta con Ok> respuesta). El nodo verde en la parte inferior con el nombre msg.payload está ahí para fines de depuración: si algo no funciona, puede usarlo.

Desde el primer nodo (/ notificar), los datos se propagaron a "Tema de datos" y "Tema de imagen", donde los temas "datos" e "imagen" se agregaron respectivamente.

En el nodo "compilar" recibimos datos (que obtenemos durante el primer paso) con el tema "datos" y una imagen con el tema "imagen" (la imagen está tomada de /home/pi/image.jpg). Estos dos mensajes deben compilarse en un objeto, ¡pero los dos objetos se reciben en un momento diferente! Para manejar esto usaremos la característica de "contexto" que nos permite almacenar datos entre invocaciones de funciones.

El siguiente paso es verificar si es una persona de nuestra lista de acceso o un extraño (nodo checkConditions). Hay un campo de "persona de confianza" en los datos que recibimos: "verdadero" significa que conocemos a esta persona, pero violó el permiso de acceso, "falso" significa que la persona es un extraño.

Cuando el resultado es "verdadero", enviamos una notificación a twitter, twilio y correo electrónico; cuando el resultado es "falso", solo correo electrónico y twilio. Creamos un objeto para correo electrónico con un mensaje, imagen adjunta y asunto del correo electrónico, un objeto para twilio con un mensaje. Para Twitter, agregamos datos a un objeto si "ustedPerson "es verdadero. Luego envíe estos tres objetos a tres nodos diferentes.

Nota: Si el siguiente nodo no debe recibir un mensaje, simplemente le enviamos "nulo".

¡Es hora de configurar los nodos para la notificación!

Twitter Agregue el nodo "twitter" al flujo. Ábralo haciendo doble clic. Haga clic en el lápiz junto a "ID de Twitter". Luego haga clic en "Haga clic aquí para autenticarse con Twitter". Ingrese a su cuenta de Twitter y otorgue los permisos necesarios a Node-Red.

Correo electrónico: agregue el nodo "correo electrónico" al flujo. Si no usa Gmail, deberá cambiar los datos en los siguientes campos: "Servidor" y "Puerto" (puede encontrar qué servidor y puerto debe usar en las páginas de ayuda de su agente de correo electrónico); de lo contrario, no cambie estos los campos.

  • Para> dirección de correo electrónico a la que se enviarán los mensajes
  • Userid> iniciar sesión desde su correo electrónico (tal vez lo mismo que el campo "Para")
  • Contraseña> contraseña de su cuenta de correo electrónico
  • Nombre> nombre de este nodo

Twilio Vaya a https://www.twilio.com/try-twilio y registre una cuenta. Verifíquelo. Vaya a https://www.twilio.com/console. Haga clic en "Números de teléfono" (icono # grande) y cree un número gratuito. Si se encuentra fuera de los EE. UU., Debe agregar permisos GEO, vaya a https://www.twilio.com/console/sms/settings/geo-pe… y agregue su país.

Ahora, vaya al editor Node-Red, agregue el nodo Twilio, haga doble clic en él para configurar y completar todos los campos:

  • Credenciales> Usar credenciales locales
  • Twilio> editar

    • Cuenta SID> tomar desde aquí
    • De> escriba el número virtual que creó
    • Token> tomar de aquí
    • Nombre> Twilio
  • Salida> SMS
  • A> tu número de teléfono
  • Nombre> nombre de este nodo.

Haga clic en Implementar

¡Ahora tu flujo está listo! ¡Puede probarlo enviando una solicitud POST con el objeto especificado!

Paso 6: compilar todo el proyecto

Compilando todo el proyecto
Compilando todo el proyecto
Compilando todo el proyecto
Compilando todo el proyecto

Descripción del paso: En este paso, juntaremos todas las partes y las haremos funcionar como un sistema separado.

En este paso tienes que:

  1. Configurar teléfono inteligente antiguo como cámara ip
  2. Tener sensores de trabajo
  3. API Face de Microsoft capacitada
  4. Flujo Node-Red configurado

Ahora tenemos que mejorar el código que escribimos en el paso 2. Más específicamente, la función process () que se llama cuando una persona abre la puerta. En esta función haremos lo siguiente:

  1. Obtenga la imagen de la cámara ip y guárdela en "/ home / pi /" con el nombre "image.jpg" (función "fromIpCam" en el archivo "getImage")
  2. Obtener el nombre de la persona en esa imagen (función "comprobarPersona" en el archivo "reconocimiento")
  3. Verifique el permiso de acceso para esa persona (función "verificar" en el archivo "acceso")
  4. Basado en el resultado de la función "comprobar" redactar mensaje
  5. Enviar mensaje compuesto a Node-Red (función "toNodeRed" en el archivo "sendData")

Nota: para ver el código completo de las funciones mencionadas, descargue el archivo zip adjunto a este paso.

Acerca de la función "fromIpCam". Esta función realiza la solicitud GET a su cámara ip, obtiene una imagen enfocada en respuesta y la guarda en la ruta especificada por usted. Debe proporcionar la dirección IP de la cámara para esta función.

Acerca de la función "checkPerson". La función obtiene la ruta a la imagen y el grupo en el que desea buscar a la persona de la foto como parámetros. En primer lugar, detecta un rostro en la imagen proporcionada (archivo Face.py, función "detectar"). En respuesta, obtiene una identificación si la cara que se detectó. Luego llama a la función "identificar" (archivo Face.py) que encuentra personas similares en un grupo específico. En respuesta, obtiene una identificación de persona si se encuentra a la persona. Luego llame a la función "persona" (archivo Person.py) con la identificación de la persona como parámetro, la función "persona" devuelve la persona con la identificación especificada, obtenemos el nombre de la persona y lo devolvemos.

Acerca de la función "comprobar". Esta función se coloca en el archivo "acceso" donde también coloca "lista de acceso" como una variable global (puede modificarlo como desee). Obtener el nombre de la persona de la función anterior, función "comprobar" comparar esta persona con la lista de acceso y devolver el resultado.

Nota: el proyecto completo se adjunta al siguiente paso.

Paso 7: Conclusión

En este paso adjunto el proyecto completo que debes descomprimir y colocar en tu Raspberry Pi.

Para que este proyecto funcione, ejecute el archivo "main.py".

Si controla Raspberry Pi a través de SSH, debe ejecutar dos programas desde un shell: el programa Python y Node-Red. Escriba en la terminal lo siguiente:

nodo-rojo

Presiona "Ctrl + Z" y escribe:

trabajos

Ha visto el proceso Node-Red. Mire el ID del proceso y escriba:

bg

Ahora Node-Red tiene que empezar a trabajar en segundo plano. Luego vaya al directorio con su proyecto y ejecute el programa principal:

python3 main.py

Nota: no olvide cambiar la CLAVE en los archivos de Python (paso 4) y las credenciales en el flujo Node-Red (paso 5)

¡Hecho! ¡Su refrigerador es seguro!

¡Espero que hayas disfrutado de este intratable! Siéntase libre de dejar sus mentes en los comentarios.

Le agradecería que votara por mi proyecto =)

¡Gracias!

Recomendado: