Tracking von Objekten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Ich würde gerne mal ein paar Anregung für ein Problem von euch bekommen. :)

Ich habe eine Bilderserie die ich in Numpy Arrays gesteckt habe. In den Bildern sind Objekte die ich Tracken möchte. Hier ein Beispiel visualisiert mit Matplotlib:

Bild

Die Segmentierung habe ich von scipy.ndimage.measurements.label erledigen lassen und dann noch den Schwerpunkt jedes Objektes bestimmt, der auf dem Plot als kleiner schwarzer Punkt zu sehen ist.

Da sich die Wolken gelegentlich verbinden oder aufspalten, bzw. unterschiedlich viele entstehen, ändert sich die Anzahl der Objekte über die Zeit.

Ich habe nun also am Ende eine List der Form:

Code: Alles auswählen

data = [
    [(1, 1), (2, 3), (3, 5)],
    [(1, 2), (2, 4), (3, 7), (1, 1)],
    [(2, 4), (3, 7)]
]
Mein (schlechter) Ansatz wäre:
* Ich nehme mir einen belibigen Punkt aus data[0]
* Bestimme Differenz data[1] - data[0][0], i im Bereich 0 bis len(data[1])
* Verschiebe data[1] um die ermittelten Differenzen ermittel die Übereinstimmung zu data[0]
* Nehme das beste Ergebniss

Es gibt natürlich viele Möglichkeiten der Opimierung: u.a. könnte man nur Schwerpunkte nehmen die in der Wolke der alten liegen usw. aber gibt es da nicht ein schönere Lösung?

Würdet ihr auch über die Schwerpunkte gehen?

Ideen? Vorschläge?

*edit* Bildlink geändert
Zuletzt geändert von Sr4l am Mittwoch 21. November 2012, 22:38, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Prinzipiell bietet sich zum Tracken erstmal ein (Extended) Kalman Filter an. Irgendwo in den Codesnippets habe ich, wenn ich mich richtig erinnere, sogar mal einen gepostet. Die Implementierung an sich ist aber nicht das Problem, eher das Finden der korrekten Parameter. Den Filter selbst zu implementieren ist aber eine ganz gute Übung, dann kannst du auch abschätzen, mit welchen Parametern du arbeiten musst.

Was du hier als Tracking bezeichnest ist eher das Teilproblem Matching. Der Schwerpunkt ist erstmal ein guter Ansatz um zu testen. Mittels Kalman Filter bekommst du dann pro Frame eine vorhersage über die neue (vorhergesagte) Position und kannst testen, ob es sich um das selbe Objekt handelt oder nicht. Dazu bekommst du natürlich noch Wahrscheinlichkeiten geschenkt (wenn du die Parameter einigermaßen vernünftig vorher gemessen hast).

Je nach Bewegung und Anzahl der Merkmale kannst du aber auch andere Verfahren verwenden. Im Idealfall testest du alle Kombinationen von Matchings durch und nimmst am Ende das wahrscheinlichste. Das wird natürlich bei bereits sehr wenigen Elementen sehr langsam. Alternativ kannst du auch verschiedene Merkmale in Korrelation setzen, das alles in einen Baum packen und darin Suchen. Zu dem Thema gibt es jede Menge Papers.

Zum Testen, ob es sich um das selbe Objekt in zwei Frames handelt, könntest du auch die Überlappung der beiden Objekte bestimmen. Am besten mittels Vorhersage der neuen Position, dann sollten die Ergebnisse deutlich besser werden. Als weitere Maße bieten sich vielleicht noch Umfang, Fläche, Umkreis, Hauptkomponenten (bzw. Längen der Hauptkomponenten) oder die länge der konvexen Hülle. Welches das beste Maß ist und wie du diese kombinierst, würde ich versuchen zu lernen. Label die Daten einfach (halb-)automatisch per Hand und lasse ein wenig Statistik drüber laufen. Weka ist ein ganz gutes Tool für solche Angelegenheiten, da kannst du verschiedene Verfahren auf deinen Daten testen.

An sich sollte es zu dem Thema auch eine Menge an Papers geben.

Sebastian
Das Leben ist wie ein Tennisball.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Danke für deine Antwort. Mit dem EKF bin ich denk ich auf einem guten Weg. Ich gebe nochmal Rückmeldung wenn ich da was erreicht habe. Ich benutze nun zusätzlich noch die Größe, nur mit Schwerpunkten bin ich nicht weit gekommen.

Weka werde ich mir anschauen, ohne lesen bin ich allerdings nicht weit gekommen. Das muss ich mir in Ruhe mit der Dokumentation und Tutorials anschauen.

Mfg Lars
Benutzeravatar
Dobi
User
Beiträge: 31
Registriert: Mittwoch 28. September 2011, 17:04

Mal so aus Neugierde: Ist das Bild, das du oben gepostet hast, ein tatsächlicher Frame, den du so reinbekommst, oder ist der schon von dir selbst zerfiltert? Eventuell hätte man auf dem Originalbild noch andere Möglichkeiten. Achja, OpenCV kennste? http://docs.opencv.org/modules/video/do ... cking.html
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Das ist ein von mir verändertes Bild. Das Original sind Temperatur Matrizen einer Gaswolke in Kelvin.

Bild
Oben "unverändertes" Bild über volles Temperaturspektrum
Unten Differenzbild

OpenCV kenne ich, nutze es unter anderem zur Darstellung.
Benutzeravatar
Dobi
User
Beiträge: 31
Registriert: Mittwoch 28. September 2011, 17:04

Hast du schon ausprobiert, was passiert wenn du da einfach mit den fertigen OpenCV-Tracking-Funktionen (optical flow und so) draufhaust? In den beiliegenden Samples sieht auch einiges zumindest vom Dateiname her brauchbar aus. zb. opencv/samples/cpp/tutorial_code/TrackingMotion
Antworten