- Components necessaris
- YOLO
- Instal·lació d’OpenCV a Raspberry Pi
- Instal·lació d'altres paquets obligatoris a Raspberry Pi
- Explicació del programa
- Prova del projecte de detector de distància social
En temps de Covid-19, el distanciament social és una manera eficaç d’alentir la transmissió de virus infecciosos. Es recomana a les persones que minimitzin el contacte entre elles per minimitzar el risc de transmissió de la malaltia a través del contacte directe. Mantenir una distància de seguretat és un repte per a molts llocs com fàbriques, bancs, autobusos o estacions de ferrocarril, etc.
Així doncs, en continuació dels nostres anteriors projectes de seguretat Corona com la desinfectant automàtica i la vigilància de la temperatura sense contacte, aquí construirem un sistema de detector de distanciament social mitjançant OpenCV i Raspberry Pi. Utilitzarem els pesos de l’algorisme de detecció d’objectes YOLO v3 amb el mòdul Deep Neural Network.
Raspberry Pi sempre és una bona opció per als projectes de processament d’imatges, ja que té més memòria i velocitat que altres controladors. Anteriorment, hem utilitzat Raspberry Pi per a alguns projectes complexos de processament d’imatges com la detecció de punts de referència facial i l’aplicació de reconeixement facial.
Components necessaris
- Raspberry Pi 4
Aquí només necessitem RPi 4 amb OpenCV instal·lat. Aquí s’utilitza OpenCV per al processament d’imatges digitals. Les aplicacions més habituals del processament d’imatges digitals són la detecció d’objectes, el reconeixement de cares i el comptador de persones.
YOLO
YOLO (You Only Look Once) és una xarxa neuronal de convolució intel·ligent (CNN) per a la detecció d’objectes en temps real. YOLOv3, l'última variant de l'algorisme de detecció d'objectes, YOLO pot reconèixer 80 objectes diferents en imatges i vídeos, és molt ràpid i té una precisió excel·lent. L'algoritme aplica una xarxa neuronal única a tota la imatge i, a continuació, separa la imatge en regions i calcula caixes de límit i probabilitats per a cada àrea. El model base YOLO pot processar imatges en temps real a 45 fotogrames per segon. El model YOLO supera tots els altres mètodes de detecció com SSD i R-CNN.
El model YOLOV3 que farem servir en aquest projecte es pot descarregar des d’aquí.
Instal·lació d’OpenCV a Raspberry Pi
Abans d’instal·lar l’OpenCV i altres dependències, el Raspberry Pi s’ha d’actualitzar completament. Utilitzeu les ordres següents per actualitzar el Raspberry Pi a la seva versió més recent:
sudo apt-get update
A continuació, utilitzeu les ordres següents per instal·lar les dependències necessàries per instal·lar OpenCV al vostre 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
Finalment, instal·leu l'OpenCV a Raspberry Pi mitjançant les ordres següents.
pip3 instal·la opencv-contrib-python == 4.1.0.25
Si no sou nou a OpenCV, consulteu els nostres tutorials anteriors d’OpenCV amb Raspberry pi:
- Instal·lació d’OpenCV a Raspberry Pi mitjançant CMake
- Reconeixement facial en temps real amb Raspberry Pi i OpenCV
- Reconeixement de matrícules mitjançant Raspberry Pi i OpenCV
- Estimació de la mida de la multitud mitjançant OpenCV i Raspberry Pi
També hem creat una sèrie de tutorials OpenCV a partir del nivell per a principiants.
Instal·lació d'altres paquets obligatoris a Raspberry Pi
Abans de programar el detector de distància Raspberry Pi for Social, instal·larem els altres paquets necessaris.
Instal·lació d’imutils: imutils s’utilitza per fer funcions essencials de processament d’imatges, com ara traducció, rotació, redimensionament, esqueletització i visualització d’imatges Matplotlib amb OpenCV. Utilitzeu l'ordre següent per instal·lar els imutils:
pip3 instal·lar imutils
Explicació del programa
Es dóna un codi complet al final de la pàgina. Aquí expliquem les seccions importants del codi per obtenir una millor explicació.
Així, al començament del codi, importeu totes les biblioteques necessàries que s’utilitzaran en aquest projecte.
importar numpy com a importació np cv2 importar imutils importar el temps d'importació
La funció Check () s’utilitza per calcular la distància entre dos objectes o dos punts en un fotograma de vídeo. Els punts a i b denoten els dos objectes del marc. Aquests dos punts s’utilitzen per calcular la distància euclidiana entre els objectes.
def Comproveu (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 calibratge = (a + b) / 2 si 0 <dist <0,25 * calibratge: retorna True True else: retorna False
La funció de configuració s’utilitza per establir els camins per als pesos YOLO, fitxer cfg, fitxer de noms COCO. El mòdul os.path s'utilitza per a la manipulació habitual de la ruta. El mòdul os.path.join () és un submòdul d' os.path i s'utilitza per unir un o més components del camí de manera intel·ligent. El mètode cv2.dnn.readNetFromDarknet () s’utilitza per carregar els pesos desats a la xarxa. Després de carregar els pesos, extreu la llista de totes les capes utilitzades en una xarxa mitjançant un model net.getLayerNames .
Configuració def (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 (configuració, pesos) ln = neural_net.getLayerNames () ln = - 1] per a i a neural_net.getUnconnectedOutLayers ()]
Dins de la funció de processament d’imatges, agafem un únic fotograma de vídeo i el processem per a la detecció de distanciament social entre totes les persones de la gent. A les dues primeres línies de la funció, establim les dimensions del fotograma de vídeo (W, H) com (None, None) inicialment. A la següent línia, hem utilitzat el mètode cv2.dnn.blobFromImage () per carregar fotogrames en un lot i executar-los per la xarxa. La funció blob realitza la resta mitjana, l’ escala i l’ intercanvi de canals en un marc.
(H, W) = (Cap, Cap) frame = image.copy () si W és Cap o H no és Cap: (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 sortides de capa de YOLO consisteixen en un conjunt de valors. Aquests valors ens ajuden a definir quin objecte pertany a quina classe . Fem un recorregut per cada sortida de les sortides de capa i, a mesura que anem detectant persones, establim l’etiqueta de classe com a "persona". De cada detecció, obtenim una caixa delimitadora que ens proporciona centre X, centre Y, amplada i alçada de la caixa per a la detecció a la sortida:
puntuacions = detecció maxi_class = np.argmax (puntuacions) confiança = puntuacions si ETIQUETES == "persona": si confiança> 0,5: quadre = detecció * np.array () (centreX, centreY, amplada, alçada) = box.astype ("int") x = int (centreX - (amplada / 2)) y = int (centreY - (alçada / 2)) outline.append () confidències.append (flotador (confiança))
Després d'això, calculeu la distància entre el centre de la casella actual amb totes les altres caselles detectades. Si els quadres de delimitació estan a prop, canvieu l'estat a true.
per a l’interval (len (centre)): per a l’interval j (len (centre)): tancar = Marcar (centre, centre) si està tancat: pairs.append (, centre)) estat = Estat real = Índex vertader = 0
A les línies següents, dibuixeu un rectangle al voltant de la persona que utilitza les dimensions de la caixa que hem rebut del model i, a continuació, comproveu si la caixa és segura o insegura. Si la distància entre les caixes és propera, el color de la caixa es pintarà de vermell; en cas contrari, la caixa serà de color verd.
(x, y) = (esquema, esquema) (w, h) = (esquema, esquema) si estat == Verdader: cv2.rectangle (marc, (x, y), (x + w, y + h), (0, 0, 150), 2) estat elif == False: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
Ara dins de la funció de bucle , estem llegint tots els fotogrames del vídeo i després processem cada fotograma per calcular la distància entre les persones.
ret, frame = cap.read () si no 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ó (yolo) ImageProcess (current_img) Frame = processImG
A les següents línies, utilitzeu la funció cv2.VideoWriter () per emmagatzemar el vídeo de sortida a la ubicació especificada per opname que hem definit anteriorment.
si crear és Cap: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Prova del projecte de detector de distància social
Un cop el codi estigui a punt, obriu un terminal Pi i aneu al directori del projecte. El codi, el model Yolo i el vídeo de demostració haurien d’estar a la mateixa carpeta que es mostra a continuació.

Podeu descarregar el directori YoloV3 des d’aquí, els vídeos de Pexels i copiar el codi Python que es mostra a continuació i posar-los al mateix directori que es mostra a dalt.
Un cop esteu al directori del projecte, executeu l'ordre següent per iniciar el codi:
python3 detector.py
He provat aquest codi amb un exemple de vídeo que s’ha obtingut de Pexels. Per a mi, l'FPS va ser molt lent i va trigar aproximadament 10 a 11 minuts a processar tot el vídeo.

En lloc d'utilitzar un vídeo, fins i tot es pot provar aquest codi amb una càmera Gerd Pi reemplaçant el cv2.VideoCapture (entrada) amb cv2.VideoCapture (0) al 98 ª línia de el codi. Per obtenir més informació sobre l’ús de PiCamera amb Raspberry Pi, seguiu l’enllaç.
Així és com podeu utilitzar OpenCV amb Raspberry Pi per detectar les infraccions de distanciament social. A continuació es mostra el codi i el vídeo de sortida:
