Cambus
Participantes:
Bruno; Kleber; ViniciusResumo do projeto:
Smart Cities - Mobilidade urbana com foco no transporte público - Cambus sistema de coleta de dados em ônibus urbanoDescriçã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
- 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
- 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
- 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/