Antes de iniciar o desenvolvimento do projeto, foi realizado um estudo para selecionar as ferramentas mais adequados para a implementação do projeto.
No que diz respeito à linguagem de programação, optou-se pelo Python devido às suas vantagens e recursos específicos para o processamento de imagens e visão computacional.
Quanto à biblioteca escolhida, a face recognition foi selecionada por sua eficiência e facilidade de uso no contexto de reconhecimento facial. Ela é construída sobre as bibliotecas dlib e OpenCV, que são amplamente reconhecidas por suas capacidades de processamento de imagens e visão computacional. A face recognition fornece algoritmos poderosos para a detecção de rostos, extração de características faciais e comparação de imagens, simplificando muito o desenvolvimento do sistema de reconhecimento facial.
No que se refere aos hardwares utilizados, o Raspberry Pi foi escolhido como plataforma principal devido à sua flexibilidade, tamanho compacto e baixo consumo de energia.
O software consiste em três etapas principais: detecção de faces, extração das características faciais e identificação do rosto. Além disso, foi desenvolvida uma página web em HTML e PHP para o cadastro de usuários, onde eles podem enviar suas informações e fotos. O sistema compara as matrizes de características dos usuários cadastrados no banco de dados com a matriz de características do rosto capturado em tempo real pela webcam conectada ao Raspberry Pi.
Detecção de Faces
Na primeira parte, é utilizada a biblioteca face recognition para a detecção de rostos em tempo real. A função fr.face_locations() é responsável por identificar as regiões do rosto na imagem capturada pela webcam. Essa função recebe como parâmetro uma imagem (imagem em tempo real da webcam) e retorna uma lista de tuplas contendo as coordenadas das faces encontradas.
Código para detecção de faces.
Extração das Características Faciais
Após a detecção dos rostos, é realizada a extração das características faciais de cada rosto encontrado. A função fr.face_encodings() é utilizada para extrair as características faciais de uma determinada imagem facial. Essa função recebe como entrada a imagem do rosto e retorna uma lista de matrizes de características faciais. Cada matriz representa uma face detectada na imagem.
Código para extração das características.
Identificação do Rosto
Na etapa de identificação, as características faciais extraídas do rosto capturado em tempo real são comparadas com as matrizes de características dos usuários cadastrados no banco de dados. Para isso, é necessário carregar as matrizes de características do banco de dados e realizar a comparação utilizando a função fr.compare_faces(). Essa função recebe dois conjuntos de vetores (um conjunto correspondente aos rostos do banco de dados e outro correspondente ao rosto capturado) e retorna uma lista de booleanos indicando se cada rosto foi considerado uma correspondência.
O software percorre todos os vetores de características do banco de dados, realizando a comparação com o vetor do rosto capturado. Se uma correspondência é encontrada, o acesso é concedido ao usuário correspondente.
Código para identificação do rosto
Desenvolvimento da Página Web
Para facilitar o cadastro de usuários, foi desenvolvida uma página web utilizando HTML e PHP, e o servidor local XAMPP foi utilizado para hospedar essa página. O XAMPP é um pacote de software que inclui o Apache, o MySQL e o PHP, permitindo a criação de um ambiente de desenvolvimento local para aplicativos web.
Com o XAMPP configurado em um servidor local, a página web pode ser acessada por dispositivos conectados à mesma rede. Isso possibilita que os usuários remotos acessem a página por meio de seus próprios dispositivos para realizar o cadastro.
A página web permite que os usuários cadastrem seu nome e uma foto no banco de dados. Ao inserir as informações no bando de dados, o sistema identifica que uma nova pessoa foi cadastrada, e utiliza a função update, para extrair a matriz de características correspondente a foto do usuário.
Após a extração das características, a matriz é armazenada no banco de dados PHPMyAdmin, juntamente com as informações prévias do usuário. Essas informações são fundamentais para realizar a verificação do reconhecimento facial posteriormente.
Página de Cadastro
Integração com o Banco de Dados e Função Update
O banco de dados PHPMyAdmin foi utilizado para armazenar as matrizes de características extraídas dos usuários cadastrados. Esse banco de dados é baseado no MySQL e oferece uma interface web para facilitar a administração e manipulação dos dados.
Após o cadastro de um novo usuário pela página web, a imagem facial inserida no banco de dados pelo usuário é processada pelo software para extrair as características faciais. Essas características são então inseridas no banco de dados junto com as informações do usuário, como nome, ID e foto que foram previamente inseridos pela webpage.
Para extrair a matriz de características de uma nova imagem cadastrada, foi criada a função update, que reconhece quando um novo usuário é cadastrado a partir da inserção de uma nova linha na tabela do banco de dados, a função então faz um select da respectiva imagem inserida e utiliza a função face_encodings() para extrair as características faciais, após obter a matriz com a utilização da biblioteca face_recognition, a função faz um update no cadastro do usuário, inserindo a matriz das características no banco de dados.
Código da função Update
Raspberry Pi e Webcam
O sistema de controle de acesso é implementado utilizando um Raspberry Pi e uma webcam conectada. O Raspberry Pi é responsável por executar o software de reconhecimento facial, capturando as imagens em tempo real da webcam. O software processa as imagens e realiza a identificação dos rostos com base nas matrizes de características armazenadas no banco de dados.
Raspberry Pi e Webcam
Imagem em Tempo Real
O sistema de controle de acesso também permite visualizar a imagem da câmera em tempo real na página web, por meio do Motion. Com isso, dispositivos conectados à rede podem acessar a página e acompanhar o vídeo da câmera remotamente, oferecendo maior conveniência e monitoramento em tempo real.
O Motion transmite a imagem da câmera para a página HTML por meio de um servidor web embutido. Quando o Motion é executado, ele captura a imagem da webcam em tempo real e disponibiliza essa imagem como um stream de vídeo em um endereço específico do servidor web.
A página HTML, por sua vez, acessa este endereço do servidor para transmitir a imagem e utiliza o elemento <img> para exibir o stream de vídeo.
Código da página da imagem da câmera
Quando o sistema reconhece uma face, o software através da biblioteca rpi.GPIO manda um sinal para uma das portas do raspberry pi, o que faz ligar o LED.