Por Pablo Diego Rosell | | Visión Artificial

No hemos terminado de frikear con la Raspberry Pi. Una de las cosas guays que puedes hacer es configurar un sistema automatizado de monitoreo para detectar cuando algo o alguien está en tu puerta. Caroline Dunn muestra cómo hacerlo en este tutorial. Una cosa que no nos gustó mucho del tutorial fue la Parte 3 del tutorial sobre las notificaciones por correo electrónico. Mailgun no nos convenció del todo, ya que queríamos algo más inmediato que un correo electrónico. Después de investigar nuestras opciones, nos enamoramos de Twilio, una plataforma para automatizar comunicaciones como mensajes SMS o llamadas telefónicas. Como somos unos guasones, vamos a personalizar las alarmas para gastar alguna bromita a nuestros colegas.

Pues bien, permítenos mostrarte cómo configurar el sistema de reconocimiento facial de Caroline con una llamada y un mensaje de texto automatizados en tu Raspberry Pi. Retomaremos el proceso en el Paso 3 de Caroline:

Crear Cuenta de Twilio

Para empezar, accede al sitio web de Twilio y regístrate para obtener una cuenta. Crear una cuenta en Twilio te proporcionará acceso a sus APIs de comunicación y te permitirá gestionar tus servicios de comunicación de manera eficiente.

Obtener Número Twilio

Una vez que tengas una cuenta de Twilio, necesitarás adquirir un número de teléfono de Twilio. Este número servirá como remitente al iniciar solicitudes de reconocimiento facial a través del teléfono. Asegúrate de anotar este número, ya que lo utilizaremos más adelante para completar la variable TWILIO_PHONE_SENDER en nuestro script de Python.

Verifica los Identificadores de Llamadas

Para garantizar la seguridad y prevenir un uso indebido, Twilio te solicita que verifiques el número de teléfono del destinatario que recibirá las solicitudes de reconocimiento facial. Agrega el número de teléfono del destinatario a la sección ‘Verified Caller IDs’ en la configuración de tu cuenta de Twilio. Este paso asegura que el destinatario pueda recibir y responder a las solicitudes de reconocimiento facial.

Configura los Permisos Geográficos de Voz

Si planeas enviar solicitudes de reconocimiento facial a destinatarios ubicados en países específicos, es necesario configurar los permisos geográficos de voz en tu cuenta de Twilio. En este caso, queremos permitir ‘España’ para las solicitudes de reconocimiento facial basadas en teléfono.

Actualiza «facial_req_phone.py»

Ahora es el momento de actualizar el script ‘facial_req_phone.py’ para incluir los detalles de tu cuenta de Twilio. El script ‘facial_req_phone.py’ está adaptado del script ‘facial_req_email.py’, pero en lugar de enviar solicitudes por correo electrónico, utiliza Twilio para la comunicación basada en teléfono. El primer bloque se mantiene igual:

# import the necessary packages
from imutils.video import VideoStream
from imutils.video import FPS
import face_recognition
import imutils
import pickle
import time
import cv2
import requests# Initialize ‘currentname’ to trigger only when a new person is identified.
currentname = «unknown»
# Determine faces from encodings.pickle file model created from train_model.py encodingsP = «encodings.pickle»
# use this xml file
cascade = «haarcascade_frontalface_default.xml»

A continuación, debes actualizar las siguientes variables con la información de tu cuenta de Twilio:

#function for setting up SMS
from twilio.rest import ClientTWILIO_ACCOUNT_SID = ‘XXXXXXXXXXXXXX’ # replace with Account SID
TWILIO_AUTH_TOKEN = ‘XXXXXXXXXXXXXX’ # replace with Auth Token
TWILIO_PHONE_SENDER = ‘+1XXXXXXXXXX’ # replace with Twilio phone number (US number provided by Twilio)
TWILIO_PHONE_RECIPIENT = ‘+34XXXXXXXXX’ # replace with number your phone number
TWIML = «https://handler.twilio.com/twiml/XXXXXXXXXXXXXXXXXXXXXX»
client = Client(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN)

El siguiente bloque define un par de funciones para enviar SMS y realizar una llamada telefónica automatizada. La función ‘send_text_alert’ envía un simple SMS con el mensaje de que la persona reconocida, simplemente ‘¡está aquí!’

def send_text_alert(name):
message = client.messages.create(
to = TWILIO_PHONE_RECIPIENT,
from_ = TWILIO_PHONE_SENDER,
body = name + » está aquí!»)

Vamos a divertirnos un poco con la función call y la vamos a usar para gastar nuestra bromita, customizando twiml_message de forma condicional a la cara reconocida.

def call(twiml_message):
call = client.calls.create(
twiml=twiml_message,
to= TWILIO_PHONE_RECIPIENT,
from_= TWILIO_PHONE_SENDER)
print(call.sid)

El siguiente bloque ejecuta el bucle estándar de reconocimiento facial del post original de Caroline:

# initialize the video stream and allow the camera sensor to warm up print(«[INFO] starting video stream…») vs = VideoStream(src=0).start() # vs = VideoStream(usePiCamera=True).start()
time.sleep(2.0)# start the FPS counter
fps = FPS().start()# loop over frames from the video file stream while True:
# grab the frame from the threaded video stream and resize it
# to 500px (to speedup processing)
frame = vs.read()
frame = imutils.resize(frame, width=500)# convert the input frame from (1) BGR to grayscale (for face
# detection) and (2) from BGR to RGB (for face recognition)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# detect faces in the grayscale frame
rects = detector.detectMultiScale(gray, scaleFactor=1.1,
minNeighbors=5, minSize=(30, 30),
flags=cv2.CASCADE_SCALE_IMAGE)# OpenCV returns bounding box coordinates in (x, y, w, h) order
# but we need them in (top, right, bottom, left) order, so we
# need to do a bit of reordering
boxes = [(y, x + w, y + h, x) for (x, y, w, h) in rects]# compute the facial embeddings for each face bounding box
encodings = face_recognition.face_encodings(rgb, boxes)
names = []# loop over the facial embeddings
for encoding in encodings:
# attempt to match each face in the input image to our known
# encodings
matches = face_recognition.compare_faces(data[«encodings»],
encoding)
name = «Unknown»# check to see if we have found a match
if True in matches:
# find the indexes of all matched faces then initialize a
# dictionary to count the total number of times each face
# was matched
matchedIdxs = [i for (i, b) in enumerate(matches) if b]
counts = {}# loop over the matched indexes and maintain a count for
# each recognized face face
for i in matchedIdxs:
name = data[«names»][i]
counts[name] = counts.get(name, 0) + 1# determine the recognized face with the largest number
# of votes (note: in the event of an unlikely tie Python
# will select first entry in the dictionary)
name = max(counts, key=counts.get)

A continuación, vamos a bifurcar el mensaje TwiML para generar un mensaje estándar y educado para una de las caras utilizando una voz femenina agradable y suave:

#If someone in your dataset is identified, print their name on the screen
if currentname != name and name == «Friend_1″:
currentname = name
print(currentname)
send_text_alert(name)
twiml_message = f»<Response><Say voice=’Polly.Conchita’
language=’es-ES’> Hola {name}! Que tal estas? Que tengas un buen dia!»

Para el otro amigo, vamos a utilizar una voz masculina y severa para alertar al usuario de que se encuentran en proximidad cercana a un peligroso criminal con una orden de arresto de Interpol.

elif currentname != name and name != «Friend_2″:
currentname = name
print(currentname)
send_text_alert(name)
twiml_message = f»<Response><Say voice=’Polly.Enrique’
language=’es-ES’> Se encuentra usted proximo a {name}, un peligroso criminal en busqueda y captura por Interpol. Llame inmediatamente al 112 y corra por su vida. Corra! </Say></Response>»
call(twiml_message)# update the list of names
names.append(name)

¡¡HILARANTE!!

El resto vuelve al código estándar:

# loop over the recognized faces
for ((top, right, bottom, left), name) in zip(boxes, names):
# draw the predicted face name on the image – color is in BGR
cv2.rectangle(frame, (left, top), (right, bottom),
(0, 255, 225), 2)
y = top – 15 if top – 15 > 15 else top + 15
cv2.putText(frame, name, (left, y), cv2.FONT_HERSHEY_SIMPLEX,
.8, (0, 255, 255), 2)# display the image to our screen
cv2.imshow(«Facial Recognition is Running», frame)
key = cv2.waitKey(1) & 0xFF# if the `q` key was pressed, break from the loop
if key == ord(«q»):
break# update the FPS counter
fps.update()# stop the timer and display FPS information
fps.stop()
print(«[INFO] elasped time: {:.2f}».format(fps.elapsed())) print(«[INFO] approx. FPS: {:.2f}».format(fps.fps()))# do a bit of cleanup
cv2.destroyAllWindows()
vs.stop()

 

Ejecutar el Script

Con el script ‘facial_req_phone.py’ listo, abre tu entorno de desarrollo de Python preferido, como Thonny. Localiza el script y haz doble clic en él para abrirlo en el editor. Una vez abierto, simplemente haz clic en el botón ‘Run’ para ejecutar el script. Esto iniciará la solicitud de reconocimiento facial basada en teléfono utilizando las capacidades de comunicación de Twilio.

****

Al integrar Twilio en tu aplicación de reconocimiento facial, puedes ampliar su funcionalidad habilitando alarmas en tu teléfono. La plataforma de Twilio simplifica el proceso de enviar y recibir llamadas telefónicas, permitiéndote centrarte en lo verdaderamente importante: la mofa y la befa.


Sobre Rosan International

ROSAN es una empresa tecnológica especializada en el desarrollo de soluciones de Data Science e Inteligencia Artificial con el objetivo de ayudar a resolver algunos de los más desafiantes retos globales. Contáctanos para descubrir cómo podemos ayudarte a extraer la información más valiosa de tus datos y optimizar tus procesos.