- Componentes requeridos
- YOLO
- Instalación de OpenCV en Raspberry Pi
- Instalación de otros paquetes necesarios en Raspberry Pi
- Explicación del programa
- Prueba del proyecto del detector de distancia social
En la época de Covid-19, el distanciamiento social es una forma eficaz de ralentizar la transmisión de virus infecciosos. Se aconseja a las personas que minimicen su contacto entre sí para minimizar el riesgo de transmisión de la enfermedad a través del contacto directo. Mantener una distancia segura es un desafío para muchos lugares como fábricas, bancos, estaciones de autobuses o ferrocarriles, etc.
Entonces, como continuación de nuestros proyectos de seguridad anteriores de Corona, como la máquina desinfectante automática y el monitoreo de temperatura sin contacto, aquí vamos a construir un sistema de detector de distanciamiento social utilizando OpenCV y Raspberry Pi. Usaremos los pesos del algoritmo de detección de objetos YOLO v3 con el módulo de red neuronal profunda.
Raspberry Pi siempre es una buena opción para proyectos de procesamiento de imágenes, ya que tiene más memoria y velocidad que otros controladores. Anteriormente usamos Raspberry Pi para algunos proyectos complejos de procesamiento de imágenes como la detección de puntos de referencia facial y la aplicación de reconocimiento facial.
Componentes requeridos
- Frambuesa pi 4
Aquí solo necesitamos RPi 4 con OpenCV instalado. OpenCV se utiliza aquí para el procesamiento de imágenes digitales. Las aplicaciones más comunes del procesamiento de imágenes digitales son la detección de objetos, el reconocimiento facial y el contador de personas.
YOLO
YOLO (You Only Look Once) es una red neuronal de convolución (CNN) inteligente para la detección de objetos en tiempo real. YOLOv3, la última variante del algoritmo de detección de objetos, YOLO puede reconocer 80 objetos diferentes en imágenes y videos, es súper rápido y tiene una precisión excelente. El algoritmo aplica una sola red neuronal a toda la imagen, luego la separa en regiones y calcula los cuadros de límites y las probabilidades para cada área. El modelo base YOLO puede procesar imágenes en tiempo real a 45 fotogramas por segundo. El modelo YOLO supera a todos los demás métodos de detección como SSD y R-CNN.
El modelo YOLOV3 que vamos a utilizar en este proyecto se puede descargar desde aquí.
Instalación de OpenCV en Raspberry Pi
Antes de instalar OpenCV y otras dependencias, la Raspberry Pi debe actualizarse por completo. Use los siguientes comandos para actualizar Raspberry Pi a su última versión:
sudo apt-get update
Luego, use los siguientes comandos para instalar las dependencias necesarias para instalar OpenCV en su Raspberry Pi.
sudo apt-get install libhdf5-dev -y sudo apt-get install libhdf5-serial-dev –y sudo apt-get install libatlas-base-dev –y sudo apt-get install libjasper-dev -y sudo apt-get install libqtgui4 –Y sudo apt-get install libqt4-test –y
Finalmente, instale OpenCV en Raspberry Pi usando los siguientes comandos.
pip3 instalar opencv-contrib-python == 4.1.0.25
Si es nuevo en OpenCV, consulte nuestros tutoriales anteriores de OpenCV con Raspberry pi:
- Instalación de OpenCV en Raspberry Pi usando CMake
- Reconocimiento facial en tiempo real con Raspberry Pi y OpenCV
- Reconocimiento de matrículas mediante Raspberry Pi y OpenCV
- Estimación del tamaño de la multitud con OpenCV y Raspberry Pi
También hemos creado una serie de tutoriales de OpenCV a partir del nivel principiante.
Instalación de otros paquetes necesarios en Raspberry Pi
Antes de programar el detector de distancia Raspberry Pi para redes sociales, instalemos los otros paquetes necesarios.
Instalación de imutils: imutils se utiliza para facilitar las funciones esenciales de procesamiento de imágenes, como traducción, rotación, cambio de tamaño, esqueletización y visualización de imágenes de Matplotlib con OpenCV. Utilice el siguiente comando para instalar los imutils:
pip3 instalar imutils
Explicación del programa
El código completo se proporciona al final de la página. Aquí estamos explicando las secciones importantes del código para una mejor explicación.
Entonces, al comienzo del código, importe todas las bibliotecas necesarias que se utilizarán en este proyecto.
import numpy as np import cv2 import imutils import os import time
La función Check () se utiliza para calcular la distancia entre dos objetos o dos puntos en un cuadro de video. Los puntos de una y b denotan los dos objetos en el marco. Estos dos puntos se utilizan para calcular la distancia euclidiana entre los objetos.
def Comprobar (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0.5 calibración = (a + b) / 2 si 0 <dist <0.25 * calibración: devuelve verdadero si no: devuelve falso
La función de configuración se utiliza para establecer las rutas para los pesos YOLO, archivo cfg, archivo de nombres COCO. El módulo os.path se utiliza para la manipulación de nombres de rutas comunes. El módulo os.path.join () es un submódulo de os.path y se utiliza para unir uno o más componentes de la ruta de forma inteligente. El método cv2.dnn.readNetFromDarknet () se utiliza para cargar los pesos guardados en la red. Después de cargar los pesos, extraiga la lista de todas las capas utilizadas en una red utilizando un modelo net.getLayerNames .
def Configuración (yolo): global neural_net, ln, LABELS weights = os.path.sep.join () config = os.path.sep.join () labelsPath = os.path.sep.join () LABELS = open (labelsPath).read (). strip (). split ("\ n") neural_net = cv2.dnn.readNetFromDarknet (config, weights) ln = neural_net.getLayerNames () ln = - 1] para i en neural_net.getUnconnectedOutLayers ()]
Dentro de la función de procesamiento de imágenes, tomamos un solo fotograma de video y luego lo procesamos para la detección del distanciamiento social entre cada persona en la multitud. En las dos primeras líneas de la función, configuramos las dimensiones del cuadro de video (W, H) como (Ninguno, Ninguno) inicialmente. En la siguiente línea, usamos el método cv2.dnn.blobFromImage () para cargar marcos en un lote y ejecutarlos a través de la red. La función de blob realiza la resta media, el escalado y el intercambio de canales en un fotograma.
(H, W) = (None, None) frame = image.copy () si W es None o H es None: (H, W) = frame.shape blob = cv2.dnn.blobFromImage (frame, 1 / 255.0, (416, 416), swapRB = True, crop = False) neural_net.setInput (blob) starttime = time.time () layerOutputs = neural_net.forward (ln)
Las salidas de capa de YOLO consisten en un conjunto de valores. Estos valores nos ayudan a definir qué objeto pertenece a qué clase . Pasamos por encima de todas las salidas de layerOutputs y, a medida que detectamos personas, establecemos la etiqueta de clase como "persona". De cada detección, obtenemos un cuadro delimitador que nos da el centro X, el centro Y, el ancho y el alto del cuadro para la detección en la salida:
puntuaciones = detección maxi_class = np.argmax (puntuaciones) confianza = puntuaciones si LABELS == "persona": si confianza> 0.5: caja = detección * np.array () (centerX, centerY, width, height) = box.astype ("int") x = int (centerX - (width / 2)) y = int (centerY - (height / 2)) outline.append () confidences.append (float (confianza))
Después de eso, calcule la distancia entre el centro del cuadro actual con todos los demás cuadros detectados. Si los cuadros delimitadores están cerca, cambie el estado a verdadero.
para i en rango (len (centro)): para j en rango (len (centro)): cerrar = Verificar (centro, centro) si está cerca: pares.append (, centro]) estado = Verdadero estado = Verdadero índice = 0
En las siguientes líneas, dibuje un rectángulo alrededor de la persona usando las dimensiones de la caja que recibimos del modelo, luego verifique si la caja es segura o insegura. Si la distancia entre los cuadros es cercana, entonces el color del cuadro será de color rojo; de lo contrario, el cuadro será de color verde.
(x, y) = (contorno, contorno) (w, h) = (contorno, contorno) if status == True: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 0, 150), 2) estado elif == False: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
Ahora, dentro de la función de bucle , leemos cada cuadro del video y luego procesamos cada cuadro para calcular la distancia entre las personas.
ret, frame = cap.read () si no es ret: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 o frameno == 1): Configuración (yolo) ImageProcess (current_img) Frame = ProcessingImg
En las siguientes líneas, use la función cv2.VideoWriter () para almacenar el video de salida en la ubicación especificada por opname que hemos definido anteriormente.
si crear es None: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Prueba del proyecto del detector de distancia social
Una vez que su código esté listo, abra una terminal Pi y navegue hasta el directorio del proyecto. El código, el modelo Yolo y el video de demostración deben estar en la misma carpeta que se muestra a continuación.
Puede descargar el directorio YoloV3 desde aquí, videos de Pexels y copiar el código Python que se muestra a continuación, y colocarlos en el mismo directorio que se muestra arriba.
Una vez que esté en el directorio del proyecto, ejecute el siguiente comando para iniciar el código:
python3 detector.py
Probé este código en un ejemplo de video que se obtuvo de Pexels. Para mí, el FPS fue muy lento y tomó aproximadamente de 10 a 11 minutos procesar todo el video.
En lugar de usar un video, incluso puede probar este código con una cámara Raspberry Pi reemplazando el cv2.VideoCapture (entrada) con cv2.VideoCapture (0) en la línea 98 del código. Obtenga más información sobre cómo usar PiCamera con Raspberry Pi siguiendo el enlace.
Así es como puede usar OpenCV con Raspberry Pi para detectar las violaciones del distanciamiento social. El video y el código de salida se dan a continuación: