Visão computacional: Por que os filtros aleatórios têm desempenho semelhante aos detectores de borda?


7

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.


Você está interessado apenas em papel ou uma explicação razoável seria suficiente? Como o filtro do kernel em tal uso é realmente um detector de borda, mas o "fenômeno", como você chama, é apenas "escolha-me os ângulos do meu detector de maneira uniforme", para que qualquer descontinuidade em determinados ângulos seja detectada - se não forem todos 0.
Mal

Como você está procurando papéis - apenas o incentivo a ler como são feitos os detectores de borda - eles são calculados para determinados ângulos, mas se você não se importa tanto com um ângulo específico, mas depois de escolher, você os usa de maneira consistente para alimentar sua rede , quase todos os números uniformes são bons (caso zero, caso identidade e casos degenerados dos olhos devem ser descartados). Quando você pega um filtro para alimentar algo, ele nem precisa ser normalizado.
Mal

Respostas:


7

Intuição, para um caso pequeno

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:

E1=[1+1]

Aqui está outra matriz para um detector de arestas que também detecta arestas verticais:

E2=[+11]

Em particular, a convolução com E1 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). E2 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

E3=[+1.71.7]

Isso se comporta quase de forma idêntica à E2, 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

M=[+αα]

por alguma constante α (Onde αé aleatório). Independentemente do queα é, vemos que isso se comporta como E1 ou E2.

Conclusão: um filtro de convolução 1x2 aleatório e normalizado se comporta como um detector de borda vertical, com alta probabilidade.

Casos maiores

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.

Normalizaçã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, umm×n matriz aleatória M pode ser decomposto em M=M+cA Onde M é normalizado, de modo que suas entradas somam zero, c é uma constante A é a matriz que contém 1/(mn) em todas as entradas.

Como envolver a imagem de entrada com Mtem uma boa chance de aplicar basicamente um filtro detector de borda na imagem de entrada (como discutido acima). Como envolver a imagem de entrada comcA basicamente irá desfocar a imagem e depois multiplicar por c. 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 c será relativamente pequeno (já que a média da soma de um monte de variáveis ​​aleatórias é geralmente bastante pequena), multiplicando-se por cfaz com que a imagem de saída seja determinada mais pelo detector de bordas do que pelo desfoque. E sec é 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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.