
Compartir:
Misha es ingeniero de soluciones para clientes en Vonage, donde se centra en el desarrollo de la Video API. Después de cambiar el ajetreo de San Francisco por el encanto de Milwaukee, Wisconsin, ahora pasa su tiempo libre descubriendo las joyas ocultas del Medio Oeste.
Detección humana en tiempo real con OpenCV
Esta entrada de blog mostrará cómo construir tu propia cámara de Video "inteligente". Se mostrará cómo tomar una imagen del marco de una cámara web, detectar si hay un ser humano en el marco, y enviar un SMS a través de Vonage Communication API para notificarle acerca de las amenazas potenciales.
Introducción
Esta idea se me ocurrió después de que robaran en casa de mis padres. Viven en un lugar apartado, sin cámaras de seguridad, y la policía nunca pudo encontrar al autor del delito. Después de esto, mis padres decidieron equipar la casa con material de seguridad. Yo era entonces estudiante universitario, así que decidí poner en práctica mis conocimientos para construir un sistema de seguridad para ellos.
No dude en ponerse en contacto conmigo como he desarrollado plenamente este en un prototipo de trabajo ¡que ha sido utilizado por mi familia!
Requisitos de hardware
Necesitarás utilizar una Raspberry Pi (yo utilicé una Raspberry Pi 2), a cámara Raspberry Piy una "cámara de seguridad "ficticia.
Requisitos previos
Para construir este proyecto, vas a necesitar las siguientes cosas además del hardware:
Vonage API Account
To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.
Algoritmo de detección de objetos
En este tutorial utilizaremos el clasificador Haar. Se trata de un método eficaz de detección de objetos desarrollado por Paul Viola y Michael Jones en su artículo de 2001, "Rapid Object Detection using a Boosted Cascade of Simple Features".
Inicialmente, el algoritmo necesita muchas imágenes positivas (en nuestro caso, imágenes de varias personas) e imágenes negativas (imágenes que no contienen un humano en el fotograma) para entrenar al clasificador.
A partir de ahí, tenemos que obtener determinadas características del clasificador. Cada característica es un valor único que se obtiene restando la suma de píxeles bajo el rectángulo blanco de la suma de píxeles bajo el triángulo negro.
Más información sobre el clasificador en cascada y el algoritmo que lo sustenta en este artículo de OpenCV: Clasificador en cascada.
Aplicación
En tu Raspberry Pi, crea un nuevo archivo Python e importa todas las librerías necesarias utilizando las siguientes sentencias import:
import cv2
import nexmo
import timeEstas bibliotecas se utilizan para detectar personas, comunicar a los usuarios las personas detectadas y calcular la diferencia de tiempo entre los textos enviados.
Después de eso, tendremos que empezar a capturar las secuencias de Video de su cámara disponible:
video_captured = cv2.VideoCapture(0)Especificar 0 en el parámetro anterior significa que vamos a utilizar la primera cámara de vídeo disponible - por lo general, sólo hay una disponible, pero si usted tiene una cámara externa conectada, puede especificar qué flujo utilizar pasando el parámetro apropiado a VideoCapture.
Ahora, inicialicemos el cliente de SMS de la API de Vonage. Para esto, necesitarás tu clave y secreto de API que puedes encontrar en el panel de control de la Account de API de Vonage que creaste:
client_nexmo = nexmo.Client(key=’your_project_key’, secret=’your_secret_key’)Después de esto, cargaremos el clasificador ya pre-entrenado. El clasificador utilizado en este tutorial se puede acceder siguiendo el enlace y seleccionando el clasificador que desea utilizar en su proyecto.
Utilizaremos el haarcascade_fullbody.xml clasificador.
A modo de prueba, y para facilitar la inclusión de capturas de pantalla adecuadas, utilicé el clasificador haarcascade_frontalface_default.xml clasificador en mi repo de ejemplopero el clasificador haarcascade_fullbody.xml es el más apropiado para el caso de uso de la cámara de seguridad.
classifier = cv2.CascadeClassifier('haarcascade/haarcascade_fullbody.xml')La mayor parte de la detección tiene lugar en el siguiente fragmento de código:
while (True):
# read frame-by-frame
ret, frame = video_captured.read()
# set the frame to gray as we do not need color, save up the resources
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# pass the frame to the classifier
persons_detected = classifier.detectMultiScale(gray_frame, 1.3, 5)
# check if people were detected on the frame
try:
human_count = persons_detected.shape[0]
else:
human_count = 0
# extract boxes so we can visualize things better
# for actual deployment with hardware, not needed
for (x, y, w, h) in persons_detected:
cv2.rectangle(frame, (x,y), (x+w, y+h), (255, 0, 0), 2)
cv2.imshow('Video footage', frame)
if (cv2.waitKey(1) & 0xFF == ord('q')):
break
Leemos cada fotograma de nuestro flujo de Video capturado. También es una buena idea convertirlo a gris para conservar recursos. Una vez hecho esto, pasamos el fotograma al clasificador para ver si se ha detectado una persona. Si es así, se dibuja un rectángulo en el fotograma alrededor de la persona detectada.
Vea a continuación un ejemplo de la detección de mi cara:
Example below of my face being detected
Si carga un clasificador diferente, como upperbody.xml o fullbody.xml, podrá utilizar el mismo código para la detección.
Tenga en cuenta que el clasificador de cuerpo completo sólo reconoce a la persona en el marco si todo el cuerpo está en el marco. Sólo la cara y/o la parte superior del cuerpo no funcionarían. Lo mismo ocurre con el clasificador de la parte superior del cuerpo: sólo con que la cara aparezca en el fotograma no se obtendrá una detección correcta.
Esto se debe a una limitación en los clasificadores proporcionados por OpenCV. Siempre puedes intentar entrenar tus propios clasificadores; eso puede llevar tiempo y recursos extra, pero es una buena manera de construir sobre este proyecto si estás interesado en aprender más sobre ese lado de las cosas.
Ahora, agreguemos las capacidades de la SMS API de Vonage a nuestra aplicación para que el usuario pueda recibir una notificación si se detecta un extraño en su cuadro de video.
Nota: Es importante añadir un retardo a esto (especialmente durante las pruebas) para que el usuario no reciba muchos mensajes SMS por un evento de detección.
En nuestro ejemplo, utilizaremos un método time.sleep(number of seconds) para hacerlo; sin embargo, siéntase libre de desarrollar su propio método más sofisticado si tiene uno.
Añade el siguiente código después del bloque try/else en el código:
if (human_count > 0):
client_nexmo.send_message({
'from': ‘your_outbound_phone_number’,
'to': ‘your_inbound_phone_number’,
'text': 'There has been ' + str(human_count) + ' human(s) detected!',
})
El SMS sólo se enviará si se detecta al menos una persona en la imagen. Para asegurarnos de que no enviamos demasiados mensajes, pondremos el hilo en reposo durante unos cinco segundos y buscaremos a la persona en el marco después.
¡Eso es todo! En sólo 50 líneas de código, estarás listo para detectar personas husmeando en tu propiedad y recibir notificaciones convenientemente cuando eso suceda, usando la API de SMS de Vonage.
El código fuente de este post se puede encontrar en el siguiente enlace GitHub. También he incluido los clasificadores Haar Cascade utilizados en este proyecto para que pueda ponerse en marcha rápidamente.
Posibles mejoras
Por supuesto, se puede hacer más para que este proyecto sea más sofisticado y eficiente.
En primer lugar, el método time.sleep() significa que hay al menos un intervalo de cinco segundos entre el análisis de los fotogramas, lo que no es una situación ideal y podría mejorarse. También sería una buena idea recortar la imagen del fotograma de Video que recibes de la cámara a un área de detección específica para mejorar la eficiencia de la detección: menos píxeles para comprobar significa detecciones más rápidas.
Referencias
https://docs.opencv.org/master/db/d28/tutorial_cascade_classifier.html https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html https://github.com/opencv/opencv/tree/master/data/haarcascades
Compartir:
Misha es ingeniero de soluciones para clientes en Vonage, donde se centra en el desarrollo de la Video API. Después de cambiar el ajetreo de San Francisco por el encanto de Milwaukee, Wisconsin, ahora pasa su tiempo libre descubriendo las joyas ocultas del Medio Oeste.
