Skip to content

Calcula Centroids Cov RGB

Mateus de Assis Silva edited this page Aug 6, 2020 · 2 revisions

Funções encontradas nesse arquivo

  1. calcula_centroids_cov_rgb
  2. extraiIntervaloFrames

Introdução

Até antes da existência do reconhecimento via proximidade de cor, o Zebtrack reconhecia os peixes ao localizar os blobs e associá-los com os indivíduos mais próximos. De forma a refinar essa associação, utilizava-se uma "previsão" da posição dos peixes no próximo momento. Isso é passível de falha, pois os animais podem se movimentar de forma a confundir o software.

Um desses movimentos é quando os peixes se deslocam em retas concorrentes. No ponto de encontro das retas eles não prosseguem, mas se desviam. Isso faz com que o software troque as labels relativas a cada animal.

Assim se torna necessário uma forma de diferenciar os indivíduos. Dentre algumas possibilidades, utilizaremos um critério de cor.

Ao longo do monitoramento, se o usuário quiser acompanhar os indivíduos (peixes), o blob_colours_2 irá fornecer as informações de cor para a distância de Mahalanobis, de forma a melhorar a associação blob-peixe.

O código blob_colours_2 é uma alternativa ao blob_colours por partir da premissa que a média será feita entre os pixels em RGB. Até o presente momento, o código calculaMediaVarianciaHSV utilizava o blob_colours. Com o advento do blob_colours_2, é necessário um código alternativo que utilize os vetores-médias RGB.

O objetivo do código calculaMediaVarianciaHSV era calcular parâmetros de distribuição de cores em Hue (tonalidade). Tais parâmetros de distribuição estatística eram a média e a variância. Como isso era realizado? Ora, as cores obtidas pelo blob_colours para os blobs de dado frame serviam como uma "amostra de cor". Ao aplicarmos blob_colours num vídeo de calibração obteríamos um conjunto de amostras. Suponha dois peixes: um vermelho, outro azul. Por influência de luz, ângulo da câmera, etc., tais tons podem variar para um vermelho/azul mais escuro, mais leve, e por aí vai. Embora tenhamos, na realidade, duas cores, o que o sistema consegue captar é uma miríade de cores, que orbitam os valores médios seguindo uma dada variância. Cabe então ao calculaMediaVarianciaHSV estimar tais medidas de tendência central/variação.

o código calcula_centroids_cov_rgb irá estimar tais medidas, mas levando em consideração vetores-amostra, isto é, as amostras não serão valores escalares, mas vetores RGB (oriundos do processamento blob_colours_2). Além do mais, utilizar amostras tridimensionais implicam uma matriz de covariância, dado que os canais podem carregar informação contida em alguma relação entre eles.

Como usar

O usuário define o video a ser analizado, além de indicar os tempo_inicial e tempo_final (em segundos) em que ocorre o trecho a ser utilizado como calibração (nesse trecho os peixes devem estar distantes um do outro). Algumas itens que ocorrem no track.m são utilizadas: Imback (imagem de fundo em escala de cinza), V (Vrm), nanimais (número de animais indicado pelo usuário), mascara (região de interesse selecionada pelo usuário [é um array]), minpix/maxpix (define o tamanho mínimo/máximo, em pixeis, de uma área para ser considerada de um animal), tol (tolerância/limiar para determinar se um pixel pertence ou não a um blob), avi (aviobj2 que é o objeto de video diferença - não um vídeo-), criavideo (criavideodiff, flag pra criar o video-diferença), tipsubfundo (tipo de subtração de fundo), colorida/cor (indicam se a imagem é colorida ou não). Também é necessário definir variáveis para blob_colours_2: value_threshold e saturation_threshold. Por fim, a última definição necessária é um parâmetro para o algoritmo kmeans: how_many_replicates.

Para o vídeo de calibração utilizado nos testes (favor pedir ao responsável pelo projeto), recomenda-se utilizar: value_threshold = 0.15; saturation_threshold = 0.5; how_many_replicates = 5. Os valores dos limiares foram definidos via inspeção com uma imagem-teste, e o parâmetro restante foi utilizado conforme um exemplo.

A função retorna as médias das cores como centróides (datatype array: um vetor para cada peixe), e as matrizes de variâncias (datatype cell: uma matriz por peixe).

Como funciona

A premissa do funcionamento do código é considerar as amostras de cor relativas aos blobs dos frames do vídeo de calibração como pontos no espaço RGB. Ora, se as variações aleatórias não forem intensas, e as cores forem bem distintas umas das outras, as amostras se comportarão como constelações bem separadas no espaço de cor RGB. Tal consideração permite que utilizemos algoritmos de clustering para determinar as "cores médias" (no contexto de clustering, centróides). Para concluir, dado que as nuvens de pontos (uma nuvem por animal) podem possuir formatos alongados, é necessário se utilizar matrizes de covariância para captar a dispersão tridimensional (uma matriz por animal).

O primeiro passo é extrair o intervalo de frames (frame_inicial e frame_final). Isto é, determinar (ordinalmente) qual frame inicia o período de calibração, e qual termina o trecho.

Devido a algum erro interno do processo de manipulação de vídeos, é necessário reconstruir o objeto VideoReader. Para isso, basta rodar o comando VideoReader(), cujo parâmetro é o path do vídeo de calibração.

Calcula-se a quantidade de frames de calibração (length_frames_video) ao somar o intervalo de frames a 1. Tal quantidade será utilizada durante o processo iterativo a seguir. Antes de iniciá-lo, aloca-se um array que conterá os vetores RGB retornados por blob_colours_2

Iteração para cada frame de calibração

Nesse ponto do código temos todos os frames disponíveis. Logo, podemos aplicar blob_colours_2... ou quase. É necessário definir os seguintes parâmetros para a função mencionada:

  • boundingbox;
  • ndetect;
  • wframe_log.

Para definí-las, é necessário chamar a função extractnblobs. Essa função só necessita de mais um argumento, que ainda não está definido: wframe. Converte-se o frame atual em escala de cinza, com data type double, executa-se extractnblobs e só alocamos os retornos necessários.

Executa-se o código blob_colours_2, seu resultado é convertido para array (lembre-se que o retorno da função é um cell array), e é alocado em avg_vector_pra_cada_frame. Esse processo faz com que avg_vector_pra_cada_frame seja um array cujas colunas são valores RGB, e cada linha é um ponto no espaço de cores RGB.

Finalizados o processamento dos frames do vídeo de calibração, o código do kmeans é executado. Um de seus retornos define o retorno da função centroids. A variável idx retornada aloca as labels de cada ponto. Isto é, a qual cluster cada linha do avg_vector_pra_cada_frame pertence.

Aloca-se a variável de retorno da função cov_matrices como um cell array vazio e define-se a lista de labels existentes.

Iterando label a label

Para cada label existente, calcula-se a matriz de covariância para os pontos que possuem tal label.

Referências: