Pedro's dev blog

CNNs: Uncovering Visual Patterns with Convolutions

Published on
Published on
/6 mins read/---

CNNs: Uncovering Visual Patterns with Convolutions

As Redes Neurais Convolucionais (Convolutional Neural Networks - CNNs) são uma classe de redes neurais profundas, inspiradas no córtex visual humano, que se tornaram a ferramenta dominante em Visão Computacional. Elas são particularmente eficazes no processamento de dados que possuem uma topologia de grade, como imagens (grades 2D de pixels) e vídeos (grades 3D - altura, largura, tempo).

A ideia central por trás das CNNs é que elas aprendem hierarquias de características (features). Camadas iniciais detectam características simples como bordas e cantos, camadas intermediárias combinam essas características para detectar formas e texturas, e camadas mais profundas reconhecem objetos complexos.

Why CNNs for Images? The Problem with Dense Networks

Se usássemos uma rede neural totalmente conectada (densa) padrão para uma imagem, teríamos problemas:

  1. Número Massivo de Parâmetros: Uma imagem pequena de 100x100 pixels colorida (3 canais) tem 30.000 pixels. Conectar isso a uma camada oculta com 1000 neurônios já exigiria 30 milhões de pesos só na primeira camada.

  2. Perda da Estrutura Espacial: Redes densas achatam a imagem em um vetor longo, perdendo a informação crucial sobre a disposição espacial dos pixels.

CNNs resolvem isso com duas ideias principais: localidade (filtros pequenos) e compartilhamento de parâmetros (o mesmo filtro é aplicado em toda a imagem).

Key Components of a CNN

1. Convolutional Layer

Este é o bloco de construção fundamental. Em vez de conectar cada pixel a cada neurônio, usamos filtros (ou kernels), que são pequenas matrizes de pesos.

  • Filtro/Kernel: Uma pequena janela (ex: 3x3 ou 5x5 pixels) que desliza sobre a imagem de entrada.
  • Operação de Convolução: Em cada posição, o filtro realiza uma multiplicação elemento a elemento com a porção da imagem, e os resultados são somados (mais um bias) para produzir um único valor na saída.
  • Mapa de Características (Feature Map): A saída da aplicação de um filtro sobre toda a imagem. Cada filtro detecta um padrão específico (bordas, curvas, texturas).
  • Stride (Passo): O número de pixels que o filtro se move a cada passo. Stride > 1 reduz o tamanho do mapa de características.
  • Padding (Preenchimento): Adicionar pixels (geralmente zeros) ao redor da borda da imagem para controlar o tamanho da saída.
graph TD
    subgraph Convolution Operation (Single Filter)
        direction LR
        Input(Input Image Patch<br/>3x3) -- Element-wise Multiply --> Kernel(Filter/Kernel<br/>3x3);
        Kernel --> Sum(Sum Products + Bias);
        Sum --> OutputPixel(Single Pixel in<br/>Feature Map);
    end
 
    InputImage(Input Image) --> SlidingWindow;
    Filter(Filter) --> SlidingWindow{Filter Slides Over Image};
    SlidingWindow --> FeatureMap(Output Feature Map);
 
    style InputImage fill:#f9f
    style Filter fill:#9cf
    style FeatureMap fill:#9fc

2. Activation Function

Após cada operação de convolução, uma função de ativação não-linear é aplicada, geralmente a ReLU (Rectified Linear Unit): f(x) = max(0, x).

  • Introduz não-linearidade na rede, permitindo aprender funções mais complexas.
  • ReLU é computacionalmente eficiente e ajuda a mitigar o problema do desaparecimento do gradiente.

3. Pooling Layer

  • Propósito: Reduzir progressivamente a dimensionalidade espacial dos mapas de características, diminuindo a quantidade de parâmetros e tornando as representações mais robustas a translações.
  • Max Pooling: Seleciona o valor máximo dentro de uma janela (ex: 2x2). É o mais comum.
  • Average Pooling: Calcula a média dos valores dentro da janela.
graph TD
    subgraph Max Pooling (2x2 Window, Stride 2)
        InputMap("Input Feature Map\n[1 2]\n[8 4]") --> MaxPoolOp{Select Max};
        MaxPoolOp --> OutputVal(Output Value: 8);
 
        InputMap2("[5 3]\n[1 7]") --> MaxPoolOp2{Select Max};
        MaxPoolOp2 --> OutputVal2(Output Value: 7);
         InputMap3("[0 6]\n[2 9]") --> MaxPoolOp3{Select Max};
        MaxPoolOp3 --> OutputVal3(Output Value: 9);
         InputMap4("[3 1]\n[5 2]") --> MaxPoolOp4{Select Max};
        MaxPoolOp4 --> OutputVal4(Output Value: 5);
    end
    FeatureMapIn(Input Feature Map<br/>4x4) --> PoolingWindow{Pooling Window Slides};
    PoolingWindow --> PooledMap(Pooled Feature Map<br/>2x2);
 
    style FeatureMapIn fill:#9fc
    style PooledMap fill:#ccf

4. Fully Connected Layer

Após várias camadas convolucionais e de pooling, os mapas de características são achatados (flattened) em um vetor longo. Esse vetor é alimentado em uma ou mais camadas totalmente conectadas que realizam a classificação final, geralmente com Softmax para produzir probabilidades de classe.

Typical CNN Architecture

Uma CNN típica consiste em empilhar essas camadas:

INPUT -> [[CONV -> RELU] * N -> POOL?] * M -> [FC -> RELU] * K -> FC (Softmax)
graph TD
    Input(Image Input) --> C1(Conv + ReLU);
    C1 --> P1(Max Pooling);
    P1 --> C2(Conv + ReLU);
    C2 --> P2(Max Pooling);
    P2 --> Flatten(Flatten);
    Flatten --> FC1(Fully Connected + ReLU);
    FC1 --> FC2(Fully Connected - Output Layer<br/>Softmax);
    FC2 --> Output(Class Probabilities<br/>Ex: Gato, Cachorro);
 
    style Input fill:#f9f
    style C1 fill:#9cf; style C2 fill:#9cf
    style P1 fill:#facc; style P2 fill:#facc
    style FC1 fill:#9fc; style FC2 fill:#9fc
    style Output fill:#ccf

Example: Image Classification (Cat vs. Dog)

  1. Entrada: Uma imagem de um gato ou cachorro.
  2. Camadas Convolucionais Iniciais: Filtros detectam características de baixo nível como bordas, texturas (pelos), cantos.
  3. Camadas de Pooling: Reduzem o tamanho, mantendo as informações mais salientes.
  4. Camadas Convolucionais Profundas: Combinam características simples para detectar partes mais complexas: olhos, focinhos, orelhas pontudas (gato?), orelhas caídas (cachorro?).
  5. Camada Totalmente Conectada: Aprende a mapear o vetor de características para as classes.
  6. Saída: Uma probabilidade para cada classe (ex: Gato: 0.95, Cachorro: 0.05).

Advantages

  • Compartilhamento de Parâmetros: Reduz drasticamente o número de parâmetros em comparação com redes densas.
  • Invariância a Translações: As CNNs são robustas a pequenas mudanças na posição do objeto na imagem.
  • Aprendizado de Hierarquia de Características: Capturam automaticamente características relevantes em diferentes níveis de abstração.
  • Desempenho State-of-the-Art: Dominam tarefas de visão computacional (classificação, detecção de objetos, segmentação).

Disadvantages

  • Requerem Muitos Dados: Especialmente para tarefas complexas, precisam de grandes datasets rotulados.
  • Sensibilidade a Rotação e Escala: A invariância não é perfeita; podem ter dificuldades com orientações ou tamanhos muito diferentes dos vistos no treinamento.
  • Não Ideais para Dados Sequenciais: Não são projetadas nativamente para capturar dependências temporais como as RNNs.
  • Interpretabilidade: Entender exatamente o que uma CNN aprendeu pode ser desafiador.

Beyond 2D Images

  • CNNs 1D: Usadas para dados sequenciais como sinais de áudio, texto, séries temporais.
  • CNNs 3D: Usadas para dados volumétricos como vídeos ou imagens médicas.

Conclusion

As CNNs revolucionaram a visão computacional ao introduzir uma arquitetura que processa eficientemente dados em grade e aprende automaticamente hierarquias de características espaciais. Sua estrutura com camadas convolucionais, de ativação e de pooling, seguida por camadas totalmente conectadas, provou ser extremamente poderosa para extrair padrões significativos de dados visuais e outros tipos de dados estruturados.

ConnectionsFull graph →