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.
Perchè rilevare Veicoli con Python ?
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.
In che progetti di deep learning è utilizzato?
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.
Sei pronto al tutorial sul rilevamento di autoveicoli con Python?
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.
Requisiti
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
Alla fine dell'articolo potrai scaricare l'intero progetto python per il Rilevamento Di Veicoli In Tempo Reale
installazione Libreria
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
Classificatore pre-addestrato per il rilevamento di veicoli
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.
Video dimostrativo con le auto
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
Diamoci da fare
Ora iniziamo a costruire ciò di cui abbiamo appena parlato, utilizzando il modello XML e il video dimostrativo nella directory del progetto.
Carichiamo il nostro modello
utilizzare cv2.CascadeClassifier() per caricare il modello haarcascade addestrato come mostrato nel codice sottostante.
import cv2
cars_cascade = cv2.CascadeClassifier('haarcascade_car.xml')
Rilevare le auto in un video con Python
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
Codice Python per rilevare le auto + le loro coordinate di posizione
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)
Disegnare un rettangolo attorno alle auto rilevate
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.
Codice per utilizzare il metodo cv2.rectangle()
cv2.rectangle(frame , point1, point2, color = (), thickness=value)
Scriviamo una funzione per eseguire tutto il processo di rilevamento
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
Scriviamo una funzione per effettuare il processo di rilevamento su un video
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()
Mettiamo tutto insieme
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 :)
Comments