dr inż. Jacek Naruniec J.Naruniec@ire.pw.edu.pl
Entropia jest to średnia ilość informacji przypadająca na jeden znak alfabetu. H( x) n i 1 p( i)log W rzeczywistości określa nam granicę efektywności kodowania danych. r określa system zapisu (2 dla bitowego) Jeśli r=2 i entropia będzie równa 5 oznacza to, że dla danego zbioru na jeden symbol będzie przypadało średnio minimalnie 5 bitów poniżej tej granicy nie zejdziemy. r p( i)
Metody uniwersalne: kodowanie Huffmana koder entropijny aaaaaaaabbbccccdd A 8 B 3 C 4 D - 2 [17] [9] [5] B[3] D[2] C[4] A[8]
aaaaaaaabbbccccdd entropia (na symbol w systemie dwójkowym) 1,808 1,808 * 17 znaków = 30,73 stała długość bitowa: A- 00, B-01, C 10, D-11 kod: 00000000000000000 Huffman: 10101101010101111 (34 bity) A 0, B 111, C 10, D-110 kod: 00000000111111 11110101010110110 (31 bitów) 1 [9] 1 [5] 0 Mamy minimalną średnią długość kodu! 1 [17] B[3] D[2] C[4] A[8] 0 0
Koder arytmetyczny koder entropijny, zwykle skuteczniejszy od kodera Huffmana Kodowanie sekwencji do liczby zmiennoprzecinkowej znak Ilość wystąpień pradopodobi eństwo zakres A 4 0,4 [0,0.. 0,4] B 2 0,2 [0,4.. 0.6] C 2 0,2 [0.6.. 0.8] D 2 0,2 [0.8.. 1.0]
abbddaaacd Wyznaczamy zakres w którym znajduje się liczba wyjściowa (od góry G i dołu D). Szerokość zakresu S=G-D Każdy kolejny znak zależnie od swojego zakresu z tabeli zawęża zakresy G i D. znak zakres A [0,0.. 0,4] B [0,4.. 0.6] C [0.6.. 0.8] D [0.8.. 1.0] Wynik włączając kolejne znaki: (a) D=0.0, G=0.4 (z tabelki), S = 0.4 (b) G=D + 0.6*S = 0.0 + 0.6*0.4 = 0.24 D=D + 0.4*S = 0.0 + 0.4*0.4 = 0.16 S = 0.08 (b) G=D + 0.6*S = 0.208 D=D + 0.4*S = 0.192 S=0.016 d) G= D + 1.0*S = 0.208 D = D + 0.8*S= 0.2048 Wyjście -> 0.20 Jeśli na tym kończymy kodowanie, to do 0.20 dopisujemy 48.
Formalnie algorytm zakodowania symbolu s, gdzie prawdopodobieństwo wystąpienia symbolu i to P[i]: zakres_dolny zakres_gorny zakres G - D G D zakres zakres_gorny D D zakres zakres_dolny Model rozkładu prawdopodobieństwa może być także tworzony w sposób adaptacyjny. Kompresja zachodzi, ponieważ bardziej prawdopodobne znaki w mniejszym stopniu zawężają interwał niż mniej p. Mniejszy interwał wymaga więcej znaków do zakodowania. s 1 i 1 s i 1 P[ i] P[ i]
Dekodowanie 0.2048: 0.0 0.4 0.6 0.8 1.0 0.0 0.16 0.24 0.32 0.4 0.16 0.192 0.208 0.224 0.24 a b b znak zakres A [0,0.. 0,4] B [0,4.. 0.6] C [0.6.. 0.8] D [0.8.. 1.0] Podobnie zawężamy zakres zgodnie z wybranym znakiem i określamy w którym segmencie zakresu znajduje się nasza liczba (tutaj 0.2048)
Koder arytmetyczny nie jest do końca optymalny (tj. nie daje długości bitowej określonej przez entropię), bo liczby zmiennoprzecinkowe mają skończoną dokładność. Z drugiej strony jest skuteczniejszy od kodowania Huffmana, gdzie mamy zawsze zaokrąglenie opisu do jednego bitu
Metody słownikowe (na przykładzie LZ77) Wykorzystują powtarzające się sekwencje znaków. LZ77 koduje tekst trójkami wartości (p, i, n) p wskaźnik (przesunięcie wstecz w tekście) do najdłuższego wystąpienia powtórzonej sekwencji i ilość powtórzonych znaków sekwencji n symbol kolejnego (nowego) znaku
Przykład dekompresji w LZ77: wejście (0,0,a) (0,0,b) (2,1,a) (3,2,b) wyjście a b a a b a b Można tu wprowadzić szereg usprawnień, np.: mniejsze wskaźniki reprezentowane na mniejszej ilości bitów, trzeci element nie musi być zawsze podawany.
Kompresja LZW słownikowa (np. w GIF, PDF) Zakodowanie sekwencji znaków polega na podaniu indeksu w słowniku gdzie dana sekwencja wystąpiła, następnie podanie kolejnego znaku sekwencji. Przy kodowaniu: Początkowo w słowniku znajdują się wszystkie znaki alfabetu z przyznanymi indeksami. Kodując odczytujemy z wejścia najdłuższą sekwencję znajdującą się w słowniku, na wyjście oddajemy jej indeks. Do powyższej sekwencji dodajemy kolejny znak z wejścia i powstały ciąg dodajemy do słownika.
LZW: aabcabcab 1. Alfabet początkowy: a: 1, b: 2, c:3 Krok Najdłuższa znaleziona sekwencja alfabetu Dodany symbol do alfabetu Wyjście 1 a aa: 4 1 2 a ab: 5 1 3 b bc: 6 2 4 c ca: 7 3 5 ab abc: 8 5 6 ca cab: 9 7 7
Z czego wynika kompresja? Entropia Percepcja szczegółów Predykcja
Metody bezstratne wykorzystują zwykle transformaty poprawiające wyniki kompresji entropijnej, słownikowej, stosowana jest tu między innymi transformata falkowa (JPEG-2000), odejmowanie sąsiednich pikseli lub linii (PNG), adaptacja do lokalnych cech obrazu (JPEG-LS) stosowane głównie w obrazach medycznych, astronomicznych standardowe archiwizery
Metody stratne wykorzystujące zwykle niedoskonałości naszego oka, większa dbałość o luminancję niż chrominancję (podpróbkowanie), zwykle zakładają transformaty np. DCT (JPEG), których mniej znaczące współczynniki są usuwane, inne kwantowane, zwykle połączone z kodowaniem entropijnym różnic między współczynnikami.
Wykorzystuje podobieństwo kolejnych klatek obrazu. Wykorzystuje wiedzę o przesunięciach konkretnych bloków obrazu kolejnych klatkach (predykcja) Zazwyczaj koduje różnice w kolejnych obrazach.
Czułość słuchu [źródło Wikipedia]
Zwykle kompresja stratna Bazuje na naszej ograniczonej percepcji dźwięku. Maskowanie częstotliwościowe dźwięku (głośny dźwięk jednej częstotliwości przysłania inne) Maskowanie czasowe dźwięku dźwięk głośny i od razu cichy -> cichego nie usłyszymy dźwięk cichy i od razu głośny -> cichego nie usłyszymy [źródło: http://mattmahoney.net/dc/dce.html]
Zwykle stosowany jest podział sygnału na nakładające się okna analizy.
Zwykle okna mnoży się przez funkcję, np. Hamminga czy Gaussa Eliminacja efektów blokowych Wykorzystanie transformary MDCT zamiast DCT (zakładkowo w celu wyeliminowania ostrych granic) [źródło obrazu- Wikipedia]
MP3 Podział na bloki (1W, 384 próbki) Filtry konwolucyjne dzielące pasmo na podpasma (32 pasma, po 12 próbek) Wyznaczenie wpływu maskowania danych pasm na pozostałe pasma Eliminacja podpasm poniżej progu maskowania Kwantyzacja do poziomu dającego dobrą jakość dźwięku Formowanie strumienia wyjściowego Możliwość kodowania wspólnego materiału stereo Możliwość wykorzystania kodowania Huffmana
AAC (Advanced Audio Coding), stosowany m.in. w koderze wideo H264: większa dostępna liczba kanałów (48 w stosunku do 2 lub 5.1 mp3), okna analizy zmiennej wielkości predykcja w dziedzinie częstotliwości wyższa jakość przy tej samej ilości bitów na próbkę różne tryby analizy (standardowy, low delay)
AAC algorytm kodowania (wersja uproszczona): wybór okna analizy (długie lub krótkie 2048 lub 256 próbek) transformata MDCT, kwantyzacja w zależności od modelu przychoakustycznego kodowanie entropijne
WMA kodowanie w blokach 128, 256, 512, 1024 i 2048 próbkowych. podobnie model psychoakustyczny, MDCT, kwantyzacja dość popularny istnieje również WMA bezstratny
Duże archiwum obrazów zawiera np. ponad 10 6 obiektów. Zakładając kod binarny na jeden identyfikator należałoby przeznaczyć (bitów): l b 6 log 2 10 19,93 20, Gdzie oznacza zaokrąglenie do góry (ceil)
Zakładając, że kolekcja może się powiększyć musielibyśmy: zarezerwować większą ilość bitów na znak lub przy każdym powiększeniu kolekcji poza zakres zmodyfikować wszystkie listy
Przestrzeń zajmowana przez indeks: kolekcja 10 6 obiektów - 20 bitów na symbol cechy reprezentatywne 16 bitowe - 65536 cech średnio 5 elementów listy dla jednej cechy reprezentatywnej cechy 16*65536 = 1048576 bitów (13,7% pamięci) listy 5*65536*20=6553600 bitów (86,3% pamięci) Stąd wniosek potrzebujemy efektywnych metod przechowywania list obiektowych
Zakładamy, że listy obiektowe są posortowane rosnąco względem identyfikatorów. Etap modelowania danych: uporządkowanie identyfikatorów na listach obiektowych, a następnie zastąpienie ich przez różnice kolejnych identyfikatorów, dobór statystycznego modelu różnic identyfikatorów, wybór schematu kodowania dopasowanego do modelu statystycznego.
Cecha Lista obiektów 0 30, 70, 84 1 12, 14, 19, 100 2 27, 33, 65, 80 Cecha Lista obiektów 0 30, 40, 14 1 12, 2, 5, 81 2 27, 6, 32, 25 cel: Skoncentrowanie rozkładu prawdopodobieństwa w niższych wartościach identyfikatorów.
Ogólna zależność im większa koncentracja rozkładu prawdopodobieństwa wystąpienia symboli, tym większa szansa na efektywną kompresję: p(x) p(x) x x
Zakładamy niezależność numeracji obiektów i faktu posiadania cechy c przez obiekt innymi słowy w zbiorze 100-elementowym jeśli obiekt o identyfikatorze 1 ma cechę c, to z równym prawdopodobieństwem cechę tę może mieć również obiekt o identyfikatorze 2 jak i 100. Przy powyższym założeniu identyfikatory długich list obiektowych mogą być modelowane rozkładem geometrycznym. [źródło wikipedia]
Zgodnie z teorią informacji dla danego rozkładu prawdopodobieństwa istnieje kod Huffmana optymalny, tj. dający minimalną średnią długość kodu Zależnie od rodzaju kolekcji: statyczna, np. płyty CD, DVD, BD, można wykorzystać koder arytmetyczny (dalej nie będziemy się zajmować tą opcją), dynamiczna, np. zbiory internetowe, stworzenie kodu optymalnego jest zwykle nierealne ze względu na wielkość bazy i jej zmienność.
Omówimy kodowania: globalne nieparametryzowane unarne kodowanie przedziałowe (w szczególności γ, δ) globalne parametryzowane binarne prawie stałej długości Golomba i Rice a lokalne interpolacyjne
Kod unarny U(q) dla q 0: q jedynek U( q) 11111...0 lub analogicznie: U( q) q zer 00000...1
U(5)=111110 U(2)=110 U(10)=11111111110 Kod unarny jest optymalnym kodem przedrostkowym dla rozkładu prawdopodobieństwa zadanego ciągiem geometrycznym o pierwszym wyrazie 1/2 i o ilorazie 1/2:
Kod binarny symbolu r z parametrem b B b (r), b>0, 0 r > b: wyznaczamy k log 2 b, symbole o wartościach w przedziale (0..2 k+1 -b) kodujemy zwykłym kodem binarnym na k bitach, symbole o wartościach w przedziale (2 k+1 -b, b) kodujemy zwykłym kodem binarnym malejąco na k+1 bitach
Załóżmy parametr b=5 Wyznaczamy k log 2 b 2,3 2 2 k+1 -b = 8-5 = 3 B 5 (0)=00 B 5 (1)=01 B 5 (2)=10 B 5 (3)=111 B 5 (4)=110
Jest to kod prefiksowy. Jest optymalny dla rozkładu prawdopodobieństwa zrównoważonego według kryterium 2min>max, tzn: 2min>max -> suma dwóch najmniejszych prawdopodobieństw wystąpienia symbolu jest większa niż prawdopodobieństwo wystąpienia najbardziej prawdopodobnego symbolu
2min>max: np. aaabbccccddd P(a) = 3/12 P(b) = 2/12 P(c) = 4/12 P(d) = 3/12 Najmniejsze prawd. P(a) i P(b), największe P(c) P(a)+P(b) > P(c), czyli mamy 2min>max
Kod Golomba G b, określony dla ustalonego parametru całkowitego b > 0, przypisuje symbolowi o numerze n>0 sekwencję bitów składającą się z: kodu unarnego liczby q= (n 1)/b, kodu binarnego prawie stałej długości B b (r) dla liczby r=(n 1) mod b. n = q*b + r. Jest to kod zmiennej długości. Innymi słowy kodujemy unarnie numer przedziału i pozycję w przedziale.
Załóżmy parametr b=5, kodujemy liczbę n=20 q= (n 1)/b = 19/5 =3 r=(n 1) mod b = 19 mod 5 = 4 U(q) = 1110 B 5 (r) : k log 2 b 2,3 2 2 k+1 -b = 3, czyli liczbę r = 4 kodujemy na k+1 bitach B 5 (4) = 110 W efekcie G 5 (20)=U(3)B 5 (4)=1110 110
Załóżmy parametr b=3, kodujemy liczbę n=20 q= (n 1)/b = 19/3 =6 r=(n 1) mod b = 19 mod 3 = 1 U(q) = 1111110 B 3 (r) : k log 2 b 1,5 1 2 k+1 -b = 1, czyli liczbę r = 1 kodujemy na k+1 bitach B 3 (4) = 11 W efekcie G 3 (20)=U(6)B 3 (1)=1111110 11
Załóżmy parametr b=8, kodujemy liczbę n=20 q= (n 1)/b = 19/8 =2 r=(n 1) mod b = 19 mod 8 = 3 U(q) = 110 B 8 (r) : k log 2 b 3 3 2 k+1 -b = 6, czyli liczbę r = 3 kodujemy na k bitach B 8 (4) = 011 W efekcie G 8 (20)=U(2)B 8 (4)=110 011
Kod Golomba, w którym parametr b jest potęgą liczby 2 to kod taki nazywa się kodem Rice a (od twórcy). Kod Rice a charakteryzuje się tym, że część binarna prawie stałej długości liczby jest zawsze tej samej długości (czyli jest tak naprawdę zwykłym kodem binarnym) niezależnie od kodowanego symbolu
Rice Rice Rice [źródło- Wikipedia - tam parametr m odpowiada naszemu parametrowi b]
Dla rozkładu geometrycznego P(n) = pq n 1 z prawdopodobieństwem sukcesu p i porażki q=1 p optymalnym kodem przedrostkowym jest kod Golomba, w którym parametr b dobieramy jako:
p=0.2 => b=3 p=0.5 => b=1 p=0.8 => b=1
Kod przedziałowy π zakłada podział zbioru liczb na rozłączne przedziały π q o długościach b q >0, q=0,1,. Jeśli kodowana liczba n należy do przedziału π q, a r jest odległością od lewej krawędzi przedziału (r=n-a q ), to π(n)=u(q)bbq (r) Innymi słowy unarnie kodujemy numer przedziału do którego należy liczba, a binarnie ze zmienną długością i parametrem równym długości przedziału pozycję w danym przedziale
Mając 3 przedziały: [1..5], [6..11], [12..15] Liczbę 3 zakodujemy jako U(0)B 5 (3) Liczbę 6 zakodujemy jako U(1)B 6 (0)
Geometryczny kod przedziałowy to szczególna rodzina kodów przedziałowych G a,b w których długość przedziałów zmienia się w postępie geometrycznym, tj. b q =ba q, q = 0, 1, 2,.... Kod geometryczny, w którym a=2, b=1 nazywany jest kodem γ (gamma). Dla tego kodu przedziały kształtują się według wzorów: czyli: [1..1][2..3],[4..7], [8..15], [16..31] itd.
Kodowanie γ(10) to: przedziały to [1..1],[2..3],[4..7],[8..15],[16..31] itd. 10 należy do 4 przedziału, więc pierwszy człon to U(3) =1110 Następnie mamy kodowanie B 8 (2)=010 Cały kod ma postać 1110 010. Dla bardzo dużych liczb naturalnych kodowanie unarne w kodowaniu przedziałowym może nie być efektywne, dlatego proponuje się rozwiązanie hybrydowe, w którym kod unarny zastępuje się kodem γ.
Zakładane prawdopodobieństwo: P( x) 1 2x 2
Kodowanie δ (delta) polega na zastąpieniu w kodzie γ liczby unarnej U(q) kodem γ(q+1). Kodowanie jest często skuteczniejsze na realnych danych od kodowania γ. δ(10): Przedział 4, a γ(4)=11000 B(2)=010 δ(10) = 11000 010 Dla liczby 1.000.000 kod δ ma 28 bitów, dla - γ 39
Weźmy listę w której mamy 20 obiektów: (7; 3,8,9,11,12,13,17) Zamiast kodować różnice między elementami spróbujmy domyślać się wartości liczb, tzn.: Jeśli znamy drugi wskaźnik do dokumentu 8, to wiemy, że pierwszy wskaźnik będzie w zakresie 1..7, co potrafimy zakodować na 3 bitach. Jeżeli znamy drugi i czwarty wskaźnik do dokumentu (8 i 11), to wartość trzeciego wskaźnika jest 9 lub 10, co potrafimy zapisać na 1 bicie. Jeśli znamy czwarty i szósty wskaźnik (11 i 13), to piąty jest oczywisty. Powyższe rozważania zakładają, że znamy listę (3; 8,11,13) Do tej listy (3; 8,11,13) stosujemy dokładnie tę samą metodę.
(3; 8,11,13) Jeśli znamy liczbę 11, to elementy po lewej kodujemy w zakresie (1..10), co zajmuje 4 bity, po prawej (9..20) 4 bity Ale jeśli wiemy, że po lewej i prawej stronie pierwszego wskaźnika (8) mamy jakąś liczbę, to możemy być pewni, że liczba po lewej będzie z zakresu 2..9. To znaczy, że możemy ją zakodować na 3 bitach. Tak samo wiemy, że 13 po lewej i prawej stronie ma liczbę, czyli jest w zakresie [13..19], więc kodujemy ją na 3 bitach. Na końcu zostaje nam liczba 11. Ale jeśli wiemy, że ma 3 obiekty po lewej i po prawej stronie, to możemy ją zakodować w zakresie 4..17. Daje nam to zwykle lepsze efekty niż w kodowaniu Golomba.
Wybrane kolekcje obiektów tekstowych: Biblia: pojedynczy werset biblii jest obiektem identyfikowanym przez numer księgi, rozdziału w księdze i wersetu w księdze. GNUbib: kolekcja notek bibliograficznych w dziedzinie informatyki. TREC (Text REtrieval Conference): kolekcja dokumentów z różnych źródeł używana w badaniach systemów wyszukiwania informacji.
W wykładzie wykorzystałem metariały: I. Witten i inni: Managing Gigabytes: Compressing and Indexing Documents and Images, W.Skarbek: materiały wykładowe przedmiotu INM