Cambus

Participantes:

Bruno; Kleber; Vinicius

Resumo do projeto:

Smart Cities - Mobilidade urbana com foco no transporte público - Cambus sistema de coleta de dados em ônibus urbano

Descrição do projeto:

Dentre os problemas e dificuldades conhecidos no transporte público, a população carece de informações em tempo real e com o mínimo de assertividade. A superlotação dos ônibus do transporte público afasta usuários, que preferem utilizar veículo próprio, ainda que fiquem horas parados no trânsito. Caso informações, em tempo real, como a lotação de um ônibus, estejam facilmente disponíveis para um usuário, ele poderá optar por aguardar ou não o próximo ônibus ou até se vai  locomover-se de ônibus ou utilizar-se de um veículo próprio. O poder de escolha torna o transporte público uma opção mais atraente para o usuário.

A contagem ou estimativa de pessoas em ambientes fechados pode ser realizada de muitas formas, dentre as quais, as mais comumente empregadas são:

  • Imagens térmicas
  • Visão computacional
  • Contador de faces

Entre as diversas dificuldades para estimar pessoas em um ambiente utilizando visão computacional, as principais são:

  • Oclusões de pessoas
  • Iluminação inconstante
  • Oclusão estática, ou seja, pessoas atrás de objetos
  • Ângulo de câmera em relação ao ambiente

Um desafio para esse projeto é saber o ângulo correto da câmera que melhor auxilie na subtração de fundo da imagem, bem como a luminosidade variável durante o dia dentro do ônibus.

O principal objetivo da proposta é criar um modelo robusto e configurável  para estimar a superlotação e disponibilizar os resultados para a população por meio de smartphones etc.

 

Arquitetura

Histórico do desenvolvimento:

Semana | 20/08-/2018 – 26/08/2018

1. Cronograma de atividades

Cronograma macro de atividades 1.

Semana | 27/08-/2018 – 2/09/2018

1. Preparação do ambiente de desenvolvimento

Foi instalado a imagem do SO Linaro na DragonBoard410c.

2. Desenvolvimento do algoritmo em C++ para detecção de pessoas(Ambiente Desktop Ubuntu)

Foi iniciado o desenvolvimento do algoritmo em C++ para a contagem de pessoas. Link para o github: https://github.com/bmonteiro00/contadorPessoas.

3. Criação de instância linux na plataforma AWS

Foi criada uma instância Linux (Ubuntu server) na plataforma AWS EC2.  Nesta instância AWS foi instalado o broker MQTT Mosquitto. Também foi executado testes de validação de conectividade entre o Broker MQTT e um client MQTT localizado no meu desktop.

 

 

 

 

 

Semana | 3/08-/2018 – 10/09/2018

1. Compilação da biblioteca OpenCV na DragonBoard

Compilação e instalação da biblioteca Opencv na DragonBoard utilizando o sistema Linaro. Trocamos a linguagem de programação para Python para aumentar nossa produtividade durante o desenvolvimento do software, entretando versões na linguagem C++ não foi descartada.

Nosso algoritmo de visão computacional utiliza-se de técnicas de processamento de imagem (veja o código no GITHUB). Porém, apenas as técnicas de processamento de imagem não cobre todas as variações de cenário encontradas num ambiente real. Utilizamos o algoritmo K-means[4] para treinar o algoritmo para ignorar variações indesejáveis na imagem, melhorando a assertividade da contagem(código ainda não submetido no GITHUB). A própria biblioteca OpenCV disponibiliza de uma biblioteca de ML(Machine learning).

Integração com o serviço AWS foi feita utilizando a biblioteca Paho. É possível também utilizarmos um SDK para a DragonBoard disponibilizado pelo AWS(Veja código no GITHUB).

 

Semana | 11/08-/2018 – 17/09/2018

  1. Implementando da plataforma AWS IoT

Durante esta semana iniciamos alguns testes na AWS IoT para verificar a sua viabilidade em nossa solução.  Por se tratar de uma solução completa de IoT que oferece vários recursos e integração com demais serviços da AWS a plataforma se mostrou bastante  interessante. Testamos os recursos de  gateway de MQTT e segurança enviando pacotes de  client MQTT usando TLS e X.509.  O próximo passo é construir uma arquitetura integrando outros serviços da nuvem que possa suporta a nossa solução.

 

 

Semana | 18/08-/2018 – 24/09/2018

  1. Integrando serviços da plataforma AWS.

Nesta semana começamos a construir nossa arquitetura de Cloud. Realizamos a integração do  gateway MQTT com o serviço de banco de dados. Entre os disponibilizados na plataforma escolhemos o DynamoDB que é um banco de dados não relacional serverless de alta performance e escalável.  O próximo passo é integrá-lo com o serviço de gateway API para criar APIs REST  para serem usadas em apps.

Semana | 25/09-/2018 – 01/10/2018

  1. Integração do Programa principal em Python

O programa principal foi dividido em classes: CamBus (a classe principal), Sensor (uma classe para obter dados como posição de GPS, temperatura, Co2) e Contador (classe com o algoritmo de processamento de imagem). O software já consegue contar pessoas em vídeo ou em tempo real (webcam) e enviar telemetria em formato jSon para a Amazon Aws, como segue:

{
                "BUS": {
                               "Name": "Vila Cruzeiro",
                               "Car": "11234",
                               "Line": "6422-10",
                               "Status": "running",
                               "Last_timestamp": "1538411388.0381477",
                               "PID": 372
                },
                "COUNTER": {
                               "count_up": 2,
                               "count_down": 5,
                               "model": "dummy"
                },
                "SENSORS": [{
                               "name": "Temp",
                               "type": "centigrade",
                               "value": 25
                },
                {
                               "name": "CO2",
                               "type": "ppm",
                               "value": 25
                }]
}

2. MQTT.fx lendo telemetria:

Semana | 1/10-/2018 – 07/10/2018

Além das divisões do programa principal(Cambus, Sensor e Contador) foram adicionadas mais 2 classes GPS e SMSSender(Envio de mensagem por SMS). A biblioteca de Machine Learning(ML) do OpenCV foi usada para excluir falsas pessoas caso a imagem(vídeo) trema entre outros casos. O algoritmo de ML utilizado foi o Naive Bayes, porém antes de utilizar é preciso realizar um treinamento para que o algoritmo possa ser usado adequadamente. O algoritmo SVM também foi utilizado, mas o Naive Bayes se saiu melhor em nossa avaliação.

Estamos pesquisando e estudando o uso de redes neurais(CNN) para melhorar a detecção das pessoas nas imagens(vídeo).  Estamos preparando o código para em python para que seja compatível com as versões 2.7 e 3.x.

A integração com o AWS CORE IOT já foi testada com sucesso.

Semana | 7/10-/2018 – 14/10/2018

A figura abaixo apresenta a arquitetura de como o sistema está organizado. Uma app para Android está sendo desenvolvida para o consumo das mensagens enviadas ao Broker AWS.

 

Semana | 14/10-/2018 – 22/10/2018

Já estão implementados:

  • hardware Dragonboard 410c (gps, sensor temp)
  • hardware RaspberryPi (gps, sensor temp, leitor de RFId para motorista, luz indicadora)
  • suporte carregamento dinâmico de classe para Processamento de Imagens (por MQtt)
  • logs e carregamento de configuração .ini
  • publicação broker AWS, AWS Shadown, AWS Dynamo (banco de dados), integração Dweet

 

Arquitetura final da Cambus

Semana | 22/10-/2018 – 28/10/2018

Implementações finais:

  • interface gráfica para celular Android (https://github.com/bmonteiro00/androidAppEmbarcados)

Publicação no site Instructables:
https://www.instructables.com/id/CAMBUS-SYSTEM-OF-DATA-COLLECTION-ON-URBAN-BUS/

Repositório do código-fonte:
https://github.com/bmonteiro00/cambus

Hardware:

Equipamentos

  • Placa DragonBoard 410c ;
  • Câmera USB;

 

Software/Firmware:

Algoritmos/Frameworks

  • Biblioteca de processamento de imagens OpenCV
  • Linguagens Python e C/C++
  • Escolha de rotinas de pré-processamento de imagens
  • Broker MQTT Mosquitto
  • Broker AWS (e persistência, interface REST, etc)
  • interface com Dweet
  • App para celular Android

Referências:

[1] http://www.ppmec.unb.br/downloads/dissertacoes/48-12-2012.pdf

[2] http://repositorio.unicamp.br/bitstream/REPOSIP/325603/1/FEEC_Soares_GuilhermeSaraiva_M.pdf

[3] http://repositorio.unicamp.br/bitstream/REPOSIP/276479/1/Higashino_WilsonAkio_M.pdf

[4] https://ieeexplore.ieee.org/document/5414001/