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
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.
- 23 de out. de 2026O paradoxo do desenvolvimento com IA: por que em código novo a velocidade sobe 55% e em código maduro cai 19%
- 3 de jul. de 2026Rede neural para prever o PIB em C++ sem TensorFlow: roda em um Arduino de 400 rublos
- 9 de out. de 2026SLVR no Qwen2.5-VL-7B ganhou 14,2 pontos no BLINK Relation sem CoT textual
- 22 de out. de 2026AgentVQA testou 22 VLMs em tarefas agênticas: a melhor chegou a apenas 58,5%
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.
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.
O essencial da IA — uma vez por semana
Sete histórias que realmente importaram, escolhidas a dedo. Sem ruído nem releases.
Pronto! Verifique seu e-mail para a confirmação.