A metodologia de detecção de veículo recomendada como parte do projeto final no Termo 1 foi baseada em um classificador SVM usando HOG criado manualmente e recursos de cores de uma imagem de entrada. Depois de concluir a abordagem SVM, decidi levar esse projeto adiante e avaliar uma abordagem CNN regular usando o LeNet-5 e uma implementação do YOLOv2

Detecção de veículo (LeNet-5)

Arquitetura e Treinamento de Modelos

Eu implementei uma ligeira variação do LeNet-5 no Keras para atender aos requisitos de classificação binária deste projeto, como mostrado abaixo.

As imagens do rastreador veicular recebidas são convertidas em espaço LUV, redimensionadas para 32×32 pixels e normalizadas antes de serem alimentadas pela rede para treinamento. A ativação da ELU é usada para as duas camadas totalmente conectadas, cada uma das quais é prosseguida por uma camada de abandono. Finalmente, uma função de ativação sigmóide é usada com um único nó de saída para determinar se uma detecção positiva deve ser relatada.

rastreador veicular, rastreamento veicular, rastreador de moto, rastreamento de veiculos em Joao Pessoa, bloqueador para moto

Os dados de treinamento utilizados consistiram em uma combinação do banco de dados de imagens de veículos GTI, do conjunto de benchmarks KITTI vision e amostras extraídas dos vídeos do projeto fornecidos pelo Udacity. O modelo foi treinado usando um otimizador Adam para imitar a entropia cruzada binária. Detalhes dos dados e da abordagem do treinamento podem ser encontrados no meu repositório do GitHub aqui.

Detecção

As abordagens das janelas deslizantes são tipicamente caras em termos computacionais, pois a classificação precisa ser executada em patches de imagem extraídos da imagem de entrada. Além disso, janelas de diferentes escalas precisam ser usadas para capturar objetos interessantes de tamanhos diferentes que podem estar presentes em diferentes locais da cena. A imagem abaixo mostra janelas de duas escalas diferentes, com uma sobreposição de 75% usada para extrair amostras para alimentar o modelo treinado.

Nesse aplicativo de rastreamento veicular em particular, uma abordagem seria extrair o patch de imagem associado a uma janela, redimensioná-lo para atender aos requisitos de entrada do modelo e executar uma previsão. Esse processo precisaria ser repetido para cada janela de cada escala. O tempo necessário para processar uma única imagem seria, portanto, escalável com o número de janelas e as variações de escala.

No entanto, uma abordagem otimizada da janela deslizante foi usada para realizar a detecção do veículo, o que reduziu bastante o tempo do processo por quadro. Isso permite que a imagem seja segmentada de maneira muito eficiente nos tamanhos de janela necessários. Segundo, uma previsão de lote é realizada nessa matriz, que pode ser limiarizada para retornar uma detecção positiva acima de um certo limite de confiança. Detalhes da implementação podem ser encontrados na classe ImageProcessor e na função car_utils.create_views () no repositório do projeto. Essa abordagem permite uma redução significativa no tempo de processamento por imagem.

Finalmente, as janelas positivas resultantes precisam ser agrupadas em uma única caixa delimitadora ao redor do veículo. Um mapa de calor foi gerado para capturar a área total sobreposta das caixas delimitadoras, que foi submetida a um limite e rotulada para atingir a caixa delimitadora final, como mostrado na série de imagens abaixo.

rastreador veicular, rastreamento veicular, rastreador de moto, rastreamento de veiculos em Joao Pessoa, bloqueador para moto

Tempo de processamento

O pipeline de rastreador de moto foi executado no mesmo hardware usado para encontrar pistas (Dell Latitude 7450 com uma CPU i7-5600U de núcleo duplo de 2,60 GHz e 8 GB de RAM) sem GPU, portanto, resultados em tempo real não eram esperados. Os tempos de processamento por quadro para o vídeo de teste (1261 quadros) estão resumidos abaixo.

O tempo médio de processamento / quadro é de 0,239 segundos. As porcentagens relativas são as seguintes:

Crie vistas: 13.4%

Realizar previsões: 54,3%

Análise de calor: 24,2%

Caixas de empate: 2,7%

A porcentagem restante é usada na execução de tarefas que não foram cronometradas nesta análise, p. conversão de imagem inicial para o espaço de cores LUV. Observa-se que a maior parte do tempo gasto é usada na realização de previsões, no entanto, uma parte significativa é alocada para a análise de calor, o que foi surpreendente. Uma revisão da função car_utils.add_heat () mostra que estamos fazendo loop em todas as detecções positivas para gerar um mapa de calor e, em seguida, na lista de heatmaps para um número predefinido de quadros na função car_utils.sum_heatmap () para acumular as detecções para rejeição positiva falsa. Portanto, é plausível que esse tempo de processamento possa ser reduzido pela otimização dessas funções.

Detecção de veículo (YOLOv2)

Aproximação

O YOLOv2 realiza detecção e classificação simultâneas sem precisar usar janelas deslizantes. Aqui estão alguns links para alguns ótimos recursos para aprender sobre o YOLOv2.

O artigo YOLOv2

Site da YOLO

A explicação de Vivek Yadev sobre caixas de ancoragem

rastreador veicular, rastreamento veicular, rastreador de moto, rastreamento de veiculos em Joao Pessoa, bloqueador para moto

Minha implementação do YOLOv2 foi baseada principalmente no projeto YAD2K no GitHub. Modifiquei ligeiramente o código para torná-lo compatível com o ambiente Keras 1.2.1 usado no Termo 1 do nanodegree SDC e empacotei parte do código em funções para usar no meu método ImageProcessor.vehicle_detection_YOLO (). A abordagem foi a seguinte:

Use os scripts YAD2K para converter os arquivos cfg do modelo darknet e pesos pré-treinados localizados no site da YOLO em modelos Keras. Usei pesos para o modelo treinado no conjunto de dados PASCAL VOC.

Redimensione as imagens de entrada para 416×416 pixels e normalize, escalando para um máximo de 1

Realizar previsões nas imagens de entrada

Filtre as previsões resultantes usando a função YAD2K yolo_eval () em keras_yolo.py

Desenhe as caixas delimitadoras finais

O rastreamento de veiculos em Joao Pessoa combinado com o pipeline de detecção de faixa demorou muito tempo para ser executado no hardware que eu estava usando, muito mais do que a abordagem LeNet-5. Em alguns casos, foram necessários mais de 20 segundos por imagem. Eu não acabei fazendo uma análise do tempo para as várias etapas do pipeline, mas suspeito que há muito espaço para melhorias, considerando que houve algumas transformações desnecessárias de imagens entre o PIL e o OpenCV ao desenhar o limite de detecção do veículo caixas.

Conclusão

A detecção de veículos e a detecção de objetos em geral é um problema bastante aberto, com muitas soluções em potencial por aí. Outras abordagens não avaliadas aqui são os detectores de disparo único, bem como a API de detecção de objetos lançada recentemente pela Tensorflow, que fornece a capacidade de usar uma variedade de modelos treinados para realizar a detecção de objetos. As vantagens e desvantagens são tipicamente entre velocidade e precisão, com os modelos mais rápidos (como a pequena YOLO) sendo menos precisos.

Para vincular isso à indústria em que trabalho, Sistemas Inteligentes de Transporte, há muitos casos de uso no momento para detecção precisa e confiável de veículos sob condições variáveis ​​de luz e clima. Isso inclui detecção baseada em vídeo para veículos nas barras de sinalização de trânsito, detecção, bloqueador para moto e classificação de veículos para sistemas de pedágio eletrônico e detecção de incidentes em rodovias e vias arteriais para situações como acidentes de trânsito, detecção incorreta e movimentos de pedestres ou animais.

Atualmente, muitas dessas abordagens exigem câmeras especializadas, hardware de campo dedicado e, em alguns casos, unidades de processamento de vídeo em um local do centro de controle. Seria interessante ver como as abordagens de aprendizado profundo poderiam ser utilizadas para aumentar a confiabilidade e reduzir o custo da implementação desse tipo de sistema.