- Composants requis
- YOLO
- Installer OpenCV dans Raspberry Pi
- Installation d'autres packages requis dans Raspberry Pi
- Explication du programme
- Test du projet de détecteur de distance sociale
À l'époque de Covid-19, la distanciation sociale est un moyen efficace de ralentir la transmission du virus infectieux. Il est conseillé aux gens de minimiser leurs contacts les uns avec les autres afin de minimiser le risque de transmission de la maladie par contact direct. Maintenir une distance de sécurité est un défi pour de nombreux endroits comme les usines, les banques, les bus ou les gares, etc.
Donc, dans la continuité de nos précédents projets de sécurité Corona tels que la machine de désinfection automatique et la surveillance de la température sans contact, nous allons ici construire un système de détection de distance sociale utilisant OpenCV et Raspberry Pi. Nous utiliserons les poids de l'algorithme de détection d'objets YOLO v3 avec le module Deep Neural Network.
Raspberry Pi est toujours un bon choix pour les projets de traitement d'image car il a plus de mémoire et de vitesse que les autres contrôleurs. Nous avons précédemment utilisé Raspberry Pi pour certains projets de traitement d'image complexes tels que la détection de repère facial et l'application de reconnaissance faciale.
Composants requis
- Raspberry Pi 4
Ici, nous n'avons besoin que de RPi 4 sur lequel OpenCV est installé. OpenCV est utilisé ici pour le traitement d'images numériques. Les applications les plus courantes du traitement numérique des images sont la détection d'objets, la reconnaissance faciale et le compteur de personnes.
YOLO
YOLO (You Only Look Once) est un réseau neuronal à convolution intelligent (CNN) pour la détection d'objets en temps réel. YOLOv3, la dernière variante de l'algorithme de détection d'objets, YOLO peut reconnaître 80 objets différents dans les images et les vidéos, et il est super rapide et d'une excellente précision. L'algorithme applique un seul réseau neuronal à l'image entière, puis sépare l'image en régions et calcule les boîtes limites et les probabilités pour chaque zone. Le modèle de base YOLO peut traiter les images en temps réel à 45 images par seconde. Le modèle YOLO surpasse toutes les autres méthodes de détection telles que SSD et R-CNN.
Le modèle YOLOV3 que nous allons utiliser dans ce projet peut être téléchargé à partir d'ici.
Installer OpenCV dans Raspberry Pi
Avant d'installer OpenCV et d'autres dépendances, le Raspberry Pi doit être entièrement mis à jour. Utilisez les commandes ci-dessous pour mettre à jour le Raspberry Pi vers sa dernière version:
sudo apt-get mise à jour
Utilisez ensuite les commandes suivantes pour installer les dépendances requises pour installer OpenCV sur votre 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
Enfin, installez OpenCV sur Raspberry Pi à l'aide des commandes ci-dessous.
pip3 installer opencv-contrib-python == 4.1.0.25
Si vous êtes nouveau sur OpenCV, consultez nos précédents tutoriels OpenCV avec Raspberry pi:
- Installer OpenCV sur Raspberry Pi à l'aide de CMake
- Reconnaissance faciale en temps réel avec Raspberry Pi et OpenCV
- Reconnaissance de plaque d'immatriculation à l'aide de Raspberry Pi et OpenCV
- Estimation de la taille de la foule avec OpenCV et Raspberry Pi
Nous avons également créé une série de tutoriels OpenCV à partir du niveau débutant.
Installation d'autres packages requis dans Raspberry Pi
Avant de programmer le détecteur de distance Raspberry Pi for Social, installons les autres packages requis.
Installer imutils: imutils est utilisé pour faciliter les fonctions essentielles de traitement d'image telles que la traduction, la rotation, le redimensionnement, le squelettisation et l'affichage des images Matplotlib avec OpenCV. Utilisez la commande ci-dessous pour installer les imutils:
pip3 installer imutils
Explication du programme
Le code complet est donné à la fin de la page. Ici, nous expliquons les sections importantes du code pour une meilleure explication.
Donc, au début du code, importez toutes les bibliothèques requises qui vont être utilisées dans ce projet.
import numpy as np import cv2 import imutils import os import time
La fonction Check () est utilisée pour calculer la distance entre deux objets ou deux points dans une image de vidéo. Les points a et b désignent les deux objets du cadre. Ces deux points sont utilisés pour calculer la distance euclidienne entre les objets.
def Vérifier (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 étalonnage = (a + b) / 2 si 0 <dist <0,25 * étalonnage: retourne Vrai sinon: renvoie Faux
La fonction de configuration est utilisée pour définir les chemins pour les poids YOLO, fichier cfg, fichier de noms COCO. Le module os.path est utilisé pour la manipulation courante des chemins. Le module os.path.join () est un sous-module de os.path et utilisé pour joindre intelligemment un ou plusieurs composants de chemin. La méthode cv2.dnn.readNetFromDarknet () est utilisée pour charger les poids enregistrés dans le réseau. Après avoir chargé les pondérations, extrayez la liste de toutes les couches utilisées dans un réseau à l'aide d'un modèle net.getLayerNames .
def Setup (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, poids) ln = neural_net.getLayerNames () ln = - 1] pour i dans neural_net.getUnconnectedOutLayers ()]
À l'intérieur de la fonction de traitement d'image, nous prenons une seule image de vidéo, puis la traitons pour la détection de distance sociale entre chaque personne dans la foule. Dans les deux premières lignes de la fonction, nous définissons initialement les dimensions de l'image vidéo (L, H) sur (Aucune, Aucune). Dans la ligne suivante, nous avons utilisé la méthode cv2.dnn.blobFromImage () pour charger des cadres dans un lot et les exécuter sur le réseau. La fonction blob effectue une soustraction moyenne, une mise à l'échelle et un échange de canal sur une image.
(H, W) = (Aucun, Aucun) frame = image.copy () si W est None ou H est 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)
Les sorties de couche de YOLO sont constituées d'un ensemble de valeurs. Ces valeurs nous aident à définir quel objet appartient à quelle classe . Nous bouclons sur chaque sortie dans les layerOutputs et lorsque nous détectons des personnes, nous définissons le label de classe comme "personne". À partir de chaque détection, nous obtenons une boîte englobante qui nous donne le centre X, le centre Y, la largeur et la hauteur de la boîte pour la détection dans la sortie:
scores = détection maxi_class = np.argmax (scores) confiance = scores si LABELS == "personne": si confiance> 0,5: box = détection * np.array () (centerX, centerY, largeur, hauteur) = box.astype ("int") x = int (centerX - (largeur / 2)) y = int (centerY - (hauteur / 2)) contour.append () confidences.append (float (confiance))
Après cela, calculez la distance entre le centre de la boîte actuelle et toutes les autres boîtes détectées. Si les cadres de délimitation sont proches, changez l'état en vrai.
for i in range (len (center)): for j in range (len (center)): close = Vérifier (center, center) si close: pairs.append (, center]) status = True status = True index = 0
Dans les lignes suivantes, dessinez un rectangle autour de la personne en utilisant les dimensions de la boîte que nous avons reçues du modèle, puis vérifiez si la boîte est sûre ou non. Si la distance entre les boîtes est proche, la couleur de la boîte sera de couleur rouge, sinon la boîte sera de couleur verte.
(x, y) = (contour, contour) (w, h) = (contour, contour) si état == True: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 0, 150), 2) état elif == Faux: cv2.rectangle (cadre, (x, y), (x + w, y + h), (0, 255, 0), 2)
Maintenant, à l'intérieur de la fonction de boucle , nous lisons chaque image de la vidéo puis traitons chaque image pour calculer la distance entre les personnes.
ret, frame = cap.read () sinon ret: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 if (frameno% 2 == 0 ou frameno == 1): Configuration (yolo) ImageProcess (current_img) Frame = traitéeImg
Dans les lignes suivantes, utilisez la fonction cv2.VideoWriter () pour stocker la vidéo de sortie à l'emplacement spécifié par opname que nous avons défini précédemment.
si create est None: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Test du projet de détecteur de distance sociale
Une fois que votre code est prêt, ouvrez un terminal Pi et accédez au répertoire du projet. Le code, le modèle Yolo et la vidéo de démonstration doivent être dans le même dossier que celui indiqué ci-dessous.
Vous pouvez télécharger le répertoire YoloV3 à partir d'ici, des vidéos de Pexels et copier le code Python donné ci-dessous, et les mettre dans le même répertoire que ci-dessus.
Une fois que vous êtes dans le répertoire du projet, exécutez la commande suivante pour démarrer le code:
détecteur python3.py
J'ai essayé ce code sur un exemple vidéo obtenu de Pexels. Pour moi, le FPS était très lent et il a fallu environ 10 à 11 minutes pour traiter toute la vidéo.
Au lieu d'utiliser une vidéo, vous pouvez même tester ce code avec une caméra Raspberry Pi en remplaçant le cv2.VideoCapture (entrée) par cv2.VideoCapture (0) dans la 98 e ligne du code. En savoir plus sur l'utilisation de PiCamera avec Raspberry Pi en suivant le lien.
C'est ainsi que vous pouvez utiliser OpenCV avec Raspberry Pi pour détecter les violations de distanciation sociale. La vidéo et le code de sortie sont donnés ci-dessous: