Trabalho 1 – Programa para segmentar o fundo estático de um vídeo

 

Descrição do trabalho:

            O objetivo principal desse primeiro trabalho é familiarizar a turma com a biblioteca de visão computacional criada pela Intel chamada de OpenCV [1]. Foi criado, especialmente para o curso, um tutorial [2] com uma série de exemplos sobre essa biblioteca que pode auxiliar bastante nessa primeira etapa do trabalho.

No primeiro trabalho deve ser criado um programa que recebe um stream de vídeo (a partir de um arquivo ou vindo de uma webcam) e faz a segmentação do fundo em relação aos objetos dinâmicos da cena. Ou seja, o programa deve ser capaz de detectar os objetos em movimento ao longo do vídeo. Uma motivação e estudos desenvolvidos nesta área podem ser encontrados em [3].

Softwares específicos para essa tarefa são desejáveis em diversas aplicações práticas, e apesar de não existir hoje uma solução definitiva para esse problema, existe alguma teoria específica para executar tal tarefa. O documento segmentação de movimento [4] faz a introdução aos conceitos de uma pequena parte dessa teoria, e sua leitura facilitou bastante a realização do trabalho.

Ambiente de desenvolvimento:

            O trabalho foi desenvolvido no Microsoft Visual Studio 2005 utilizando as bibliotecas do OpenCV para dar suporte a leitura de arquivos .avi, interface gráfica e chamadas de funções específicas.

Implementação:

            Neste trabalho foram estudadas quatro metodologias para solucionar o problema em questão:

1-     Redes Neurais

2-     Method for Adaptive: Novel Clustering-Based Background Segmentation

3-     Mediana

4-     OpenCV

 

1 - Redes Neurais

A aplicação de redes neurais neste tipo de problema seria beneficiada, por temos inúmeros casos a serem tratados em diferentes situações, onde a rede neural pode se adaptar bem a cada um deles. A idéia básica da aplicação de redes neurais neste trabalho seria interpolar funções com o intuito de atribuir pesos para cada uma das camadas da rede que resolvessem o problema em questão. A interpolação seria feita em uma fase de treinamento (100 primeiros frames) e com isso saberíamos classificar o que era background. Com isso ganhamos de graça a extração de ruído da cena e grande versatilidade na escolha da topologia da rede sem grandes mudanças de código. O que inviabilizou a continuação desta abordagem foi a resposta da rede para o foreground. Como o treinamento era apenas para o que era fundo, a rede não sabe responder o que não é fundo. Alguns dos outros problemas encontrados foram falta de bibliografia, algoritmo não adaptativo e pouco eficiente dependendo da entrada e da topologia da rede. Maiores detalhes sobre redes neurais pode ser encontrado em [5].

2- Method for Adaptive: Novel Clustering-Based Background Segmentation

            Esta abordagem tinha como idéia implementar o algoritmo descrito no artigo [6]. Por só termos acesso a uma apresentação deste artigo, a implementação do código foi dificultada, porém a idéia básica do algoritmo esta descrita abaixo:

 

 

 
                                                                                       

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Foi estipulado que os 100 primeiros frames seriam utilizados para a fase de treinamento. Com todos os pixels armazenados em memória, transformamos seus valores para o espaço de cores HSV, formando assim 3*W*H imagens. A primeira imagem contém os valores de H (100 primeiros frames) para os pixels na posição (0,0), a segunda os valores de S e a terceira de V. Este processo é feito para todos os conjuntos de pixels até (w,h). O próximo passo do algoritmo é obter o histograma de cada uma das imagens e por fim montar um modelo de fundo. A apresentação do artigo descreve a continuação do algoritmo de forma muito confusa e não foi possível implementá-lo por completo.

 

3 - Mediana

Este algoritmo calcula a mediana de cada um dos pixels na fase de treinamento a fim de obter um modelo de fundo que possa ser subtraído do frame a ser classificado. Ou seja, cada pixel x de um novo frame de entrada Ii(X) deverá sofrer uma segmentação em relação a mediana representadas por B(x) em relação à um “threshold” qualquer t, respeitando a equação abaixo:

Os pixels que satisfaçam a equação anterior devem pintados de branco, caso contrário deverão ser pintados de preto. Segue abaixo uma figura com os resultados obtidos:

 

A janela source da figura acima mostra a imagem original, a janela Median-Intermediate ilustra a aplicação do algoritmo de mediana e a janela Median-Segmented mostra o contorno dos objetos identificados na cena. A janela controls serve apenas como threshold do método e a janela Background é o modelo de fundo que esta sendo utilizado.

Para que novos elementos da cena que permanecessem parados por muito tempo fossem incorporados ao modelo de background, conseguido na fase de treinamento, foi implementado uma adaptação da seguinte forma:

 

double scale = 0.0015;

ref = cvGet2D( _imgMedian, y, x );

ref.val[0] = scale * src.val[0] + ( 1.0 - scale ) * ref.val[0];

ref.val[1] = scale * src.val[1] + ( 1.0 - scale ) * ref.val[1];

ref.val[2] = scale * src.val[2] + ( 1.0 - scale ) * ref.val[2];

cvSet2D( _imgMedian, y, x, ref );

 

Com isso o modelo de fundo é atualizado de forma gradativa, dando maior importância para o plano de fundo obtido na fase de treinamento.

OpenCV

Outra solução utilizada neste trabalho foi fazer a chamada da função do OpenCV cvRunningAvg que tem como paramentros:

cvRunningAvg(IplImage*imgY,IplImage*imgU,doublealpha, IplImage* mask)

μt  = αy + (1 – α) µt-1

0<α<1

y – imagem corrente

µt-1- background antigo

μt – novo background

Esta função resolve parcialmente o problema de maneira simples e possui a atualização gradual do modelo de fundo, porem não resolve o problema de noise e sombras. A imagem abaixo mostra o algoritmo rodando. Pode ser observado na janela Running-Background a incorporação gradativa do carro ao modelo de background. Caso ele fique muito tempo parado ele fará parte do modelo de fundo.

 

Download do trabalho

 

Bibliografia:

[1]- Manual do Opencv, visitado em 10/08/2007 http://www.cs.unc.edu/Research/stc/FAQs/OpenCV/OpenCVReferenceManual.pdf

[2] – Tutorial desenvolvido para o curso, visitado em 10/08/2007 http://www.tecgraf.puc-rio.br/~malf/opencv

[3] – Motivação e algoritmos desenvolvidos na área, visitado em 12/08/2007 http://www.tecgraf.puc-rio.br/~malf/tese/mov_apres.ppt

[4] – Introdução e teoria sobre o trabalho, visitado em 10/08/2007 http://www.tecgraf.puc-rio.br/~malf/tese/mov_doc.pdf

[5] - Filho, Edson Costa de Barros Carvalho., Modelagem, Aplicações e Implementações de redes Neurais. Anais da IV Escola Regional de Informática da SBC Regional Sul, 21 a 27 de abril de 1996. Páginas 36 - 53.

[6] - S. Indupalli and M. A. Ali and B. Boufama, A Novel Clustering-Based Method for Adaptive Background Segmentation, CRV '06: Proceedings of the The 3rd Canadian Conference on Computer and Robot Vision (CRV'06)