Ao vivo 18/11 · Turma 318 nov às 19:00 MSK — aula prática gratuita de agentes de IA · Turma 3 ao vivo começa 23/11Aula 18/11 →Turma 3 (23/11)
LançamentoAnálise · No radarHabr AI→ original

Convolução em PHP puro: quatro laços encontram bordas em uma imagem

As redes convolucionais parecem uma caixa-preta até você escrever uma convolução à mão. O autor da oitava parte da série para desenvolvedores PHP pega uma imagem 5×5, um kernel 3×3 e quatro laços aninhados. O filtro desliza pelos pixels, multiplica os valores pelos pesos e soma: em uma área escura o resultado é 0, e na borda, 570.

Processado por IA de Habr AI; editado por Hamidun News
Convolução em PHP puro: quatro laços encontram bordas em uma imagem
Fonte: Habr AI. Colagem: Hamidun News.
Ouvir artigo
Ficha técnica e números-chave
ParâmetroDados
Fonte originalHabr AI ↗
Editor-chefe
Convolução em uma CNNquatro laços, multiplicação e soma
Dado-chave #2Um kernel com pesos -1, 0, 1 responde a uma borda vertical
Dado-chave #3Uma borda gera duas respostas por causa do tamanho da janela

A maioria dos desenvolvedores já ouviu falar de redes neurais convolucionais, mas poucos entendem o que acontece dentro da camada. A oitava parte da série "IA para desenvolvedores PHP" dissipa essa névoa: o autor implementa a convolução em PHP 8.1+ puro, sem bibliotecas nem algoritmos de ML prontos.

Como o computador vê uma imagem

Para uma máquina, uma imagem é uma matriz de números. Em tons de cinza, cada pixel assume um valor de 0 (preto) a 255 (branco). O exemplo usa uma imagem 5×5: as três colunas da esquerda têm o valor 10 e as duas da direita, o valor 200. Entre a terceira e a quarta colunas passa uma borda vertical, e é ela que precisa ser encontrada.

Para isso, usa-se um kernel de convolução (kernel), uma pequena matriz de pesos 3×3. À esquerda há -1, no centro 0 e à direita 1. O kernel compara o brilho das partes esquerda e direita de um trecho: se são parecidas, os termos se anulam; se diferem, o resultado é grande em módulo.

Como funciona no código

A função convolve() recebe uma matriz de entrada e um kernel. O tamanho do resultado é simples de calcular: largura da entrada menos largura do kernel mais um, e o mesmo para a altura. Para 5×5 e 3×3, obtém-se um mapa de características 3×3. Os dois laços externos movem a janela pela imagem, e os dois internos multiplicam os pixels pelos pesos e acumulam a soma.

Na implementação, o stride é 1, o padding é 0 e o kernel não é invertido. A rigor, isso é correlação cruzada (cross-correlation), e não convolução matemática, mas em deep learning costuma-se chamá-la de convolução. Os valores do resultado não são limitados ao intervalo 0–255: o mapa de características pode conter números negativos e valores acima de 255.

A saída é uma matriz cuja primeira coluna é formada por zeros, enquanto as outras duas valem 570. Em uma região escura uniforme, o filtro não vê variação e o resultado é zero. Quando a janela abrange pixels escuros e claros, cada linha resulta em 190, e as três linhas somam 570.

Por que duas respostas para uma borda

Os dois valores 570 não significam duas bordas. Uma janela de 3 pixels de largura, ao deslocar-se de um em um, captura duas vezes a transição de escuro para claro, por isso a resposta se mantém em duas posições vizinhas. Esse é o comportamento normal do kernel, não um bug.

Mais adiante no artigo, o autor altera os pesos e procura bordas horizontais, mostrando que mudar o filtro muda ao que a camada reage.

O que fazer com isso

A conclusão prática é modesta, mas honesta. Esse código não serve para produção: quatro laços aninhados em PHP serão lentos em imagens reais, e para trabalho sério são necessárias bibliotecas otimizadas ou chamadas a modelos externos. Em compensação, se você trabalha com visão computacional por meio de APIs ou extensões, entender a convolução ajuda a ler a documentação, depurar resultados inesperados e compreender o que exatamente a rede aprende: em uma CNN, os pesos dos kernels não são definidos à mão, mas ajustados durante o treinamento.

O artigo é útil como material didático para equipes PHP que querem entender a base das CNNs sem migrar para Python.

História

Perguntas frequentes sobre a notícia

Como o computador vê uma imagem?

Para uma máquina, uma imagem é uma matriz de números. Em tons de cinza, cada pixel assume um valor de 0 (preto) a 255 (branco). O exemplo usa uma imagem 5×5: as três colunas da esquerda têm o valor 10 e as duas da direita, o valor 200. Entre a terceira e a quarta colunas passa uma borda vertical, e é ela que precisa ser encontrada. Para isso, usa-se um kernel de convolução (kernel), uma pequena matriz de pesos 3×3. À esquerda há -1, no centro 0 e à direita 1.

Como funciona no código?

A função convolve() recebe uma matriz de entrada e um kernel. O tamanho do resultado é simples de calcular: largura da entrada menos largura do kernel mais um, e o mesmo para a altura. Para 5×5 e 3×3, obtém-se um mapa de características 3×3. Os dois laços externos movem a janela pela imagem, e os dois internos multiplicam os pixels pelos pesos e acumulam a soma. Na implementação, o stride é 1, o padding é 0 e o kernel não é invertido.

Por que duas respostas para uma borda?

Os dois valores 570 não significam duas bordas. Uma janela de 3 pixels de largura, ao deslocar-se de um em um, captura duas vezes a transição de escuro para claro, por isso a resposta se mantém em duas posições vizinhas. Esse é o comportamento normal do kernel, não um bug. Mais adiante no artigo, o autor altera os pesos e procura bordas horizontais, mostrando que mudar o filtro muda ao que a camada reage.

ZK
Zhemal Khamidun — CPO da Alpina Digital, gerente de produto do AlpinaGPT. Cria produtos de IA desde 2019. O Hamidun News é um projeto pessoal que virou um agregador em produção com mais de 6.000 leitores.
✦ Unified AI Workspace · Nomad

Test Frontier LLMs & Autonomous Agents in One Workspace

Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.

Try Nomad AI →Launch Nomad Agent
O que você acha?
Carregando comentários…