Entendendo de vez a convolução: base para processamento de imagens

Quem tem a formação em áreas como engenharia, estatística ou matemática, no mínimo tem uma ideia do que é uma convolução, pois essa técnica é muito utilizada para se criar filtros digitais em processamento de sinais, definição de correlação em estatística, etc.

Atualmente ouve-se muito o termo convolução na área de Inteligência Artificial, especificamente no Aprendizado de Máquina, que utiliza processamento de imagens como pré-tratamento para classificar ou extrair informações relevantes. 

Mas afinal que é convolução?

Convolução é simplesmente uma operação de somatório do produto entre duas funções, ao longo da região em que elas se sobrepõem, em razão do deslocamento existente entre elas. Na teoria, o cálculo da convolução contínua é dada pela integral deste produto, desde que as funções sejam integráveis no intervalo:

Na computação, utiliza-se o cálculo discreto, que realiza um somatório do produto:

 

 

Quando se trata de utilizar a convolução em processamento de imagens para Inteligência Artificial, são necessários dois somatórios pois temos duas dimensões – altura e largura:

Neste caso a convolução tem o papel de fazer uma filtragem para extração de informações de interesse na imagem. Mais especificamente, o uso de filtros espaciais lineares é feito através de matrizes denominadas máscaras ou kernels – como são mais conhecidos na prática.

Dependendo da dimensão e dos valores presentes nessa matriz ou kernel, é possível se obter características diferentes nas imagens como: suavização, deslocamento, contraste, bordas, texturas, remoção de ruídos, dentre outras.

Durante a aplicação da convolução em uma imagem, o kernel vai se deslocando ao longo da imagem, como uma janela móvel, que vai multiplicando e somando os valores sobrepostos, segundo um número de passos determinados, conhecidos por stride.

Para facilitar o entendimento, vamos considerar uma imagem de 32x32x3, onde a altura e a largura têm 32 pixels, com 3 canais de cores – que é a profundidade da matriz. Suponha um kernel de 5x5x3, onde a altura e a largura têm 5 pixels, com obrigatoriamente a mesma profundidade da imagem – que é 3. Deslizando-se o kernel sobre toda a área da imagem, considerando um stride igual a um, teremos uma matriz convoluída de tamanho 28x28x1, pois a cada passo, é calculado o somatório do produto de todos os valores sobrepostos resultando em um único valor:

Para uma imagem NxN, um kernel FxF, e com passo S, o resultado da convolução será uma matriz GxG tal que:

Com este exemplo, fica fácil perceber que a matriz convoluída será menor que a imagem original, e mesmo ajustando-se o stride igual a um, não será possível cobrir os pixels da borda da imagem original. Para resolver este problema, é usual a inclusão de mais pixels nas bordas da imagem original, com a quantidade P tal que:

Esse preenchimento é chamado de padding, e pode-se preencher com zeros, para se minimizar o efeito de redução rápida de dimensionalidade espacial da imagem convoluída. Agora, considerando a mesma nomenclatura do exemplo anterior, pode-se calcular o tamanho GxG da matriz convoluída incluindo o padding, tal que:

 

No contexto de redes neurais convolucionais (as CNNs), utiliza-se uma coleção de kernels ou agrupamento de filtros. Essa coleção é conhecida como camada convolucional. No exemplo visto anteriormente, onde a convolução resultou em uma matriz 28x28x1, aplicando-se seis kernels 5x5x1, a saída será uma matriz 28x28x6, ou seis mapas de ativação – como também é conhecido na prática.

Vejamos outro exemplo, agora utilizando padding: de acordo com a fórmula explicada anteriormente, para filtros 5×5, utilizaremos um padding de valor 2, preenchendo uma imagem de 32x32x3 com 2 camadas de zeros acima, abaixo e nas laterais. Aplicando-se uma primeira convolução com seis filtros 5x5x3, obtém-se uma imagem de 32x32x6. Após uma segunda convolução com dez filtros 5x5x6, obtém-se uma imagem de 32x32x10, e assim por diante. Com esse exemplo verifica-se que as dimensões altura e largura da imagem de entrada não se alteram.

Este texto é a base para o próximo artigo, onde veremos mais detalhes sobre as camadas de uma rede neural convolucional. Gostou? Então visite nosso Instagram e fique por dentro de mais conteúdos ou fale com um especialista da Viceri