c++ algorithm machine-learning nearest-neighbor

c++ - Aseguramiento de ICP, métricas internas



algorithm machine-learning (3)

En cuanto a sus ejemplos, parece que una de las cosas que determina si el partido es bueno o no, es la calidad de los puntos. ¿Podría usar / calcular un factor de ponderación al calcular su métrica?

Por ejemplo, puede ponderar los puntos que son co-lineales / coplanarios, o espacialmente cercanos, ya que probablemente definan la misma característica. Eso quizás permitiría que tu triángulo invertido sea rechazado (ya que los puntos están en una línea, y eso no es un gran indicador de la pose general), pero el caso de la esquina estaría bien, ya que definen más o menos el casco.

Alternativamente, tal vez la ponderación debe ser sobre cómo distribuidos los puntos están alrededor de la pose, una vez más tratando de garantizar que tenga una buena cobertura, en lugar de coincidir con pequeñas características indistintas.

Así que tengo un algoritmo iterativo de punto más cercano (ICP) que se ha escrito y que se ajustará a un modelo a una nube de puntos. Como un tutorial rápido para aquellos que no saben ICP es un algoritmo simple que se ajusta a los puntos de un modelo que finalmente proporciona una matriz de transformación homogénea entre el modelo y los puntos.

Aquí hay un tutorial de imágenes rápidas.

Paso 1. Encuentra el punto más cercano en el conjunto de modelos a tu conjunto de datos:

Paso 2: Usar un montón de matemáticas divertidas (a veces basadas en el descenso gradiente o SVD) acerca las nubes y repite hasta que se forme una pose:

! [Figura 2] [2]

Ahora que ese bit es simple y funciona, con lo que me gustaría ayudar es: ¿Cómo puedo saber si la pose que tengo es buena?

Así que actualmente tengo dos ideas, pero son un poco hacky:

  1. Cuántos puntos hay en el Algoritmo ICP. Es decir, si no tengo casi ningún punto, supongo que la postura será mala:

    Pero, ¿y si la pose es realmente buena? Podría ser, incluso con pocos puntos. No quiero rechazar buenas poses:

Entonces, lo que vemos aquí es que los puntos bajos realmente pueden hacer una muy buena posición si están en el lugar correcto.

Entonces, la otra métrica investigada fue la relación entre los puntos suministrados y los puntos usados. Aquí hay un ejemplo

Ahora exluimos los puntos que están muy lejos porque serán atípicos, ahora esto significa que necesitamos una buena posición de partida para que funcione el ICP, pero estoy de acuerdo con eso. Ahora en el ejemplo anterior, la seguridad dirá NO, esta es una mala postura, y sería correcto porque la relación de puntos vs puntos incluidos es:

2/11 < SOME_THRESHOLD

Entonces eso es bueno, pero fallará en el caso que se muestra arriba, donde el triángulo está boca abajo. Dirá que el triángulo invertido es bueno porque ICP usa todos los puntos.

No necesita ser un experto en ICP para responder esta pregunta, estoy buscando buenas ideas. Usando el conocimiento de los puntos, ¿cómo podemos clasificar si es una buena solución de postura o no?

Usar ambas soluciones juntas en tándem es una buena sugerencia, pero es una solución bastante coja si me preguntas, muy tonto para limitarlo.

¿Cuáles son algunas buenas ideas sobre cómo hacer esto?

PD. Si quiere agregar algún código, por favor vaya. Estoy trabajando en C ++.

PPS. Alguien me ayude a etiquetar esta pregunta. No estoy seguro de dónde debería caer.


ICP intenta minimizar la distancia entre su nube de puntos y un modelo, ¿sí? ¿No tendría más sentido evaluarlo en función de lo que esa distancia realmente es después de la ejecución?

Supongo que trata de minimizar la suma de las distancias cuadradas entre cada punto que intentas encajar y el punto más cercano al modelo. Entonces, si quiere una métrica para la calidad, ¿por qué no simplemente normalizar esa suma, dividiendo por la cantidad de puntos que le corresponde? Sí, los valores atípicos lo alterarán un poco, pero también van a alterar un poco tu ajuste.

Parece que cualquier cálculo que se le ocurra que proporcione más información que cualquier otro que ICP esté minimizando sería más útil incorporado en el algoritmo en sí mismo, por lo que también puede minimizarlo. =)

Actualizar

Creo que no entendí el algoritmo. Parece que selecciona iterativamente un subconjunto de puntos, los transforma para minimizar el error y luego repite esos dos pasos. En ese caso, su solución ideal selecciona tantos puntos como sea posible, manteniendo el error lo más pequeño posible.

Dijiste que combinar los dos términos parecía una solución débil, pero me parece una descripción exacta de lo que quieres, y captura las dos características principales del algoritmo (¿sí?). La evaluación usando algo así como error + B * (selected / total) parece espiritualmente similar a cómo se usa la regularización para abordar el problema de sobreajuste con algoritmos ML de descenso de gradiente (y similares). Seleccionar un buen valor para B requeriría algo de experimentación.


Un posible enfoque podría ser comparar las poses por sus formas y su orientación.

La comparación de formas se puede hacer con la distancia de Hausdorff hasta la isometría , es decir, las poses tienen la misma forma si

d(I(actual_pose), calculated_pose) < d_threshold

donde d_threshold debe encontrarse a partir de experimentos. Como las modificaciones isométricas de XI considerarían rotaciones por diferentes ángulos, parece ser suficiente en este caso.

Las posturas tienen la misma forma, debemos comparar su orientación. Para comparar la orientación, podríamos usar un modelo de Freksa algo simplificado. Para cada pose debemos calcular valores

{x_y min, x_y max, x_z min, x_z max, y_z min, y_z max}

y luego asegúrese de que cada diferencia entre los valores correspondientes para poses no rompa otro another_threshold , también derivado de experimentos.

Afortunadamente, esto tiene algún sentido, o al menos puede extraer algo útil a partir de esto.