Team I.A. Italia
4 min
Aggiornato il: 1 nov 2022
In questo articolo, ti mostreremo come esguire il rilevamento dei veicoli in tempo reale con Python utilizzando la libreria OpenCV , il classificatore preaddestrato e in poche righe di codice.
Il rilevamento dei veicoli in tempo reale è una delle tante applicazioni del rilevamento degli oggetti , per cui si concentra sul rilevamento delle auto all'interno di un'immagine insieme alle coordinate della posizione.
il rilevamento dei veicoli insieme al rilevamento della strada è molto applicato sulle auto a guida autonoma, affinché un'auto possa navigare in sicurezza lungo la strada, deve sapere dove sono posizionate le altre auto in modo da evitare una collisione.
Anche il rilevamento dei veicoli viene utilizzato nei sistemi di sorveglianza del traffico in modo tale da poter rilevare il traffico in base al numero di veicoli e utilizzare tali dati per gestirlo e controllarlo.
In questo tutorial, impareremo come eseguire il rilevamento dei veicoli in tempo reale in un video o dai flussi di telecamere utilizzando OpenCV e un modello pre-addestrato.
Per poter seguire questo tutorial senza problemi ti lasciamo gli stessi file da noi utilizzati
OpenCV ( vedremo nel passaggio dopo come istallarlo )
Modello preaddestrato
Video dimostrativo
Se non sai perchè utilizzeremo python, clicca qui
Se non hai ancora installato Python, clicca qui
Se non sai come scaricare e gestire le librerie, clicca qui
Se non sai cosa sia un Dataset, clicca qui
Se già conosci questi concetti usa questo comando per istallare la libreria
$ pip install opencv-python
$ pip3 install opencv-python # per python >=3
Come ho spiegato in precedenza, non addestreremo il nostro modello per individuare da zero le auto nei fotogrammi video, ma ne useremo uno pre-addestrato.
Questi classificatori a cascata addestrati vengono solitamente archiviati nel formato XML, quindi dovresti scaricare il sistema a cascata che è stato addestrato per rilevare le auto e averlo nella directory del progetto.
Puoi effettivamente utilizzare qualsiasi video che desideri purché contenga auto, il modello sarà in grado di rilevarle. Se già sei esperto in questo campo potresti divertirti a farlo in streaming da remoto. Installando un app sul telefonino che funga da IP-CAMERA e collegandoti tramite opencv, ti basterebbe poggiare il telefono in modo che riprenda la strada mentre guidi e tornato a case esaminare o creare un progetto ad hoc al tuo caso.
Directory del progetto Rilevamento Di Veicoli In Tempo Reale
La directory del tuo progetto dopo aver scaricato gratuitamente dovrebbe essere simile a questa
├── app.py
├── cars.mp4
└── haarcascade_car.xml
Ora iniziamo a costruire ciò di cui abbiamo appena parlato, utilizzando il modello XML e il video dimostrativo nella directory del progetto.
utilizzare cv2.CascadeClassifier() per caricare il modello haarcascade addestrato come mostrato nel codice sottostante.
import cv2
cars_cascade = cv2.CascadeClassifier('haarcascade_car.xml')
utilizzeremo il metodo detectMultiScale() per rilevare e ottenere le coordinate dei veicoli nei frame video.
Il metodo detectMultiScale () riceve 3 parametri per fornire effettivamente le tue coordinate come mostrato di seguito
Immagine in scala di grigi
fattore di scala
minVicini
Immagine in scala di grigi specifica l'immagine da elaborare, nel nostro caso un'immagine in scala di grigi sarà un'immagine recuperata dai flussi video.
ScaleFactor specifica di quanto viene ridotta la dimensione dell'immagine ad ogni scala dell'immagine, puoi saperne di più qui, un buon valore è per lo più scelto come 1.05
minNeighbors specifica quanti vicini dovrebbe avere ogni rettangolo candidato per mantenerlo, questo parametro influenzerà la qualità delle facce rilevate.
Un valore più alto si traduce in un minor numero di rilevamenti, ma con una qualità più elevata di solito, 3-6 è un buon valore per questo
Quando esegui la riga di codice qui sotto, eseguirà il rilevamento delle auto nell'immagine del frame e quindi ci restituirà tutte le coordinate delle auto trovate (punto coordinate diagonali).
cars = cars_cascade.detectMultiScale(frame, scaleFactor, minNeighbors)
Dopo aver rilevato tutte le coordinate di tutte le auto in un frame, disegnamo un rettangolo attorno ad esso per consentirci di vedere visivamente il processo di rilevamento.
Useremo il metodo cv2.rectangle() per disegnare un rettangolo attorno a ogni auto rilevata usando i punti di coordinate diagonali restituiti dal nostro classificatore a cascata.
cv2.rectangle(frame , point1, point2, color = (), thickness=value)
Dobbiamo condensare ciò che abbiamo appena appreso e metterlo in un'unica funzione che riceve i frame dell'immagine e quindi disegna rettangoli attorno ad essa utilizzando le coordinate rilevate proprio come mostrato di seguito.
def detect_cars(frame):
cars = cars_cascade.detectMultiScale(frame, 1.15, 4)
for (x, y, w, h) in cars:
cv2.rectangle(frame, (x, y), (x+w,y+h), color=(0, 255, 0), thickness=2)
return frame
infine aggiungiamo una singola funzione per simulare l'intero processo dal caricamento del video, per eseguire il rilevamento del veicolo chiamando la funzione detect_cars e quindi eseguire il rendering di un frame con i veicoli rilevati sullo schermo.
def Simulator():
CarVideo = cv2.VideoCapture('cars.mp4')
while CarVideo.isOpened():
ret, frame = CarVideo.read()
controlkey = cv2.waitKey(1)
if ret:
cars_frame = detect_cars(frame)
#se stai programmando in locale
#cv2.imshow('frame', cars_frame)
#se usi colab
cv2_imshow(cars_frame)
else:
break
if controlkey == ord('q'):
break
Aggiungi queste due righe in modo da assicurarci di eseguire il nostro codice Python come script.
Simulator()
Ora sappiamo come eseguire ogni parte indipendente del nostro script di rilevamento, è ora di metterli insieme in modo da poterlo eseguire.
Una volta che hai messo tutto il concetto che abbiamo imparato sopra in un app.py , il tuo codice apparirà come mostrato di seguito
from google.colab.patches import cv2_imshow #Se usi Google Colab
import cv2
cars_cascade = cv2.CascadeClassifier('haarcascade_car.xml')
def detect_cars(frame):
cars = cars_cascade.detectMultiScale(frame, 1.15, 4)
for (x, y, w, h) in cars:
cv2.rectangle(frame, (x, y), (x+w,y+h), color=(0, 255, 0), thickness=2)
return frame
def Simulator():
CarVideo = cv2.VideoCapture('cars.mp4')
while CarVideo.isOpened():
ret, frame = CarVideo.read()
controlkey = cv2.waitKey(1)
if ret:
cars_frame = detect_cars(frame)
#se stai programmando in locale
#cv2.imshow('frame', cars_frame)
#se usi colab
cv2_imshow(cars_frame)
else:
break
if controlkey == ord('q'):
break
CarVideo.release()
cv2.destroyAllWindows()
Simulator()
Siamo arrivati alla fine del nostro articolo, spero che tu abbia imparato qualcosa, ora condividilo con i tuoi amici o colleghi.
Grazie mille per la lettura :)