NVIDIA Jetson Nano: Detecção e Rastreamento de Faixas

Zachariah Peterson
|  Criada: Abril 9, 2020  |  Atualizada: Marco 23, 2021
Aeronaves furtivas e radar quântico

Veículos autônomos estão se tornando lentamente uma parte importante da indústria automotiva. Muitos acreditam que veículos totalmente autônomos em breve estarão dirigindo ao lado de humanos, e empresas de tecnologia estão em uma corrida para implantar veículos totalmente autônomos. Em dezembro de 2018, Waymo, a empresa que surgiu do projeto de carro autônomo do Google, iniciou oficialmente seu serviço comercial de carro autônomo nos subúrbios de Phoenix. Empresas como May Mobility, Drive.ai e Uber estão seguindo o mesmo caminho.

Veículos autônomos podem parecer ser uma visão grandiosa, mas veículos semi-autônomos já estão entre nós. Os novos carros da Tesla têm o recurso Tesla Autopilot, que é capaz de reconhecimento e rastreamento de faixas, controle de cruzeiro adaptativo e estacionamento automático. A capacidade de identificar e rastrear faixas na estrada é um dos muitos pré-requisitos para veículos sem motorista. Embora o reconhecimento de faixas possa parecer um problema difícil, você pode começar a desenvolver algoritmos de reconhecimento e rastreamento de faixas com a plataforma de hardware NVIDIA Jetson Nano.

Introdução ao Jetson Nano

O Jetson Nano COM é um pouco maior que um Raspberry Pi 3, mas pode executar redes neurais em paralelo com 472 Gflops de potência. Isso é cerca de 22 vezes mais potente que o Raspberry Pi 3 e é altamente eficiente em termos de energia, consumindo apenas 5 W. Esta placa é perfeita para aplicações de IA embarcada rodando em um kernel Linux enxuto. Ela possui poder de processamento e memória embarcada suficientes para aplicações de processamento de imagens e vídeos de alta qualidade. As principais características do Jetson Nano incluem:

  • GPU: GPU baseado na arquitetura NVIDIA Maxwell™ de 128 núcleos
  • CPU: Quad-core ARM® A57
  • Câmera: MIPI CSI-2 DPHY lanes, 12x (Módulo) e 1x (Kit de Desenvolvedor)
  • Memória: 4 GB LPDDR4 de 64 bits; 25,6 gigabytes/segundo
  • Conectividade: Ethernet Gigabit
  • Suporte ao SO: Linux para Tegra®
  • Tamanho do Módulo: 70mm x 45mm
  • O kit de desenvolvedor é uma excelente ferramenta para testar um novo algoritmo para aplicações de visão computacional/processamento de imagens. Se você não está familiarizado com a plataforma Jetson Nano, confira este artigo. Caso contrário, continue lendo para ver como você pode facilmente implantar uma poderosa aplicação de processamento de imagens para reconhecimento de faixas.
Developer kit for NVIDIA Jetson Nano
Kit de desenvolvimento NVIDIA Jetson Nano. [Image source]

Reconhecimento de Faixas com Jetson Nano

Para este projeto, precisamos de um Jetson Nano COM ou placa de desenvolvimento e uma câmera CSI (uma câmera CSI Raspberry Pi v2 funciona bem). Vou mostrar esta aplicação usando a placa de desenvolvimento Nano, mas você pode facilmente construir uma base personalizada para um Nano COM e implantar esta aplicação. A câmera CSI será conectada à porta da câmera no Jetson Nano, embora você possa usar uma câmera USB ou câmeras IP. Abaixo estão os requisitos necessários para fazer este projeto funcionar com sucesso:

Hardware

  • NVIDIA Jetson Nano
  • Câmera CSI

Pacotes de Software

  • Python
  • OpenCV
  • Nanocamera

Implementação

A implementação completa para este projeto pode ser encontrada no GitHub. Siga os próximos passos para obter uma demonstração deste projeto em funcionamento. Estes passos são importantes etapas de processamento de imagem que se destinam a tornar o reconhecimento de faixas mais preciso.

Percepção

O primeiro passo do nosso sistema de detecção de faixas é ser capaz de ler imagens ao vivo da câmera. Para novos usuários trabalhando com o Jetson Nano, lidar com as câmeras pode ser complicado. Para isso, estaremos usando a biblioteca NanoCamera. Esta biblioteca não é a melhor opção para uma aplicação de nível de produção, mas funciona para uma aplicação mais simples como a mostrada aqui.

Primeiro, instale a biblioteca com pip:

.

Lendo a imagem ao vivo da câmera:

.

Remover Ruído com Desfoque

Para tornar a imagem mais suave e remover ruídos indesejados, podemos aplicar um desfoque gaussiano. Isso envolve calcular o valor de cada pixel como uma média ponderada dos pixels ao redor.

Gaussian blur algorithm for lane recognition
Algoritmo de desfoque gaussiano para suavização de imagem. [Fonte da imagem]

O OpenCV inclui uma função para aplicar desfoque gaussiano em uma imagem:

.

Transformação de Cor

Após o desfoque gaussiano, a imagem ainda está em RGB e deve ser transformada para o espaço de cores HSV. A separação de cores será usada para remover cores indesejadas da imagem. Uma vez que a imagem está em HSV, podemos "remover" todas as cores desnecessárias da imagem especificando uma faixa de escala de cinza.

.

Operações Morfológicas - Dilatação

A dilatação adiciona pixels aos limites dos objetos em uma imagem. Aplicar dilatação à imagem ajudará a fechar quaisquer espaços soltos nas imagens de linha.

.

Canny (Detecção de Bordas)

Para detectar linhas de faixa, podemos usar uma técnica chamada detecção de bordas de Canny. A detecção de bordas de Canny pode ser usada para extrair informações estruturais úteis de um objeto. A biblioteca OpenCV fornece uma função de detecção de bordas de Canny que pode ser usada para detectar bordas em uma imagem. Para que a detecção de Canny funcione, precisamos fornecer limites mínimos e máximos. O OpenCV geralmente recomenda o valor de (100, 200) ou (200, 400), então estamos usando (200, 400).

.
Canny edge detection applied to a camera image
Imagem com detecção de borda de Canny. Note as faixas mostradas na imagem.

Isolar Região de Interesse

A imagem de saída da borda de Canny contém algum ruído. Todas as informações, exceto as faixas na imagem, podem ser isoladas reduzindo a região de interesse. Ao realizar o reconhecimento e a navegação de faixas, não necessariamente precisamos ver a imagem inteira. Uma maneira fácil de fazer isso é simplesmente recortar a metade superior da imagem.

ROI reduction for lane recognition
Imagem original (esquerda) e imagem com região de interesse recortada (direita).

O código para reduzir a região de interesse é:

.

Detectar Segmentos de Linha - Linhas de Hough

Após a região de interesse ter sido reduzida, as faixas estão claramente visíveis com quatro linhas distintas. No entanto, o computador não sabe que essas linhas representam os limites de duas faixas. Então, precisamos de uma maneira de extrair as coordenadas para essas linhas de faixa. Uma transformada de Hough é uma técnica usada no processamento de imagens para extrair características como linhas, círculos e elipses. Ela pode ser usada para encontrar linhas retas a partir de um número de pixels que parecem formar uma linha. Isso pode ser feito com a função HoughLinesP no OpenCV. A função ajusta várias linhas através de todos os pixels brancos e retorna o conjunto mais provável de linhas sujeitas a algumas restrições de limiar mínimo.

Lines found during lane recognition
Detecção de linhas com uma transformada de Hough aplicada.

Aqui está o nosso código que detecta segmentos de linha usando uma Transformada de Hough. A maioria dos parâmetros usados aqui pode ser determinada por tentativa e erro ou selecionando parâmetros de imagens de referência.

.

Combinar Segmentos de Linha em Duas Linhas de Faixa

A saída da função detect_line_segments() produz um conjunto de pequenas linhas com coordenadas de ponto final (x1, y1) e (x2, y2). Precisamos encontrar uma maneira de combiná-las em apenas duas linhas para as linhas de faixa esquerda e direita, mas como conseguimos isso? Uma maneira é classificar esses segmentos de linha por suas inclinações.

Todas as linhas da faixa esquerda têm uma inclinação positiva, e os segmentos de linha pertencentes à faixa da direita têm uma inclinação negativa. Com base nestes dois novos grupos, podemos calcular a média das inclinações e interceptações dos segmentos de linha para obter as inclinações e interceptações das linhas das faixas esquerda e direita. Isso é implementado com a função average_slope_intercept():

..

A função make_points() é uma função auxiliar para a função average_slope_intercept(), que recebe a inclinação e interceptação de uma linha, e retorna os pontos finais do segmento de linha. Neste ponto, agora temos as linhas das faixas!

O que vem a seguir

Neste ponto, a saída desta função seria entrada para outro algoritmo para controlar a velocidade e direção do veículo. Para fazer isso, um ângulo de direção pode ser calculado a partir das linhas das faixas detectadas e, em seguida, passado para um controlador PID para minimizar o ângulo de direção e manter o veículo centrado.

Embora isso tenha sido feito com uma placa de desenvolvimento Nano, o mesmo código oferece um ponto de partida para a implantação de um sistema em um sistema de processamento de imagens embutido para um ambiente de produção. Para fazer isso, você precisará construir uma base real para o Jetson Nano. Isso é mais fácil quando você usa as ferramentas de design eletrônico modular no aplicativo Upverter Board Builder. Adotando uma abordagem modular, você pode facilmente personalizar uma base para um Jetson Nano, câmeras e outros sensores para reconhecimento de faixas.

As ferramentas de design eletrônico modular no Upverter dão acesso a uma ampla gama de COMs padrão da indústria e módulos populares sem a necessidade de baixar ou instalar nenhum novo software. Você pode criar hardware de grau de produção para uma variedade de aplicações, incluindo reconhecimento de faixas e outras tarefas de processamento de imagens com Jetson Nano, usando uma interface de usuário de arrastar e soltar. Se o seu sistema precisar de funcionalidades adicionais, você pode incluir conectividade sem fio, uma variedade de sensores e muito mais.

Veja algumas histórias de sucesso de clientes da Gumstix ou entre em contato conosco hoje mesmo para saber mais sobre nossos produtos, ferramentas de design e serviços.

Sobre o autor

Sobre o autor

Zachariah Peterson tem vasta experiência técnica na área acadêmica e na indústria. Atualmente, presta serviços de pesquisa, projeto e marketing para empresas do setor eletrônico. Antes de trabalhar na indústria de PCB, lecionou na Portland State University e conduziu pesquisas sobre teoria, materiais e estabilidade de laser aleatório. A experiência de Peterson em pesquisa científica abrange assuntos relacionados aos lasers de nanopartículas, dispositivos semicondutores eletrônicos e optoeletrônicos, sensores ambientais e padrões estocásticos. Seu trabalho foi publicado em mais de uma dezena de jornais avaliados por colegas e atas de conferência, além disso, escreveu mais de dois mil artigos técnicos sobre projeto de PCB para diversas empresas. É membro da IEEE Photonics Society, da IEEE Electronics Packaging Society, da American Physical Society e da Printed Circuit Engineering Association (PCEA). Anteriormente, atuou como membro com direito a voto no Comitê Consultivo Técnico de Computação Quântica do INCITS, onde trabalhou em padrões técnicos para eletrônica quântica e, no momento, atua no grupo de trabalho P3186 do IEEE, que tem como foco a interface de portas que representam sinais fotônicos com simuladores de circuitos da classe SPICE.

Recursos relacionados

Retornar a página inicial
Thank you, you are now subscribed to updates.