quarta-feira, 27 de março de 2019

Reconhecimento e classificação facial com CNN - Rede neural convolucional usando Tensorflow


#python #IA #redeNeural #CNN #reconhecimentoFacial

Continuando minha série de artigos sobre visão computacional e reconhecimento facial, mostrarei um método bem mais preciso de classificação de rostos, ou seja, identificação de pessoas com base em fotos.

Esta demonstração utiliza o Tensorflow e um modelo de rede convolucional que eu criei e treinei com imagens minhas e de algumas personalidades públicas, selecionadas da Internet.




CNN – Convolutional Neural Network



O código desta demonstração está em: https://github.com/cleuton/facerec_cnn

Clone o repositório ou baixe um zip. Mas não se esqueça de dar uma estrela no Github!

Rede Neural Convolucional
É uma rede neural dupla, sendo que a primeira parte é dedicada a capturar as características de cada imagem, enquanto a segunda, classifica essa característica de acordo com os pesos.

Convolução


Convolução é o processo de adicionar cada elemento da imagem aos seus vizinhos locais, compensado por um núcleo ou Kernel. O kernel ou matriz de convolução, ou ainda "máscara", é uma pequena matriz, que determina o que deve ser ser multiplicado e adicionado a cada pixel, gerando uma imagem menor.
É utilizada em operações de sharpening, blurring, embossing, detecção de bordas e outras operações em imagens.


O kernel é rotacionado sobre todos os pixes da imagem original, gerando uma matriz resumida, onde cada ponto é um resumo das operações de multiplicação de cada elemento do kernel.


Pooling

Pooling é o processo de reduzir a dimensionalidade das características, reduzindo o tamanho da entrada. Além de tornar o processamento mais simples e rápido, evita o overfitting.
Utilizamos uma matriz de pooling para sumarizar os pontos da imagem convolucionada. Podemos sumarizar pegando o maior valor de um grupo de pontos (MAX) ou a sua média (AVERAGE).
Crédito da imagem: https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/


Camadas de uma rede convolucional

Geralmente, temos um núcleo convolucional, formado por 3 camadas, que pode se repetir em uma CNN, antes de passar para a segunda parte, que é a classificação:
  1. Convolução;
  2. Retificação (adicionar não-linearidade);
  3. Pooling.
A retificação elimina os pontos negativos na imagem, substituindo-os por zero. Ela pode ser feita utilizando qualquer uma das funções de ativação mais comuns, como: ReLU, sigmoid ou tanh.


Geralmente, uma CNN é a união de duas Redes Neurais: uma Convolucional, e outra Classificatória, como na imagem:
Crédito da imagem: https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/
Meu processo é bem simples:
  1. Seleciono várias imagens das pessoas que desejo reconhecer e armazeno na pasta “raw”;
  2. Cada imagem deve ter o nome da pessoa (a categoria), por exemplo: “cleuton.1.jpg”, “cleuton.2.jpg” etc;
  3. Executo o programa de preparo e treinamento: “python trainCNN.py”;
  4. Uso o mesmo modelo, com os pesos que foram salvos (“faces_saved.h5”) para fazer predições com base em captura da webcam.
Nesta demonstração, eu uso o Anaconda que é um gerenciador de ambientes virtuais que funciona com Python (e com outras linguagens, como R).
Tudo pode ser instalado e testado em qualquer sistema operacional, pois o Anaconda tem instaladores para: MS Windows, Linux e MacOS. Eu estou utilizando Ubuntu 18.04.


Para rodar esta demonstração, você precisa ter o Python 3.x instalado, além de várias bibliotecas, incluindo o Tensorflow e o Keras. Mas não se preocupe! O Anaconda vai ajudar a preparar o ambiente para você! Além destas bibliotecas, eu utilizo a dlib e a OpenCV para preparar as imagens, mas a montagem da CNN, o Treinamento e a predição eu faço com Keras e Tensorflow.


Comece instalando o Anaconda escolhendo a versão com Python 3.x. Se o seu computador for 64 bits, escolha esta versão. Dentro dos arquivos do repositório, há um em especial: “ambiente.yml”, que serve para criarmos um ambiente virtual com o anaconda:
conda env create -f ambiente.yml


Depois de executar este comando, que demora um pouco, é só entrar no ambiente virtual com o comando:
conda activate facedet
Pronto! Agora, você pode treinar seu modelo e salvar o arquivo de pesos correspondente.


O software

O programa trainCNN.py prepara as imagens, cria o modelo e executa um treinamento, com as imagens processadas. Ele pega as imagens da pasta “raw”, prepara, e separa em dados de treino e teste, gravando nos diretórios correspondentes.


A preparação da imagem consiste em:
  1. Detectar rostos na imagem, utilizando a dlib (face predictor);
  2. Para cada rosto, transformar em imagem monocromática;
  3. Para cada imagem mono, analisar o ângulo dos olhos e rotacionar a face para ficar de frente (vertical);
  4. Para cada imagem mono rotacionada, redimensionar para 64 x 64 pixels;
Antes de executar o programa de treinamento (trainCNN.py) baixe e descompacte o arquivo de face landmarks do dlib:
http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
Veja a comparação de uma imagem original e a preparada para treinamento:
O modelo CNN que eu criei está configurado desta maneira:
inputs = Input(shape=(img_h, img_w, 1))
x = conv3x3(inputs, 32)
x = conv3x3(x, 32)
x = MaxPooling2D(pool_size=(2,2))(x)
x = conv3x3(x, 64)
x = conv3x3(x, 64)
x = MaxPooling2D(pool_size=(2,2))(x)
x = conv3x3(x, 128)
x = MaxPooling2D(pool_size=(2,2))(x)
x = Flatten()(x)
x = Dense(128, activation="relu")(x)
preds = Dense(nb_class, activation='softmax')(x)
model = Model(inputs=inputs, outputs=preds)


São várias camadas convolucionais, com filtro de 3 x 3 e função de ativação ReLU, com camadas de polling 2 x 2 e a camada densa final com softmax.


O predict.py usa o mesmo modelo e carrega o arquivo de pesos, criado pelo trainCNN.py. Ele obtém a imagem a partir da webcam, utilizando a OpenCV (pode obter de um arquivo também). Ao pressionar a tecla “q” ele vai identificar os rostos da foto e colocar os nomes encontrados. Como você pode ver, ele detecta até rostos em fotos de celular.


O interessante é que, nesta foto, estou utilizando cavanhaque, e o modelo foi treinado com fotos antigas minhas, sem cavanhaque. E, na foto do celular, o Bill Clinton está fazendo uma certa “careta”, o que não impediu o reconhecimento correto.

Aplicação

Esta demonstração é diferente daquela que eu fiz com HOG, sendo mais precisa. A comparação com HOG é útil quando não temos fotos prévias das pessoas e queremos comparar duas fotos.







Nenhum comentário:

Postar um comentário