Face detection e face recognition com ESP32-CAM • Do bit Ao Byte
Djames Suhanko 18 de fevereiro de 2019 8 min read
No artigo anterior apresentei o ESP32-CAM, essa belezinha da imagem de destaque do artigo anterior que, claro, provocou interesse imediato em muitos makers; muitos mesmo. Tanto, que publiquei o artigo em um domingo pela manhã e antes das 17:00 já havia sido vendidas todas as placas disponíveis no nosso parceiro MASUGUX. Mas não fique triste, você pode reservar a sua já para a próxima leva que deve chegar em menos de 30 dias e, realmente, recomendo que faça a reserva, porque vai acabar rápido de novo. Enquanto isso, veja como fazer face detection e face recognition com ESP32-CAM.
Diferença entre detection e recognition
Face detection é a capacidade de detectar um rosto, não importa quem seja; é a capacidade de saber diferenciar entre um rosto e uma batata, por exemplo.
Face recognition é o reconhecimento do rosto, sendo de uma pessoa devidamente cadastrada; é a capacidade de dizer se é "João" ou se é "José".
O firmware utilizado nesse artigo é espetacular. Além de carregar um model para fazer o reconhecimento facial, ainda oferece uma interface web inacreditável, com montes de filtros!
No modo de operação padrão, a câmera captura frames de forma fluida. Já habilitando o face detection, a resolução deve ser CIF ou inferior. Isso não é um problema, é bastante comum utilizar imagens de 320×240 com foco em reconhecimento facial, mas no caso do ESP32-CAM, a degradação dos quadros é notória. Não é uma câmera para reconhecimento de transeuntes, mas para autenticação, abertura de portas, consulta de cadastro de clientes e coisas em que não haja realmente uma necessidade de resposta rápida, sim, é ideal e suficiente.
Para adquirir (quando disponível) ou reservar (se ainda indisponível), utilize esse link. Se quiser aproveitar, dê uma olhada na lista de produtos do MASUGUX.
Adicionar suporte ao ESP32 na IDE do Arduino
Sempre tem gente nova conhecendo o ESP32. Antes de ir para o Atom com PlatformIO, vou exemplificar a gravação de um ESP32-CAM utilizando a IDE do Arduino.
Copie o link abaixo para incluir o suporte ao ESP32 à IDE do Arduino:
Agora abra a IDE do Arduino e siga o menu Arquivo > Preferências e coloque uma vírgula antes de colar o link no input box com as URLs de placas:
Alí na altura do cursor do mouse é onde se coloca a URL, não tem como errar.
Feito isso, feche e abra a IDE do Arduino novamente (estou tentando garantir que você consiga atingir o resultado de primeira). Vá ao menu Tools > Board > Board Manager e digite ESP32. Selecione a versão mais recente e clique em Install ou Update, caso já tenha o suporte ao ESP32 na IDE do Arduino.
Instalado? Ok, então reinicie a IDE do Arduino (lembre-se, estou fazendo isso para garantir que funcione de primeira. Reiniciando a interface você forçará a atualização dos repositórios de placas e bibliotecas, além do carregamento das placas e bibliotecas já instaladas).
O próximo passo é selecionar a placa correta. No menu Tools > Boards selecione ESP32 Wrover Module.
Se deixar no padrão, vai dar um estouro monstro de memória devido à área da flash reservado para OTA. Siga o menu Tools > Partition Scheme e mude para ficar igual abaixo:
Com isso, o problema deve ser sanado. Agora o gran finale.
Gravar firmware no ESP32-CAM
Agora é a parte fácil. Com o suporte devidamente adicionado à IDE do Arduino e a placa selecionada corretamente, siga o menu File > Examples > ESP32 > Camera > CameraWebServer. Troque o SSID e senha para conectar o ESP32-CAM à sua rede.
Da linha 9 à 12, deixe desse jeito (definida a câmera AI_THINKER):
Mas antes de subir o firmware, você precisará (obviamente) conectar o ESP32-CAM ao computador.
Eu coloquei mais umas linhas pra ajudar depurar erros, uma vez que me deparei com alguns mas não tinha pistas. Nada de mais, apenas uns prints e delays nos lugares certos. Você pode copiar e substituir o código padrão, se estiver ansioso por ver a câmera funcionando.
const char* password = "fsjmr112";
ESP32-CAM não tem porta USB?
Pois é. Não colocaram um conversor USB-serial nessa placa. Isso significa que você precisará de um FTDI para gravar o firmware. Não é um problema no final das contas, um FTDI pode ser utilizado em diversos casos, inclusive para fazer sniffing de uma comunicação serial.
O link para comprar FTDI é esse.
Tendo em mãos o FTDI, comece mantendo o ESP32-CAM desconectado do computador.
Se surgirem dúvidas quanto à explicação abaixo, leia o artigo anterior.
Coloque o TX do FTDI ao RX do ESP32-CAM e o RX do FTDI ao TX do ESP32-CAM. Alimente-o com o FTDI em 5V (não faça c4g4d4, deixe o jumper do FTDI em 5V, coloque o VCC ao 5V do ESP32-CAM) e conecte o GND. Após, coloque um jumper fechando os pinos IO0 e GND. Estão lado a lado, pode ser um jumper de HD, não precisa ser um cabo com terminadores, mas se não tiver um jumper usado para wiring, use o cabinho mesmo.
Seguindo o procedimento supracitado, conecte o FTDI ao computador, então mais uma vez, garanta que ele está em modo de gravação, apertando o botão RST que está do lado oposto do processador e câmera (na "costa" da placa). Ao apertar o botão RST, o LED utilizado para flash piscará.
Após subir o sketch, aparecerá nas mensagens da IDE do Arduino que foi feito reset da placa, mas o FTDI não está conectado para isso, portanto será necessário remover o jumper (sem problemas fazê-lo com a placa ligada) e apertar mais uma vez o botão RST. Abra então o terminal serial na IDE do Arduino e aguarde. Utilizando o código disposto acima você deverá ver algo como:
Daí basta acessar pelo browser. No menu (exibido em uma imagem lá em cima) você pode iniciar a streaming da câmera ou pegar apenas uma amostra. No caso de amostra, pode ser útil para sistemas de cadastro.
Face detection com ESP32-CAM
No menu à esquerda da interface web, próximo ao rodapé, habilite o recurso face detection após mudar a resolução para CIF ou menor, no primeiro item desse mesmo menu. Um retângulo amarelo circundará qualquer face no campo de visão da câmera, como exibido na imagem mais acima. Como citado anteriormente, o fluxo de quadros reduzirá drasticamente, mas não é um problema, tudo depende da aplicação.
Face recognition com ESP32-CAM
Se habilitar o recurso de reconhecimento facial, faces desconhecidas serão tratadas como invasores. É um bom padrão, em minha humilde opinião.
Após cadastrar (clicando no botão Enroll face) o resultado deve ser algo como:
A câmera está à esquerda do meu monitor principal, por isso as imagens estão sendo pegas de meio perfil. Após feito o reconhecimento, a acurácia foi incrivelmente alta, não gerando falso-positivo. Porém, é necessário cadastrar pelo menos uma família inteira no sistema para garantir que a inteligência artificial implantada é boa o suficiente.
A média de frames por segundo (monitorada no monitor serial) foi de 27fps. Com face detection ativado, a média é de 2fps, o que é bastante bom.
Um exemplo da saída da detecção na serial, mostrando inclusive o posicionamento da face:
MJPG: 9108B 1127ms (0.9fps), AVG: 985ms (1.0fps), 130+792+0+138=1061 DETECTED 0
E acredite ou não, para reconhecimento facial o tempo é similar, exceto em uma amostragem de pico que deu quase 8fps:
MJPG: 8995B 976ms (1.0fps), AVG: 133ms (7.5fps), 127+692+0+137=957 DETECTED 0
Match Face ID: 0
A primeira linha traz as informações relacionadas ao posicionamento e detecção da face, seguido por uma linha contendo o ID da face detectada. Daí basta cadastrar o ID em um sistema externo e fazer tudo o que imaginar com a informação.
Recém mudei de endereço, ainda estou iniciando a arrumação da minha estrutura de rede, mas vou tentar fazer entre hoje ou o mais breve possível um video de prova de conceito, se inscrevam lá no canal DobitAoByteBrasil no Youtube!