Eu li aqui que "um filtro inicializado aleatoriamente funciona muito como um detector de borda!". Quero saber se existem documentos descrevendo e explicando esse fenômeno.
Eu li aqui que "um filtro inicializado aleatoriamente funciona muito como um detector de borda!". Quero saber se existem documentos descrevendo e explicando esse fenômeno.
Respostas:
Por quê? Vejamos o caso mais simples possível, em que o kernel tem 1x2 (ou seja, dois pixels de largura e um pixel de altura).
Aqui está uma matriz do kernel para um detector de arestas que detecta arestas verticais:
Aqui está outra matriz para um detector de arestas que também detecta arestas verticais:
Em particular, a convolução com responde fortemente às arestas verticais e onde o lado direito da aresta tem maior intensidade e o lado esquerdo tem menor intensidade (mais branco à direita, mais preto à esquerda). responde fortemente às arestas verticais com a variação de intensidade oposta (mais branca à esquerda, mais negra à direita).
Podemos ver que o mesmo se aplica a outros exemplos. Por exemplo, considere
Isso se comporta quase de forma idêntica à , exceto para redimensionar sua saída.
Por uma questão de simplicidade, vamos nos concentrar nos kernels de convolução que foram normalizados, para que suas entradas sejam zero. (Muitos kernels de convolução que usamos na prática têm essa forma, porque possuem boas propriedades.)
Que tal uma matriz 1x2 aleatória? Bem, se tiver sido normalizado, terá necessariamente a forma
por alguma constante (Onde é aleatório). Independentemente do que é, vemos que isso se comporta como ou .
Conclusão: um filtro de convolução 1x2 aleatório e normalizado se comporta como um detector de borda vertical, com alta probabilidade.
Isso pode ser generalizado para outros tamanhos de kernels. Para um kernel 2x1 aleatório e normalizado, obteremos basicamente um detector de borda horizontal. Um kernel 2x2 aleatório e normalizado provavelmente responderá às arestas em alguma direção (talvez em algum ângulo; a direção específica dependerá das entradas da matriz).
À medida que a matriz aumenta, esse efeito diminui (eu acho). No entanto, normalmente na prática usamos um núcleo de convolução relativamente pequeno (um campo receptivo razoavelmente pequeno), então realmente nos preocupamos principalmente com o comportamento de pequenos núcleos de convolução.
E a normalização? Até agora, tenho falado sobre matrizes que foram geradas aleatoriamente e depois normalizadas para somar a zero. E se pularmos a etapa de normalização?
Bem, isso não muda muito. Sem normalização, um matriz aleatória pode ser decomposto em Onde é normalizado, de modo que suas entradas somam zero, é uma constante é a matriz que contém em todas as entradas.
Como envolver a imagem de entrada com tem uma boa chance de aplicar basicamente um filtro detector de borda na imagem de entrada (como discutido acima). Como envolver a imagem de entrada com basicamente irá desfocar a imagem e depois multiplicar por . Assim, a imagem de saída é a soma (ponderada) desses dois: a soma (ponderada) de um filtro detector de borda mais uma versão borrada da imagem.
Para uma matriz aleatória, há uma chance decente de será relativamente pequeno (já que a média da soma de um monte de variáveis aleatórias é geralmente bastante pequena), multiplicando-se por faz com que a imagem de saída seja determinada mais pelo detector de bordas do que pelo desfoque. E se é pequeno, podemos basicamente ignorar o segundo termo da soma e aproximar a imagem de saída como resultado de um filtro detector de borda.
É por isso que a convolução com uma matriz aleatória tem uma chance decente de aplicar algum tipo de detector de borda à imagem de entrada.
Olhando para as imagens de exemplo nessas páginas, aos meus olhos a primeira parece mais ou menos com um detector de borda e a segunda parece mais ou menos com um operador de desfoque. Isso é consistente com a análise acima.