• Nenhum resultado encontrado

5 Recuperação de Imagens Baseada em Conteúdo

6.4 Módulo para Recuperação de Imagens Baseada em Conteúdo

6.4.2 Estrutura de Indexação

A estrutura métrica dinâmica utilizada como base para indexação das características extraídas é a Slim-tree proposta por Traina Jr et. al. (2000); ela é uma estruturada métrica dinâmica e balanceada baseada na M-tree, que permite inserções de dados de um domínio (ou espaço) métrico.

A Slim-tree armazena páginas de tamanho fixo para cada nó. Cada nó armazena um número variável C de objetos, pois objetos adimensionais possuem quantidade de

características variáveis. Ela é uma árvore balanceada e apresenta dois tipos de nós: nó índice e nó folha.

Um nó índice é definido por:

NoIndice = EntidadeRepresentativa + vetor de Entidade[n]

Uma entidade em um nó índice é definida por:

EntidadeFolha = registro de [ Obj, Dis, Sub, Raio, Num], onde cada campo representa:

• Obj – Objeto no domínio métrico;

• Dis – Distância desse objeto para o representativo do nó, definido por distância(Obj, Obj[nível anterior]);

• Sub – Referência para nó inferior; • Raio – Tamanho do raio de cobertura;

• Num – Número de objetos no sub-ramo inferior.

A EntidadeRepresentativa é a entidade do nível superior onde seu raio engloba (indexa)

todas as entidades do nó da árvore. As demais entidades utilizam o objeto da EntidadeRepresentativa para o cálculo da distância, ou seja, Entidade[n].Dis =

fdistância(Entidade[n].Obj, EntidadeRepresentativa.Obj). Assim, o campo Dis da Entidade

representativa tem que ser zero, pois é a distância para si mesmo.

Um nó índice (Figura 6.19) armazena entidades onde suas distâncias para a entidade do nível superior são menores do que o raio da entidade onde cada objeto engloba objetos do próximo nível da árvore. Assim, o nó índice repete os objetos que estarão também no último nível da árvore nos nós folhas.

Figura 6.19 – Representação de um nó índice da Slim-Tree

O nó folha (Figura 6.20) armazena os dados das entidades. Todos os nós folhas armazenam todas as entidades que foram indexadas, sem repetição. Uma entidade em um nó folha é definida por:

EntidadeFolha = registro de [ Obj, Dis, OID], onde cada campo representa:

• Obj – Objeto métrico;

• Dis – Distância desse objeto para o representativo do nó, definido por distância(Obj, Obj[nível anterior]);

• OID – Um identificador para encontrá-lo na base em que está armazenado.

Figura 6.20 – Representação de um nó folha da Slim-Tree

O mecanismo de inserção de objetos na Slim-tree, a partir do nó raiz seleciona um nó que possa receber o novo objeto. Se nenhum nó se qualifica, seleciona-se o nó cujo centro está mais perto do novo objeto e aumenta-se o raio de cobertura desse nó de maneira a cobrir o novo objeto. Se por outro lado, mais de um nó se qualifica, o algoritmo ChooseSubtree é executado para selecionar o nó onde será inserido o novo objeto. Este processo é aplicado recursivamente para todos os níveis da árvore.

A Slim-tree possui três opções para o algoritmo ChooseSubtree: Nó folha ... Entidade[1] Dist Obj OID Entidade[2] Dist Obj OID Entidade[3] Dist Obj OID Entidade[4] Dist Obj OID Entidade[n] Dist Obj OID Entidade[5] Dist Obj OID Nó índice ... Entidaderepresentativo Dist Raio

Obj Sub Num

Entidade[1] Dist Raio

Obj Sub Num

Entidade[2] Dist Raio

Obj Sub Num

Entidade[n] Dist Raio

• random - seleciona aleatoriamente o nó para inserir o novo objeto entre os que se qualificaram;

• mindist - seleciona o nó cuja distância de seu representativo (centro) para o novo objeto seja a menor;

• minoccup - seleciona o nó que esteja com o menor número de objetos armazenados, dentre os que se qualificaram.

O campo Num presente em todo nó intermediário (indexnode) da Slim-tree é utilizado pelo algoritmo minoccup, onde o nó com menor valor de NEntries é selecionado. É interessante notar que utilizando a opção minoccup do algoritmo ChooseSubtree obtém-se árvores mais compactas (maior taxa de ocupação dos nós), o que resulta em um número menor de acessos a disco para responder consultas por similaridade e também menor número de comparações de distância.

Durante o processo de inserção de objetos pode acontecer do nó escolhido já estar completo (já ter atingido sua taxa de ocupação máxima). Nesse caso, a árvore aloca um novo nó no mesmo nível do anterior, e os objetos que estavam nesse nó, mais o novo nó a ser inserido devem ser então redistribuídos entre os dois nós. A Slim-tree possui os seguintes algoritmos para efetuar a quebra de nós (splitting):

• random - seleciona aleatoriamente os dois objetos representativos para os novos nós e os demais objetos são distribuídos entre eles pela menor distância entre o objeto e o representativo. Deve-se respeitar a taxa de ocupação mínima dos nós; • minMax - consideram-se como candidatos todos os possíveis pares de objetos

como representativos. Para cada par possível, associa-se os demais objetos a um dos representativos. Serão escolhidos como representativos o par de objetos que minimizar o raio de cobertura da sub-árvore. A complexidade do algoritmo é O(C3), onde C é a capacidade dos nós. Apesar deste algoritmo ser extremamente

custoso, ele é designado na literatura como o que teoricamente consegue obter árvores que possibilitam consultas mais eficientes (CIACCIA; PATELLA; ZEZULA, 1998);

• MST - constrói-se a árvore de caminho mínimo (minimal spanning tree - MST) (KRUSKAL, 1956), e um dos arcos mais longos da MST é removido. Dessa forma obtém dois agrupamentos, que serão os objetos associados a cada nó. Nos testes realizados, verificou-se que esse algoritmo possibilitou a construção de Slim-trees praticamente equivalentes às construídas utilizando o algoritmo de quebra de nós minMax, porém em muito menos tempo. Isso pode ser também notado pela complexidade do algoritmo que é O(C2 logC) com O(C2) cálculos de distância. É possível identificar que a Slim-tree cresce um nível quando a raiz da árvore está completa e um novo elemento deve ser inserido nela. Nesse caso, a raiz divide-se e uma nova raiz deve ser criada com dois representativos, e dessa forma, a árvore cresce um nível.

Quando comparada com a M-tree, nas mesmas condições, a Slim-tree sempre a sobrepujou, tanto em termos de número de acessos a disco quanto em termos de número de distâncias calculadas para responder consultas por abrangência (range queries) e, portanto, também em tempo total de execução.

As consultas por similaridade têm por objetivo recuperar objetos que sejam similares ou dissimilares até um determinado valor, de um dado objeto de consulta q. A similaridade ou a dissimilaridade são medidas através da função de distância métrica definida entre os pares de objetos.