Scale-Invariant Feature Transform Renato Madureira de Farias renatomdf@gmail.com Prof. Ricardo Marroquim Relatório para Introdução ao Processamento de Imagens (COS756) Universidade Federal do Rio de Janeiro, Brasil, 2012 1. Resumo O objetivo deste trabalho foi implementar o algoritmo conhecido como Scale-Invariant Feature Transform, ou SIFT [1][2]. Este algoritmo busca identificar os pontos chave de uma imagem e descrevê-los através de uma estrutura, chamada de feature vector, que seja invariante a translação, rotação, e (parcialmente) iluminação. Posteriormente, os feature vectors de duas imagens podem ser comparados afim de encontrar correspondências. 2. Algoritmo O algoritmo consiste numa série de passos: 1) Gerar espaço de escalas; 2) Calcular Difference of Gaussians (DoGs); 3) Encontrar pontos extremos (máximos e mínimos); 4) Identificar orientação principal dos extremos; e 5) Criar descritores. Todos os passos são detalhados abaixo. A entrada do algoritmo é uma imagem em tons de cinza na qual deve ser aplicado um filtro Gaussiano inicial. Usamos σ = 1.0 para este borramento inicial. 2.1. Gerar espaço de escalas. O primeiro passo é gerar o espaço de escalas da imagem. O espaço de escalas consiste num certo número de oitavas, sendo que cada oitava contém um certo número de escalas. As imagens dentro de uma oitava sofrem borramentos (através do filtro Gaussiano) progressivamente maiores. As imagens de cada oitava têm metade do tamanho das imagens da oitava anterior, sendo que a primeira oitava começa com o dobro do tamanho da imagem original. Então, a segunda oitava possui o tamanho da imagem original, a terceira oitava possui metade do tamanho da imagem original, etc. Neste trabalho, usamos 4 oitavas com 5 escalas cada, conforme a sugestão do autor do
algoritmo [1]. O σ inicial de uma oitava é 1.6, e a cada escala o multiplicamos 2. Note que a primeira escala de cada oitava (a partir da segunda) é na verdade a terceira escala da oitava anterior (com metade do tamanho). Isso é porque o autor sugere que o borramento da escala de uma oitava deve ser o dobro da escala equivalente da oitava anterior. 2.2. Calcular Difference of Gaussians (DoGs). O segundo passo consiste em subtrair os pares de escalas adjacentes de cada uma das oitavas. As imagens resultantes, representando a diferença entre uma aplicação do filtro Gaussiano e o próximo, são chamadas de Difference of Gaussians. Obviamente, cada oitava possui um número de DoGs igual ao número de escalas menos 1. Figura 1: Espaço de escalas e Difference of Gaussians. Fonte: [1]. 2.3. Encontrar pontos extremos (máximos e mínimos). No terceiro passo, procuramos nas DoGs do passo anterior pontos que descrevem bem a imagem. Consideramos que, para um ponto descrever bem a imagem, ele precisa ter sobrevivido nas várias escalas, e ser o máximo ou mínimo dentre seus 26 vizinhos (8 vizinhos da mesma escala, 9 vizinhos da escala de cima, e 9 vizinhos da escala de baixo). Os pontos encontrados neste passo são guardados, junto com informação sobre em qual oitava, escala, e posição foram encontrados. Note que extremos não podem ser encontrados no primeiro e último DoGs, já que 3 escalas são necessárias para a busca.
Figura 2: Um extremo precisa ser maior (ou menor) do que seus 26 vizinhos. Fonte: [1]. 2.4. Identificar orientação principal dos extremos. No quarto passo, encontramos a orientação principal dos pontos do passo anterior. Fazemos isso construindo um histograma dos gradientes e suas magnitudes em torno do ponto, usando as imagens do espaço de escalas. O tamanho da janela em torno do ponto que consideramos para construir o histograma é igual ao tamanho do kernel do filtro Gaussiano com o σ (multiplicado por 1.5) usado nesta escala. As orientações são divididas em 36 caixas, cada uma representando uma faixa de 10o (a primeira contém a soma das magnitudes das orientações de 0o-9o, a segunda de 10o-19o, e assim por diante). Uma vez feito isso, procuramos no histograma a caixa com maior magnitude. Usando esta magnitude e as magnitudes das caixas adjacentes como se fossem 3 pontos no plano XY, encaixamos uma parábola invertida neles de forma a encontrar o melhor valor desta orientação. Esta orientação gera um ponto chave da imagem que será usada no último passo. Note que este processo se repete para magnitudes que tenham pelo menos 80% do valor da maior magnitude. Em outras palavras, um ponto extremo gera no mínimo um ponto chave, mas pode gerar mais se possui mais do que uma orientação dominante. 2.5. Criar descritores. O quinto e último passo consiste em criar os descritores da imagem para cada ponto chave do último passo. Um descritor guarda a posição de um ponto na imagem original, e um feature vector que descreve sua vizinhança. Usamos uma janela 16x16 em torno do ponto, dividida em quatro janelas 4x4.
Para cada janela 4x4, criamos um histograma, como no passo anterior, porém com 8 caixas em vez de 36, e usamos um filtro Guassiano com σ igual a metade da dimensão da janela (nesse caso, 8) para pesar as magnitudes. O resultado é um vetor que guarda todos os 16 histogramas, cada um com 8 caixas, para um total de 128 posições. Este vetor é o feature vector. Figura 3: Exemplo visual da construção da janela, considerada aqui como sendo 8x8 dividida em 4 janelas 4x4, em vez de 16x16 dividida em 16 janelas 4x4. Fonte: [1]. Note que a orientação principal deve ser subtraída de cada orientação da janela, para que as orientações do histograma fiquem relativas à orientação principal. Pelo mesmo motivo, as coordenadas dos pontos da janela precisam ser rotacionadas em torno do ponto chave usando uma matriz de rotação com a orientação principal. Essas duas ações visam obter invariância à rotação. Uma vez que temos o feature vector calculado, normalizamos seus valores, depois reduzimos a 0.2 qualquer valor acima de 0.2, e normalizamos o vetor de novo. Isso visa obter invariância à iluminação na imagem. 3. Comparação Uma vez que se tenha os feature vectors de duas imagens, uma comparação entre elas pode ser feita. O método de comparação que usamos é bastante simples, e consiste em simplesmente calcular a distância Euclideana entre os vetores, em 128D. Comparamos todos os feature vectors de uma imagem com todos da outra imagem; uma correspondência existe quando um ponto da primeira imagem encontra outro da segunda imagem como vizinho mais próximo, e vice versa. Para verificar as correspondências visualmente, usamos o algoritmo clássico de Bresenham para desenhar uma linha entre os dois pontos, lembrando que temos a posição dos pontos guardados no descritor que também possui o feature vector.
4. Resultados Figura 4: A segunda imagem sofreu um pequeno crop em relação à primeira. Figura 5: A segunda imagem sofreu uma redução de tamanho em relação à primeira. Figura 6: As duas imagens sofreram crops em lugares diferentes.
Figura 7: A segunda imagem foi invertida na vertical. 5. Conclusão A implementação resultante apresentou resultados razoáveis, como se pode ver na seção anterior. A invariância a translação foi facilmente alcançada. Já a invariância a rotação foi parcialmente alcançada, e foi a parte mais demorada da implementação. O algoritmo ainda apresenta um número significativo de erros ao comparar os feature vectors de duas imagens idênticas, sendo uma delas invertida na vertical. A invariância a iluminação não foi testada com o conjunto de imagens teste usado neste trabalho. 6. Trabalhos Futuros A invariância a rotação ainda é uma área do trabalho que pode ser melhorada. O método de comparação também não é muito esperto, podendo render falsos positivos pelo simples fato de que pontos chave acabam encontrando um vizinho mais próximo na maior parte do tempo, mesmo que não sejam tão próximos. Talvez um limiar possa ser desenvolvido para rejeitar certas correspondências, como as de pontos que só existem numa imagem.
7. Referências [1] Lowe, David G. 2004. Distinctive Image Features from Scale-Invariant Keypoints. [2] Lowe, David G. 1999. Object Recognition from Local Scale-Invariant Features. [3] Sinha, Utkarsh. www.aishack.in. O site tem uma série de tutorials sobre o SIFT que ajudaram muito a compreensão do algoritmo.