NVIDIA Jetson Nano: Detección y Seguimiento de Carriles

Zachariah Peterson
|  Creado: Abril 9, 2020  |  Actualizado: Marzo 23, 2021
Aeronaves furtivas y radar cuántico

Los vehículos autónomos están convirtiéndose lentamente en una parte importante de la industria automotriz. Muchos creen que los vehículos completamente autónomos pronto estarán circulando junto a los humanos, y las compañías tecnológicas están en una carrera para desplegar vehículos totalmente autónomos. En diciembre de 2018, Waymo, la compañía que surgió del proyecto de coche autónomo de Google, inició oficialmente su servicio comercial de coches autónomos en los suburbios de Phoenix. Compañías como May Mobility, Drive.ai y Uber están siguiendo el mismo camino.

Los vehículos autónomos pueden parecer una gran visión, pero los vehículos semiautónomos ya están entre nosotros. Los nuevos coches de Tesla cuentan con la función Tesla Autopilot, que es capaz de reconocer y seguir carriles, control de crucero adaptativo y estacionamiento automático. La capacidad de identificar y seguir los carriles en la carretera es uno de los muchos requisitos previos para los vehículos sin conductor. Aunque el reconocimiento de carriles puede parecer un problema difícil, puedes comenzar a desarrollar algoritmos de reconocimiento y seguimiento de carriles con la plataforma de hardware NVIDIA Jetson Nano.

Introducción a Jetson Nano

El Jetson Nano COM es ligeramente más grande que un Raspberry Pi 3, pero puede ejecutar redes neuronales en paralelo con 472 Gflops de potencia. Esto es aproximadamente 22 veces más potente que el Raspberry Pi 3 y es altamente eficiente en términos de energía, consumiendo tan solo 5 W. Esta placa es perfecta para aplicaciones de IA embebidas que se ejecutan en un kernel de Linux reducido. Tiene suficiente potencia de procesamiento y memoria a bordo para aplicaciones de procesamiento de imágenes y videos de alta calidad. Las características clave de Jetson Nano incluyen:

  • GPU: GPU basado en la arquitectura NVIDIA Maxwell™ de 128 núcleos
  • CPU: ARM® A57 de cuatro núcleos
  • Cámara: carriles MIPI CSI-2 DPHY, 12x (Módulo) y 1x (Kit de Desarrollador)
  • Memoria: 4 GB LPDDR4 de 64 bits; 25.6 gigabytes/segundo
  • Conectividad: Ethernet Gigabit
  • Soporte de OS: Linux para Tegra®
  • Tamaño del Módulo: 70mm x 45mm
  • El kit de desarrollador es una excelente herramienta para probar un nuevo algoritmo para aplicaciones de visión por computadora/procesamiento de imágenes. Si no estás familiarizado con la plataforma Jetson Nano, echa un vistazo a este artículo. De lo contrario, sigue leyendo para ver cómo puedes implementar fácilmente una potente aplicación de procesamiento de imágenes para el reconocimiento de carriles.
Developer kit for NVIDIA Jetson Nano
Kit de desarrollador NVIDIA Jetson Nano. [Image source]

Reconocimiento de Carriles con Jetson Nano

Para este proyecto, necesitamos un COM Jetson Nano o una placa de desarrollo y una cámara CSI (una cámara CSI Raspberry Pi v2 funciona bien). Mostraré esta aplicación usando la placa de desarrollo Nano, pero puedes construir fácilmente una placa base personalizada para un COM Nano e implementar esta aplicación. La cámara CSI se conectará al puerto de la cámara en el Jetson Nano, aunque podrías usar una cámara USB o cámaras IP. A continuación, se encuentran los requisitos necesarios para que este proyecto funcione con éxito:

Hardware

  • NVIDIA Jetson Nano
  • Cámara CSI

Paquetes de Software

  • Python
  • OpenCV
  • Nanocamera

Implementación

La implementación completa de este proyecto se puede encontrar en GitHub. Sigue los pasos a continuación para obtener una demostración de este proyecto en funcionamiento. Estos pasos son importantes procesos de tratamiento de imágenes que están destinados a hacer que el reconocimiento de carriles sea más preciso.

Percepción

El primer paso de nuestro sistema de detección de carriles es poder leer imágenes en vivo desde la cámara. Para los nuevos usuarios que trabajan con Jetson Nano, trabajar con las cámaras podría ser complicado. Para esto, utilizaremos la librería NanoCamera. Esta librería no es la mejor opción para una aplicación de grado de producción, pero funciona para una aplicación más simple como la que se muestra aquí.

Primero, instala la librería con pip:

.

Leyendo la imagen en vivo desde la cámara:

.

Eliminar ruido con desenfoque

Para hacer la imagen más suave y eliminar el ruido no deseado, podemos aplicar un desenfoque gaussiano. Esto implica calcular el valor de cada píxel como un promedio ponderado de los píxeles circundantes.

Gaussian blur algorithm for lane recognition
Algoritmo de desenfoque gaussiano para suavizado de imágenes. [Fuente de la imagen]

OpenCV incluye una función para aplicar desenfoque gaussiano a una imagen:

.

Transformación de color

Después del desenfoque gaussiano, la imagen todavía está en RGB y debe transformarse al espacio de color HSV. La separación de colores se utilizará para eliminar colores no deseados de la imagen. Una vez que la imagen está en HSV, podemos "eliminar" todos los colores innecesarios de la imagen especificando un rango de escala de grises.

.

Operaciones morfológicas - Dilatación

La dilatación añade píxeles a los bordes de los objetos en una imagen. Aplicar dilatación a la imagen ayudará a cerrar cualquier espacio suelto en las imágenes de líneas.

.

Canny (Detección de Bordes)

Para detectar líneas de carril, podemos usar una técnica llamada detección de bordes de Canny. La detección de bordes de Canny se puede utilizar para extraer información estructural útil de un objeto. La biblioteca OpenCV proporciona una función de detección de bordes de Canny que se puede usar para detectar bordes en una imagen. Para que la detección de Canny funcione, necesitamos suministrar umbrales mínimo y máximo. OpenCV generalmente recomienda que el valor sea (100, 200) o (200, 400), por lo que estamos usando (200, 400).

.
Canny edge detection applied to a camera image
Imagen con detección de bordes de Canny. Note las líneas mostradas en la imagen.

Aislar Región de Interés

La imagen de salida del borde de Canny contiene algo de ruido. Toda información que no sean carriles en la imagen puede ser aislada reduciendo la región de interés. Cuando realizamos el reconocimiento de carriles y la navegación, no necesariamente necesitamos ver toda la imagen. Una manera fácil de hacer esto es simplemente recortar la mitad superior de la imagen.

ROI reduction for lane recognition
Imagen original (izquierda) e imagen con región de interés recortada (derecha).

El código para reducir la región de interés es:

.

Detectar Segmentos de Línea - Líneas de Hough

Después de que se redujo la región de interés, los carriles son claramente visibles con cuatro líneas distintas. Sin embargo, la computadora no sabe que estas líneas representan los límites de dos carriles. Por lo tanto, necesitamos una forma de extraer las coordenadas para estas líneas de carril. Una transformada de Hough es una técnica utilizada en el procesamiento de imágenes para extraer características como líneas, círculos y elipses. Se puede utilizar para encontrar líneas rectas a partir de un número de píxeles que parecen formar una línea. Esto se puede hacer con la función HoughLinesP en OpenCV. La función ajusta muchas líneas a través de todos los píxeles blancos y devuelve el conjunto de líneas más probable sujeto a algunas restricciones de umbral mínimo.

Lines found during lane recognition
Detección de líneas con una transformada de Hough aplicada.

Aquí está nuestro código que detecta segmentos de línea usando una Transformada de Hough. La mayoría de los parámetros utilizados aquí se pueden determinar mediante prueba y error o seleccionando parámetros de imágenes de referencia.

.

Combinar Segmentos de Línea en Dos Líneas de Carril

La salida de la función detect_line_segments() produce un conjunto de pequeñas líneas con coordenadas de punto final (x1, y1) y (x2, y2). Necesitamos encontrar una forma de combinarlas en solo dos líneas para las líneas de carril izquierdo y derecho, pero ¿cómo logramos eso? Una forma es clasificar estos segmentos de línea por sus pendientes.

Todas las líneas del carril izquierdo tienen una pendiente positiva, y los segmentos de línea que pertenecen a la línea del carril derecho tienen una pendiente negativa. Basándonos en estos dos nuevos grupos, podemos tomar el promedio de las pendientes y las intersecciones de los segmentos de línea para obtener las pendientes y las intersecciones de las líneas de los carriles izquierdo y derecho. Esto se implementa con la función

..

average_slope_intercept()

..

. La función make_points() es una función auxiliar para la función average_slope_intercept(), que toma la pendiente y la intersección de una línea, y devuelve los puntos finales del segmento de línea. En este punto, ¡ahora tenemos las líneas de los carriles!

¿Qué sigue?

En este punto, la salida de esta función sería la entrada a otro algoritmo para controlar la velocidad y la dirección del vehículo. Para hacer esto, se puede calcular un ángulo de dirección a partir de las líneas de carril detectadas y luego pasarlo a un controlador PID para minimizar el ángulo de dirección y mantener el vehículo centrado.

Aunque esto se hizo con una placa de desarrollo Nano, el mismo código proporciona un punto de partida para desplegar un sistema en un sistema de procesamiento de imágenes embebido para un entorno de producción. Para hacer esto, necesitarás construir una base real para el Jetson Nano. Esto es más fácil cuando usas las herramientas de diseño de electrónica modular en la aplicación Upverter Board Builder. Al adoptar un enfoque modular, puedes personalizar fácilmente una base para un Jetson Nano, cámaras y otros sensores para el reconocimiento de carriles.

Las herramientas de diseño de electrónica modular en Upverter te dan acceso a una amplia gama de COMs estándar en la industria y módulos populares sin necesidad de descargar o instalar ningún software nuevo. Puedes crear hardware de grado de producción para una variedad de aplicaciones, incluyendo el reconocimiento de carriles y otras tareas de procesamiento de imágenes con Jetson Nano, utilizando una interfaz de usuario de arrastrar y soltar. Si tu sistema necesita funcionalidades adicionales, puedes incluir conectividad inalámbrica, una variedad de sensores y mucho más.

Echa un vistazo a algunas historias de éxito de clientes de Gumstix o contáctanos hoy para aprender más sobre nuestros productos, herramientas de diseño y servicios.

Sobre el autor / Sobre la autora

Sobre el autor / Sobre la autora

Zachariah Peterson tiene una amplia experiencia técnica en el mundo académico y la industria. Actualmente brinda servicios de investigación, diseño y marketing a empresas de la industria electrónica. Antes de trabajar en la industria de PCB, enseñó en la Universidad Estatal de Portland y realizó investigaciones sobre la teoría, los materiales y la estabilidad del láser aleatorio. Su experiencia en investigación científica abarca temas de láseres de nanopartículas, dispositivos semiconductores electrónicos y optoelectrónicos, sensores ambientales y estocástica. Su trabajo ha sido publicado en más de una docena de revistas revisadas por pares y actas de congresos, y ha escrito más de 1000 blogs técnicos sobre diseño de PCB para varias empresas. Es miembro de IEEE Photonics Society, IEEE Electronics Packaging Society, American Physical Society y Printed Circuit Engineering Association (PCEA), y anteriormente se desempeñó en el Comité Asesor Técnico de Computación Cuántica de INCITS.

Recursos Relacionados

Volver a la Pàgina de Inicio
Thank you, you are now subscribed to updates.