Visão Computacional — O que é convolução?

Uma das bases da visão computacional

Rodrigo Fill Rangel
Turing Talks
8 min readSep 13, 2020

--

Fonte: https://pixabay.com/pt/photos/onda-sinal-comunica%C3%A7%C3%A3o-tecnologia-850007/

Texto escrito por Rodrigo Fill e Paulo Sestini.

Olá caro leitor dos Turing Talks, seja muito bem vindo a mais um texto, aproveitando a série de visão computacional? Espero realmente que esteja gostando. Hoje vamos apresentar mais um dos temas desta série, aprofundando o conceito de convolução, abordado nos textos anteriores desta série. Neste texto você vai aprender o que é convolução, quais tipos existem e como ela se aplica em visão computacional.

Como visto nos primeiros textos as aplicações de visão computacional são das mais amplas, desde querer aplicar um filtro à uma imagem até querer que o computador seja capaz de interpretar as imagens que são fornecidas a ele. Lembrando então que as imagens são interpretadas pelo computador como uma matriz, podemos pensar que, não importa a aplicação, ao tratar os problemas citados será necessário ter uma operação matemática bem definida para lidar com as matrizes. Tal operação já existe e é chamada de convolução, que é definida tanto de forma contínua como discreta, no tempo ou no espaço. Para o computador o importante é apenas a operação discreta e especificamente para visão computacional o mais interessante é a convolução discreta espacial, mas antes vamos passar pelos outros tipos rapidamente para elevar o grau de intuição e entendimento.

Quais são os tipos de convolução?

Convolução temporal contínua

A convolução temporal contínua é geralmente utilizada em análise de sinais temporais analógicos, como a transmissão física de sinais elétricos por meio de condutores. Um significado físico para a convolução temporal é particularmente mais difícil de ser encontrado, porém, podemos pensar na convolução como uma medida de quanto dois sinais estão sobrepostos em diferentes instantes de tempo. A equação para cálculo da convolução entre duas funções contínuas, f(t) e g(t), é:

Expressão de convolução temporal contínua

Onde * denota a operação de convolução. Resolver analiticamente a integral acima pode não ser trivial, na realidade quase nunca é, mas é possível resolver a convolução de forma gráfica, como faremos a seguir.

Processo de resolução gráfica

Iremos realizar uma convolução entre os dois pulsos de sinal na imagem a seguir.

Pulsos de sinais

Observe que os pulsos são funções que possuem valores diferentes de zero somente durante um certo intervalo de tempo, sendo nulas nos outros instantes.

  1. Temos que as funções no domínio do tempo serão integradas em 𝝉, portanto o primeiro passo é pegar a função g(t), invertê-la em relação ao eixo “y’’, uma vez que no domínio de integração temos g(-𝝉). Isso pois em 𝝉 = -1 teremos o valor de g(1), 𝝉 = -2 teremos g(2), 𝝉 = 1 teremos g(-1), e assim por diante, o efeito seria de “rebater” a função em relação ao eixo “y”. Note que se a função g(t) for par, ou seja, simétrica em relação ao eixo “y”, inverter a função não tem efeito visível, então pode parecer que nada foi invertido.
  2. Iniciando então no instante ‘t = 0’, multiplicar a função f(𝝉) pela parte de g(0-𝝉) que se sobrepõe com a anterior. Aqui fica mais fácil compreender o significado de sobreposição, quando os sinais não estão sobrepostos essa multiplicação é nula, se o valor da multiplicação é alta, grande parte das funções se sobrepõe.
  3. Integrar o resultado da multiplicação anterior, ou seja, calcular a área referente à multiplicação das funções. Vale ficar atento para o detalhe que esta área entre as funções corresponde à apenas um ponto de f(t) * g(t), precisamos agora calcular os outros.
  4. A seguir deslocamos a função g(t-𝝉) para o próximo instante de tempo ‘t’, por exemplo ‘t=1’.
  5. Repetir os passos 2 a 4, até varrer completamente todo o domínio das funções analisadas, gerando a função f(t)*g(t).

Ainda é possível que esteja um pouco difícil visualizar o que foi dito acima, então vamos utilizar o maravilhoso recurso do GIF para mostrar como fica a convolução entre dois sinais contínuos de forma gráfica, movendo um deles, mantendo o outro fixo:

Fonte: https://gfycat.com/brownquickisabellineshrike

A imagem mostra duas funções funções, f(t) em azul e g(t-𝝉) em vermelho deslocando na imagem, repare que ela foi invertida em relação à imagem anterior que mostramos. Vemos então a vermelha sendo deslocada e sobrepondo a função azul. Em preto, por fim, está f*g, a convolução de fato. Algumas coisas para notar, a convolução tem uma parte de subida, uma constante, e uma de descida, como eu falei acima cada instante que g(t-𝝉) é deslocado gera um ‘ponto’ da função f*g, neste sentido quando a função f*g cresce, significa que a sobreposição de g(t) com f(t) está aumentando. Quando este valor se mantém constante significa que a sobreposição é a mesma.

Vale lembrar então que este é um processo para funções contínuas em seu domínio, mas a operação de convolução pode ser definida em para outros tipos de domínios, como em funções discretas.

Convolução temporal discreta

O convolução temporal discreta é particularmente útil quando tratamos de sistemas lineares invariantes no tempo discretos, como o computador. É uma forma análoga da função que vimos anteriormente, mas por ser no tempo discreto seu cálculo analítico é consideravelmente mais simples (não inclui integrais):

Convolução espacial discreta

Vamos falar agora sobre a convolução mais simples, a espacial discreta, que é a de fato utilizada pelo computador quando realizamos visão computacional. A convolução espacial utiliza imagens, no caso matrizes, no lugar de funções ou sinais. Imagine a f(t) como sendo uma imagem e a g(t) como sendo outra imagem. O processo de cálculo agora da convolução não depende mais de uma integral visto que estamos em domínio discreto, intuitivamente basta sobrepor as imagens e multiplicar, pixel a pixel, seus valores, e somar tudo ao fim, isso retorna o valor da convolução naquele ponto. A quantidade de convoluções a serem realizadas vai depender do tamanho das imagens, se tiverem o mesmo tamanho apenas uma operação de convolução é feita, se tiverem tamanhos diferentes voltamos ao processo de deslocar as imagens e ir computando as operações de convolução. Vejamos o gif abaixo onde a imagem analisada está em verde, em amarelo temos a imagem que buscamos comparar, repare que a imagem amarela seria um ‘x’. Em rosa esta o resultado da convolução em cada ponto:

Fonte: https://i.stack.imgur.com/I7DBr.gif

A imagem sendo deslocada é chamada de máscara em visão computacional, seu uso pode ser dos mais variados, por exemplo:

  • Ao aplicar um filtro à imagem original a máscara deve ser definida de acordo com o objetivo do filtro, um exemplo é a máscara do filtro Gaussiano, abordado no texto anterior.
  • Ao comparar a imagem de análise o filtro deve representar o elemento com o qual deseja-se realizar a comparação, por exemplo como uma rede neural convolucional busca saber se uma foto corresponde à um cachorro ela pode buscar elementos como: rabo, quatro patas, focinho, orelhas; tudo no formato esperado para um cachorro. Se a convolução retornar valores altos em partes da imagem para cada uma das análises a rede pode concluir que ali há mesmo um cachorro.

Aplicações de convolução em imagens

Como vimos, podemos utilizar um filtro de convolução para realizar operações em imagens, agora vamos ver alguns exemplos do que pode ser feito.

Convolução para detecção

Podemos utilizar filtros para encontrar para detectar padrões e objetos em imagem, um bom exemplo disso é o de detecção de bordas e contornos em imagens. Há vários tipos de filtro para isso, sendo que um dos mais famosos é o filtro de Sobel.

O Filtro de Sobel possui duas componentes, uma para realizar detecção de bordas na horizontal e outra na vertical.

Componente horizontal
Componente vertical

Podemos pensar numa borda como uma mudança abrupta de intensidade na imagem, e o formato do filtro para fazer tal detecção retrata este fato, com valores variando de positivo para negativo ao longo dos eixos horizontal e vertical.

Imagem original. Fonte: https://en.wikipedia.org/wiki/Sobel_operator
Imagem convolucionada com Sobel. Fonte: https://en.wikipedia.org/wiki/Sobel_operator

Convolução para tratamento de imagens

É muito comum utilizarmos editores de imagens para borrar imagens ou aumentar nitidez, e os editores fazem isto justamente utilizando convolução com diferentes filtros para cada propósito:

  • Box blur: Aplica desfoque em uma imagem realizando a média das intensidades dos pixels em uma vizinhança.
Filtro Box Blur
Fonte: http://codecave.org/image-processing/chap_area.html
  • Filtro Gaussiano: Também realiza um desfoque, porém seguindo uma distribuição gaussiana.
Filtro Gaussiano (aproximado)
Fonte: https://pt.wikipedia.org/wiki/Ficheiro:Halftone,_Gaussian_Blur.jpg

Já escrevemos um Turing Talks especialmente para este tipo de filtro, você pode ver mais detalhes neste link: Implementação do desfoque Gaussiano

  • Image Sharpening: Filtros utilizados para aumentar a nitidez de imagens

Convolução em redes neurais convolucionais

Com estes exemplos vimos que, dependendo dos números presentes na matriz de um filtro, uma função diferente é realizada.

Porém, estes filtros são construídos manualmente, então, como uma rede neural os utiliza para a detecção de objetos?

A resposta é que, ao contrário dos kernels mostrados, que são construídos manualmente para determinado propósito, as redes neurais aprendem a fazer os seus próprios sozinhas.

Assim, a tarefa das redes neurais convolucionais é aprender os números certos das matrizes para que cada filtro faça a função necessária. No final, elas aprendem diversos tipos de detectores diferentes, um para cada propósito.

Padrões detectados por diferentes kernels aprendidos por uma rede neural convolucional. Fonte: https://cs231n.github.io/understanding-cnn/

Conclusão

E assim chegamos ao fim de mais um Turing Talks! Esperamos ter conseguido ajudar a compreensão desta que é uma importante operação para visão computacional. Em outros textos futuros da área vamos explorar mais a fundo as aplicações que foram citadas, então fique atento aqui no Medium para não perder os próximos conteúdos, e siga as páginas do Grupo Turing no Facebook e no Instagram, até a próxima!

--

--