Semana 11. Segmentación Semántica 3D con LiDAR mediante MMDetection3D
Esta semana he estado trabajando en la segmentación semántica aplicada a datos LiDAR en 3D. Para ello he utilizado el script inference.py, cuyo objetivo es realizar segmentación semántica de nubes de puntos a partir de un modelo previamente entrenado. El modelo está basado en MMDetection3D, una extensión de PyTorch especializada en visión 3D, y el procesamiento de los datos se apoya en utilidades de mmengine y transformaciones específicas para nubes de puntos.
Para comenzar he replicado el entorno necesario para lanzar el programa inference.py.
El programa comienza cargando el modelo entrenado (--model) y un archivo LiDAR en formato .bin (--lidar). Opcionalmente, permite indicar si los puntos incluyen intensidad (--has_intensity), proporcionar una ontología con el mapeo de clases a colores (--ontology) y activar la visualización interactiva (--visualize). El modelo se carga automáticamente en GPU si está disponible, o en CPU en caso contrario.
Para preparar los datos de entrada, el script construye una muestra compatible con el pipeline de MMDetection3D. Mediante la transformación LoadPointsFromFile, se cargan los puntos 3D (x, y, z, intensidad si existe). Posteriormente, los datos se empaquetan con Pack3DDetInputs para que el modelo pueda procesarlos correctamente. Este paso es equivalente al preprocesamiento que se realiza durante el entrenamiento, garantizando que la inferencia mantenga el mismo formato de entrada.
Una vez preprocesados los datos, se ejecuta la inferencia en modo predict. El modelo devuelve una máscara de segmentación semántica por punto (pts_semantic_mask), donde cada punto de la nube recibe una etiqueta numérica correspondiente a su clase. Estas etiquetas representan las distintas categorías aprendidas durante el entrenamiento (por ejemplo, terreno, vegetación, obstáculos, etc., dependiendo del modelo utilizado).
Para facilitar la interpretación visual, el script genera un lookup table (LUT) que asigna un color RGB a cada clase. Si no se proporciona una ontología externa, los colores se generan aleatoriamente. Con este mapeo se crea una versión coloreada de la predicción, que se guarda en formato .bin como matriz de colores normalizados.
Además, el programa renderiza la nube de puntos coloreada y genera automáticamente una imagen .png con la visualización proyectada. Si se activa la opción --visualize, también se abre una ventana interactiva utilizando Open3D, donde se puede explorar la nube de puntos en 3D, modificar el punto de vista y analizar visualmente los resultados de la segmentación.
Para poder ejecutar correctamente el entorno he tenido que utilizar WSL (Windows Subsystem for Linux), ya que, las dependencias de MMDetection3D, PyTorch y Open3D estaban preparadas para un entorno Linux y resultaban problemáticas en Windows. Esto me ha permitido replicar el entorno requerido para la inferencia.
Aunque la inferencia se ejecutaba correctamente y el modelo generaba sin problemas el archivo salida.bin con los colores predichos para cada punto, el script fallaba en la fase final de renderizado. Concretamente, intentaba visualizar la nube de puntos utilizando Open3D dentro de WSL, pero mi configuración no disponía de soporte gráfico completo. Open3D activaba automáticamente el modo EGL headless, y al intentar crear el contexto OpenGL necesario para la visualización, se producía un segmentation fault. Como consecuencia, el proceso se detenía antes de generar la imagen .png final.
La solución adoptada ha consistido en eliminar la dependencia de Open3D para el renderizado. En su lugar, he implementado un script alternativo (make_png.py) que genera una proyección 2D de la nube de puntos utilizando únicamente NumPy para el procesamiento de datos y Pillow para la creación de la imagen. De esta forma se evita completamente la necesidad de un entorno gráfico o contexto OpenGL, eliminando el fallo y permitiendo generar correctamente el PNG final con la segmentación coloreada.
Gracias a este cambio, el pipeline de inferencia funciona de manera estable en WSL, produciendo tanto el archivo binario con las predicciones como la imagen renderizada sin errores.
!
A su vez, esta semana he comenzado con la redacción de la introducción y el estado del arte del TFG en Overleaf. Los siguientes pasos serán seguir con la redacción y realizar Image Stitching.