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

Acompanhe todas as nossas publicações

Mais Insights.

Fale com a Viceri-Seidor.

Leve a revolução digital para a sua empresa hoje mesmo.

Onde estamos.

São Paulo
Belo Horizonte
Rio de Janeiro
Porto Alegre
Vila Velha
Goiânia
Jundiaí
Recife
Ribeirão Preto
Florianópolis
Curitiba

Tem alguma dúvida?

Entregamos muito mais que soluções tecnológicas, nós entregamos o valor real que o seu negócio precisa em toda nossa relação.

Faça parte.

Nós movemos o mundo junto com nossos talentos. Venha ser parte dessa transformação.