Team I.A. Italia

4 min

Esempio pratico Rilevamento Di Veicoli In Tempo Reale con il Deep Learning , Python e OpenCV

Aggiornato il: 1 nov 2022

Esempio pratico Rilevamento Di Veicoli In Tempo Reale con il Deep Learning ( DL ) , Python e OpenCV

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 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()

Esempio pratico Rilevamento Di Veicoli In Tempo Reale con il Deep Learning ( DL ) , Python e OpenCV

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 :)