Permítanme comenzar con algunas advertencias primero. Los únicos vehículos totalmente autónomos exitosos (en el sentido de que realmente pueden navegar en el mundo real) han sido los de Google. Google simplifica significativamente el problema de percepción al obtener y etiquetar manual / semiautomáticamente modelos 3D detallados de todos los lugares donde conducirán sus automóviles, de antemano. Además, tienen LIDAR Velodyne increíblemente caros junto con una gran cantidad de otros sensores [1] en sus automóviles. Al conducir, esto les permite alinear simplemente las nubes de puntos entrantes con las nubes pregrabadas, y gracias a las ubicaciones pre-etiquetadas de los semáforos, el marcado de carriles, etc., la tarea de percepción se reduce a la sustracción de fondo y al seguimiento (a lo largo del tiempo) de otros usuarios de la carretera, como vehículos y peatones. Por supuesto, estoy simplificando demasiado esto, porque su sistema de percepción todavía hace algunas hazañas increíbles, ¡como detectar señales de mano por parte de ciclistas! Pero quiero contrastar esto con los sistemas de cámara + RADAR que hasta ahora solo han funcionado con éxito en carreteras o en entornos urbanos controlados. Esto se debe a que si no tiene un Velodyne, muchos de los desafíos técnicos involucrados en la construcción de un automóvil totalmente autónomo siguen siendo problemas de investigación abiertos. Pero supondré que no tiene 60,000 $ de sobra, por lo que Velodyne LIDAR está fuera. [Si tienes un Velodyne, entonces Sebastian Thrun, fundador de los esfuerzos de Google y ganador del DARPA Urban Challenge, tiene un curso en línea [0] para ti].
Además, supondré que su automóvil tampoco tiene RADAR, lo que podría haberle permitido rastrear media docena de objetos en las proximidades de su automóvil con mucha precisión. Entonces, el sistema que describo a continuación se basa solo en cámaras pasivas (un par estéreo para ser precisos) y viene con las debilidades de las cámaras pasivas actuales, es decir, no funcionará en la noche, no funcionará en extremo condiciones climáticas como la lluvia o la nieve, probablemente también tendrá problemas en condiciones de iluminación extrañas, como si conduce al lado de un bosque y recibe mucha luz filtrada a través de los árboles, lo que causa mucha variación en la iluminación. Una vez que lo haya eliminado, intentaré señalar la literatura de vanguardia sobre cada uno de los submódulos que necesitará para construir algo que al menos funcione en un curso de prueba.
Ah … y supondré además que tienes una gran capacidad de cálculo disponible a bordo. Idealmente, un escritorio de múltiples núcleos con una GPU Nvidia reciente. Para las cámaras, usted mismo debe construir una línea de base ancha (línea de base ~ 0.5 m) [2]. Incluso encontré una discusión interesante sobre cómo elegir las cámaras [3]. Configuración de la plataforma de la cámara, incluida la elección de la configuración adecuada de la cámara, recoger los lentes y polarizadores correctos (?), Junto con IMU / GPS, sincronizar todo y llevar esos datos a la memoria (sin necesidad de E / S de disco que pueden ralentizar todo significativamente) no es trivial, pero al menos no es un problema de investigación abierto y cualquier persona con habilidades de programación decentes y conocimientos básicos de electrónica / microcontroladores puede hacerlo, por ejemplo, en un mes.
- Cómo obtener líneas de regresión y encontrar coeficientes de correlación a partir de datos
- ¿Cuáles son los temas más comunes omitidos de los cursos de aprendizaje automático?
- Cómo publicar un proyecto capstone
- ¿Qué técnicas se usan generalmente para la reducción de la dimensionalidad en el campo de análisis de Big Data?
- ¿Cuáles son las diferencias en las aplicaciones de filtrado colaborativo en los datos de calificación y en los datos de compra?
Como puede imaginar, hay dos componentes clave a tener en cuenta al construir un vehículo autónomo. Uno es el componente de percepción, y el otro es el componente de control o planificación. La planificación / control de vehículos autónomos se considera en gran medida un problema resuelto. Si tomaste IA en pregrado, es posible que hayas estudiado el algoritmo A *. Los algoritmos utilizados para la planificación (si conoce la escena) son extensiones del algoritmo A * [4] [5]. Estoy seguro de que las implementaciones genéricas de estos algoritmos también están disponibles en código abierto. Deberá adaptarlo significativamente al escenario de la escena de la carretera: cuáles son las configuraciones “buenas”, cuáles son los diferentes tipos de participantes en la carretera y cómo se mueven típicamente, cuáles son las ubicaciones válidas (espacio libre) donde se le permite moverse. su automóvil, cómo navegar a través de diferentes tipos de intersecciones, etc. Mi profesor de IA nos hizo modificar un Mario Bros de código abierto para hacer que Mario sea autónomo usando la búsqueda de árbol A * de vainilla, y eso podría ser un buen ejercicio para comprender cómo se podría hacer esto. En la práctica, para evitar movimientos bruscos bruscos, también deberá suavizar las decisiones que surgen de A *, pero estoy seguro de que cualquiera puede idear muchas estrategias para eso.
Necesitará comprender cómo interactuar con el bus CAN en su automóvil y poder dar comandos de dirección, frenado y aceleración al automóvil. Una vez más, no creo que sea demasiado difícil si te sientes cómodo con la electrónica y los microcontroladores. También deberá acceder al navegador GPS incorporado o interactuar con un tercero, para poder especificar a dónde desea ir, así como mejorar sus estimaciones visuales, por ejemplo, que se encuentra en una intersección, o límite de velocidad es tal y tal.
Ahora viene la parte realmente desafiante, que es el sistema de percepción. Necesita al menos cuatro componentes clave para que su automóvil comprenda la escena a su alrededor. Señalaré brevemente referencias a documentos o códigos para cada uno de estos módulos a continuación, pero debe descubrir cómo dividirlos entre sus núcleos y GPU, y cómo hacer que se comuniquen entre sí, es decir, cómo la arquitectura de el sistema de software y hardware podría verse así. Lamentablemente, no tengo conocimiento de nada en el dominio público que describa dicha arquitectura de software (excepto [1]), aunque estamos pensando en enviar dicho documento a una conferencia de robótica en el futuro cercano.
Estos componentes clave de percepción son:
(1) un sistema de Odometría Visual (VO o SLAM), que permitirá que el automóvil se localice y comprenda cuánto se ha movido, como una especie de mecanismo de retroalimentación. El mejor canal de código abierto disponible para esto es el sistema ORB-SLAM [6] (tanto monocular como estéreo). El documento relevante también es fácil de entender. Al igual que muchas tuberías de SLAM, ORB-SLAM también realiza cierres de bucle, es decir, identifica ubicaciones que vuelve a visitar durante un viaje para mejorar la estimación de ubicación a lo largo de la trayectoria del vehículo, y esto es algo que probablemente no necesite, ya que normalmente No visite el mismo lugar varias veces cuando vaya a conducir. Por lo tanto, también podría deshabilitarlo. También es posible que no desee construir y mantener un “mapa” de todo su viaje, ya que no ayuda a la precisión de la ubicación si no está volviendo a visitar el mismo lugar una y otra vez, pero desperdicia el cálculo y la memoria. Por lo tanto, es posible que desee comprender el sistema / código y realizar estas modificaciones.
También debe fusionar el GPS con las estimaciones de ubicación obtenidas por visión, ya que las estimaciones basadas en la visión (o las estimaciones basadas en la odometría de la rueda) tienden a desplazarse mucho con el tiempo. Una forma directa de hacerlo es incluir un término basado en GPS en la función objetivo que se utiliza de todos modos para SLAM [7]. ORB-SLAM puede funcionar en una CPU multinúcleo y no necesita una GPU. Es posible que pueda limitarlo a tres núcleos después de quitar los bits irrelevantes para un escenario automotriz.
(2) Detección de carril / bordillo / camino, una forma de hacerlo es mediante algoritmos de segmentación semántica. Estos algoritmos etiquetan cada píxel en una imagen dada, como perteneciente a una determinada categoría, por ejemplo, píxel que no es de carretera frente a píxel de carretera frente a píxel de marcado de carril frente a píxel de acera. Los de mejor rendimiento se basan en redes neuronales totalmente convolucionales [8]. Puede encontrar un punto de referencia para esta tarea, que también enumera los documentos correspondientes a los mejores sistemas de rendimiento [9]. Una implementación reciente que funciona en tiempo real en dispositivos móviles está aquí [9b]. En la edad oscura (antes de la actual revolución de aprendizaje profundo), algunas personas muy inteligentes propusieron una forma de obtener mapas locales (vistas de pájaro) desde una sola vista frontal, que es lo que debería combinar con CNN profundos para obtener si lo desea hacer esto bien [9c].
Desafortunadamente, estas CNN profundas pueden ser muy costosas computacionalmente. En un núcleo de CPU, puede ser tan lento como 1 fps. Entonces definitivamente necesitará explotar la GPU aquí; y, por lo tanto, se vuelve importante distribuir adecuadamente los recursos de GPU / CPU entre estos módulos [¡la detección de objetos también necesita GPU!]. El punto de referencia anterior [9] también menciona la velocidad computacional por cuadro en las CPU y GPU, y vale la pena verlo en detalle.
Debe ser sencillo estimar el carril y la superficie de la carretera en 3D al obtener la profundidad de cada píxel de la imagen [10].
(3) Detección de objetos + seguimiento, es decir, detectar la ubicación de objetos (otros vehículos, peatones, etc.) y rastrearlos a través de cuadros. Los mejores resultados en la detección de objetos son nuevamente métodos basados en redes neuronales convolucionales profundas. Afortunadamente, hay muchos códigos y modelos pre-entrenados disponibles en línea. Faster-RCNN [11] es probablemente el mejor. Desafortunadamente, actualmente no es en tiempo real. Entonces tendrás que trabajar para acelerarlo [12]; así como experimentar para ver cuán infrecuentemente necesita hacer una detección explícita (cada cuadro versus cada tercer cuadro para un sistema que opera a 10 Hz). Una gran cantidad de código de seguimiento también está disponible en línea [13]; los rastreadores identifican el mismo objeto a través de múltiples cuadros (problema de correspondencia) y / o reducen el tiempo de búsqueda requerido para la detección, ya que puede predecir dónde espera ver a un peatón o automóvil en particular en el siguiente cuadro y solo realiza la detección cerca de ese ubicación.
Nuevamente, puede usar la profundidad desde estéreo [10], más algunas suposiciones sobre las dimensiones promedio del automóvil (largo, ancho, alto), para elevar estas detecciones 2D a cuboides 3D.
Alternativamente, puede utilizar una profundidad más elegante desde estéreo [15] [16], para estimar “obstáculos” frente a espacio libre, y no preocuparse por si esos obstáculos son automóviles, peatones o cochecitos de bebé.
(4) Detección de señales de tráfico, es decir, detección de señales de tráfico y señales de tráfico.
Puede volver a usar Faster-RCNN mencionado anteriormente [11] para detectar la ubicación en 2D de las señales de tráfico y las señales de tráfico. Una manera fácil de estimar el estado de la señal de tráfico podría ser analizar (usando un clasificador como SVM) el histograma de color dentro del cuadro delimitador de la señal de tráfico.
Por supuesto, he dejado implícitos muchos detalles importantes, como cómo identificar una intersección de carreteras (semáforos, señales de tráfico, marcas de carriles, GPS + datos de mapas) y cómo comportarse en esos escenarios (modelado a través de su adaptación del algoritmo de planificación RRT *), o incluso cuál de los muchos semáforos que está viendo en una intersección se aplica a su carril. Algunas líneas de percepción casi completas interesantes, que cubren algunos de estos problemas, nuevamente usando solo cámaras se describen en [17] [18] [19], en caso de que esté interesado.
[0] Inteligencia artificial para robótica | Udacity
[1] http://cs.stanford.edu/people/te…
http://isl.ecst.csuchico.edu/DOC…
[2] Construir y calibrar una cámara estéreo con OpenCV (<50 €)
[3] ¿Cómo seleccionar cámaras para un sistema de visión estéreo?
[4] Explorando rápidamente un árbol aleatorio
[5] http://www.cs.cmu.edu/~ggordon/l…
[6] Página de inicio de Raul Mur Artal
[7] http://maxime.lhuillier.free.fr/…
[8] http://www.cs.berkeley.edu/~jonl…
[9] La suite de referencia KITTI Vision
[9b] https://arxiv.org/pdf/1606.02147…
[9c] https://www.inf.ethz.ch/personal…
[10] Mapa de profundidad de imágenes estéreo
[11] http://arxiv.org/pdf/1506.01497v…
[12] https://papers.nips.cc/paper/564…
[13] Andreas Geiger.
[14] Andreas Geiger.
[15] Stixel World – 6D-Vision
[16] http://www.lelaps.de/papers/badi…
[17] https://www.computer.org/csdl/tr…
[18] http://www.cv-foundation.org/ope…
[19] https://www.vision.ee.ethz.ch/pu…