Proyección Camera-Lidar: Navegación entre 2D y 3D

- Hace 4 meses

Los lidares y las cámaras son dos sensores esenciales para la percepción y la comprensión de la escena. Construyen un entorno en tándem y proporcionan un medio para la detección y localización de otros objetos, proporcionando a los robots una rica información semántica necesaria para una navegación segura. Muchos investigadores han comenzado a explorar el modelo de aprendizaje profundo multimodal para la detección precisa de objetos en 3D. Un ejemplo interesante sería el algoritmo desarrollado por Aptiv, PointPainting.

Entonces, ¿por qué estos dos sensores son complementarios?

La cámara supera a LiDAR cuando se trata de capturar una representación más densa y rica. De la siguiente figura, mirando solo la nube de puntos dispersos, es relativamente difícil identificar correctamente el cuadro negro como un peatón. Sin embargo, prestando atención a la imagen RGB, incluso con la persona mirando hacia atrás, podríamos decir fácilmente que el objeto parece un peatón. Además de eso, otras características visuales útiles que podrían extraerse incluyen el semáforo y la señal de tráfico que LiDAR tendría dificultades.

Imagen de la entrada

Por el contrario, el LiDAR sobresale cuando se trata de extraer información de distancia. Es extremadamente difícil medir la distancia usando la cámara en una vista en perspectiva estándar.

Al fusionar la información los dos sensores, la idea es que podamos aprovechar las ventajas de ambos, superando las limitaciones individuales. Tener múltiples sensores a bordo también permite la redundancia, que es un elemento crucial en la conducción autónoma segura en caso de falla del sensor.

Objetivo

En esta publicación, me gustaría dar un paso más en cómo LIDAR y los datos de la cámara se pueden aprovechar y fusionar simultáneamente para crear una escena 3D más enriquecedora y precisa del entorno. Lo que necesita comprender es que los datos del LIDAR se procesan como nubes de puntos 3D y la cámara como puntos de píxeles en un plano 2D.

Utilizaremos el conjunto de datos de detección de objetos KITTI 3D como referencia. Consulte el sitio web de KITTI Dataset o el código en Github para comprender el formato de datos.

Para el resto de este artículo, primero tendremos que analizar el problema establecido con respecto a la ubicación del sensor y revisar el conjunto de datos de detección de objetos KITTI para comprender la estructura de datos. Cómo se realiza la calibración para comprender las matrices de calibración. A continuación, ver en detalle el mapeo de proyección 3D-2D y 2D-3D, y finalmente, mostrar visualmente los diferentes tipos de representación de datos de la cámara lidar. Todos los formatos de texto en línea son funciones, variables o archivos en el código.

Configuración del sensor, calibración y sistema de coordenadas (KITTI)

Imagen de la entrada

Antes de comenzar con nuestro análisis, es necesario conocer la posición relativa de los sensores durante el proceso de adquisición de datos. Esta es información necesaria para realizar cualquier transformación entre un marco de coordenadas a otro. Tenga en cuenta que cada sensor tiene su propio marco de coordenadas como se muestra en la figura superior.

Especificación de hardware

KITTI tiene varios sensores, incluidos LIDAR, cámara en escala de grises, cámaras en color e IMU a bordo del vehículo. Sin embargo, solo nos centraremos en:

  • Cámara 0: cámara en escala de grises, cámara izquierda de una plataforma estéreo. Esta es la cámara de referencia.
  • Cámara 2: cámara de color RGB, cámara izquierda de una plataforma estéreo
  • Velo: escáner láser Velodyne de 64 haces

Sistema de coordenadas: vehículo orientado a la izquierda, sistema de coordenadas a la izquierda.

¿Qué datos tenemos?

Nube de puntos Lidar fileid.bin: matriz 2D con forma [num_points, 4] Cada punto codifica XYZ + reflectancia.

Instancia de objeto fileid_label.txt: para cada fila, la anotación de cada objeto se proporciona con 15 columnas que representan ciertos metadatos y propiedades de cuadro 3D en las coordenadas de la cámara:

tipo | truncamiento | visibilidad | ángulo de observación | xmin | ymin | xmax | ymax | altura | ancho | longitud | tx | ty | tz | podrido

Algunos tipos de instancias están marcados como «DontCare», lo que indica que no están etiquetados.

Imagen RGB fileid_image.png: Imagen de la cámara 2

Parámetros de Calibración

fileid_calib.txt

Los parámetros de calibración se almacenan en orden de fila mayor. Contiene los parámetros de la matriz de proyección 3×4 que describen el mapeo de puntos 3D en el mundo a puntos 2D en una imagen.

Es importante tener en cuenta que la calibración se realiza con cam0 como sensor de referencia. El escáner láser está registrado con respecto al sistema de coordenadas de la cámara de referencia. La rectificación R_ref2rect también se ha considerado durante la calibración para corregir la alineación plana entre cámaras.

Contiene la siguiente información:

  • P_rect [i]: transformación proyectiva del marco de cámara de referencia rectificado a cam [i]. Tenga en cuenta que bx [i] denota la línea de base con respecto a la cámara de referencia 0.
Imagen de la entrada
  • R0_rect: rotación para tener en cuenta la rectificación de puntos en la cámara de referencia.
  • Tr_velo_to_cam: transformación euclidiana de lidar a cámara de referencia cam0.

Proyección entre cuadros

Recuerde del álgebra lineal que una matriz de proyección, cuando se expresa en coordenadas homogéneas, es simplemente una transformación lineal que deforma los puntos mediante la multiplicación de un espacio vectorial a otro espacio vectorial x ’= Px. Se puede componer para atravesar los diferentes sistemas de coordenadas. Os remito a este increíble video para más explicaciones.

La matriz de transformación en este contexto representa principalmente la transformación del cuerpo rígido entre los sensores y la proyección en perspectiva (colapsando el vector z de la columna) de puntos 3D a 2D. Estas matrices se dan en los archivos de calibración.

Proyección de lidar a la cámara 2 project_velo_to_cam2: Supongamos que nos gustaría convertir los puntos Velodyne en coordenadas de cámara, se consideran las siguientes transformaciones.

Tenga en cuenta que la multiplicación debe realizarse en coordenadas homogéneas para simplificar el cálculo. Para convertir a coordenadas de píxeles, simplemente normalice por coordenadas z.

Imagen de la entrada

Proyección de la cámara a la coordenada lidar: la anotación de cuadros 3D se da en la coordenada de la cámara. Si nos quisiéramos convertir los vértices de la caja en el marco de la cámara a lidar, project_cam2_to_velowe calcula la transformación inversa y lo transformamos hacia atrás.

Cajas en Imagen

ver render_image_with_boxes

Las cajas se usan comúnmente para representar a otros agentes y peatones. Es más sencillo adquirir y anotar definiendo 8 vértices para localizar completamente el objeto como un modelo de caja. En mi opinión, las cajas pueden no ser las mejores para representar a los peatones, ya que no son rígidas.

Hay algunos otros métodos para representar objetos que incluyen puntos clave, modelo CAD y máscaras de segmentación que vale la pena considerar.

Imagen de la entrada

A partir de la anotación, se nos da la ubicación de la caja (t), el ángulo de guiñada (R) de la caja en las coordenadas de la cámara (guardar para asumir que no hay cabeceo ni balanceo) y las dimensiones: altura (h), ancho (w) y longitud (l). ¡Tenga en cuenta que las cajas 3D de objetos están anotadas en coordenadas de cámara! Dada esta información, podemos transformar fácilmente el modelo de caja en la ubicación exacta en el espacio de la cámara.

Considere la figura 5 anterior, cada origen de instancia de caja se establece en la base y el centro, que corresponde a la misma altura que el vehículo del ego y el nivel del suelo. Para proyectar cuadros 3D a la imagen:

  • Primero, obtenemos el recuadro en la coordenada de la cámara a través de [R | t] donde R = roty and t = (tx, ty, tz) a partir de la anotación inlabel.txt
  • A continuación, aplique la proyección en perspectiva al plano de imagen P_rect2cam2

Nube de puntos en imagen [3D-2D]

ver render_lidar_on_image

Imagen de la entrada

Si nos gustaría procesar datos en 2D, se puede recopilar más información proyectando una nube de puntos en la imagen para construir una representación de mapa de profundidad escasa utilizando el valor de rango lidar correspondiente (z). La escasez depende del número de haces lidar que se asignan a los píxeles.

Los mapas de profundidad son datos de alcance convenientes y precisos en comparación con el mapa de profundidad de predicción de una cámara. Un trabajo que utilizó un mapa de profundidad dispersa para mejorar la detección basada en monocular se describe en pseudo-lidar ++.

Para asignar puntos a píxeles, esta es una transformación proyectiva de lidar a plano de imagen.

  • Calcular matriz de proyección project_velo_to_cam2.
  • El proyecto apunta al plano de la imagen.
  • Eliminar puntos que se encuentran fuera de los límites de la imagen.

Cajas en PointCloud [2D-3D]

ver render_lidar_with_boxes

Visualizar y trabajar en el espacio Lidar proporciona la comprensión más completa en términos de razonamiento espacial. Además, podemos cambiar fácilmente el punto de vista de nuestra cámara para mirar el entorno desde una perspectiva diferente si es necesario.

Imagen de la entrada

En este ejemplo, en lugar de dibujar todos los puntos escaneados del escáner LIDAR girado 360 grados, solo consideraremos las nubes de puntos que se encuentran dentro del campo de visión de la cámara como se muestra en la figura 4. Los pasos dados son similares al ejemplo en Nube de puntos en la imagen. A continuación, necesitaremos aplicar la transformación inversa para proyectar los cuadros 3D en coordenadas de cámara a LIDAR usando la proyección project_cam2_to_velo.

Los pasos son los siguientes:

  • Calcular matriz de proyección project_velo_to_cam2.
  • El proyecto apunta al plano de la imagen.
  • Eliminar puntos que se encuentran fuera de los límites de la imagen.
  • Proyectar cuadros 3D a coordenadas LIDAR

Para terminar

Comprender cómo transformar los datos de un sensor a otro es esencial para desarrollar el rendimiento de nuestro algoritmo. Por ejemplo, supongamos que estamos trabajando en un detector 3D monocular, los puntos LIDAR proporcionan un control de la cordura de la precisión de nuestro detector al registrar las cajas 3D en los puntos LIDAR.

Sin embargo, cuando se trata de la fusión de sensores en sí, la tarea sigue siendo un desafío, ya que los sensores multimodales tienen varias diferencias en la forma en que los datos se almacenan y procesan como se explica. Esto dificulta la alineación geométrica y temporal en tiempo de ejecución. Una buena calibración es esencial, para empezar.

https://github.com/darylclimb/cvml_project/tree/master/projections/lidar_camera_projection – Código