Semana 15. Alineación Semántica
Esta semana he implementado un programa que realiza una aproximación al problema de calibración cámara-LiDAR basada en alineación semántica que presenta este paper. A partir de una segmentación semántica de la imagen RGB y de las etiquetas semánticas asociadas a los puntos LiDAR, el algoritmo proyecta los puntos 3D del LiDAR sobre el plano de la imagen utilizando una calibración inicial dada. Posteriormente, se generan N perturbaciones aleatorias de la rotación y traslación de esta calibración, proyectando de nuevo los puntos LiDAR para cada hipótesis. Para cada proyección se calcula una función de pérdida basada en la coincidencia entre la clase semántica del punto LiDAR proyectado y la clase del píxel correspondiente en la segmentación de la imagen. Finalmente, el algoritmo selecciona la transformación (rotación y traslación) que produce la menor pérdida semántica, obteniendo así la calibración que mejor alinea los datos LiDAR con la segmentación de la imagen.
Para probar el algoritmo se ha utilizado el frame 000130 del dataset de RELLIS. Se han implemenmtado diferentes aproximaciones al algoritmo mencionado en el paper.
Primero se empleó una pérdida simple de tipo binario. Si la clase del punto LiDAR proyectado coincide con la clase observada en la segmentación 2D su valor de pérdida es 0 y de lo contrario 1. Para hacer la comparación menos rígida, se usa una vecindad alrededor del píxel proyectado. La pérdida total se calcula como la media de estas penalizaciones sobre los puntos que se han proyectado de manera correcta. Se evaluaron valores de N =[100, 200, 400] y vecindad de [1, 2 ,3] obteniéndose los mejores resultados con N=400, y V = 3.
A diferencia de la pérdida anterior, en este segundo enfoque se sustituyó la pérdida binaria por una pérdida basada en distancia de tipo Chamfer unidireccional. En este caso, para cada punto LiDAR proyectado no se evalúa únicamente si coincide o no la clase del píxel correspondiente, sino que se calcula la distancia entre su proyección y el píxel más cercano que pertenezca a la misma clase semántica. La pérdida total se obtiene promediando estas distancias dentro de cada clase y combinando posteriormente las contribuciones de las distintas clases, evitando así que una clase con muchos más puntos domine el resultado global. Además, se descartan clases con muy poca representación tanto en la imagen como en la nube de puntos, con el fin de reducir inestabilidades en la evaluación. En esta implementación la pérdida se calculó únicamente sobre un subconjunto de la ontología, utilizando las clases con identificadores 12 (person), 14 (bush) y 17 (puddle). Estas clases se seleccionaron por presentar regiones bien delimitadas en la segmentación y una presencia suficientemente fuerte tanto en la imagen como en la nube LiDAR. Se usó el mismo valor de N que en el apartado anterior.
La tercera aproximación mantuvo la misma pérdida basada en distancia de tipo Chamfer unidireccional pero se ha modificado la manera de explorar la mejor calibración. En lugar de evaluar perturbaciones aleatorias se ha empleado una búsqueda en rejilla (grid search) en dos etapas diferenciadas. Primero una exploración gruesa inicial para elegir una región prometedora del espacio de rotaciones y a continuación, un refinamiento posterior con saltos más pequeños, el cuál cuenta con un un ajuste fino de traslación. La función de pérdida no cambia, pero si la forma en la que se minimiza. La búsqueda de la calibración se realiza mediante una estrategia coarse-to-fine. En una primera fase se evalúa una rejilla de rotaciones en el rango [-2°, 2°] con un paso de (0.5°) en cada eje, lo que genera 729 combinaciones posibles. Posteriormente se realiza un refinamiento alrededor de la mejor rotación encontrada utilizando una ventana de ±0.5° con paso de 0.1°, lo que supone 1331 evaluaciones adicionales. Finalmente se ajusta la traslación mediante una búsqueda local en el rango ±0.03 m con paso de 0.01 m.
La última aproximación que se ha probado ha sido utilizar la distancia de Chamfer bidireccional por clase. Mientras que en las versiones anteriores la pérdida se calculaba únicamente desde los puntos LiDAR proyectados hacia la región de la misma clase en la segmentación 2D, en este caso, se consideran ambas direcciones. Por un lado, se mide la distancia desde cada punto LiDAR proyectado hasta el píxel más cercano de su misma clase en la segmentación. Por otro, se calcula también la distancia desde los píxeles de la máscara semántica hacia los puntos LiDAR proyectados de esa misma clase. La pérdida de cada clase se obtiene combinando ambas contribuciones mediante una suma ponderada. Se empleó la misma estrategia de búsqueda en rejilla coarse-to-fine, aunque con un grid ligeramente más reducido. Es importante destacar que en esta implementación ambos términos no tienen el mismo peso debido a que la segmentación 2D tiene muchísimos más píxeles que puntos LiDAR, el término inverso se introduce solo como una regularización suave.
\[loss = 1.0 \cdot d_{LiDAR \rightarrow RGB} + 0.1 \cdot d_{RGB \rightarrow LiDAR}\]Los resultados de los experimentos se recogen en la siguiente tabla y en este enlace se encuentra el código y resultados de los experimentos.
| Método | Base Loss | Best Loss | Mejora (%) | Observación visual |
|---|---|---|---|---|
| Pérdida Binaria | 0.2808 | 0.2725 | 2.96 % | Mejora respecto al original |
| Chamfer unidireccional | 72.19 | 56.41 | 21.85 % | Peor que binaria pero aceptable |
| Chamfer unidireccional (Grid) | 72.19 | 54.89 | 23.97 % | Similar a sin grid |
| Chamfer bidireccional (Grid) | 566.47 | 455.82 | 19.53 % | Mejor resultado visual |
Dado que las funciones de pérdida operan en escalas diferentes, la comparación directa de sus valores absolutos no resulta útil. Por este motivo, se ha calculado la mejora relativa respecto a la pérdida inicial de cada método. Esta métrica se define como la reducción porcentual de la pérdida tras el procso de optimización. Los resultados obtenidos son unas correciones relativamente pequeñas, ya que, la calibración inicial ya era buena, simplemente se ha realizado un refinamiento fino para mejorarla.
- El overlay original:

- El overlay con pérdida binaria:

- El overlay con Chamfer unidireccional:
![]()
- El overlay con Chamfer unidireccional con grid:
![]()
- El overlay con Chamfer bidireccional con grid:
![]()
Paralelamente he continuado con la implementación de un programa cuyo objetivo es maximizar el solapamiento entre dos imágenes mediante la estimación de la transformación geométrica que mejor las alinea. El algoritmo busca la rotación y la traslación óptimas del patch sobre la imagen principal. Para ello, en primer lugar, se genera una máscara que identifica las zonas relevantes del patch y descarta los píxeles de fondo. A continuación se realiza una búsqueda gruesa, en la que se rota el patch con diferentes ángulos y se utiliza template matching para estimar de forma aproximada la posición donde podría encajar dentro de la imagen grande. Una vez obtenida esta estimación inicial, el algoritmo ejecuta una fase de refinado, en la que explora pequeñas variaciones de ángulo y desplazamiento alrededor de la solución inicial y evalúa cada candidato calculnado el error de superposición entre ambas imágenes utilizando únicamente los píxeles válidos de la máscara. Finalmente, la combinación de rotación y posición que produce el menor error se selecciona como la solución óptima, ya que corresponde al alineamiento en el que ambas imágenes presentan el mayor solapamiento.
Se han usado las siguientes imágenes sintéticas creadas con la herramienta FIGMA, la imagen de la izquierda corresponde con nuestra base y la de la derecha el recorte trasladado y rotado que intentamos alinear.
PRUEBA 1:
Para una primera prueba se ha usado la siguiente imagen sintética creada con la herramienta FIGMA, la imagen de la izquierda corresponde con nuestra base y la de la derecha el recorte trasladado y rotado que intentamos alinear.

Se obtienen los siguientes resultados:

PRUEBA 2:
En esta segunda prueba se ha generado la imagen con inteligencia artifical usando el siguiente prompt:
- A very simple childlike drawing like made by a 3-year-old. An orange cartoon fox with very basic shapes standing on green grass, a simple tree next to it, blue sky background. Minimal details, flat colors, thick uneven lines, naive drawing style, like a toddler drawing, very simple composition.
Y se ha repetido el mismo proceso mencionado anteriormente:

Se obtienen los siguientes resultados:

Además he etiquetado parte de un dataset de detección de basuras que servirá para el proyecto en un futuro.