Kompresja Kodowanie arytmetyczne
Transkrypt
Kompresja Kodowanie arytmetyczne
Kompresja Kodowanie arytmetyczne Dariusz Sobczuk Kodowanie arytmetyczne (lata 1960-te) Pierwsze prace w tym kierunku sięgają początków lat 60-tych XX wieku Pierwszy algorytm Eliasa nie został opublikowany (opisywany jest tylko w później wydanych książkach) Niezależne odkrycie kodowania arytmetycznego latach 1976–1980 przez różnych autorów Aktualnie patent posiada IBM kompresja danych 2 Kodowanie arytmetyczne Pomysł W metodach entropijnych chodzi o zaokrąglanie rozkładu prawdopodobieństw symboli Ps, powodowane koniecznością zapisania poszczególnych słów kodowych na całkowitej liczbie bitów Najbardziej dokładne przybliżenie rozkładu Ps można uzyskać poprzez przypisanie jednego słowa kodowego całej sekwencji danych źródłowych Dokładność wyznaczania wartości prawdopodobieństwa wystąpienia całego ciągu jest ograniczona sposobem ustalenia jego wartości dla poszczególnych symboli kompresja danych 3 Kodowanie arytmetyczne – Pomysł cd Chcemy wyznaczyć P(swe) i zapisać je za pomocą bitowego ciągu kodowego Jednak dotychczasowy zapis As={a1,...,an} i Ps={p1,...,pn} tak, że Ps: ai → P(ai) nie jest przydatny, gdyż prawdopodobieństwa wystąpienia dwóch symboli mogą być jednakowe Zamiast prawdopodobieństw można użyć dystrybuantę dyskretnego układu zmiennej losowej ⎧ i ⎫ FPS = ⎨∑ p j : i = 1,..., n ⎬ = {p1 , p1 + p 2 ,..., p1 + ... + p n } ⎩ j =1 ⎭ kompresja danych 4 Kodowanie arytmetyczne – Pomysł cd Opis za pomocą dystrybuanty pozwala na jednoznaczne odwzorowanie symboli alfabetu As w rozłączne podprzedziały w postaci πs : ai∈As → [F(ai-1), F(ai)) ⊂ [0,1) Zakładając F(a0) = 0 i F(an) =1 można dla dowolnego przedziału zapisać π[d,g): ai∈As→ [d+F(ai-1)·(g-d), d+F(ai)·(g-d)) ⊂ [d,g) Opierając się na powyższych założeniach można podziały robić rekurencyjnie kompresja danych 5 Kodowanie arytmetyczne Kodowanie Pierwszy symbol pojawiający się w kodowanym ciągu s1= ak, ak∈As powoduje zawężenie przedziału kodu do π(1) = πs(ak) = [F(ak-1), F(ak) ⊂ [0,1). Drugi symbol ciągu wejściowego powoduje zawężenie przedziału π(1) w proporcjach, które wynikają z linii prawdopodobieństwa do π(2) itd. Mamy więc zasadę zwężania kodu π(i) ⊂ π(i-1) kompresja danych 6 Kodowanie arytmetyczne – Kodowanie cd Kod arytmetyczny K=A0: As → [0,1]) z jedną linią prawdopodobieństwa Πs = {[F(ai-1), F(ai)), i=1,...n} na podstawie kodu wejściowego si=ak modyfikuje aktualny przedział w następujący sposób: A0(πs(ak), π(i-1)) = π(i) gdzie π(i) =[D(i),G(i)) oraz: D(i)= D(i-1) + R(i-1)F(ak-1), G(i)= D(i-1) + R(i-1)F(ak), dla i=1,2,... Długość przedziału kodowego: R(i-1)= |π(i-1)| = G(i-1)- D(i-1) kompresja danych 7 Kodowanie arytmetyczne Dekodowanie Ponieważ π(t) ⊂ π(1) , to pozwala określić do jakiego przedziału Πs trafia Lt , co pozwala zdekodować pierwszy symbol s1= ak ⇔ Lt ∈ [F(ak-1), F(ak)) Dalej przeskalowujemy liczby zgodnie ze wzorem: Li-1 = (Li - F(ak-1))/(F(ak) - F(ak-1)) i rzutując na linie prawdpodobieństw otrzymujemy symbol si= ak ⇔ Lt ∈ [F(ak-1), F(ak)) Dodatkowo jest potrzebna liczba ciągu wejściowego, bo inaczej kodowanie się zapętli. Po osiągnięciu tej liczby dekodowanie kończy się kompresja danych 8 Kodowanie arytmetyczne Przykład Kodujemy słowo „ARYTMETYKA” a1=„A”; P(a1)=0.2; πs(a1)=[0, 0.2) a2=„E”; P(a2)=0.1; πs(a2)=[0.2, 0.3) a3=„K”; P(a3)=0.1; πs(a3)=[0.3, 0.4) a4=„M”; P(a4)=0.1; πs(a4)=[0.4, 0.5) a5=„R”; P(a5)=0.1; πs(a5)=[0.5, 0.6) a6=„T”; P(a6)=0.2; πs(a6)=[0.6, 0.8) a7=„Y”; P(a7)=0.2; πs(a7)=[0.8, 1.0) kompresja danych 9 Kod. arytmetyczne – Przykład cd i si= ak D(i) G(i) R(i) 0 INI 0 1 1 1 „A” 0.0 0.2 0.2 2 „R” 0.1 0.12 0.02 3 „Y” 0.116 0.12 0.004 4 „T” 0.1184 0.1192 0.0008 5 „M” 0.11872 0.1188 0.00008 6 „E” 0.118736 0.118744 0.000008 7 „T” 0.1187408 0.1187424 0.0000016 8 „Y” 0.11874208 0.1187424 0.00000032 9 „K” 0.118742176 0.118742208 0.000000032 10 „A” 0.118742176 0.1187421824 0.0000000064 kompresja danych 10 Kod. Arytmetyczne - Przykład cd. si= ak F(ak-1) F(ak) ΔF(ak) 0.118742176 „A” 0.0 0.2 0.2 2 0.59371088 „R” 0.5 0.6 0.1 3 0.9371088 „Y” 0.8 1.0 0.2 4 0.685544 „T” 0.6 0.8 0.2 5 0.42772 „M” 0.4 0.5 0.1 6 0.2772 „E” 0.2 0.3 0.1 7 0.72 „T” 0.6 0.8 0.2 8 0.86 „Y” 0.8 1.0 0.2 9 0.3 „K” 0.3 0.4 0.1 10 0 „A” 0.0 0.2 0.2 ... 0 „A” 0.0 0.2 0.2 i Liczba kodowa Li 1 kompresja danych 11 Kod. Arytmetyczne - Przykład cd. si= ak F(ak-1) F(ak) ΔF(ak) 0.11874218 „A” 0.0 0.2 0.2 2 0.5937109 „R” 0.5 0.6 0.1 3 0.937109 „Y” 0.8 1.0 0.2 4 0.685546 „T” 0.6 0.8 0.2 5 0.427725 „M” 0.4 0.5 0.1 6 0.27725 „E” 0.2 0.3 0.1 7 0.725 „T” 0.6 0.8 0.2 8 0.8625 „Y” 0.8 1.0 0.2 9 0.3125 „K” 0.3 0.4 0.1 10 0.125 „A” 0.0 0.2 0.2 ... 0.625 „T” 0.6 0.8 0.2 i Liczba kodowa Li 1 kompresja danych 12 Częstość występowania symboli w badanej sekwencji tekstowej Jakżeż ja się uspokoję – Pełne strachu oczy moje, Pełne grozy myśli moje, Pełne trwogi serce moje, Pełne drżenia piersi moje – Jakżeż ja się uspokoję... Symbol a c d e ę g h i j k l ł m n o L. wyst. 6 3 1 18 4 2 1 7 10 4 1 4 5 5 11 kompresja danych Symbol p r s ś t u w y z ż , . – <spacja> <nw> L. wyst. 7 6 7 1 2 3 1 3 2 5 3 3 2 20 6 13 Kodowanie arytmetyczne przykładowa sekwencja 0 0,0392 0,2288 0,2745 i a 0,3399 0,3660 0,9608 k j 0,2745 0,2784 0,2788 a 0,3399 <nw> 0,27545 0,27546 0,274510,27461 0,27521 a <nw> 0,3373 c 1,0000 j k kompresja danych 0,27697 0,27707 <nw> 14 Kodowanie arytmetyczne – cechy W teorii wymagane są operacje na liczbach o bardzo dużej precyzji (rzędu milionów cyfr) Dzięki takiemu podejściu możliwe jest uzyskanie kodu o średniej długości odpowiadającej entropii (kod całej wiadomości będzie dłuższy o nie więcej niż 2 bity od kodu wynikającego z entropii) Operacje na liczbach o takiej precyzji są bardzo czasochłonne kompresja danych 15 Kodowanie arytmetyczne – podejście praktyczne Przedziały stają się bardzo małe, a co za tym idzie pierwsze cyfry obu końców są identyczne Wykorzystując to implementuje się kodowanie arytmetyczne na liczbach o niewielkiej liczbie cyfr znaczących (typowo na liczbach 32-bitowych) Znacząco większa prędkość działania takiej implementacji Nieznaczne pogorszenie współczynnika kompresji kompresja danych 16 Koder binarny Koder binarny jest szczególnym przypadkiem realizacji kodu arytmetycznego dla dwuelementowego alfabetu As={0,1} Binarne kodowanie adaptacyjne jest najbardziej efektywną, entropijną metodą kodowania przy kompresji obrazów (JBIG, JBIG2, MPEG-4, JPEG, JPEG200) Większość realizacji kodowania arytmetycznego dotyczy alfabetu binarnego kompresja danych 17 Algorytm kodowania binarnego Przy alfabecie As={a1,a2} podział linii prawdopodobieństw Πs zależy od jednej wartości F(a1)=P(a1)=p1. Mamy wówczas dwa podprzedziały [0, p1) oraz [p1,1). Aktualna postać przedziału kodowego π(i) =[D(i),G(i)) o długości R(i)= |π(i)| = G(i)- D(i) zależy od wartości liczby R1(i-1)= R(i-1) p1. kompresja danych 18 Algorytm kodowania binarnego cd Algorytm kodowania: Jeśli kodujemy si= a1 to π(i) =[D(i-1), D(i-1)+ R1(i-1)) Jeśli kodujemy si= a2 to π(i) =[D(i-1) )+R1(i-1), G(i-1)) W pierwszym przypadku modyfikowana jest tylko górna granica. W drugim przypadku modyfikowana jest tylko dolna granica. kompresja danych 19 Algorytm kodowania binarnego cd Algorytm dekodowania: Jeśli L - D(i-1)< R1(i-1), to dekodujemy si= a1 oraz π(i) =[D(i-1), D(i-1)+ R1(i-1)) Jeśli L - D(i-1)≥ R1(i-1), to dekodujemy si= a2 oraz π(i) =[D(i-1) )+R1(i-1), G(i-1)) Wartość przedziału kodowego w praktyce można ustalić za pomocą zmiennych DÓŁ i GÓRA kompresja danych 20 Kodowanie Huffmana a kodowanie arytmetyczne Kodowanie Huffmana: kod optymalny w klasie kodów o długościach będącymi liczbami całkowitymi stosunkowo łatwy do obliczania współczynnik kompresji zwykle niewiele gorszy od teoretycznego optimum brak ograniczeń patentowych Kodowanie arytmetyczne: kompresja danych kod optymalny stosunkowo trudny do obliczania niewysoka wydajność wynikająca z konieczności wykonywania operacji arytmetycznych bardzo dobry współczynnik kompresji (zbieżny do entropii) ograniczenia patentowe 21 Paradygmat modelowanie– kodowanie Modelowanie sekwencja wejściowa Kodowanie uaktualnienie modelu dane skompresowane kompresja danych Modelowanie Dekodowanie uaktualnienie modelu sekwencja wyjściowa 22 Kodowanie adaptacyjne Kod budowany na podstawie częstości wystąpień symboli w dotychczas zakodowanym fragmencie Zalety: brak konieczności przekazywania do dekodera informacji o prawd. występowania symboli dobry współczynnik kompresji Wady: niska prędkość działania (konieczność modyfikacji kodu po zakodowaniu każdego symbolu) kompresja danych 23 Adaptacyjne kodowanie Huffmana Model początkowy zakłada, że prawdopodobieństwo wystąpienia każdego symbolu alfabetu jest jednakowe Kod Huffmana konstruowany jest dla takiego modelu Po zakodowaniu każdego symbolu kod Huffmana jest przebudowywany, aby symbole, które w przeszłości występowały częściej otrzymały krótsze kody kompresja danych 24 Adaptacyjne kodowanie Huffmana – cechy Zalety: Wady: brak konieczności przesyłania do dekodera informacji o modelu dobry współczynnik kompresji kompresja danych wolne uaktualnianie drzewa Huffmana po zakodowaniu każdego symbolu 25 Adaptacyjne kodowanie arytmetyczne Model początkowy zakłada jednakowe prawdopodobieństwo występowania każdego symbolu alfabetu Przedział [0, 1) dzielony jest na podprzedziały równej długości Po zakodowaniu każdego symbolu modyfikowane jest prawdopodobieństwo jego występowania, aby zwiększyć względną długość podprzedziału mu odpowiadającego kompresja danych 26 Adaptacyjne kodowanie arytmetyczne – cechy Wady: Zalety: brak konieczności przesyłania do dekodera informacji o modelu dobry współczynnik kompresji kompresja danych konieczność przechowywania statystyk występowania symboli w specjalnych strukturach danych umożliwiających szybki dostęp i aktualizację wolniejsze niż kodowanie statyczne 27 Czym jest tak naprawdę kodowanie? Algorytmy kodowania służą do przydzielenia symbolom kodów w taki sposób aby średnia długość kodu w kodowanej sekwencji była jak najmniejsza Algorytmy te bazują na rozkładzie prawdopodobieństwa występowania symboli, który jest dostarczany przez algorytm modelowania kompresja danych 28 Plan kolejnego wykładu Algorytmy kompresji bezstratnej ogólnego przeznaczenia: metody Ziva–Lempela (LZ) metody predykcji przez częściowe dopasowanie (PPM) metody oparta na transformacie Burrowsa– Wheelera (BWT) Porównanie wydajności algorytmów kompresja danych 29