sábado, 3 de fevereiro de 2018

Tutorial de Machine Learning + IoT: Reconhecimento facial


Esta é uma implementação do FaceNet para reconhecimento facial. Um dispositivo remoto Raspberry PI fotografa uma pessoa e envia para um servidor. O servidor ajusta e processa a foto, utilizando um modelo criado por Machine Learning, para reconhecer a pessoa que está na foto ou não. Veja aqui como montar o tutorial, incluindo o Raspberry.
ENGLISH VERSION: https://github.com/cleuton/FaceGuard
VÍDEOhttps://youtu.be/sqkxT7MBa8U




Os arquivos para este tutorial estão no Github: https://github.com/cleuton/FaceGuard

Você precisará de um computador e um Raspberry para executar o tutorial. Uma rede wifi é importante, embora você possa utilizar Ethernet.

A maior parte do código-fonte deste demo é derivado do trabalho de David Sandberg. O arquivo de licença original está no repositório: "ORIGINAL_LICENSE".

O código-fonte adicionado por este trabalho é composto pelos arquivos:

  • photoserver.py: Servidor que recebe uma foto e a classifica, tentando obter um "match";
  • Foto.py: Classe auxiliar para o photoserver;
  • photoclient.py: Cliente para o Raspberry PI, que captura a foto e a envia ao Servidor.

Todo o código-fonte produzido por este trabalho está licenciado de acordo com os termos da licença Apache, versão 2.0.


Preparação

Clone o repositório ou baixe um arquivo ZIP. Instale o Anaconda.

Primeiramente, você deverá criar um ambiente virtual Python utilizando o Anaconda:

conda env create -f ds-env.yml

O arquivo "ds-env.yml" está na pasta principal do repositório. Para ativar o ambiente virtual, use o comando:  "source activate facenet" (para Linux e MacOS) ou "activate facenet" (para MS Windows).

Você precisará treinar um classificador utilizando o dataset LFW - Labeled Faces in the Wild, Siga o tutorial de David Sandberg: https://github.com/davidsandberg/facenet/wiki/Validate-on-LFW.

Você poderá, então, usar suas próprias fotos. Siga o tutorial:  https://github.com/davidsandberg/facenet/wiki/Train-a-classifier-on-own-images

Após isto, você poderá subir o script photoserver e executar o photoclient em seu Raspberry PI  3.

O circuito Raspberry 

O dispositivo remoto Raspberry tem uma câmera, um botão e três leis: Amarelo, Verde e Vermelho.



Aponte a câmera para você mesmo (ou para outra pessoa), pressione o botão na protoboard, o Led amarelo acenderá e a foto será transmitida para o Servidor RESTfull. Quando o processamento terminar, o Raspberry acenderá o Led verde, se o reconhecer (60% de precisão) ou vermelho, se não o reconhecer.

A lista de materiais é:
  1. Um Raspberry PI 3;
  2. Uma protoboard;
  3. Um conector para Raspberry e protoboard, com um cabo paralelo (colorido);
  4. 3 leds: Amarelo, Verde e Vermelho;
  5. 3 resistires de 330 Ohms;
  6. Alguns cabos com jumpers de cores diferentes;
  7. Um switch (Botão);
  8. Uma câmera para  Raspberry.

Você poderá encontrar todos esses materiais no MercadoLivre.

Montagem do circuito na protoboard

Plugue o conector com os nomes das portas na protoboard, deixando o sulco da protoboard bem no meio dele (veja na figura anterior). Este conector tem os nomes das portas do Raspberry PI: GPIOs, GND (terra), voltagem 3.3, voltagem 5 etc.

Plugue o outro lado no Raspberry. Preste atenção ao lado correto. Se estiver inseguro, use um multímetro e verifique as voltagens na protoboard. Veja a figura anterior! No lado de cima, o primeiro conector à direita deve ter 3,3 volts, e o primeiro abaixo à esquerda, deve ter 5 volts. Se estiverem assim, então você plugou corretamente.

Agora, instale o switch (o botão) exatamente como na figura. O switch tem quatro pernas, ligadas duas a duas. Se você pressionar o botão, ele causará o curto-circuito entre todas. Preste atenção porque pode ser mais difícil do que parece. Leia este artigo que ensina a instalar switch em protoboard: https://www.hackster.io/hardikrathod/push-button-with-raspberry-pi-6b6928

Lembre-se de instalar um cabo jumper a um lado do switch e a uma das GPIOs. Eu utilizei a GPIO 18. Se você conectar o switch a outra GPIO, terá que alterar o código do photoclient. O outro lado do switch, ligue a uma das GND (terras) do Raspberry.

Finalmente, instale os 3 leds. Um Led tem duas pernas: uma longa e outra curta. A longa é chamada de "anodo" e é conectada ao positivo, no nosso caso, a uma das GPIOs do Raspberry. A perna curta é chamada de "catodo" é conectada ao terra (uma das tomadas GND).

Resistores

Temos que proteger o Raspberry e os Leds de sobrecarga. Portanto, conectaremos resistores de 330 ohm entre o GND e a perna curta de cada Led, como na figura.

A protoboard tem circuitos horizontais e verticais. Existem duas faixas horizontais de cada lado: uma azul (negativa) e outra vermelha (positiva). Você pode conectar a negativa a qualquer tomada GND do conector do Raspberry, então, plugue uma perna de cada resistor de 330 ohm nesta linha.

A outra perna de cada resistor deve ser conectada a um circuito vertical, depois da linha vermelha, exatamente como na foto.

Cada led deve ter sua perna longa conectada (usando um cabo jumper) a uma tomada GPIO. Eu usei estas tomadas (preste atenção! Se utilizar tomadas diferentes, terá que alterar o código do photoclient):

  • Led amarelo: GPIO 23;
  • Led vermelho: GPIO 25;
  • Led verde: GPIO 24.

O lado do Raspberry



Preste atenção na conexão do cabo paralelo e o socket do Raspberry. Deve estar na posição correta, caso contrário, você poderá danificar seu Raspberry PI! Use um multímetro, como eu expliquei anteriormente.

A câmera deve ser conectada no slot próximo da tomada HDMI. Ela tem um lado condutivo e um blindado, conecte de maneira certa. Leia este artigo:  https://projects.raspberrypi.org/en/projects/getting-started-with-picamera.

A câmera tem uma posição fixa, logo, você deve rotaciona-la para que a foto fique na posição correta. Execute o programa raspa-config para habilitar sua câmera:  https://www.raspberrypi.org/documentation/usage/camera/python/README.md



Nenhum comentário:

Postar um comentário