Estimativa de contagem de pessoas com SimpleCV, Raspberry Pi e uma VPS

A visão computacional trata-se da união de recursos tecnológicos para que máquinas possam enxergar. O enxergar da visão computacional pode ser entendido como a busca por padrões em imagens e streaming de vídeos, buscando assim característica desejadas nas mesmas (detectar faces, olhos de rostos e bocas de rostos, por exemplo).

Com o crescente ganho de tecnologia (sobretudo em processamento), as atuais Single-Board Computers têm poder computacional suficiente para realizarem tarefas de visão computacional. E para ilustrar isso, este artigo mostra um projeto nesta linha: utilizar uma Webcam comum e um Raspberry Pi para detectar faces em um streaming de vídeo, de modo a contabilizar o número de pessoas em um certo ambiente. Além disso, o projeto irá se integrar a uma VPS (Virtual Private Server) para contabilizar o número médio de pessoas contabilizadas por período do dia e utilizar como interface com o usuário um bot Telegram.

Antes de prosseguir com o artigo, gostaria de deixar aqui um agradecimento ao meu patrocinador Digital Ocean, o qual me deu acesso a uma VPS e permitiu que este projeto virasse realidade.

Materiais, serviços e conhecimentos necessários

Para reproduzir o projeto deste artigo, serão necessários os seguintes materiais, conhecimentos e serviços:

  • Uma Raspberry Pi 3 model B
  • Uma webcam USB comum
  • Fonte de alimentação 5V / 2A
  • Disponibilidade de conexão wireless à Internet para a Raspberry Pi
  • Uma conta / serviço de VPS. Recomendação: Digital Ocean
  • Conhecimentos básicos de Linux embarcado
  • Conhecimentos básicos de linguagem de programação Python
  • Noções básicas de MQTT

 

Instalação do SimpleCV na Raspberry Pi

 

O SimpleCV trata-se de um framework open-source de computação visual. Comparativamente com o OpenCV, trata-se de um framework de visão computacional mais simples, porém adequado à maioria das necessidades desta área. Devido a sua fácil integração com Python, tornou-se um framework muito popular.

Para instalar o SimpleCV na Raspbery Pi, siga o procedimento abaixo:

  1. Instale as ferramentas e dependências do SimpleCV com os comandos abaixo:

     
  2. Instale o SimpleCV com o comando abaixo:

     

    Teste do SimpleCV

 

Uma vez instalado o SimpleCV, este pode ser testado da maneira descrita a seguir. Antes de executar o procedimento, certifique-se que a webcam USB está ligada na Raspberry Pi.

 

  1. No terminal, crie um arquivo de script Python com o seguinte comando:

     
  2. No editor de texto nano, cole o seguinte conteúdo:

     
  3. Pressione Ctl+X e salve o arquivo. Para executar, utilize o seguinte comando:

     
  4. Se o teste for bem sucedido, uma janela irá surgir, exibindo nela a imagem que a webcam está capturando.

 

Detecção de face

 

Com o SimpleCV e webcam funcionando, podemos partir para a detecção de faces. Para tal tarefa, é utilizado um recurso do SimpleCV chamado “Haar Feature-based Cascade Classifier for Object Detection”. Este recurso permite encontrar características em uma imagem (seja uma foto ou stream de vídeo), a fim de encontrar objetos característicos na mesma.

O “input” deste recurso são os chamados “Cascade classified files”. Cada arquivo destes tem formato xml e descreve como são os objetos que devem encontrar. Portanto, quanto mais detalhado o objeto a ser encontrado, mais complexo será este xml. O SimpleCV já conta por padrão com alguns Cascade classified files, o que irá facilitar muito seu aprendizado e seus primeiros projetos. Um deles é o Cascade classified file de face (ou seja, permite detectar a presença de uma face humana em uma foto ou stream de video). Para saber mais, clique aqui.

Portanto, para identificar faces com base na imagem capturada pela webcam, utilize o script Python abaixo:

 

Salve o script como DeteccaoFaces.py e execute o programa com o seguinte comando:

 

Pronto, agora basta ficar na frente da webcam e observar a detecção de sua face! Uma brincadeira interessante é você segurar uma foto com uma ou mais pessoas ao mesmo tempo em que é “visto” pela webcam. O script irá encontrar a sua face e as da foto ao mesmo tempo, assim você consegue ver o funcionamento da detecção de face a todo vapor.

IMPORTANTE: o Cascade classified file de face (face.xml) está preparado  para detecção de faces “filmadas” de forma frontal. Ou seja, sua eficiência de detecção é reduzida em casos de faces em outras posições (vistas de cima ou de perfil, por exemplo).

Contabilizando pessoas e guardando os dados em uma VPS

A partir de agora, será explicado como detectar faces, contabilizá-las e enviar a contabilização a uma VPS. Desta forma, será feito um mecanismo para armazenar qual a média de pessoas contabilizadas por período do dia (períodos de 1 hora cada).

Antes de tudo, é preciso preparar sua VPS para suportar sistema de banco de dados sqlite3 e instalar um broker MQTT Mosquitto nela. O sistema de banco de dados será responsável por gerenciar a tabela que contém o registro das contagens (por período), enquanto a comunicação entre Raspberry Pi e VPS será feita por MQTT.

Observação: Para poder utilizar MQTT e Python na Raspberry Pi, é necessário instalar a biblioteca Paho-MQTT. Para saber como fazer isso, veja este artigo.

Para uma VPS Digital Ocean com sistema operacional Linux Ubuntu 16.04, isso pode ser feito das seguintes maneiras:

  • Instalação do broker MQTT Mosquitto: clique aqui
  • Instalação do sistema de banco de dados sqlite3: clique aqui

Feito isso, chegou a hora dos códigos do lado da Raspberry Pi e da VPS.

Do lado do servidor, faça o seguinte procedimento:

  1. Primeiramente, vamos fazer um script que manipula o banco de dados do nosso projeto. Ele será responsável por inserir e ler registros do mesmo. Para isso, utilize o script Python abaixo:

    Salve-o como ManipulacaoBancoDadosContadorPessoas.py.
  2. Agora, faremos o “robô”, o qual consiste em um script Python responsável por receber dados das contagens e solicitar ao script de manipulação de banco de dados que os insira no banco de dados do projeto. Tal script deverá rodar de modo permanente / em background na VPS.
    O código-fonte deste robô está a seguir.

     

    Salve-o como RoboContagemPessoasBD.py

  3. Coloque o robô para rodarem modo permanente / em background com o comando a seguir. Uma vez executado o comando, você pode fechar sua sessão SSH com a VPS que este continuará rodando conforme desejado.

     

  4. Pronto! Para verificar se seu robô está rodando, basta utilizar o comando abaixo e verificar a execução do mesmo na lista de processos.

     

Já do lado da Raspberry Pi, faça o seguinte:

  1. O script para detecção de faces (já preparado para o envio das informações a VPS) pode ser visto a seguir:

    Salve-o como DeteccaoFaceVPS.py
  2. Execute o script com o comando abaixo:

     
  3. Está feito! Agora basta colocar seu sistema composto por Raspberry Pi + webcam em algum ponto onde deseja contar o número médio de pessoas por hora e a Raspbery Pi e a VPS fazem o resto!

 

Bônus: interface pelo Telegram

 

Sabe o Telegram? Isso mesmo, aquele app / serviço de mensagens instantâneas (que normalmente lembramos quando o WhatsApp está fora do ar). Que tal saber as estatísticas de contagem de pessoas através dele, conversando com um bot que roda na sua VPS? Isso é possível e vamos fazê-lo aqui!

Primeiramente, é necessário criar um token para seu bot Telegram. isso é feito conversando com um bot chamado The BotFather no Telegram e seguido estas instruções aqui.

Em seguida, é preciso instalar as bibliotecas para interagir com o telegram a partir do Python. Faça isso com o seguinte comando:

Uma vez criado o bot e com seu token em mãos, coloque o seguinte código Python na sua VPS (salve-o como TelegramCP.py):

 

Agora execute-o com o seguinte comando (assim, ele rodará em background / de modo permanente):

 

 

Pronto! Pode fechar sua sessão SSH com a sua VPS e usar o Telegram para acompanhar tudo! Basta enviar a palavra oi para seu bot que ele lhe informa as estatísticas.

Gostou do artigo? Tem dúvidas? Tem críticas? Comente abaixo!