Questo articolo è stato pubblicato nell'ambito del Blogathon sulla scienza dei dati
Punto
In questo blog, discuteremo dei metodi di conteggio delle persone popolari, insieme ad alcune attività che vengono eseguite nell'elaborazione video per risultati migliori. Ci sono alcuni algoritmi come i metodi Haar Cascade, HOG e OpenCV utilizzati nel rilevamento umano. Dopo aver compreso questi metodi insieme ai loro vantaggi, possiamo utilizzare questi metodi nel caso d'uso del conteggio delle persone come descritto di seguito.
Il nostro obiettivo è trovare il numero di persone in negozio in un determinato momento (resta tempo) e il numero di persone nelle varie sezioni (drogheria, bevande, eccetera.) all'interno del negozio al dettaglio con l'aiuto di filmati CCTV. Per eseguire questo compito, I video CCTV sono richiesti al punto di ingresso e in diverse sezioni all'interno del negozio.
Il seguente video mostra una tipica registrazione CCTV di un negozio al dettaglio, con varie sezioni del negozio nel campo visivo.
Algoritmi
Diamo un'occhiata ad alcuni degli algoritmi di rilevamento delle persone insieme all'approccio utilizzato in questo blog.:
1. Algoritmo di rilevamento delle persone Haar Cascade È un approccio basato sul machine learning in cui una funzione a cascata viene addestrata da molte immagini positive e negative. Nel rilevamento vengono utilizzate cascate pre-addestrate. Scopri di più su questo metodo qui: cascata.
Di seguito è riportato il codice per esso:
importa numpy come np
importa cv2 # Crea il nostro classificatore del corpo
body_classifier = cv2.CascadeClassifier ('Haarcascade_fullbody.xml') # Avvia l'acquisizione video per il file video
cap = cv2.VideoCapture ('/ moskva.mov') # Ripeti una volta che il video è stato caricato con successo
mentre cap.isOpened ():
# Leggi il primo frame
Giusto, frame = cap.read ()
grigio = cv2.cvtColor (marco, cv2.COLOR_BGR2GRAY)
# Passa il frame al nostro classificatore del corpo
body = body_classifier.detectMultiScale (Grigio, 1.1, 3)
# Estrai riquadri di delimitazione per qualsiasi corpo identificato
per (X, e, w, h) nei corpi:
cv2.rettangolo (marco, (X, e), (X + w, e + h), (0, 255, 255), 2)
cv2.imshow ('Pedoni', marco)
se cv2.waitKey (1) == 13: # 13 è il tasto Invio
rottura
cap.release ()
cv2.destroyAllWindows ()
2. Rilevamento HOG semplice MAIALE (Istogramma gradienti) è una specie di “descrittore di funzionalità”. La técnica cuenta las apariciones de la orientación de gradienteGradiente è un termine usato in vari campi, come la matematica e l'informatica, per descrivere una variazione continua di valori. In matematica, si riferisce al tasso di variazione di una funzione, mentre in progettazione grafica, Si applica alla transizione del colore. Questo concetto è essenziale per comprendere fenomeni come l'ottimizzazione negli algoritmi e la rappresentazione visiva dei dati, consentendo una migliore interpretazione e analisi in... en partes localizadas de una imagen y, così, in un video. Scopri di più su questo metodo qui: Maiale.
Di seguito è riportato il codice per esso:
importa cv2
importare imutils
# Inizializzazione del rilevatore di persone HOG
hog = cv2.HOGDescriptor
hog.setSVMDetector (cv2.HOGDescriptor_getDefaultPeopleDetector)
# Leggere l'immagine
immagine = cv2.imread ('img.png')
# Ridimensiona l'immagine
imagen = imutils.resize (Immagine,
larghezza = min (400, immagine.forma[1]))
# Rilevamento di tutte le regioni nell'immagine che contengono pedoni
(regioni, _) = hog.detectMultiScale (Immagine, winStride = (4, 4), imbottitura = (4, 4), scala = 1.05)
# Disegnare le regioni nell'immagine
per (X, e, w, h) nelle regioni:
cv2.rettangolo (Immagine, (X, e), (X + w, e + h), (0, 0, 255), 2)
# Mostrando l'immagine di output
cv2.imshow (“Immagine”, Immagine)
cv2.waitKey (0)
cv2.destroyAllWindows ()
3. Sottrazione dello sfondo OpenCV La sottrazione dello sfondo è un'importante fase di pre-elaborazione in molte applicazioni basate sulla visione. Ad esempio, considera casi come un contatore visitatori in cui una telecamera statica rileva il numero di visitatori che entrano o escono dalla stanza, o una telecamera del traffico che estrae informazioni sui veicoli, eccetera. In tutti questi casi, devi prima rimuovere la persona o i veicoli da solo. tecnicamente, è necessario estrarre il primo piano in movimento dallo sfondo statico. È un metodo relativamente più veloce per rilevare le persone in tempo reale. OpenCV ha implementato tre di questi algoritmi:
- SfondoSustractorMOG
- SfondoSustractorMOG2
- SfondoStractorGMG
Scopri di più su questi qui: opencv
Di seguito è riportata l'implementazione della sottrazione di sfondo OpenCV utilizzando BackgroundSubtractorMOG2:
importa numpy come np
importa cv2
cap = cv2.VideoCapture ('vtest.avi')
fgbg = cv2.createBackgroundSubtractorMOG2 ()
mentre (1):
Giusto, frame = cap.read ()
fgmask = fgbg.apply (marco)
cv2.imshow ('marco', fgmask)
k = cv2.waitKey (30) e 0xff
si k == 27:
rottura
cap.release ()
cv2.destroyAllWindows ()
Fonte: https://docs.opencv.org/3.4/d1/dc5/tutorial_background_subtraction.html
La seconda immagine mostra i risultati della sottrazione dello sfondo OpenCV nella prima immagine.
Il nostro approccio utilizza questo metodo per ottenere i migliori risultati. Sono stati utilizzati metodi di contorno e trasformazioni morfologiche per contare le persone con maggiore precisione.
4. HOG con algoritmo SVM lineare La precisione del rilevatore HOG (discusso nel metodo di rilevamento Simple HOG) può essere ulteriormente migliorato utilizzando un classificatore SVM per classificare le caratteristiche positive e negative delle immagini campione.
Le caratteristiche positive e negative estratte dai campioni di imaging positivi e negativi raccolti vengono utilizzate per addestrare il modello SVM con rilevamento HOG.. Questo metodo conta il traffico con la massima precisione e l'algoritmo può essere personalizzato. È possibile generare immagini negative (immagini di sfondo del negozio al dettaglio) per ogni nuovo negozio per aumentare la precisione.
Avvicinarsi
Confronto degli algoritmi sopra menzionati:
Fonte: lavoro di progetto automatico
Vediamo l'approccio utilizzato in questo blog, sulla base dell'osservazione precedente, considerando i diversi tipi di video che riceviamo dal negozio al dettaglio:
Divisione video
La suddivisione del video del layout del negozio viene eseguita per un conteggio efficace del traffico su più categorie da una singola visualizzazione della telecamera. Un filmato può coprire 2-3 categorie come le bevande, sezioni di generi alimentari. Per avere persone precise: contare in diverse sezioni del negozio, dividere è utile.
Come puoi vedere nell'immagine sopra, I video CCTV sono disponibili a livello della baia, quindi per misurare il traffico a livello di categoria, l'area di copertura video è suddivisa in categorie per area.
Risultati
Nel caso d'uso, il nostro compito principale è avere una stima del numero di persone all'interno del negozio (e anche in varie sezioni del negozio) analizzare il tempo di permanenza. Dopo aver discusso gli algoritmi e gli approcci appropriati per il caso dato, vediamo i risultati:
Ingresso video della telecamera / Uscita
L'algoritmo utilizzato: – Ricevitore in background Opencv
Motivo: – I rilevamenti rapidi vengono effettuati perché le persone tendono ad entrare a una velocità relativamente elevata (rispetto al movimento lento all'interno del negozio). Le persone vengono rilevate quando attraversano la visuale della telecamera.
Risultato:-
Video delle telecamere su varie sezioni all'interno del negozio
L'algoritmo utilizzato: – MAIALE (Classificatore lineare SVM)
Motivo: – È necessario un rilevamento accurato poiché le persone spesso camminano con i carrelli / bambini. Questo algoritmo è il migliore per questo caso.
Risultato:-
Le persone nel reparto drogheria contano in ogni piazza:
Le persone nella sezione bevande contano in ogni quadrato:
Fatecelo sapere nei commenti in caso di qualsiasi approccio che possa migliorare ulteriormente i risultati..
Il supporto mostrato in questo articolo non è di proprietà di DataPeaker e viene utilizzato a discrezione dell'autore.