Reconhecimento de linguagem de sinais usando CNN

Estudo de caso do Sign Language MNIST dataset

Álvaro Ferreira Pires de Paiva
6 min readNov 21, 2020

Nesse artigo irei mostrar o desenvolvimento de modelos de inteligência artificial para o reconhecimento da linguagem de sinais, me restringindo a um subconjunto de dados (número de 0 a 5).

Problema/Contexto

Atualmente mais de 10 milhões de cidadãos brasileiros sofrem com algum tipo de surdez e a previsão é que nos próximos anos essa quantidade de pessoas surdas aumente cada vez mais. Com isso em mente, se faz cada vez mais necessário o desenvolvimento de aplicações que auxiliem no dia a dia de pessoas com deficiência auditiva.

A aplicação em questão que irei desenvolver nesse artigo é uma inteligência artificial que deve ser capaz de classificar corretamente sinais com as mãos que representam números de 0 a 5. A partir desse modelo, podemos expandir ele para os demais números, letras e outros símbolos, podendo, por exemplo, implementar isso como funcionalidade em aplicativos de chamada por vídeo, no qual o usuário faz os símbolos com as mãos e o aplicativo transcreve eles para texto.

Tecnologias

As tecnologias que usarei para o desenvolvimento dessa inteligência artificial serão:

  • 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: Numpy 1.18.5, Matplotlib 3.2.2.

A ferramenta que estou usando para codificar é o Google Colab.

Dataset

O dataset consiste em um subconjunto do dataset “Sign Language MNIST”, sendo um total de 1200 imagens, todas as imagens possuem as dimensões de 64 por 64 pixels. Cada imagem representa o sinal de um número de 0 a 5, totalizando 6 números.

Exemplos de imagens no nosso dataset e suas respectivas representações numéricas.

A divisão do conjunto de treino e teste ficou:

  • 1080 imagens de treino (90%). O conjunto esta balanceado, ou seja, temos 180 imagens de sinais para cada número;
  • 120 imagens de teste (10%). O conjunto esta balanceado, ou seja, temos 20 imagens de sinais para cada número;

Modelos

Como estamos usando imagens como dados, optei por desenvolver uma Rede Neural Convolucional (Convolutional Neural Network, CNN).

CNN são amplamente utilizadas em diferentes tarefas de processamento de imagens e visão computacional, pois tratam-se de redes que podem receber uma imagem como entrada e realizar múltiplas operações que no geral servem para ações como classificação de imagens, detecção e localização de objetos e segmentação de objetos em imagem.

Nosso modelo esta organizado de forma Sequencial. O final das redes seguirá o padrão de ter uma camada de Flatten para transformarmos as imagens em entradas válidas para as camadas Dense, que servirão para classificar a imagem.

As outras camadas que estaremos usando serão MaxPool2D e Conv2D, ambas são úteis para retirarmos as principais características das imagens com a criação de filtros.

Os treinamentos ocorreram com batch size igual a 64 e um total de 100 épocas.

Modelo base

Trata-se de um modelo básico de CNN:

Modelo base.

Mesmo sendo um modelo básico, ele obteve os seguintes resultados:

Resultados do modelo base.

A partir desse modelo, iremos incrementá-lo de forma que ele fique mais robusto e consiga ter melhores resultados.

Ajuste de hiperparâmetros do modelo

Para a criação dos modelos é necessário decidir alguns parâmetros como quantidade de neurônios na penúltima camada Dense, dimensão do kernel das camadas Conv2D, entre outras coisas.

Pegando o modelo base para estudo, aplicou-se técnicas para identificar os melhores hiperparâmetros para ele, a fim de compreendê-lo melhor e aplicá-los para os modelos posteriores. O resultado foi:

Testes com alguns parâmetros.

Pode-se ver que os melhores parâmetros foram a dimensão do kernel sendo 5 e com 64 unidades na penúltima camada Dense.

Dropout

Nesse nosso modelo iremos utilizar uma técnica de regularização chamada Dropout. Esse método consiste em eliminar aleatoriamente e temporariamente alguns dos neurônios da rede durante uma etapa de treinamento, após essa etapa ele recoloca os neurônios eliminados e realiza novamente o passo a passo, repetindo isso até terminar o treinamento. Para saber mais clique aqui. O modelo ficou:

Modelo com dropout.

O resultado desse modelo foi:

Resultado do modelo com dropout.

Esse modelo conseguiu um resultado melhor que o modelo base, além do tempo de treinamento não ter aumentado tanto (por volta de 50 segundos de diferença).

Batch Normalization

A camada de batch normalization permite taxas de aprendizado maiores e contribui na normalização do modelo, corrigindo a média e a variância da saída da camada anterior. Com o uso dessa camada, não se faz necessário o uso de camadas Dropout. O modelo ficou:

Modelo com batch normalization.

O resultado desse modelo foi:

Resultado do modelo com batch normalization.

Esse modelo treinou mais rápido que o modelo base, além de possuir um melhor resultado até agora.

Modelos sem CNN

Para fazermos um comparativo, os mesmos modelos apresentados anteriormente foram desenvolvidos sem usar camadas para CNN, ou seja, são apenas modelos de redes neurais tradicionais. A seguir temos os modelos sem CNN e seus respectivos resultados.

Modelo base:

Modelo base sem CNN.
Resultado do modelo base sem CNN.

Modelo com dropout:

Modelo com dropout sem CNN.
Resultado do modelo com dropout sem CNN.

Modelo com batch normalization:

Modelo com batch normalization sem CNN.
Resultado do modelo com batch normalization sem CNN.

No geral podemos ver que eles possuem uma acurácia muito ruim, com exceção do modelo com batch normalization, porém devido a complexidade do problema creio que é um problema de overfitting.

Conclusão

Analisando os resultados, podemos concluir que para classificação de imagens (no nosso caso, sinais dos números de 0 a 5) é muito mais interessante usarmos modelos CNN do que modelos tradicionais, tendo em vista a acurácia apresentada pelos modelos usados no estudo.

Por mais que o modelo com Batch Normalization tenha tido o melhor resultado, o modelo com Dropout também se mostrou muito promissor, creio que com os ajustes certos ele poderia ter se tornado o melhor modelo do estudo, por mais que o treinamento tenha sido o mais demorado.

Trabalhos futuros

  • User todo o dataset ou algum que apresente mais símbolos;
  • Analisar mais hiperparâmetros, quantidade de camadas e afins dos modelos;
  • Utilizar outras abordagens e comparar;
  • Conseguir implementar em uma aplicação real e analisar o comportamento da inteligência artificial.

Código

Todo o código desenvolvido e os dados utilizados podem ser encontrados no seguinte repositório: alvarofpp/imd1104-cnn-sign-language.

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.

--

--