Beh, prima di tutto, il progetto OpenCV VideoSurveillance è un buon modo per iniziare a gestire le vostre domande.
Effettua l'associazione dati delle risposte di rilevamento, come hai detto tu. Inoltre, gestisce i falsi positivi (2 blob su 1 oggetto come hai detto) con un meccanismo semplicistico (l'inizializzazione si basa su una soglia di fotogramma e anche sulla cancellazione). L'altro problema, come hai detto, di circa 1 blob corrispondente a 2 oggetti è solitamente chiamato occlusione (il termine "collisione" nel progetto VideoSurveillance è usato ma oggigiorno è obsoleto). VideoSurveillance sta utilizzando un'implementazione del filtro particelle basata su una modellazione dell'istogramma di colore 3D per risolvere questa situazione.
Semplice spiegazione: come distinguere due obiettivi diversi in base al loro aspetto (i vestiti)? È possibile memorizzare il loro istogramma di colore e utilizzarlo più tardi in fotogrammi futuri, giusto? Ma come si fa la ricerca? Puoi cercare tutti i centroidi possibili nel fotogramma successivo, oppure usare diciamo 200 punti casuali sparsi per un'area in cui credi che sia il tuo oggetto. Questi 200 punti sono le particelle. Come funzionano? Confrontano l'area in cui sono focalizzati e producono una probabilità che l'oggetto sia lì. Più vicini sono, più grande è la possibilità. Alla fine, riassumi tutte le possibilità e trova il centroide "medio".
In parole semplici, l'abbigliamento di ciascun target è modellato all'interno della funzione di probabilità e, grazie all'idea di filtraggio delle particelle, si ottengono calcoli quasi in tempo reale.
Infine, il filtro kalman è un predittore, che aiuta il localizzatore a utilizzare solo i dati di movimento. "Filtra" i comportamenti di movimento estremo nel caso in cui il risultato del filtro particella diventi più folle di quanto dovrebbe essere. VideoSurveillance include anche questo. È complementare all'aspetto e il tracker è più sofisticato quando usa entrambi.
Modifica: come può essere utile per il tracciamento multi-target? Supponendo di avere un semplice tracker con associazione dati, diciamo che due oggetti stanno per "scontrarsi". Il tracker funziona correttamente finché gli oggetti non vengono uniti. Durante la "fusione", il tracker vede solo un oggetto. L'altro è perso.Dopo un po ', si dividono e il tracker rileva il vecchio oggetto come nuovo! come possiamo fissare questo? Iniziamo finita filtraggio delle particelle e l'aspetto modellazione questa volta:
Prima della fusione, abbiamo 2 oggetti in movimento verso l'altro. Gli oggetti sono indipendenti e il tracker può vederli chiaramente. Durante questo periodo, un modellatore dell'aspetto (un meccanismo che "ricorda" come appare un oggetto) sta imparando come appaiono questi due oggetti. Ovviamente, mentre i fotogrammi passano, entrambi gli oggetti cambiano leggermente aspetto. Ecco perché, il modellista ha un "tasso di apprendimento" che gli consente di adattare la sua "memoria" col passare del tempo.
Durante l'unione, questa volta, impostiamo il tracker per essere più paziente e non uccidere il secondo oggetto così facilmente come prima. Il tracker consente a entrambi gli oggetti di essere attivi. L'oggetto non occluso viene tracciato con successo come prima, e l'altra casella di delimitazione dell'oggetto tenta di riposizionare di nuovo il bersaglio. Se siamo fortunati *, dopo un breve periodo l'oggetto occulto (nascosto) riapparirà (diviso) e il riquadro di delimitazione verrà attratto lì grazie alle particelle.
* Come sopra indicato, il riquadro di delimitazione del bersaglio occulto è ancora modellato dal modellatore. Se la persona occlusa rimane troppo a lungo nascosta, il modellatore dimenticherà il vecchio oggetto e imparerà cosa si trova davanti all'area di occlusione (cioè l'oggetto non occluso) o girerà come una scatola orfana (questo è chiamato deriva). VideoSurveillance non ha un meccanismo per questo. Una soluzione semplice potrebbe essere quella di fermare l'adattamento del modellatore durante l'occlusione. Come? Quando le due caselle di delimitazione si sovrappongono.
Sono interessato a quello –
@nkint come hai fatto, puoi spiegarlo o condividerlo? – Arjun
Non ho più codice ma non è difficile da implementare in opencv .. ci sono alcune implementazioni con opencv + python su github – nkint