Pregunta

Estoy trabajando en una estructura de la aplicación de movimiento y estoy rastreando una serie de marcadores colocados en el objeto para determinar la estructura rígida del objeto.

La aplicación esencialmente utiliza la optimización estándar de Levenberg-Marquardt sobre múltiples vistas de la cámara y minimiza las diferencias entre los puntos marcadores esperados y los puntos marcadores obtenidos en 2D de cada vista.

Para cada punto de marcador y cada vista se minimiza la siguiente función:

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

Cuando el valor calculado, el valor depende de una serie de parámetros desconocidos que deben encontrarse a través de la optimización y Observedxy es la posición del punto de marcador en 2D. En total tengo (puntos marcadores * vistas) número de funciones como la anterior que pretendo minimizar.

He codificado una simulación de la cámara viendo todos los puntos marcadores, pero me preguntaba cómo manejar los casos cuando durante la ejecución no son visibles debido a la iluminación, la oclusión o simplemente no estar en la vista de la cámara. En la ejecución real de la aplicación, usaré una cámara web para ver el objeto, por lo que es probable que no todos los marcadores sean visibles a la vez y dependiendo de cuán robusto sea el algoritmo de visión de mi computadora, es posible que no pueda detectar un marcador todo el tiempo.

Pensé en establecer que el valor Diff sea 0 (Sigma Squared Difference = 0) en el caso de que no se podía observar el punto de marcador, ¿podría esto sesgar los resultados?

Otra cosa que noté es que el algoritmo no es tan bueno cuando se presenta con demasiadas opiniones. Es más probable que estime una mala solución cuando se presenta con demasiadas vistas. ¿Es este un problema común con el ajuste del paquete debido a la mayor probabilidad de golpear un mínimo local cuando se presenta con demasiadas opiniones?

¿Fue útil?

Solución

Es una práctica común simplemente dejar de lado los términos correspondientes a los marcadores faltantes. Es decir. No intentes minimizar calculateXY-observedXY si no hay observedXY término. No hay necesidad de establecer nada en cero, ni siquiera debe considerar este término en primer lugar, simplemente omitirlo (o, supongo que en su código, es equivalente establecer el error en cero).

El ajuste del paquete puede fallar terriblemente si simplemente arroja una gran cantidad de observaciones. Cree su solución incrementalmente resolviendo primero con algunas vistas y luego siga agregando.

Es posible que desee probar algún tipo de enfoque 'robusto'. En lugar de usar mínimos cuadrados, use una "función de pérdida"1. Estos permiten que su optimización sobreviva incluso si hay un puñado de observaciones que son incorrectas. Todavía puede hacer esto en un marco de Levenberg-Marquardt, solo necesita incorporar la derivada de su función de pérdida en el jacobiano.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top