Você está na página 1de 6

Melhorando o desempenho do rastreamento de pontos de interesse em

imagens através do paralelismo em GPU

Crystian Wendel M. Leão¹, João Marcelo X. N. Teixeira¹, Eduardo S. Albuquerque²,


Veronica Teichrieb¹, Judith Kelner¹

¹Centro de Informática ²Instituto de Informática


Universidade Federal de Pernambuco Universidade Federal de Goiás
{cwml, jmxnt, vt, jk}@cin.ufpe.br eduardo@inf.ufg.br

Resumo dos rastreadores existentes não oferece desempenho


satisfatório por apresentarem implementações
O rastreamento de pontos de interesse é uma etapa sequenciais e pouco otimizadas em CPU. Para
fundamental de muitos algoritmos de Visão solucionar esse problema crítico de desempenho,
Computacional. Neste trabalho é proposta uma outras plataformas passaram a ser utilizadas como
adaptação do Ferns, um conhecido rastreador de ambiente de execução desses algoritmos. Uma delas é
pontos de interesse em imagens, de forma a aproveitar a Graphics Processing Unit (GPU), que pode ser
a capacidade de processamento paralelo fornecida utilizada de maneira genérica, com programação
pelas GPUs atuais. Foi realizada uma análise em todo semelhante à linguagem C, através da arquitetura de
o código fonte original da implementação do CUDA (Compute Unified Device Architecture) [1].
algoritmo de forma a identificar regiões críticas e Muitos algoritmos já foram implementados pela
quais delas eram passíveis de paralelização. Em comunidade nessa plataforma, e obtiveram ganhos
seguida, implementou-se a fase de rastreamento de satisfatórios com a abordagem paralela, o que validou e
pontos de interesse em GPU e os resultados obtidos sedimentou a utilização da GPU como alternativa de
foram comparados com os valores de referência em plataforma de execução. Em [2], uma versão paralela
CPU. As vantagens da nova versão são enumeradas e do rastreador Kanade-Lucas-Tomasi (KLT) é proposta
justificam sua utilização, sempre que houver uma GPU e com ela é possível rastrear até 512 pontos chave
com suporte à CUDA disponível. simultaneamente em tempo real. Em [3], foi criada
uma versão paralela do Scale Invariant Feature
Transform (SIFT) e, para imagens com resolução de
1. Introdução 640x480, é possível conseguir um desempenho de 27,1
A capacidade de reconhecer pontos de interesse quadros por segundo ao se utilizar uma placa de vídeo
em imagens geradas a partir de diferentes pontos de NVIDIA GeForce 8800 GTX. Em [4], um rastreador
vista representa o foco de muitos algoritmos de Visão bayesiano através de filtro de partículas foi
Computacional. A área de pesquisa em Realidade implementado e obteve um ganho de desempenho de
Aumentada (RA) se utiliza de vários desses algoritmos 20 vezes, quando comparado à implementação original
com o objetivo de sobrepor informações virtuais no em CPU. Por fim, em [5], um filtro de partículas é
ambiente real do usuário [1]. Especificamente em utilizado para rastrear faces, e é capaz de detectar até 6
aplicações de RA sem marcadores, onde a carga delas a uma taxa de 28 quadros por segundo, usando
computacional é mais intensa, quando comparado à uma resolução de 1024x768 pixels.
RA com marcadores, é de importância fundamental a Visto que há uma tendência de melhoria de
utilização de algoritmos capazes de identificar de desempenho através da utilização de algoritmos
forma correta regiões de textura na vizinhança de paralelos, o objetivo deste trabalho é modificar um
pontos chave das imagens capturadas. Além disso, conhecido rastreador de pontos de interesse em
outro requisito bastante importante nesse caso é o imagens, o Ferns [6], para que seja possível executá-lo
desempenho em tempo real. O usuário deve receber em paralelo na GPU. O escopo deste artigo se limita à
retorno instantâneo da aplicação, e a grande maioria implementação da fase de rastreamento do algoritmo e
os resultados obtidos com a adaptação realizada,
comparando o desempenho com a versão de referência valor de probabilidade para cada classe, para cada um
em CPU. dos possíveis resultados do conjunto de testes, ou seja,
O restante do artigo está organizado da seguinte valores.
forma: a seção 2 fornece os conceitos básicos Através de uma abordagem bayesiana semi-
necessários ao entendimento do rastreador usando ingênua, é possível agrupar os testes em conjuntos
Ferns. A seção 3 detalha a arquitetura CUDA utilizada pequenos, e assumir independência entre eles. Com
e as vantagens oferecidas pela mesma. A seção 4 lista isto tem-se
como se deram as alterações no algoritmo original e ∏ (4)
quais pontos específicos foram atacados, no que diz onde os N testes foram divididos em grupos
respeito à paralelização. Por fim, as seções 5 e 6 com testes, e representa o resultado obtido
realizam uma análise dos resultados obtidos com a dos testes do K-ésimo Fern. Utilizando esta
versão implementada e apontam possíveis melhorias e abordagem, é necessário armazenar apenas
trabalhos futuros, respectivamente. valores.
Em uma visão geral, o algoritmo pode ser dividido
2. Ferns em duas partes: treinamento e reconhecimento. Na
etapa de treinamento, o objetivo é construir as
A técnica Ferns foi desenvolvida por Vincent distribuições de probabilidade das classes para cada
Lepetit como sucessão à técnica Randomized Trees, e resultado possível de cada Fern. Essa etapa acontece
ambas tratam o problema do casamento de padrões da seguinte maneira: são geradas várias homografias da
como um problema de classificação [6]. Ele prova, em imagem a ser reconhecida, e de cada uma delas são
seu trabalho, que patches (pedaços de uma imagem) extraídos vários pontos chave. Cada um destes pontos
podem ser classificados se utilizando apenas de testes chave, os quais se sabe a qual classe pertencem, pois a
binários aleatórios de luminância entre pixels, homografia foi gerada pelo algoritmo, é utilizado para
agrupados em estruturas chamadas de Ferns, que gerar a distribuição de probabilidade, sendo os pontos
particionam o espaço entre todos os patches possíveis. chave detectados com maior frequência escolhidos
No trabalho, Lepetit trata todas as aparições possíveis como as classes. A Figura 1, disponível em [7], mostra
dos patches como classes, e os Ferns moldam uma um exemplo do treinamento quando se utiliza apenas
distribuição de probabilidade sobre estas classes. Um três Ferns, cada um deles com três testes. A Figura 2,
grupo de testes não consegue ser discriminativo o também disponível em [7], ilustra o resultado do
suficiente, mas utilizando vários grupos de Ferns, é treinamento.
possível obter bons resultados.
Dessa forma, dado um patch qualquer, o algoritmo
tenta encontrar a classe correspondente a este patch.
Considere todas as classes, e
os resultados dos testes em cada um dos
testes binários. Formalmente, procura-se por
̂ , (1)
onde C é uma variável aleatória que representa a
classe. De acordo com a fórmula de Bayes, pode-se
deduzir que
Figura 1. Cada cor representa uma classe. A
. (2) figura mostra um patch, conhecidamente da
Assumindo uma distribuição uniforme para e classe vermelha, passando por cada Fern. Ao
dado que o denominador representa um fator de escala, final, a probabilidade de um patch da classe
que independe da classe em questão, pode-se entender vermelha passar pelo primeiro Fern e retornar
o problema como a solução de 5 como resultado é incrementada, e assim
sucessivamente.
̂ (3)
A fórmula anterior pode ser interpretada da
seguinte maneira: para cada classe, obtém-se a
probabilidade de dado um patch pertencente a mesma,
os resultados dos testes serem iguais aos observados, e
seleciona-se a maior destas probabilidades. O problema
desta abordagem é a necessidade de armazenar um
uma vez que milhares de threads podem ser executadas
paralelamente na GPU. Este trabalho faz uso da versão
1.1 de CUDA, uma vez que ela dá suporte a operações
atômicas, artifício utilizado durante o desenvolvimento
da versão paralela do algoritmo. Qualquer versão
superior a esta também será suportada.

4. Implementação
A metodologia de desenvolvimento adotada nesse
projeto consistiu em inicialmente realizar uma análise
de desempenho sobre o código de referência utilizado
[8]. O código está escrito em C++ e utilizou-se o
Figura 2. Ao final do treinamento teremos as
Microsoft Visual Studio 2008 para compilá-lo. Através
distribuições de probabilidade montadas. da busca por possíveis “gargalos” na execução do
Na fase de reconhecimento, basta passar o patch algoritmo original, verificou-se que aproximadamente
em questão por cada Fern, e somar as distribuições de 99% do tempo é gasto em três etapas: construção da
cada Fern, para cada uma das classes. Finalmente, a pirâmide gaussiana (17,04%), extração de pontos
distribuição com maior valor é escolhida. A Figura 3 chave (11,78%) e classificação dos mesmos utilizando
ilustra este processo. Ferns (70,30%). Uma análise posterior constatou que
todas essas três etapas apresentavam características
favoráveis à paralelização (sequência bem definida de
operações, poucos desvios no fluxo de dados,
independência entre os dados processados etc.). Sendo
assim, este trabalho focou na implementação e
otimização dessas três etapas em GPU.

4.1. Construção da pirâmide gaussiana

A etapa de construção da pirâmide gaussiana tem


como objetivo preparar a imagem para a extração de
pontos chave. Inicialmente, dada uma imagem de
entrada, cria-se uma borda em volta da mesma, apenas
replicando os pixels da primeira e última linha, e da
Figura 3. Para análise, temos que passar o primeira e última coluna. Em seguida, cria-se uma
patch por todos os Ferns, e somar as nova imagem a partir da suavização gaussiana da
distribuições associadas com cada resultado mesma, com kernel de tamanho 7x7. Essas duas
de cada Fern, e ao final apenas escolher a imagens compõem o primeiro nível da pirâmide. Para
classe com maior probabilidade. criar o 2º nível, realiza-se uma sub-amostragem na
imagem não suavizada através da aplicação de uma
suavização gaussiana, com kernel de tamanho 5x5, e
3. CUDA descartando, após isto, todas as linhas e colunas pares,
CUDA é uma arquitetura de computação paralela obtendo assim uma imagem com metade da largura e
de propósito geral da NVIDIA, lançada em novembro altura da anterior. Com esta imagem menor, aplica-se a
de 2006, que permite que GPUs da NVIDIA (aquelas a mesma suavização com o kernel 7x7 do passo anterior.
partir da série 8) sejam utilizadas para resolver Ao final da etapa tem-se 2 imagens, onde
problemas computacionais variados. representa o nível máximo da pirâmide criada.
CUDA permite que linguagens de alto nível, como A geração da pirâmide gaussiana em GPU toma
C, sejam utilizadas para programação em GPU, de como ponto de partida a imagem com a borda
maneira simples. Para uma aplicação qualquer ter construída em CPU (o tempo gasto com essa
vantagem na sua implementação em CUDA, ela deve construção é inferior a 1% do tempo total). Além disso,
necessariamente ser paralelizável. Quanto maior o grau o algoritmo de convolução em paralelo utilizado é
de paralelismo da aplicação, melhor será a ocupação e aquele disponibilizado no SDK de CUDA, com
o consequente aproveitamento do hardware gráfico, modificações mínimas. O kernel trabalha com imagens
cujos valores de largura e altura sejam múltiplos de 48 valores representa a probabilidade do patch analisado
para ser executado. Para tornar o tamanho da imagem pertencer a uma das classes. Após passar por todos os
de entrada genérico, adiciona-se uma segunda borda à Ferns, somam-se as probabilidades associadas com os
imagem, de cor preta, de forma que a imagem se resultados, para no final se ter uma única distribuição
adeque às restrições do algoritmo. A sub-amostragem com valores, onde é o número de classes. Por
implementada em GPU utiliza a mesma convolução do fim, seleciona-se a maior destas probabilidades, e a
passo anterior, porém com kernel de tamanho 5x5. classe associada a ela é a escolhida.
Essa etapa foi paralelizada como um todo, sendo a
4.2. Extração de pontos chave análise de cada patch executada em uma thread
diferente.
A etapa de extração de pontos chave da imagem Durante a inicialização, as distribuições de
tem por objetivo selecionar os patches mais prováveis probabilidade previamente calculadas na fase de
de pertencerem à imagem a ser rastreada, para treinamento são copiadas para a memória da GPU,
posterior utilização na etapa de classificação com assim como os endereços dos pixels dos testes de cada
Ferns. A implementação de referência faz uso do Fern. Os valores dos endereços dos pixels dos testes,
YAPE (Yet Another Point Detector), um extrator de que estão armazenados como deslocamento em X e
pontos chave convencional [9]. deslocamento em Y, são transformados em um valor de
Para cada imagem suavizada nos diferentes níveis deslocamento absoluto dentro da imagem, de acordo
de pirâmide em GPU, calcula-se a sua laplaciana. A com a largura da mesma, para uma otimização nos
partir de comparações e cálculos considerando a 8- testes.
vizinhança de cada pixel, determina-se se o mesmo Na etapa de classificação existe bastante demanda
será considerado um ponto chave. por leitura de memória global para obtenção dos
Para cada ponto selecionado, armazena-se um valores das probabilidades. Por essa razão, utilizou-se
score que representa o quão forte o ponto chave é em memória de textura, para um melhor desempenho, já
relação aos demais. Esta etapa de extração de pontos que a mesma é acessada em blocos de dados e é
chave é completamente realizada em GPU, e o acelerada por uma cache auxiliar.
processo é paralelizado como um todo, ou seja, cada Após a classificação, os pontos são copiados de
pixel é testado se é um ponto chave em uma thread volta para a memória da CPU, e o algoritmo no host
separada, e à medida que novos pontos são executa o restante das operações.
encontrados, eles são salvos em um vetor. Através de
operações atômicas, esses pontos são salvos 5. Resultados
sequencialmente na memória da GPU.
Após a extração dos pontos, eles são ordenados de Todos os testes realizados foram executados em
acordo com o score, com a ajuda de um algoritmo de uma máquina com as seguintes configurações: Core 2
ordenação em GPU pertencente ao SDK de CUDA, Quad Q9400, 2,66 GHz, com 4 GB de RAM, Windows
mais especificamente o Radix Sort. 7 Professional 64 bits, e uma placa de vídeo NVIDIA
GeForce 9800 GX2.
4.3. Classificação dos pontos chave utilizando A entrada do algoritmo, em todos os testes,
Ferns correspondeu a um vídeo que acompanha a distribuição
do código de referência do Ferns [8], no qual uma
A etapa de classificação nos Ferns é a mais pessoa expõe para a câmera, em variadas poses, um
custosa do processo, e tem por objetivo classificar um mousepad com uma imagem de um gato, como mostra
patch da imagem em uma das classes obtidas na etapa a Figura 4. Todos os tempos de execução medidos se
de treinamento. referem ao tempo médio quando o algoritmo é
Conforme explicado anteriormente, armazena-se executado com essa entrada específica, e analisa todos
valores de distribuições de probabilidade, os seus frames. A resolução deste vídeo é de 720x480
onde é a quantidade de classes, é a quantidade de pixels.
testes por Fern e é a quantidade de Ferns, e
pares de endereços de pixels, que representam os testes
binários de cada Fern. Cada ponto chave obtido é
passado por cada Fern, executando assim testes,
e de acordo com o resultado obtido nos testes, obtém-
se valores de distribuições de probabilidade. O
processo é repetido para cada Fern. Cada um destes
Figura 5. O tempo relativo de cada uma das
Figura 4. Quatro quadros do vídeo usado nos etapas no algoritmo original, em CPU, e na
testes, disponível em [8]. versão adaptada para GPU.
Os autores consideraram os resultados iniciais
obtidos com esse trabalho satisfatórios tanto com Tempos de execução
relação ao tempo de execução, pois houve uma redução
considerável, quanto à classificação dos pontos chave 70 63,6
em si, pois os resultados foram absolutamente iguais 60
àqueles do algoritmo original. Vale salientar que este
50
trabalho se encontra em sua primeira fase de
otimização. 40 GPU
Na primeira etapa, construção da pirâmide 30
15,33 16,27
gaussiana da imagem, obteve-se um tempo médio de 20 13,48
10,12 CPU
6,59
6,59 ms, contra 13,48 ms em CPU. Apesar do 10
algoritmo de convolução paralela ser bastante eficiente 0
em relação a sua versão em CPU, o fato de se utilizar 1ª Etapa 2ª Etapa 3ª Etapa
imagens pequenas nos últimos níveis da pirâmide,
acarreta em tempos similares entre CPU e GPU. 1ª Etapa 2ª Etapa 3ª Etapa
Na segunda etapa, extração de pontos chave, Speedup 104,55% 51,48% 290,90%
obteve-se um tempo médio de 10,12 ms, contra 15,33 Figura 6. Na parte superior, o tempo de
ms em CPU. Esta etapa também é bastante custosa por execução em milissegundos de cada uma das
acessar bastante memória global da GPU, assim como etapas em CPU e em GPU. Na parte inferior, o
por utilizar operações atômicas, que degradam ganho percentual de velocidade em cada uma
consideravelmente o desempenho da GPU. das etapas.
Na terceira e última etapa, classificação dos pontos
chave utilizando Ferns, implementada em CUDA, 6. Conclusões e trabalhos futuros
obteve-se um tempo médio de 16,27 ms, contra 63,60
ms em CPU, com uma média de 921 pontos chave Este trabalho propôs uma implementação paralela
analisados por quadro. do Ferns, um rastreador de pontos de interesse bastante
Comparando o tempo de execução como um todo, utilizado em aplicações de RA e Visão Computacional.
a taxa de quadros média do algoritmo em CPU, que era Através da análise realizada por meio de testes
de aproximadamente 9,8, foi melhorada para 21,16, o envolvendo a implementação de referência, verificou-
que representa uma melhora considerável no tempo de se que a versão implementada pelos autores apresentou
resposta para o usuário do sistema de RA. as seguintes vantagens:
A Figura 5 ilustra a fatia de tempo relativa de cada
uma das etapas do algoritmo em CPU e em GPU. A
 Aumento de desempenho – ganho de 290% na
Figura 6 mostra a melhoria conseguida em cada uma
etapa de classificação e ganho de até 115% no
das etapas, comparando os resultados em GPU com os
tempo total em comparação à versão original
tempos em CPU.
em CPU;
 Redução da carga de processamento da CPU –
o host fica livre para processar as informações
da aplicação, usando o rastreador
implementado em GPU apenas como uma Workshops, 2008, pp. 1-7.
biblioteca;
 Economia de memória da CPU – as [3] SiftGPU: A GPU Implementation of Scale Invariant
distribuições de probabilidade são agora Feature Transform (SIFT).
armazenadas na memória da GPU http://www.cs.unc.edu/~ccwu/siftgpu/, 2010.
(aproximadamente 280 MB), o que acelera o
acesso e diminui a utilização de memória no [4] Geoffrey Ulman, "Bayesian Particle Filter Tracking with
host. CUDA," George Mason University, 2010.

Pretende-se, como trabalhos futuros, implementar [5] Oscar Mateo Lozano and Kazuhiro Otsuka, "Real-time
o algoritmo por completo em GPU, ambas as fases de Visual Tracker by Stream Processing," Journal of Signal
treinamento e rastreamento. Além das novas partes a Processing Systems, vol. 57, no. 2, 2009, pp. 285-295.
serem implementadas, existem muitas otimizações que
podem ser feitas, envolvendo a não utilização de [6] Mustafa Özuysal, Michael Calonder, Vincent Lepetit, and
operações atômicas, melhor utilização dos kernels Pascal Fua, "Fast Keypoint Recognition using Random
Ferns”, TPAMI 32(3), IEEE Computer Society, Washington,
disponíveis, e aplicação da memória de textura sempre
2010, pp. 448-461.
que possível. Além disso, pretende-se implementar
suporte à plataformas multi-GPU e utilizar o conceito
[7] A Semi-Naive Bayesian Classifier for Fast Patch
de threads persistentes, de forma a balancear melhor a Classification.
carga de processamento entre as diferentes threads na http://cvlab.epfl.ch/alumni/oezuysal/ferns.html, 2010.
placa de vídeo. Outro trabalho futuro, que seria uma
contribuição para este trabalho é a implementação do [8] Ferns: Planar Object Detection Demo.
algoritmo para CPU Multi-core, e realizar uma http://cvlab.epfl.ch/software/ferns/index.php, 2010.
comparação de desempenho com a versão em GPU.
[9] Vincent Lepetit and Pascal Fua, "Towards Recognizing
7. Referências Feature Points using Classification Trees," Swiss Federal
Institute of Technology, Lausanne, Switzerland, 2004.
[1] T. Farias et al., "High Performance Computing: CUDA as
a Supporting Technology for Next Generation Augmented [10] R. Azuma et al., "Recent advances in augmented
Reality Applications," in Livro dos Minicursos do SVR 2008. reality," Computer Graphics and Applications, IEEE, vol. 21,
Recife: Gráfica e Copiadora Naciona, 2008, pp. 91-116. no. 6, Nov. 2001, pp. 34 -47.

[2] C. Zach, D. Gallup, and J.-M. Frahm, "Fast gain-adaptive


KLT tracking on the GPU," IEEE Computer Society
Conference on Computer Vision and Pattern Recognition

Você também pode gostar