Semana 19: Submuestreo de LiDAR semántico
Comparación del LiDAR estándar con el LiDAR semántico con ruido y pérdidas añadidos
Primero, se realizó una comparación entre ambos sensores LiDAR en CARLA para evaluar si el efecto de añadir ruido y pérdidas al LiDAR semántico se asemeja al del estándar, lo cual era el objetivo a lograr, para simular entornos realistas con las etiquetas semánticas.
Conclusión
Los resultados muestran que los efectos son similares, lo que confirma que el LiDAR semántico puede utilizarse en la generación de futuros datasets sin perder realismo.
Submuestreo del sensor LiDAR semántico
Se ha implementado un submuestreo por vóxeles (Voxel Grid Downsampling) con los siguientes objetivos:
- Reducir la densidad de puntos en las muestras del dataset, evitando la necesidad de procesarlos posteriormente.
- Mantener una distribución espacial uniforme, evitando zonas con demasiados puntos redundantes.
El método de submuestreo por vóxeles consiste en dividir el espacio en celdas cúbicas (vóxeles) y seleccionar un punto representativo por cada una, eliminando los demás.
En este caso, se ha seleccionado como punto representativo el centroide de cada vóxel, lo que conserva la estructura general de la nube de puntos mientras se reduce la cantidad de datos.
Función ‘voxel_downsampling’
Para realizar este proceso, se ha implementado la siguiente función en Python:
from scipy.spatial import cKDTree
def voxel_downsampling(points, semantic_tags, voxel_size=0.5):
print(f"Antes del submuestreo: {len(points)} puntos")
# Convertir los puntos a un objeto Open3D
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
# Aplicar el submuestreo
downsampled_pcd = pcd.voxel_down_sample(voxel_size)
downsampled_points = np.asarray(downsampled_pcd.points)
# Usar KDTree para asignar etiquetas desde los puntos originales a los reducidos
tree = cKDTree(points) # Construimos el KDTree con los puntos originales
_, indices = tree.query(downsampled_points, k=1) # Encontrar el vecino más cercano, Buscamos el índice en los puntos originales
# Asignar la etiqueta semántica correspondiente
downsampled_tags = semantic_tags[indices]
print(f"Después del submuestreo: {len(downsampled_points)} puntos")
return downsampled_points, downsampled_tags
Parámetros de entrada:
points: np.array (N, 3)
- Coordenadas XYZ del LiDAR.semantic_tags: np.array (N,)
- Etiquetas semánticas de cada punto.voxel_size: float
- Tamaño del vóxel para el agrupamiento, en metros.
Parámetros de salida:
np.array (M, 3)
- Nube de puntos reducida mediante agrupamiento por vóxeles.np.array (M)
- Etiquetas semánticas asignadas a los puntos reducidos.
Con pcd.voxel_down_sample(voxel_size)
se realiza el submuestro de la nube de puntos con los vóxeles de tamaño voxel_size
, que es un cubo de voxel_size × voxel_size × voxel_size
metros.
Corrección del desfase en etiquetas con KDTree
Inicialmente, tras aplicar el submuestreo, el tamaño del array de etiquetas ya no coincidía con la cantidad de puntos, lo que provocaba un desfase de los colores en la visualización.
Para resolverlo, se utilizó cKDTree(points)
, una estructura de datos que organiza los puntos en un árbol espacial para buscar eficientemente sus vecinos más cercanos.
Para reasignar etiquetas, se utiliza tree.query(downsampled_points, k=1)
, que busca el punto más cercano en la nube de puntos original para cada punto submuestreado. Esta función devuelve:
- Las distacias de los puntos.
- Los índices, que se usarán para obtener las etiquetas semánticas correspondientes a cada punto.
Resultado
Finalmente, se consiguieron resultados tan buenos como una reducción de 18.104 puntos en un frame antes del submuestreo a 7.152 puntos después del submuestreo con un tamaño de 0,5 metros de vóxel, lo que representa una reducción del 60% de los puntos, lo que optimiza el almacenamiento y el procesamiento de datos sin perder información estructural relevante.
Otros
También se ha estado trabajando en la creación de otro escenario, el de un camino forestal con zona de camping, para ello se han estado buscando modelos 3D en páginas como CGTrader o Sketchfab, ya que CARLA no tiene suficientes modelos 3D para dicho entorno.