Frage

Ich arbeite an einer Struktur aus der Bewegungsanwendung und verfolge eine Reihe von Markern, die auf das Objekt platziert sind, um die starre Struktur des Objekts zu bestimmen.

Die App verwendet im Wesentlichen die Standard-Levenberg-Marquardt-Optimierung über mehrere Kameraansichten und minimiert die Unterschiede zwischen den erwarteten Markierungspunkten und den in 2D erhaltenen Markerpunkten aus jeder Ansicht.

Für jeden Markierungspunkt und jede Ansicht wird die folgende Funktion minimiert:

double diff = calculatedXY[index] - observedXY[index]

Wenn der berechnete Wert von einer Reihe unbekannter Parameter abhängt, die über die Optimierung und Beobachtung festgestellt werden müssen, ist die Markerpunktposition in 2D. Insgesamt habe ich (Markerpunkte * Ansichten) Anzahl der Funktionen wie die oben genannten, die ich minimieren möchte.

Ich habe eine Simulation der Kamera codiert und alle Markerpunkte gesehen, aber ich habe mich gefragt, wie ich mit den Fällen umgehen kann, wenn die Punkte während des Ausführens der Punkte aufgrund von Beleuchtung, Verschluss oder einfach nicht in der Kameraansicht sichtbar sind. In der realen Ausführung der App werde ich eine Web -Cam verwenden, um das Objekt anzuzeigen Marker die ganze Zeit.

Ich dachte daran, den Diff -Wert auf 0 zu setzen (Sigma quadratische Differenz = 0), wenn der Markerpunkt nicht beobachtet werden konnte, könnte dies die Ergebnisse jedoch verzerren?

Eine andere Sache, die mir aufgefallen ist, ist, dass der Algorithmus nicht so gut ist, wenn er zu viele Ansichten präsentiert wird. Es ist wahrscheinlicher, dass es eine schlechte Lösung schätzt, wenn sie zu viele Ansichten präsentiert wird. Ist dies ein häufiges Problem bei der Anpassung der Bündel aufgrund der erhöhten Wahrscheinlichkeit, ein lokales Minimum zu erreichen, wenn sie zu viele Ansichten präsentiert werden?

War es hilfreich?

Lösung

Es ist üblich, nur Begriffe zu überlassen, die fehlende Marker entsprechen. Dh. Versuchen Sie nicht zu minimieren calculateXY-observedXY Wenn es keine gibt observedXY Begriff. Es ist nicht erforderlich, etwas auf Null zu setzen, Sie sollten diesen Begriff nicht einmal in Betracht ziehen - überspringen Sie es einfach (oder, wie in Ihrem Code, ist es gleichwertig, den Fehler auf Null zu setzen).

Die Einstellung der Bündel kann schrecklich scheitern, wenn Sie einfach eine große Anzahl von Beobachtungen darauf werfen. Erstellen Sie Ihre Lösung inkrementell, indem Sie zuerst mit ein paar Ansichten lösen, und fügen Sie dann weiter hinzu.

Vielleicht möchten Sie einen "robusten" Ansatz ausprobieren. Verwenden Sie anstatt die kleinsten Quadrate zu verwenden, sondern verwenden Sie eine "Verlustfunktion"1. Diese ermöglichen es Ihrer Optimierung, zu überleben, auch wenn eine Handvoll Beobachtungen falsch sind. Sie können dies immer noch in einem Levenberg-Marquardt-Framework tun. Sie müssen nur die Ableitung Ihrer Verlustfunktion in den Jakobier einbeziehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top