Reconhecimento de expressão facial usando CNN

Estudo de caso do fer2013 dataset

Álvaro Ferreira Pires de Paiva
5 min readDec 17, 2020

Nesse artigo irei mostrar o desenvolvimento de modelos de inteligência artificial para o reconhecimento de expressões faciais.

Contexto

Visão computacional é uma área que consiste na manipulação de imagens com a finalidade de compreender visualmente algo, seja detectando objetos, identificando características, etc. É uma área bastante explorada e que vem crescendo a cada dia, principalmente devido a quantidade de aplicações que podemos desenvolver para resolver os problemas dos mais diversos contextos, sejam de segurança (detectar armas ou reconhecer foragidos) até de logística (identificar o material carregado e direcioná-lo a partir de suas características).

No nosso caso, iremos usar visão computacional para detectar a expressão facial que alguém esta fazendo na imagem. Para isso iremos desenvolver um algoritmo que (1) identifique os rostos presentes na imagem e (2) aplique uma Convolutional Neural Network (CNN) que seja capaz de detectar a expressão facial.

Um exemplo de aplicação que poderíamos usar essa nossa inteligência artificial seria para observar o que as pessoas estão sentindo durante uma transmissão, reunião, apresentação, etc nas chamadas online. Então um pesquisador consegue saber como as pessoas estão reagindo a uma determinada parte de um vídeo/transmissão ou no caso de um palestrante que deseja saber se aquele tema tem mais simpatizantes ou não durante a sua apresentação.

Tecnologias

As tecnologias que usei para o desenvolvimento dessa inteligência artificial foram:

  • Linguagem de programação: Python 3.6.9;
  • Criação de modelos: Tensorflow 2.3.0;
  • Manipulação de imagens: Pillow 4.1.1;
  • Demais bibliotecas: Pandas, Numpy.

A ferramenta que usei para codificar foi o Google Colab (usando GPU). Ao final, utilizei o Streamlit para criar uma simples aplicação web.

Dataset

Imagem retirada do Wolfram Data Repository.

Os dados foram retirados do Kaggle “Challenges in Representation Learning: Facial Expression Recognition Challenge”. Consiste em um dataset com 35887 linhas e 3 colunas, sendo as colunas:

  • emotion: a emoção categorizada da imagem;
  • pixels: corresponde aos pixels das imagens de rostos em tons de cinza de 48x48 pixels;
  • Usage: diz se aquela imagem pertence a um dos três conjuntos: “Training”, “PublicTest” ou “PrivateTest”.

As emoções foram categorizadas com um código numérico que varia de 0 a 6:

  • 0: Zangado (Angry), 4953 exemplares;
  • 1: Nojo (Disgust), 547 exemplares;
  • 2: Medo (Fear), 5121 exemplares;
  • 3: Feliz (Happy), 8989 exemplares;
  • 4: Triste (Sad), 6077 exemplares;
  • 5: Surpresa (Surprise), 4002 exemplares;
  • 6: Neutro (Neutral), 6198 exemplares.

O conjunto de treinamento (“Training”) consiste em 28.709 linhas (algo próximo dos 80%). O conjunto de teste público (“PublicTest”) e de teste final (“PrivateTest”) consistem em 3.589 linhas cada (algo próximo dos 10% cada).

Modelos

Para a criação dos modelos, eu segui dois papers:

O primeiro paper introduz as redes VGG (mais conhecidas são VGG16 e VGG19). Um detalhe dessas redes é que a utilização de filtros 3x3 com Max Pooling no modelo permite que ele consiga simular filtros de maior dimensão, mas sem perder os benefícios de ser um filtro pequeno, assim ele consegue um maior número de parâmetros. Abaixo você consegue ver os modelos propostos pelo paper:

Tabela 1 retirada do paper Very Deep Convolutional Networks for Large-Scale Image Recognition (Karen Simonyan, Andrew Zisserman), ICLR 2015.

Durante a implementação, modifiquei o VGG A-LRN na parte de Local Response Normalization (LRN), uma camada não treinável, para um Layer Normalization (LN), uma camada treinável.

O segundo paper propõe dois modelos de CNN (um modelo raso e outro profundo) para o problema de reconhecimento de expressões faciais. Um detalhe sobre esse paper é que ele referencia o mesmo dataset que estou usando nesse trabalho, porém as dimensões são diferentes (37000 do paper contra 35887 do dataset no Kaggle) e sem explicação. Resumidamente os modelos possuem as seguintes estruturas:

  • Shallow CNN: 2 camadas de convolução e 1 camada Fully Connected;
  • Deep CNN: 4 camadas de convolução e 2 camadas Fully Connected.

Especificações mais detalhadas sobre os modelos podem ser encontras na seção “5.1 Experiments”, na página 3.

Além desses modelos, criei outros dois modelos: um a partir do VGG19 e outro a partir do Deep CNN. Na VGG19 eu modifiquei o tamanho do kernel das primeiras camadas de convolução de cada bloco (de 3x3 foi para 5x5), coloquei camadas de Batch Normalization em cada bloco (com exceção do último bloco) e um Dropout no último bloco. No Deep CNN eu modifiquei os valores de Dropout e adicionei mais um bloco com camada de convolução.

Parâmetros

Testou-se diferentes parâmetros de treinamento, no geral seguindo as recomendações dos papers em questão.

  • Batch size: 128 (Shallow e Deep) e 256 (VGG);
  • Epochs: 30, 50 e 100; 30 foi baseado no paper de Shallow e Deep que usa 30 e 35 épocas respectivamente para os modelos citados. O paper do VGG usa 74 épocas, portanto coloquei 50 e 100.
  • Kernel size: 3x3 e 5x5;
  • Dropout: 0.2, 0.25 e 0.3.

Os modelos obtiveram melhores resultados com batch size 256 e 100 epochs.

Resultados e Conclusão

(esquerda) Imagens encontradas no Google Imagens. (direita) Resultado da aplicação de um dos modelos.

Todos os modelos acabaram tendo uma baixa acurácia, porém alta precisão e recall. Creio que um balanceamento de classes poderia melhorar esse resultado, além de um aumento do dataset, seja por usar funções que modifiquem as imagens a fim de gerar novos exemplares ou de conseguir novos rostos e emoções.

A aplicação em Streamlit encontra-se no endereço eletrônico: https://share.streamlit.io/alvarofpp/imd1104-facial-expression-recognition/main/app.py. Lá você pode selecionar o modelo e testar com suas próprias imagens.

Trabalhos futuros

  • Colocar para ver via webcam em tempo real a detecção de expressões faciais na aplicação web;
  • Criar um plugin para ser usado em bibliotecas de streaming de vídeo para poder ser implementado em várias plataformas (YouTube, Google Meet, etc);
  • Treinar com novos dados gerados e de outros datasets, visando um modelo mais acurado;
  • Implementar novos modelos (ResNet50 e afins).

Código

Todo o código pode ser encontrado no seguinte repositório: https://github.com/alvarofpp/imd1104-facial-expression-recognition.

Esse artigo foi escrito para a disciplina de Aprendizado Profundo do curso de Bacharelado em Tecnologia da Informação (BTI) da Universidade Federal do Rio Grande do Norte (UFRN), possuindo Ivanovitch Silva como professor.

--

--