Transfer Learning — Detecção do uso de máscaras revisitado

Bruno Pellanda
gb.tech
Published in
4 min readFeb 11, 2022
Photo by Anshu A on Unsplash

Em um dos meus artigos escritos no LinkedIn, expliquei um pouco como funcionam as CNNs (Convolutional Neural Networks) e fiz um programa que usa a webcam do notebook para fazer a detecção do uso (ou não) de máscaras.

Como a pandemia ainda não acabou, e continua sendo MUITO importante todos nós continuarmos usando máscaras, resolvi voltar nesse artigo e agora focar na otimização do modelo treinado, já que esse não tinha sido o foco naquele momento, mas mesmo assim tínhamos alcançado um resultado razoavelmente bom (aproximadamente 98% de acurácia).

Quando falamos em problemas de visão computacional, o baseline que temos como comparação para dizer se um modelo é bom ou não é muito alto, basta pensar como nós, ao olharmos para uma pessoa ou foto, conseguimos dizer se ela está ou não usando máscara. Temos quase sempre 100% de acerto, sendo muito difícil errarmos. Então esperamos algo muito próximo disso ao desenvolver um modelo de visão computacional.

No primeiro artigo, meu objetivo era explicar como construímos uma CNN, suas camadas (Convoluções, MaxPooling, Fully Connected Layer, …) e implementá-la de ponta a ponta e vê-la funcionando. (Spoiler para quem não leu o artigo, ela funcionou)

Gif mostrando uma imagem captada pela webcam de um computador com um sistema de detecção do uso ou não de máscara
Modelo rodando utilizando a câmera do notebook para detecção de imagens

Agora tendo entendido como ela funciona, pensei em como podemos melhorá-la, e quando falamos em Deep Learning, CNNs e outras redes neurais, podemos quase sempre falar que dados nunca são demais, e nesse caso não tínhamos muitos dados disponíveis (menos de duas mil fotos).

Mas nem sempre é fácil (ou barato) para conseguirmos mais dados, então uma das técnicas muito utilizadas nesses tipos de problemas, e que eu acho uma das mais sensacionais, é utilizarmos transfer learning.

Transfer Learning

Transfer learning é a técnica utilizada em machine learning para transferir o conhecimento adquirido durante o treino de um modelo para resolvermos um outro problema com objetivo semelhante (no nosso caso reconhecimento de imagens).

Então para aplicar essa técnica em nosso problema, iremos utilizar uma CNN muito famosa chamada de Inception.

Rede Inception, fonte: Paperswithcode

Ela foi inicialmente desenvolvida para o desafio "ImageNet Recognition Challenge" da ImageNet e foi treinada em mais de 14 milhões de imagens e tem 1.000 classes como suas saídas.

Nosso problema

Apresentações feitas, agora como podemos nos aproveitar de todo o conhecimento que a Inception aprendeu ao ser treinada em mais de 14 milhões de imagens para o nosso problema?

As convoluções são muito boas em detectar padrões e essas informações são armazenadas em seus pesos, então vamos aproveitar esses padrões que ela aprendeu utilizando toda sua estrutura menos suas últimas camadas, pois ela foi construída para uma saída com 1.000 classes e nós temos apenas 2.

Imagem: Autor

Na imagem acima, temos alguns pontos importantes:

  • Importamos os pesos pré-treinados da Inception;
  • Ajustamos o tamanho das imagens de entrada para a rede (para 150x150 pixels);
  • Definimos como Falso o parâmetro para treinar as camadas;
  • Salvamos na variável last_layer a camada mixed7 da rede.

Agora precisamos ajustar as camadas a partir da última (mixed7) de acordo com o nosso problema, e essas camadas que incluirmos no modelo que poderão ser treinadas:

Imagem: Autor

Definições:

  • Criamos 4 camadas ao final da rede Inception para o nosso problema:
    1. Uma camada Flatten;
    2. Uma camada Dense;
    3. Uma camada de Dropout;
    4. E a última camada de saída (Dense com ativação do tipo sigmoide).
  • Definimos o modelo e compilamos ele

Vamos treinar a rede por 20 épocas e visualizar as métricas durante a fase de treino:

Imagem: Autor

Como podemos ver, chegamos num valor muito bom, saindo de 98% com a nossa CNN para >99% utilizando transfer learning.

O próximo passo agora seria pegar esse modelo que acabamos de treinar e substituí-lo no nosso notebook que faz a detecção. Mas vou deixar esse exercício para vocês :)

Todos os códigos, tanto do primeiro modelo quanto desse de hoje, estão no meu Github.

--

--

Bruno Pellanda
gb.tech
Writer for

Cientista de dados, matemático industrial e enxadrista