• Nenhum resultado encontrado

Curso de Bacharelado em Ciência da Computação ANÁLISE DE QUANTIZAÇÃO VETORIAL UTILIZANDO REDE NEURAL ARTIFICIAL PARA COMPRESSÃO DE IMAGEM DIGITAL

N/A
N/A
Protected

Academic year: 2021

Share "Curso de Bacharelado em Ciência da Computação ANÁLISE DE QUANTIZAÇÃO VETORIAL UTILIZANDO REDE NEURAL ARTIFICIAL PARA COMPRESSÃO DE IMAGEM DIGITAL"

Copied!
83
0
0

Texto

(1)

JOÃO LEILES TORMA KOPPS

ANÁLISE DE QUANTIZAÇÃO VETORIAL UTILIZANDO REDE NEURAL

ARTIFICIAL PARA COMPRESSÃO DE IMAGEM DIGITAL

(2)

JOÃO LEILES TORMA KOPPS

ANÁLISE DE QUANTIZAÇÃO VETORIAL UTILIZANDO REDE NEURAL

ARTIFICIAL PARA COMPRESSÃO DE IMAGEM DIGITAL

Trabalho de conclusão de curso apresentado para a banca examinadora do curso de Ciência da Computação do Centro Universitário La Salle – Unilasalle, como exigência parcial para obtenção do grau de Bacharel em Ciência da Computação, sob orientação do Prof. Me. Gaspare Giuliano Elias Bruno.

(3)

TERMO DE APROVAÇÃO

JOÃO LEILES TORMA KOPPS

ANÁLISE DE QUANTIZAÇÃO VETORIAL UTILIZANDO REDE NEURAL

ARTIFICIAL PARA COMPRESSÃO DE IMAGEM DIGITAL

Trabalho de conclusão aprovado como requisito parcial para obtenção do grau de Bacharel do curso de Ciência da Computação do Centro Universitário La Salle -

Unilasalle, pela seguinte banca examinadora:

__________________________________ Prof. Me. Javier García López

Unilasalle

__________________________________ Prof. Me. Mozart Lemos de Siqueira

Unilasalle

(4)

DEDICATÓRIA

Dedico este Trabalho de Conclusão:

À minha mãe Elda, pelo seu carinho, otimismo, incentivo e dedicação.

Ao meu pai Américo “in memoriam”, pelo exemplo de coragem e persistência em suas metas.

À minha irmã Lourdes, pelo apoio incondicional.

Às minhas filhas Amanda e Jéssica, que muitas vezes estiveram privadas da minha atenção, mas nunca do meu amor, para que possa servir de incentivo para elas.

(5)

AGRADECIMENTOS

Agradeço à minha mãe Elda, minha irmã Lourdes, minhas filhas Amanda e Jéssica e minha esposa Andreza pelo apoio.

Agradeço ao meu professor orientador Me. Gaspare Giuliano Elias Bruno, pela atenção, paciência e incentivo, com quem muito aprendi.

Agradeço ao professor coordenador Dr. Marcos Ennes Barreto, por toda a atenção que teve comigo.

Agradeço a todos os meus professores do La Salle - Unilasalle, pela atenção e disposição para me atenderem.

Agradeço aos meus colegas de graduação pela parceria, em especial à Andréa Krob, Cinara Zambelli, Daniel Amorim, Juliana Bilhão e Régis Model.

Enfim, agradeço a todos que direta ou indiretamente contribuíram para a realização deste trabalho.

(6)

“A mente que se abre para uma nova idéia nunca volta ao seu tamanho original”

(7)

RESUMO

Diversos trabalhos relacionados à quantização vetorial, que é uma técnica que consegue alta taxa de compressão de dados, têm buscado reduzir o tempo de compressão de imagens, mas os resultados mostram algum prejuízo de qualidade em relação à imagem original quando é realizada a decodificação. Neste trabalho foi proposta a utilização de redes neurais artificiais auxiliando a técnica de quantização vetorial, como alternativa para a escolha do melhor vetor de imagem em uma biblioteca de vetores. O objetivo desta pesquisa foi investigar a possibilidade de se conseguir uma qualidade de imagem decodificada próxima à qualidade alcançada pelo algoritmo Full

Search (que é o método que consegue a melhor qualidade de imagem em quantização

vetorial), mas com um tempo de compressão menor, pelo fato de não ser necessária uma comparação de cada vetor de imagem de entrada com todos os vetores dessa biblioteca. Os resultados alcançados nesta pesquisa mostraram que a aplicação de redes neurais artificiais, juntamente com quantização vetorial, pode ser considerada uma opção para se conseguir uma alta taxa de compressão de imagens, com qualidade próxima à alcançada pelo algoritmo FS, mas com grande diminuição do tempo de codificação em relação a esse algoritmo.

PALAVRAS-CHAVE: Quantização vetorial. Rede neural artificial. Compressão. Imagem.

ABSTRACT

Several studies related to vector quantization, a technique that gets a high data compression, try to reduce the image compression time, but the results present some harm in the quality of the decodified image. This work had used artificial neural networks in the vector quantization process as an alternative to aid the choice of the best codeword within a codebook. The objective this research was to investigate the possibility to achieve a decodified image with a similar quality which is provided by the Full Search algorithm (it is the method that obtains the best quality of image in vector quantization), but in a minor time, because is not necessary to compare all the codewords available in the codebook. The results reached in this inquiry showed that the application of artificial neural networks, bonded with vector quantization, can be considered an option in order that to get a high rate of images compression, with a quality close to the one reached by the algorithm FS, but with great decrease of time codification compared to this algorithm.

(8)

LISTA DE ABREVIATURAS E SIGLAS

ANSI – American National Standards Institute DCT – Discrete Cosine Transform

DHSS3 – Dynamical Hyperplanes Shrinking Search with three axes DPCM – Differential Pulse Code Modulation

DVQ – Differential Vector Quantization

ENNS – Equal-average Nearest-Neighbor Search

ESVQ – Exhaustive Searching Vector Quantization FANN – Fast Artificial Neural Network

FS – Full Search

HH – High - High HL – High-low

JPEG – Join Photographic Experts Group JPG – Join Photographic Group

LBG – Linde Buzo Gray LH – Low-high

LL – Low-low

MATLAB – Matrix Laboratory MSE – Mean Square Error

NTSC – National Television System Committee PSNR – Peak Signal-to-Noise Ratio

RAM – Random Access Memory

RNA – Rede Neural Artificial RNAs – Redes Neurais Artificiais RGB – Red Green Blue

SOM – Self Organization Maps

VBTSVQ – Variable-Branch Tree-Structured Vector Quantization YUV – Luminância, intensidade de vermelho, intensidade de azul

(9)

LISTA DE FIGURAS

Figura 1 – Distribuição de freqüências em uma matriz de 8x8 pixels...18

Figura 2 – Diferença visual entre os coeficientes das freqüências de imagem. ...19

Figura 3 – Scan Zig-Zag em matriz de 8x8 pixels. ...20

Figura 4 – Segmentação em quantização escalar. ...22

Figura 5 – Exemplo de entradas e saídas para compressão de imagens...24

Figura 6 - Exemplo de conexões entre neurônios. ...27

Figura 7 - Semelhanças entre Subbandas. ...31

Figura 8 - CplX versus Bit Rate. ...32

Figura 9 – Fluxo do experimento...38

Figura 10 – Blocos iniciais da imagem Lena. ...40

Figura 11 – Parâmetros iniciais da RNA. ...52

Figura 12 – Arquitetura da RNA. ...54

Figura 13 – Pesos da RNA após treinamento. ...54

Figura 14 – Imagem Lena utilizada no teste...55

Figura 15 – Imagem Lena restaurada pelo algoritmo FS: 33,74 dB. ...55

Figura 16 – Imagem Lena restaurada pela RNA: 25,66 dB...56

Figura 17 – Diferença de PSNR entre o algoritmo FS e a RNA. ...56

Figura 18 – Gráfico PSNR versus quantidade de treinos. ...57

Figura 19 – Gráfico PSNR versus erro de convergência...58

Figura 20 – Imagem Lena restaurada por RNA: 26,85 dB. ...60

Figura 21 – Imagem Lena restaurada por RNA: 27,70 dB. ...62

(10)

LISTA DE TABELAS

Tabela 1: Algumas combinações de RGB...16

Tabela 2: Resumo dos testes realizados. ...49

Tabela 3: Tempo de execução para codebook com 10000 vetores. ...50

Tabela 4: Tempo de execução para codebook com 20000 vetores. ...51

Tabela 5: Variação da quantidade de treinos. ...57

Tabela 6: Erro de convergência de cada RNA. ...62

(11)

SUMÁRIO

1 INTRODUÇÃO... 12

2 PROCESSAMENTO DIGITAL DE IMAGEM ... 15

2.1 Sistema de cor RGB... 16

2.2 Sistema de cor YUV ... 17

2.3 Transformada discreta do cosseno ... 18

3 QUANTIZAÇÃO ... 21

3.1 Quantização escalar... 21

3.2 Quantização vetorial ... 23

4 REDES NEURAIS ARTIFICIAIS ... 27

5 TRABALHOS RELACIONADOS ... 30

5.1 Quantização vetorial ... 30

5.2 Rede neural artificial ... 33

6 METODOLOGIA... 37

6.1 Programa de criação do codebook... 39

6.2 Algoritmo FS... 42

6.3 Programa de restauração de imagem ... 45

6.4 Programa para teste do PSNR ... 46

7 TESTES E RESULTADOS ... 49

7.1 Teste de tempo de processamento ... 50

7.2 Treino da RNA, testes e resultados ... 52

7.2.1 Teste – 1200 vetores de treino e codebook com 10000 vetores ... 54

7.2.2 Teste – variação de imagens de treino para um codebook com 10000 vetores ... 56

7.2.3 Teste – codebook com 1000 vetores e uma imagem de treino ... 59

7.2.4 Teste – 4 RNAs treinadas, cada uma com 1/4 da imagem de treino ... 60

8 CONCLUSÃO ... 65

8.1 Limitações... 66

(12)

1 INTRODUÇÃO

Quantização vetorial (LINDE, 1980) é uma técnica que pode ser utilizada na área de codificação de imagem e vídeo e tem sido muito estudada por pesquisadores do meio científico. Ela é conhecida como a técnica que utiliza vetores ao invés de escalares com o objetivo de conseguir um melhor desempenho na compressão de um determinado sinal (KIM, 1995), (CAO, 2000).

A compressão de um conjunto de dados busca diminuir a quantidade de informação, tanto para transmissão quanto para armazenamento (GERSHO, 1991). Na Internet, a compressão de dados permite reduzir a banda ocupada.

A Internet a cada ano tem recebido mais usuários e com isso tem ocorrido um aumento em transmissões de imagens, vídeos e conferências. Isso pode causar futuros congestionamentos e até mesmo comprometer a estabilidade dessa rede. Portanto, é de suma importância avaliar as opções disponíveis em termos de novas técnicas que possam conseguir maior compressão de dados, porém com baixo custo computacional e boa qualidade de decodificação.

No processo de codificação de uma imagem, a quantização é a etapa que responde pela maior compressão de dados e pela degradação de qualidade da imagem original, quando da sua decodificação (FERRAZ, 1998).

Na codificação de um vídeo, na qual, dependendo do padrão utilizado, podem-se ter trinta imagens codificadas por segundo, um dos principais desafios é a redução do tempo em que os dados são comprimidos. Da mesma forma, a taxa de compactação e a qualidade da imagem descompactada também são focos de pesquisa nessa área.

Existem várias técnicas para se comprimir dados através da quantização e que podem ser divididas em duas categorias: quantização escalar e quantização vetorial (BRUNO, 2003).

(13)

A idéia da quantização escalar é, por meio da utilização de índices, estabelecer que um determinado índice represente um determinado conjunto de valores para conseguir compressão de dados. A quantidade de valores que esse índice representa está diretamente relacionada à taxa de compressão.

Diferentemente, o objetivo de um quantizador vetorial é criar um codebookI que contenha um número finito de vetores, também chamados de codewords ou

codevectors, que serão comparados com os vetores extraídos das imagens de entrada

do codificador. O vetor do codebook escolhido para ter seu índice enviado ao decodificador é aquele que tiver o menor erro médio quadrático (MSE - Mean Square

Error) (NASRABADI, 1988), (JUNIOR 1993), (TAI, 1996), (MAKUR, 1997), (FERRAZ;

GRAY; ZHU, 1998), (KLAUTAU, 1999), (BRUNO, 2003), em relação a um vetor de entrada.

O algoritmo que consegue a menor distorção de imagem decodificada em relação à codificada é o Full Search (FS), pois para cada vetor de entrada, ele executa uma pesquisa em todo o codebook para encontrar o codeword com menor MSE. Essa pesquisa resulta um custo computacional muito elevado devido à quantidade de comparações e aos cálculos envolvidos em cada comparação (CAO, 2000), (LAI, 2004). Algumas propostas tais como as de Lin (1994), Yang (2004) e Lai (2004) conseguem diminuir o tempo de processamento da busca do codeword mais compatível com o vetor de entrada, mas acabam tendo uma qualidade de imagem inferior ao FS após a decodificação.

A utilização de redes neurais artificiais (RNAs) em quantização vetorial (CARBONARA, 1992), (KIM, 1995), (CHU, 1998) e a sua complexidade O(n log n)II (MARTINETZ, 1993) inferior em relação à complexidade O(2kr)III (BAYAZIT, 1999) do algoritmo FS, foram os dois pontos-chave que inspiraram esta pesquisa a verificar o comportamento de uma rede neural artificial (RNA) empregada em quantização vetorial para escolha de codewords. Dessa forma, de acordo com a informação citada

I Conjunto de vetores para representação dos blocos de imagem de entrada no codificador. II Para essa complexidade, n representa o número de vetores do codebook.

(14)

anteriormente, este autor considera que em termos de complexidade computacional, uma RNA apresenta melhor desempenho que o algoritmo FS.

A questão de pesquisa explorada nesta monografia é verificar qual a distorção que uma RNA aplicaria na codificação de uma determinada imagem em relação a essa mesma imagem codificada pelo algoritmo FS.

O objetivo deste trabalho é apresentar uma proposta de aplicação de quantização vetorial, utilizando RNAs e, posteriormente, realizar uma análise comparativa com o algoritmo FS em relação à distorção resultante da escolha dos

codewords do codebook. Essa comparação de distorção será realizada utilizando-se

como referência a medida de pico da relação sinal-ruído (PSNR - Peak Signal-to-Noise

Ratio) (COSMAN; JUNIOR, 1993), (LIN; SETIONO, 1994), (ALPCAN; SHEPPARD;

ZHU, 1998), (SUDHIR, 1999), (FOWLER; TSAI, 2000), (KARAYIANNIS; KHALIL, 2001), (PINAGÉ, 2005).

A área de processamento digital de imagem, bem como RNAs e compressão de imagem, são muito amplas, por essa razão, para não fugir do escopo desta pesquisa, as informações contidas neste texto são destinadas apenas ao entendimento do leitor sobre o que foi realizado neste trabalho. Para informações mais aprofundadas sobre esses assuntos sugeri-se verificar as referências indicadas ao longo desta monografia.

O presente trabalho está dividido em oito capítulos: o capítulo 2 apresenta algumas características de processamento digital de imagem. No capítulo 3 são abordadas a quantização escalar e a quantização vetorial. É apresentada no capítulo 4 uma introdução à RNA juntamente com algumas de suas características. Alguns trabalhos relacionados a esta pesquisa são descritos no capítulo 5. A metodologia utilizada é descrita no capítulo 6. No capítulo 7 aparecem os testes realizados e os resultados obtidos. Por fim, no capítulo 8 são apresentadas a conclusão deste trabalho, as limitações encontradas e as indicações para trabalhos futuros neste assunto.

(15)

2 PROCESSAMENTO DIGITAL DE IMAGEM

A base deste trabalho está muito ligada à manipulação de informações extraídas de imagens que são digitalizadas, então é interessante que seja mencionado uma das maneiras de se tratar com esse tipo de informação.

Para se processar digitalmente uma imagem, o primeiro passo a ser dado é capturar essa imagem do mundo real e transportá-la para o mundo digital, ou seja, para dentro de um computador. Esse processo pode ser conseguido, por exemplo, utilizando-se uma câmera digital.

A imagem digitalizada necessita ser representada de maneira apropriada para que um computador possa processá-la. Nesse caso, uma solução comumente utilizada, é a representação da imagem na forma matricial, onde cada célula dessa matriz irá conter a menor informação dessa imagem.

Geralmente, um equipamento de captura de imagem fornece em sua saída a imagem capturada no padrão RGB, onde as letras R, G e B significam do idioma inglês

red, green e blue, respectivamente.

Em uma imagem colorida, essa imagem pode ser subdividida em pixels, onde cada pixel representa a menor informação da imagem. Nesse padrão, cada pixel teria as informações de luminosidade das cores vermelha, verde e azul de uma imagem.

Para a representação de uma imagem colorida no padrão RGB, seriam necessárias três matrizes, sendo que cada uma guardaria as informações de luminosidade de cada uma das três cores que compõem um pixel de imagem. O tamanho dessas matrizes é definido de acordo com a resolução da imagem quando essa é capturada. Por exemplo, para se capturar uma imagem colorida com resolução de 320x240 pixels, poderiam ser utilizadas 3 matrizes, cada uma tendo 320 colunas por 240 linhas.

(16)

2.1 Sistema de cor RGB

A sigla RGB corresponde respectivamente do idioma inglês à red, green e blue, ou seja, às cores vermelha, verde e azul. Essas três cores primárias são misturadas e, de acordo com a quantidade e combinação entre elas, é possível se conseguir muitas outras cores. A Tabela 1 mostra um exemplo de combinação entre essas três cores utilizando-se apenas os valores máximo e mínimo de amplitude.

Tabela 1: Algumas combinações de RGB.

E s c a la B ra n c o A m a re lo C y a n V e rd e M a g e n ta V e rm e lh o A z u l P re to R 0 até 255 255 255 0 0 255 255 0 0 G 0 até 255 255 255 255 255 0 0 0 0 B 0 até 255 255 0 255 0 255 0 255 0 Fonte: Jack, 2005, p. 16.

O sistema de cor RGB é muito utilizado computacionalmente porque monitores de vídeo trabalham com esse padrão de cores ao gerarem as imagens que são aplicadas em suas entradas.

Uma desvantagem desse sistema é que a cor de um determinado pixel da imagem é formada pelas três informações de R, G e B, ou seja, para determinadas cores é necessário alterar as três informações, causando nesses casos, um prejuízo de desempenho na construção e/ou modificação de algumas cores. Então, em alguns casos, é utilizado um outro sistema de cores: o YUV, onde as letras Y, U e V correspondem respectivamente à luminância, intensidade de vermelho e intensidade de azul de uma imagem.

(17)

2.2 Sistema de cor YUV

O sistema de cor YUV, que é também utilizado no padrão National Television

System Committee (NTSC), é uma combinação do sistema de cor RGB e é

demonstrado através da fórmula (1) (JACK, 2005):

Y = 0,229*R + 0,587*G + 0,114*B U = -0,147*R – 0,289*G + 0,436*B

= 0,492*(B – Y) (1) V = 0,615*R – 0,515*G – 0,100*B

= 0,877*(R – Y)

A fórmula (2) (JACK, 2005) demonstra o caminho inverso para se obter RGB através de YUV:

R = Y + 1,141*V

G = Y – 0,395*U – 0,581*V (2) B = Y + 2,032*U

No sistema de cor YUV, o componente Y representa a informação de luminosidade da imagem e os outros dois componentes representam somente a informação de intensidade das cores vermelha e azul, com o propósito de economia de informação. Essa economia ocorre porque no espaço de cor RGB, a informação de luminosidade de um pixel é repetida três vezes, e no espaço de cor YUV, ela está presente somente uma vez. Para o sistema de cor RGB, uma imagem que seja mostrada em tons de cinza, necessita da informação dos três componentes; no sistema YUV, necessita apenas do componente Y. Com isso, a representação numérica dessa imagem no sistema de cor YUV é menor do que no sistema de cor RGB.

(18)

2.3 Transformada discreta do cosseno

A transformada Discreta do Cosseno (DCT – Discrete Cosine Transform) (AHMED, 1974) é uma operação matemática que não insere perda de dados na sua aplicação. Sua aplicação no processamento digital de imagens é justificada por conseguir identificar matematicamente a freqüência espacial de uma imagem, ou seja, a taxa de variação de mudança de intensidade de cada pixel.

Partes da imagem que contenham concentração na variação da intensidade dos

pixels indicam um ponto com freqüências altas e áreas que apresentem valores

constantes ou muito próximos na intensidade dos pixels indicam a localização de freqüências baixas.

A DCT constrói matematicamente uma matriz com os valores representantes das intensidades de cada pixel e separa dentro dessa matriz as freqüências baixas, médias e altas da imagem. A Figura 1 mostra a distribuição das freqüências em uma matriz gerada pela DCT.

Figura 1 – Distribuição de freqüências em uma matriz de 8x8 pixels. Fonte: Autoria própria, 2007.

O olho humano percebe melhor as variações suaves nas mudanças das intensidades dos pixels, ou seja, nas informações que fazem parte das freqüências baixas (BRUNO, 2003).

(19)

A Figura 2 (a) mostra a imagem original Lena; a Figura 2 (b) exibe a cópia restaurada da imagem Lena utilizando-se apenas o componente DC juntamente com os 9 primeiros coeficientes que fazem parte das baixas freqüências; a Figura 2 (c) apresenta uma cópia restaurada da imagem Lena utilizando-se os 54 coeficientes restantes que compõem as médias e altas freqüências da imagem, com os dez primeiros estando zerados.

(a) (b)

(c)

Figura 2 – Diferença visual entre os coeficientes das freqüências de imagem. Fonte: Autoria própria, 2007.

A vantagem de se utilizar a DCT é que ela consegue transformar um sinal no domínio espaço, que nesse caso é uma imagem, para o domínio freqüência, onde podemos encontrar a concentração da informação mais perceptível a nossa visão.

(20)

A primeira informação dessa matriz contém a média de todas as freqüências que nela estão contidas. Esse valor é chamado de coeficiente DC. Os demais valores da matriz são chamados de coeficientes AC.

A idéia é criar um vetor que contenha nas suas primeiras posições os valores das freqüências mais baixas da imagem e nas últimas posições os valores das freqüências mais altas. Para isso, é utilizado um método chamado Scan Zig-Zag (JACK, 2005) conforme mostra a Figura 3.

Figura 3 – Scan Zig-Zag em matriz de 8x8 pixels. Fonte: Adaptado de Salomon, 2004, p. 28.

O vetor gerado utilizando-se o Scan Zig-Zag, tem na sua primeira posição o coeficiente DC da imagem na qual foi aplicada a DCT. Nas posições seguintes os valores correspondentes às freqüências baixas, na seqüência os valores das freqüências médias e nas últimas posições, os valores correspondentes às freqüências altas. Dessa forma, apenas as primeiras posições desse vetor foram utilizadas, ou seja, as informações mais significantes das imagens, tanto para o treino das RNAs, que será abordado no capítulo 4, quanto para os testes realizados neste trabalho, que serão descritos no capítulo 7.

(21)

3 QUANTIZAÇÃO

A quantização é a etapa, em um codificador de imagem, que responde pela maior compressão de dados e pela degradação de qualidade da imagem original, quando da sua decodificação (FERRAZ, 1998).

De acordo com (BRUNO, 2003), existem várias técnicas para se comprimir dados através da quantização e que podem se divididas em duas categorias: quantização escalar e quantização vetorial.

Nas duas seções deste capítulo, serão abordadas as técnicas de quantização escalar e quantização vetorial respectivamente, onde serão descritas as suas principais características.

3.1 Quantização escalar

Antes de ser apresentada a técnica de quantização vetorial, será abordada a sua antecessora, a quantização escalar, que apesar de obter uma taxa de compressão muito inferior, ainda é muito utilizada em função de ter um melhor desempenho em termos de processamento computacional.

Na quantização escalar, os dados de entrada são tratados de forma independente, gerando para cada informação de entrada uma informação de saída com precisão menor (BRUNO, 2003).

A idéia básica de um quantizador escalar é substituir um determinado grupo de valores de entrada por um índice. Cada índice representa uma aproximação dentro de uma determinada escala.

(22)

No caso de quantizadores escalares uniformes, consegue-se gerar uma escala de índices segmentando o valor máximo de entrada em faixas de tamanho fixo.

Para exemplificar, pode-se supor que a faixa de entrada de um quantizador escalar esteja entre 0 - 255, então os dados de entrada poderiam ser representados por 8 bits (28=256). Se cada segmento de uma escala de aproximação comportar 4 valores,

então um valor de entrada igual a 2 será substituído pelo índice 1, pois o valor 2 faz parte do primeiro segmento e o valor 122 que pertence ao trigésimo segmento, receberá o índice de número 30. Como os 256 valores de entrada estão sendo representados por 64 segmentos, então serão necessários apenas 6 bits (26=64) para

representar os valores de saída, conseguindo-se assim nesse caso, uma compressão de 25% (SOBREIRO, 1998). A Figura 4 mostra um exemplo de segmentação em quantização escalar.

Figura 4 – Segmentação em quantização escalar. Fonte: Adaptado de Bruno, 2003, p. 31.

Um outro exemplo poderia ser um termômetro digital que mostra em seu visor temperaturas de -40° até 100° Celsius com um interv alo de 1° em 1°. É possível imaginar que o termômetro será exposto a temperaturas que vão variar dentro de uma escala bem menor, por exemplo: 12,16°, 21,57°, 32,9 8° Celsius, etc., mas sua saída mostrará um valor aproximado dentro da escala do quantizador, por exemplo: 12°, 21° e 32° respectivamente.

(23)

Esta seção apresentou a quantização escalar mostrando como esse método pode ser utilizado para se comprimir uma determinada informação. Na próxima seção, será abordada a quantização vetorial, onde poderá ser percebida a grande vantagem de sua utilização em relação à técnica de quantização escalar.

3.2 Quantização vetorial

A quantização vetorial pode ser considerada uma extensão da quantização escalar, mas que ao invés de considerar cada elemento separadamente, esses são agrupados em vetores (FLEURY, 2005).

Conforme Gersho

Um quantizador vetorial Q de dimensão k e tamanho N é um mapeamento de de um vetor (ou um “ponto”) em um k- dimensional espaço Euclidiano, Rk,

dentro de um finito conjunto C contendo N saídas ou pontos de reprodução, chamados de codevectors ou codewords. Dessa forma

Q:RkC,

onde C = (y1, y2, ..., yN) e yi

Rk para cada i

∈ ≡

τ

{1, 2, ..., N}. O conjunto

C é chamado de codebook ou código e tem tamanho N, significando que tem

N elementos distintos, estando cada um desses vetores contidos em Rk. (1991,

p. 310).

A busca por baixas taxas de bits por pixel na codificação de imagens, levou ao surgimento da quantização vetorial como uma nova técnica de compressão de dados.

Na compressão de imagem, utilizando-se quantização vetorial, essa é dividida em várias partes ou células e o conteúdo de cada célula é atribuído às posições de um vetor.

A idéia básica de um quantizador vetorial é criar um codebook que contenha um número finito de vetores que irão representar todos os vetores das imagens de entrada de um codificador. Cada vetor desse codebook, além de já terem seus valores quantizados, ou seja, já sofreram uma DCT, também possuem um índice de identificação.

(24)

Um codificador de imagem que utiliza a técnica de quantização vetorial para compressão de dados tem a tarefa de identificar, para cada vetor de imagem de entrada, o índice que endereça o vetor mais adequado para representar esse vetor de entrada. Dessa forma, para cada vetor de entrada é identificado um índice correspondente no codebook.

A escolha do codeword que vai representar o vetor de entrada é feita através do cálculo do MSE entre o vetor de entrada e os vetores do codebook. O vetor do

codebook que apresentar o menor MSE será o escolhido pelo quantizador vetorial para

ter seu índice enviado ao decodificador.

A tarefa do decodificador é bem mais simples. Esse, que possui um codebook idêntico ao codificador, ao receber os índices enviados pelo bloco de codificação, os utiliza para endereçar seu codebook e acessar diretamente os vetores previamente escolhidos pela etapa codificadora e, através deles, conseguir construir a imagem original novamente, mesmo com alguma perda de qualidade.

A Figura 5 apresenta uma visualização das entradas e saídas dos blocos de codificação e decodificação que utilizam a técnica de quantização vetorial para compressão de imagem.

Figura 5 – Exemplo de entradas e saídas para compressão de imagens. Fonte: Adaptado de Gersho, 1991, p. 313.

A codificação, em relação à decodificação, é a etapa que responde pela maior ocupação de processamento computacional, devido a quantidade de comparações e cálculos matemáticos que necessitam ser realizados para se encontrar os índices dos vetores do codebook que irão formar a imagem decodificada.

Em um codificador, uma das etapas comumente utilizada antes da quantização, é a DCT, que entrega para a etapa posterior uma matriz formada por coeficientes,

(25)

resultantes da transformação das informações do domínio espaço para o domínio freqüência da imagem que está sendo tratada.

Em vários codificadores a DCT é aplicada em blocos de 8x8 pixels, do início até o fim da imagem. O quantizador vetorial gera para cada matriz de 8x8 um vetor de 64 posições (8x8=64). O codebook utilizado com a técnica de quantização vetorial, já mencionado anteriormente, é formado por um conjunto de vetores de imagens, cada um possuindo um índice de identificação. Esses vetores terão 64 posições se estiverem sendo utilizados blocos de 8x8.

A quantização vetorial consegue uma alta taxa de compactação devido ao fato de fornecer ao decodificador apenas os índices dos vetores do codebook que forem escolhidos, ao invés de todas as 64 posições de cada vetor selecionado nesse banco de vetores, pois o decodificador possui um codebook idêntico ao codificador.

Supondo que cada uma das informações das 64 posições de um determinado vetor de entrada seja representada por um byte e cada índice do codebook seja representado por 2 bytes, então nesse caso, para cada vetor de entrada serão enviados ao decodificador apenas 2 bytes ao invés de 64 bytes. Isso representa uma compressão de aproximadamente 97%.

Com um índice composto por 2 bytes, ou seja, 16 bits, pode-se ter um codebook com 65536 vetores.

É importante salientar que o tamanho do codebook também influencia na qualidade da imagem decodificada, pois seus vetores são utilizados para representar todas as matrizes de 8x8 das imagens originais. Quanto maior a quantidade de vetores em um codebook, maior a chance de um vetor de entrada encontrar um vetor mais compatível, mas também será maior o custo computacional para realizar a pesquisa nesse codebook.

Em quantização vetorial, o algoritmo mais eficiente em relação à qualidade da imagem decodificada é o Full Search (GRAY, 1982). Isso se dá pelo fato de que para um determinado vetor de entrada, ele executa uma pesquisa em todo o codebook para encontrar o codeword com menor MSE. Sua desvantagem está no alto custo computacional para realizar toda essa pesquisa.

(26)

O próximo capítulo apresenta uma visão geral sobre as RNAs, pois essa tecnologia será utilizada em conjunto com a quantização vetorial para integrar a etapa de compressão de dados em um codificador de imagem.

(27)

4 REDES NEURAIS ARTIFICIAIS

Baseadas no funcionamento dos neurônios do cérebro humano, as RNAs são formadas por neurônios artificiais que podem ser conectados de várias maneiras e formar uma ou várias camadas, dependendo do objetivo definido para uma determinada rede (LUGER, 2004).

Um dos primeiros modelos de RNAs que surgiram foi chamado de rede

perceptron. Essa rede era formada por neurônios do tipo discriminadores lineares e

possuía a característica de aprender a responder com verdadeiro/falso ou 1/0. Essa rede perceptron possuía mais de um neurônio que eram dispostos em camadas (LUGER, 2004).

Uma RNA pode ser dividida basicamente em três camadas: camada de entrada, camada oculta (que pode ser constituída por uma ou várias camadas) e camada de saída. A conexão entre essas camadas se dá através da ligação entre os neurônios dessas camadas. As conexões entre os neurônios são representadas por valores numéricos e possuem pesos que são ajustados durante a fase de treinamento da rede (LUGER, 2004). A Figura 6 mostra um exemplo de conexão entre neurônios.

Figura 6 - Exemplo de conexões entre neurônios. Fonte: Autoria própria, 2007.

(28)

Cada neurônio possui internamente uma expressão matemática que, juntamente com os pesos de suas conexões, alteram seus valores de entrada para disponibilizá-los em sua saída (LUGER, 2004).

Existem basicamente dois tipos de arquiteturas de RNAs: as feedforward e as

backpropagation, sendo a segunda arquitetura a mais utilizada, por ter a capacidade de

aprender complexos mapeamentos multidimensionais (NIELSEN, 1989).

Na arquitetura backpropagation, as unidades de uma camada retornam informações de erro para as camadas anteriores, para que suas unidades possam se ajustar na tentativa de minimizá-los. Dessa forma, a retro-propagação fornece uma solução na tentativa de evitar que os erros se espalhem no interior da rede através das camadas sucessivas (LUGER, 2004).

Em uma arquitetura feedforward nenhuma informação é retornada para as camadas anteriores. O fluxo de dados é sempre no sentido da entrada para a saída, ou seja, segue em uma única direção.

Outra característica de uma RNA, é que ela necessita ser treinada para que ela aprenda como deve se comportar, ou seja, qual a saída que ela deve gerar de acordo com as entradas que lhe são aplicadas. Esses ajustes são feitos de acordo com os pesos que são atribuídos para cada conexão. A rede neural atinge seu aprendizado quando ela consegue uma solução generalizada para uma classe de problemas. A quantidade de vezes que se treina uma determinada RNA também é chamada de época, em outras palavras, uma RNA que foi treinada 10000 vezes, diz-se que foi treinada com 10000 épocas.

Existem duas formas de aprendizado: o supervisionado e o não-supervisionado. No aprendizado supervisionado, a rede tenta resolver a ocorrência de um problema através da observação de resultados que lhe são fornecidos externamente para que ela modifique seus pesos para reduzir o erro. A repetição desse processo faz com que a RNA consiga aprender qual o grupo de pesos que minimiza o erro médio sobre todo o conjunto de treinamento.

Diferentemente, o aprendizado não-supervisionado não possui um agente que lhe forneça os resultados desejados para os padrões de entrada, dessa forma, os pesos são alterados como uma função dos valores de entrada e de saída do neurônio.

(29)

Uma grande vantagem das RNAs é o seu desempenho em termos de processamento computacional, pois todos os neurônios processam suas entradas simultânea e independentemente, conseguindo nesse sentido uma solução paralela e distribuída para um determinado problema.

(30)

5 TRABALHOS RELACIONADOS

Este capítulo apresenta algumas pesquisas que foram realizadas em quantização vetorial nos últimos anos, bem como uma amostra de trabalhos que utilizaram RNAs nessa mesma área.

Neste capítulo também aparecem considerações desta pesquisa em relação a alguns desses trabalhos relacionados a RNAs, com a intenção de se mostrar diferenças positivas alcançadas.

5.1 Quantização vetorial

Muitas pesquisas em quantização vetorial foram realizadas na tentativa de se conseguir maior velocidade na etapa de compressão, mas também buscando uma qualidade de imagem decodificada próxima ao algoritmo FS (NASRABADI, 1988), (LIN; SITARAM 1994), (ALPCAN, 1998), (SUDHIR, 1999), (CAO; PALIWAL; TSAI, 2000), (LAI; YANG, 2004).

Nesta seção foram selecionados apenas alguns desses trabalhos para que se possa ter uma idéia do que já foi desenvolvido, como por exemplo, o algoritmo de Alpcan (1998) que explorou a técnica de decomposição em subbandas para compressão de uma imagem e a existência da correlação de pixels horizontal e vertical em cada sub-banda através da correlação dos coeficientes wavelets.

A decomposição inicial gera as subbandas low-low (LL), low-high (LH), high-low (HL) e high-high (HH). Essa última é praticamente ignorada, pois possui a menor representação de energia da imagem de entrada.

(31)

Os vetores de quantização são formados por blocos de imagem de 4x8 para a sub-banda LH e 8x4 para a sub-banda HL. Para evitar a utilização de dois codebooks, para uma das dimensões de sub-banda é feita uma transposição. Selecionando-se um conjunto de codevectors apropriados, é possível utilizar um único codebook com tamanho reduzido, pois se pode encontrar um codeword apropriado no sentido horizontal ou vertical da imagem, conforme ilustração da Figura 7.

Para escolher o melhor codeword para cada bloco da imagem de entrada, esse algoritmo verifica os coeficientes que representam a banda de baixa freqüência.

O PSNR resultante ficou em torno de 26,8 dB em relação aos 28,5 dB do Join

Photographic Experts Group (JPEG). Embora os resultados tenham mostrado uma

qualidade de imagem inferior ao padrão JPEG, a técnica de Alpcan (1998) apresentou uma melhor distribuição dessa qualidade, com uma diferença média em torno de 0,0000611 dB.

Figura 7 - Semelhanças entre Subbandas. Fonte: Alpcan, 1998, p. 3.

Diferentemente, a idéia do algoritmo de Cao (2000) é armazenar o codebook como um grafo direcionado ao invés de uma lista ou uma árvore como é feito em outras técnicas de quantização vetorial. Um exemplo seria criar dois codebooks, um com menos e outro com mais codewords.

Esses dois codebooks são particionados em duas regiões sobrepostas. Quando um vetor de entrada chega para ser quantizado vetorialmente, primeiro é pesquisado no

(32)

testam-se os outros codewords da região sobreposta a essa. Uma diferença básica do grafo direcionado em relação às outras abordagens que utilizam estruturas em árvores, é que os nodos filhos, que contém o codeword, podem ter mais de um "parente". Essa idéia serve para um grafo direcionado com n codebooks C0, C1,..., Cm com (N0<N1<...<Nm) codewords, respectivamente.

Para esse experimento foram utilizadas 16 imagens de 512x512 e um codebook com 4096 codewords (12 bits). A Figura 8 mostra uma comparação em termos de complexidade expressa em unidades de operações de pesquisa entre o algoritmo

Exhaustive Searching Vector Quantization (ESVQ) e o Algoritmo de Cao (2000).

O algoritmo de Cao (2000) apresentou uma degradação de 0,06 dB de PSNR com um vetor de 16 posições e apenas 3% da complexidade do ESVQ.

Figura 8 - CplX versus Bit Rate. Fonte: Adaptado de Cao, 2000, p. 592.

Lai (2004) escolhe um codevector em um codebook avaliando as características de valor médio, intensidade da borda e intensidade da textura da imagem, extraídas do vetor de entrada.

Esse algoritmo utilizou blocos de imagem de 4x4 e codewords de 16 posições e o codebook foi gerado utilizando a imagem Lena com resolução de 512x512 pixels. Para o experimento, foram utilizados quatro codebooks com tamanhos de 128, 256, 512 e 1024 codewords e três imagens: Lena, Peppers e Baboon; todas com resolução de 512x512 pixels.

(33)

Os resultados obtidos por Lai (2004) apresentaram um número menor de cálculos de distorção e um tempo de processamento menor que os algoritmos FS,

Equal-average Nearest-Neighbor Search (ENNS) e Dynamical Hyperplanes Shrinking Search with three axes (DHSS3).

Yang (2004) desenvolveu um algoritmo que consegue melhorar a escolha do

codeword em relação ao vetor de entrada. O Variable-Branch Tree-Structured Vector Quantization (VBTSVQ) aplica a técnica de quantização vetorial utilizando uma árvore

estruturada com expansão variável para armazenar o codebook.

Esse algoritmo também prevê um aumento do codebook de acordo com os vetores de entrada e a procura pelo melhor codeword. Esse codebook é armazenado em uma estrutura de árvore e seu aumento é maior em profundidade do que em largura.

Quando um codebook é dividido em cluster, um determinado vetor de entrada pode estar na região crítica de escolha entre um ou outro. Yang (2004) dividiu os

clusters em sub-regiões e, ao invés de verificar a relação do vetor de entrada com o

centro de cada cluster, o algoritmo avalia o vetor de entrada com o elemento da sub-região mais próxima. Isso permite uma escolha mais precisa de qual cluster será utilizado para buscar o codeword correspondente.

O algoritmo FS, por pesquisar todo o codebook, consegue encontrar o melhor

codeword para o decodificador, mas com um tempo de busca elevado. Em termos de

tempo de processamento, o VBTSVQ se mostrou mais eficiente que o algoritmo FS.

5.2 Rede neural artificial

A pesquisa de Sicuranza (1990) abordou a utilização de RNAs utilizando o algoritmo de treino backprogapgation para a compressão de imagem.

Esse trabalho levou em consideração que se pode obter bom desempenho utilizando-se RNAs para codificação de diferentes imagens, desde que elas possuam propriedades estáticas locais semelhantes. Para imagens com essas propriedades

(34)

diferentes foi registrada perda de qualidade de imagem em torno de 10 dB na medida PSNR.

A RNA desenvolvida por Sicuranza (1990) é uma perceptron com apenas uma camada oculta. A quantidade de neurônios dessa camada são inferiores às quantidades de neurônios das camadas de entrada e saída com a intenção de se conseguir compressão. Essa RNA é composta por duas partes, sendo que a conexão ente elas se dá através do meio de transmissão. Dessa forma, a entrada e a camada oculta estão no codificador e a saída está no decodificador.

Nesse experimento foi utilizada a medida MSE para se verificar o erro entre a entrada da RNA e sua saída. As imagens de entrada, que tinham resolução de 256x256 em escala de cinza, foram divididas em blocos de 8x8 pixels para que a RNA tivesse um número pequeno de neurônios de entrada.

Foram utilizadas três RNAs com diferentes dimensões: 36 x 9 x 2, 25 x 6 x 2 e 16 x 4 x 2, onde os primeiros números, os intermediários e os últimos se referem às quantidades de neurônios na entrada, na camada oculta e saída respectivamente.

Os resultados experimentais mostraram que a RNA com apenas 4 neurônios na camada oculta apresentou uma medida de PSNR em torno de 20 dB, sendo esse o seu limite de desempenho.

Os resultados iniciais deste trabalho mostram superioridade em relação à qualidade da imagem restaurada pela RNA da proposta de Sicuranza (1990). Em seu artigo, Sicuranza (1990) chegou a um limite de qualidade de imagem de 20,5 dB, enquanto que nesta pesquisa, os resultados além de serem superiores (o primeiro resultado que aparece na Figura 16 exibi uma qualidade de 25,66dB e o último resultado apresentado na Figura 21, mostra uma qualidade de 27,70 dB), demonstram que ainda é possível de serem melhorados com algumas alterações na RNA, como por exemplo, utilizar uma RNA com um número maior de neurônios na camada oculta.

Carbonara (1992) utilizou RNAs para conseguir a geração do codebook de um quantizador vetorial. Explorando o alto paralelismo intrínseco nesse tipo de arquitetura, desenvolveu um quantizador vetorial adaptativo para ser empregado em aplicações de tempo real. Um ótimo codebook está sempre sendo buscado e suas alterações são posteriormente enviadas ao decodificador.

(35)

Para a compressão dos dados, Carbonara (1992) empregou a arquitetura

Differential Vector Quantization (DVQ) e para os testes foram utilizados codebooks com

tamanhos de 128 e 256 codewords. O algoritmo DVQ, utilizando RNAs, apresentou 25% mais compressão que um decodificador Differential Pulse Code Modulation (DPCM) e também uma menor sensibilidade em transmissões em canais ruidosos.

A abordagem de Carbonara (1992) também é interessante no sentido de se estar sempre buscando um codebook mais adequado, mas para isso é necessário o envio de cada novo codebook ao decodificador. A utilização dessa proposta na internet, por exemplo, vai acarretar em mais ocupação de banda e, quanto maior for esse

codebook e a freqüência de atualização, maior será essa ocupação.

O tamanho do codebook tem uma ralação diretamente proporcional à possibilidade de se encontrar um codeword mais adequado para a informação de entrada. Na abordagem deste trabalho, mesmo utilizando-se um codebook muito maior que o da proposta de Carbonara (1992), esse já faria parte do decodificador, não sendo necessário seu envio pelo codificador.

Kim (1995) utilizou um algoritmo de Self Organization Maps (SOM) utilizado em RNAs não-supervisionadas para desenhar codebooks em quantização vetorial. Através da alteração desse algoritmo, conseguiu reduzir a degradação das bordas da imagem codificada. As bordas estão presentes em boa parte do conteúdo de uma imagem e a redução de sua degradação melhora a qualidade visual da imagem.

Foi empregado um SOM de duas dimensões (32x64) e sub-blocos de imagem de 4x4 de 15 imagens diferentes para gerar o codebook. Para o teste foi utilizada a imagem monocromática Lena de 512x512 pixels e um codebook com 2560 codewords. Foi utilizado como medida para identificar as bordas, a variância entre os pixels dos blocos de 4x4 da imagem.

Essa pesquisa mostrou que a geração do codebook utilizando um algoritmo SOM chega mais rapidamente ao codebook definitivo em relação ao algoritmo Linde Buzo Gray (LBG) (Linde, 1980) e também que é possível utilizar blocos de imagens mais largos tornando a quantização vetorial mais eficiente.

Chu (1998) utilizou uma rede de perceptrons backpropagation para identificar o

(36)

vetorial de sinal de áudio. Esse algoritmo identifica os codewords mais utilizados através de um contador em cada um deles e com isso cria um sub codebook formado por esses codewords.

A taxa de aprendizado da rede neural foi definida em 0,005, pois com 0,01 ela apresentou instabilidade. Os resultados esperados foram alcançados em torno de 1000 iterações. Foi verificado também que conforme o codebook foi aumentado de tamanho, sua distorção média diminuiu.

Através do artigo de Chu (1998), pôde-se avaliar o desempenho de três esquemas de quantização utilizando RNAs, sendo que o Multistage apresentou melhores resultados em relação ao Split e ao Tree-Structured Split, tanto em espaço de armazenamento (tamanho do codebook), quanto em quantidade de operações de busca pelo melhor codeword.

(37)

6 METODOLOGIA

Neste capítulo será apresentada a metodologia utilizada neste trabalho, bem como alguns programas que foram desenvolvidos para auxiliar no desenvolvimento deste estudo.

Como já comentado no capítulo anterior, existem várias pesquisas na área de quantização vetorial que procuram diminuir o tempo de busca pelo codeword mais adequado, mas essas pesquisas em comparação com o algoritmo FS, apresentam uma qualidade inferior nas imagens decodificadas. Neste trabalho, o algoritmo FS foi escolhido pela característica de ser o que gera a menor distorção na qualidade de imagem durante o processo de codificação. Esta pesquisa buscou investigar como uma RNA treinada se comportaria em comparação ao algoritmo FS em relação à qualidade da imagem decodificada.

O software Matrix Laboratory (MATLAB), por possuir uma biblioteca para RNAs - e também por já ter sido utilizado como ferramenta de apoio em outras pesquisas (MARGRAVE, 1995), (JOST; SANGHAMITRA, 2005) - foi o programa escolhido para gerar, treinar e analisar o comportamento da RNA, na escolha dos codewords compatíveis com os vetores de imagem de entrada.

A RNA perceptron, que já foi utilizada em algumas pesquisas tais como (SICURANZA, 1990), (BOSE, 1993), (CHU, 1998), (MARTINS, 2006) e, também por adequar-se aos testes propostos, foi a rede escolhida para este trabalho.

Durante a disciplina de Trabalho de Conclusão de Curso, foi desenvolvido um programa em linguagem C para simulação do algoritmo FS, com o propósito de permitir observações mais precisas das escolhas dos codewords do codebook por esse algoritmo. Uma observação exata dos vetores escolhidos pelo algoritmo FS se fez necessária, pois esses resultados foram utilizados para os treinos das RNAs.

(38)

Embora tenham sido utilizados dois ambientes para os testes realizados (MATLAB e Linguagem C), os resultados não sofreram influência por essa razão, pois as análises foram realizadas fazendo-se uma comparação entre as imagens originais de entrada e sua resultante decodificada, tanto para a RNA desenvolvida na ferramenta MATLAB, quanto para o algoritmo FS desenvolvido em linguagem C.

Todos os testes foram realizados em um microcomputador com processador Pentium 4, dual core, 3,4 GHz e 2GB de memória do tipo Random Access Memory (RAM). Foram utilizados dois sistemas operacionais: o Windows XP, para rodar o

software MATLAB e o Linux Ubuntu kernel 2.6.15-23-386, para os testes de tempo de

execução entre a RNA e o algoritmo FS. Os testes de tempo de execução foram realizados no sistema operacional Linux por ter sido utilizado para essa medição uma RNA construída em linguagem C, a Fast Artificial Neural Network (FANN) (GOOGLE SUMMER OF CODE, 2007), que possui bibliotecas para Linux. Isso foi feito para não se medir o tempo de uma RNA que estava executando dentro de uma ferramenta (MATLAB), pois isso poderia comprometer o resultado.

Para atingir os objetivos apresentados neste trabalho, foi realizado um experimento, que é descrito a seguir e que trata da realização dos testes entre o algoritmo FS e uma RNA implementada pela ferramenta MATLAB 7.0. A Figura 9 serve para apoiar o entendimento deste experimento.

Início Criar codebook utilizando MATLAB Treinar RNA Entrar com as imagens de teste na RNA Entrar com as imagens de teste no algoritmo FS Calcular PSNR Comparar PSNR Fim Entrar com imagens de treino na rede neural artificial

Testar RNA algoritmo FSTestar Entrar com imagens de treino no algoritmo FS Verificar os vetores escolhidos pelo FS Concluir

Figura 9 – Fluxo do experimento. Fonte: Autoria própria, 2007.

(39)

Todas as imagens envolvidas neste experimento eram coloridas, do tipo Join

Photographic Group (JPG) e com resolução de 320x240 pixels, de onde foi extraído o

componente Y de cada uma para os testes (FOWLER, 2000); todos os programas desenvolvidos para este trabalho foram elaborados utilizando-se a linguagem C do

American National Standards Institute (ANSI C); como métrica de avaliação dos

resultados de qualidade de imagem utilizou-se a medida PSNR entre as imagens originais e as imagens de teste, para se verificar o erro de codificação entre o algoritmo FS e uma RNA treinada.

6.1 Programa de criação do codebook

Primeiramente foi gerado um codebook provisório baseado em nove imagens, conforme ANEXO A, com diferentes tipos de conteúdo, buscando abranger algumas diferentes possibilidades de informação de entrada como paisagem, imagem humana e desenho.

Esse codebook provisório foi gerado aproveitando-se a ferramenta MATLAB 7.0 por ela já possuir uma biblioteca que gera o componente Y a partir de uma imagem formada por RGB e também executa a DCT que gerou os coeficientes que formaram o conteúdo dos vetores desse codebook.

A DCT disponibiliza no MATLAB um arquivo com os coeficientes das imagens em blocos de 8x8, onde o primeiro elemento de cada bloco é o seu coeficiente DC. Esse coeficiente pode ser facilmente identificado por ser a informação com maior valor numérico. A Figura 10 mostra como ficam organizados os coeficientes das imagens, e é possível notar a posição do coeficiente DC de cada bloco. Como a resolução utilizada é de 320x240, acabou resultando em um arquivo com 40 blocos de 8x8 coeficientes na horizontal e 30 blocos de 8x8 coeficientes na vertical.

(40)

Figura 10 – Blocos iniciais da imagem Lena. Fonte: Autoria própria, 2007.

A Figura 10 mostra os valores originais dos coeficientes de alguns blocos da imagem Lena. Mas para este trabalho, buscando evitar erros de arredondamento no momento da leitura dos arquivos-texto dos coeficientes das imagens e posterior transformação dos caracteres para tipo float dentro dos programas elaborados foi necessário retirar os pontos decimais dos números, transformando-os em números inteiros. Também foram utilizadas apenas duas casas decimais para que a RNA pudesse trabalhar com menos informação.

Como exemplo, o primeiro coeficiente do bloco 1 da Figura 10 ficou com valor de 332 ao invés de 3,324500. Essa estratégia foi utilizada apenas para a manipulação desses dados dentro dos programas elaborados neste trabalho, porque para o treino da RNA eles eram novamente retornados para a forma decimal.

Como o formato dos dados entregues pela DCT não foi adequado à formação do

codebook, ou seja, os dados estavam separados em blocos e também não estavam

ordenados, foi elaborado um programa para extrair e organizar as informações de cada bloco na forma de vetores, para que posteriormente esses vetores pudessem ser utilizados no codebook.

(41)

As nove imagens utilizadas para gerar o codebook provisório, cada uma sendo formada por 1200 vetores, resultou em um primeiro momento num codebook com 10800 vetores (9x1200=10800).

A próxima tarefa realizada identificou os vetores idênticos, ou seja, os vetores que continham os mesmos valores em todas as suas posições e que não precisavam estar presentes no codebook.

Esses vetores foram marcados substituindo-se o valor de seus coeficientes DC por um outro bem superior a 800, que seria o valor máximo nessa posição gerado pela DCT depois de ser transformado para inteiro. Dessa forma, no passo seguinte onde organizou-se todos esses vetores do codebook provisório em ordem crescente (essa ordenação foi realizada comparando-se as primeiras 25 posições de cada vetor), esses vetores foram deslocados para as últimas posições para serem excluídos posteriormente, pois seriam aproveitados somente os primeiros 10000.

A razão de se aproveitar os primeiros 10000 vetores foi apenas para se ter um número redondo nas fórmulas de normalização que são mostradas em (4) e (5) na seção 7.2; e também porque não faria muita diferença manter os 800 vetores restantes nesse momento, levando-se em conta que seriam realizados testes com um codebook com 20000 vetores, conforme mostrado no capítulo 7, seção 7.1.

O próximo passo realizado na seqüência, foi a transferência dos 10000 primeiros vetores para um novo codebook. Esse novo codebook, formado por apenas 10000 vetores (que depois de todas as alterações necessárias, seria o definitivo), ficou em sua primeira posição com o vetor correspondente à cor preta, pelo fato dos vetores estarem ordenados em ordem crescente. Esse vetor possui em todas as suas posições o valor zero. Isso acontece porque após a aplicação da DCT em uma imagem, as cores são representadas por valores numéricos, onde a cor preta possui o menor valor e a cor branca, que seria o outro extremo dessa representação, possui o maior valor.

Para se manter nos dois extremos as representações de mínimo e máximo dos tons de cinza, na última posição do codebook foi colocado o vetor correspondente à cor branca. Esse vetor tem na sua primeira posição, ou seja, na posição referente ao componente DC, o valor 800 e em todas as suas outras posições, o valor zero.

(42)

Para que esse codebook tivesse valores que variassem mais linearmente entre a cor preta e a cor branca, ou seja, o coeficiente DC dos vetores variando de 0 a 800, e também para melhor atender as diferentes imagens que ele iria representar, alguns vetores tiveram que ser substituídos. Para isso, foram utilizados alguns vetores que estavam entre as posições 10001 e 10800 e que não iriam ser aproveitados. Essa substituição foi necessária, pois se verificou após o codebook ter sido criado, que o último vetor antes do de cor branca que foi inserido manualmente, tinha um coeficiente DC com valor em torno de 700. Então foram inseridos no codebook alguns vetores com coeficientes DC entre 701 e 799 e retirado alguns vetores com coeficiente DC com valores entre 1 e 700.

Para melhor adequar o range da RNA às fórmulas de normalização, que serão descritas na seção seguinte, o codebook foi carregado, dentro deste programa, em uma matriz a partir da posição 1, ignorando-se a posição zero.

Esse codebook, já com as alterações, foi o mesmo, tanto para os testes do algoritmo FS, quanto para os testes da RNA e continha 10000 vetores, cada um com 64 posições.

6.2 Algoritmo FS

A principal função do algoritmo FS desenvolvido para este trabalho, foi a verificação exata das escolhas dos vetores do codebook para cada vetor de imagem que era aplicado em sua entrada. Os resultados analisados pelo algoritmo FS foram armazenados e utilizados na fase de treinamento da RNA.

A tarefa realizada pelo algoritmo FS é a identificação do vetor do codebook com menor MSE em relação a um vetor de imagem de entrada. Através da fórmula do MSE

definida em (3) (LINDE, 1980), onde xi representa a posição de um determinado vetor

de entrada, xˆi representa a posição do codeword do codebook que está sendo testado

em um determinado momento e k é o tamanho desses vetores; todas as posições desses vetores foram calculadas e o valor resultante foi armazenado em uma variável

(43)

de erro de MSE. Da mesma forma, uma outra variável foi definida para armazenar o índice do codeword que resultou o menor MSE.

Para cada vetor de entrada, foi executada uma busca em todo o codebook aplicando-se esse cálculo. Quando algum codeword resultou em um valor de MSE menor que o armazenado na variável de erro, o valor dessa variável foi substituído e o índice desse codeword foi salvo. Sendo assim, no final de cada busca, pôde-se identificar o codeword mais compatível para cada vetor de entrada.

− =

=

1 0 2

|

ˆ

|

)

ˆ

,

(

k i i i

x

x

x

x

d

(3)

Através do algoritmo FS foi possível verificar para cada vetor de uma determinada imagem, qual era o índice correspondente do codebook que continha um

codeword com menor erro. Para armazenar essas informações, foi previsto no próprio

algoritmo FS uma rotina para juntar todos esses resultados em um arquivo, para que pudessem ser utilizados posteriormente no treino da RNA. Mas antes do efetivo armazenamento dos índices e vetores do codebook escolhidos pelo algoritmo FS, foi preciso ser feita uma modificação na representação desses índices, conforme explicação que segue.

A modificação na representação dos índices escolhidos pelo algoritmo FS ocorreu devido ao fato de que o range de entrada e saída da RNA utilizada no MATLAB era de -1 até 1, e o range de endereçamento do codebook era de 1 até 10000. Para solucionar esse problema, foi necessária a aplicação de uma função de normalização para se evitar que valores negativos de saída na RNA endereçassem o codebook.

Como mencionado anteriormente, a saída da RNA é o próprio índice para o

codebook e não se pode endereçar uma matriz utilizando números negativos

diretamente. Então, para se transformar os índices escolhidos pelo algoritmo FS, que podiam variar de 1 até 10000 em uma variação de -1 até 1, foi criada a função de normalização que está definida em (4), onde

I

e refere-se ao índice escolhido pelo

(44)

=

5000

5000

e r

I

I

(4) Para a operação inversa, ou seja, quando a RNA disponibilizava em sua saída os índices escolhidos para uma determinada imagem de entrada, também foi necessária a criação de uma função de normalização que alterasse o range de -1 até 1 da saída da RNA para o range de endereçamento do codebook que é de 1 até 10000. Essa função esta definida em (5), onde

I

s refere-se ao índice escolhido pela RNA e

I

c ao índice

correspondente que será utilizado para endereçar um vetor no codebook.

5000

5000

+

×

=

s c

I

I

(5) Também foi previsto no algoritmo FS que as posições dos vetores das imagens que foram aplicadas na RNA, tanto para treino como para os testes, já estivessem no modo Scan Zig-Zag, para se extrair desses vetores somente as informações de baixa freqüência, ou seja, as informações mais significantes das imagens. A razão de se aplicar esse método é que não se utilizou para os treinos e testes todas as 64 posições dos vetores das imagens, fazendo-se necessário utilizar alguma estratégia que identificasse essas informações dentro dos vetores das imagens. Dessa forma, o arquivo disponibilizado pelo algoritmo FS já estava totalmente de acordo com as condições adequadas para servir de entrada da RNA, tanto para os treinos quanto para os testes.

Como foi informado anteriormente, o algoritmo FS gera um arquivo no formato texto com os vetores das imagens, já com a quantidade de posições ajustadas para a quantidade de entrada da RNA e no modo Scan Zig-Zag. Também foi mencionado que os valores manipulados dentro dos programas eram do tipo inteiro, com valores de coeficientes DC podendo variar entre 0 e 800. Para que esses valores se adequassem à entrada da RNA, em função de seu range estar entre -1 até 1, todos esses valores contidos nas posições dos vetores de imagens foram divididos por 1000 antes de serem gravados no arquivo gerado pelo algoritmo FS. Dessa forma, como exemplo, os valores inteiros dos coeficientes DC que variavam de 0 a 800, passaram a variar de 0 a 0,8.

(45)

6.3 Programa de restauração de imagem

A idéia básica deste trabalho é definir para cada vetor de uma determinada imagem de entrada um índice que será disponibilizado ou enviado ao sistema decodificador para que essa imagem seja restaurada. Uma das tarefas deste sistema decodificador é receber esse índice, e através dele identificar em seu codebook o vetor correspondente. Nesse codebook, que é idêntico ao existente na etapa de codificação, existe um número finito de vetores com a intenção de representar todos os possíveis vetores das imagens codificadas.

As informações de saída do algoritmo FS, bem como as informações de saída da RNA, são justamente os índices para endereçar os vetores do codebook da etapa de decodificação.

No MATLAB, os índices escolhidos pela RNA eram disponibilizados em uma janela dessa ferramenta. Esses índices eram então copiados para um arquivo texto que posteriormente era aberto e manipulado pelo algoritmo de restauração de imagem, que foi construído com a finalidade de restaurar as imagens codificadas.

No algoritmo FS desenvolvido neste trabalho, uma de suas saídas era um arquivo texto que continha os índices escolhidos. Da mesma forma, para se restaurar uma imagem utilizando-se os índices escolhidos pelo algoritmo FS, copiavam-se eles para o mesmo arquivo que seria utilizado no algoritmo de restauração de imagem.

Os índices escolhidos correspondem a vetores de imagens e precisam ser colocados na forma adequada para se visualizar uma imagem novamente.

Para que a ferramenta MATLAB pudesse aplicar as funções reversas utilizadas para o processamento das imagens e com isso ser possível visualizá-las novamente, foi necessário colocar as 64 informações de cada vetor selecionado pelos índices na forma de blocos de 8x8, pois foi assim que a ferramenta MATLAB, após a aplicação da DCT, disponibilizou as imagens utilizadas nesta pesquisa.

A saída do algoritmo de restauração de imagem era então um arquivo texto muito semelhante ao apresentado na Figura 10, mas com os valores correspondendo às imagens que estavam sendo decodificadas.

Referências

Documentos relacionados

Neste momento a vacina com a melhor perspetiva de disseminação pelos cuidados de saúde é a M.vaccae, pela sua ação como vacina terapêutica, aguardando-se a sua

Nossos resultados confirmam a presença de subdivisões no complexo pulvinar em núcleo pulvinar anterior (APul), núcleo pulvinar medial (MPul), núcleo pulvinar lateral

O abate ocorreu quando os animais atingiram peso médio de 325 kg (±20), entre 28 e 30 meses de idade, sendo avaliados os parâme- tros comprimento de carcaça fria, peso dos

A pesquisa pode ser caracterizada como exploratória e experimental em uma primeira etapa (estudo piloto), na qual foram geradas hipóteses e um conjunto de observáveis, variáveis

Nessa situação temos claramente a relação de tecnovívio apresentado por Dubatti (2012) operando, visto que nessa experiência ambos os atores tra- çam um diálogo que não se dá

43, tradução nossa e reconhecem o papel fundamental dos meios de comunicação social na alteração da representação dos idosos: b Encorajar os meios de comunicação a promover

This process of fusioning gluons slows down and then stops the growth of gluon distribution functions when going into smaller and

dois gestores, pelo fato deles serem os mais indicados para avaliarem administrativamente a articulação entre o ensino médio e a educação profissional, bem como a estruturação