Osnova přednášky klasifikace kompresních metod ztrátová a neztrátová komprese výklad ztrátových kompresí přesahuje rámec přednášky Modelování a kódování za účelem komprese Intuitivní kompresní metody Statistické kompresní metody Slovníkové kompresní metody
Ztrátová a neztrátová komprese Komprese dat = proces identifikace a odstraňování redundance v datech Bázová klasifikace Neztrátová komprese, Lossless Compression dekompresí se získají originální data Ztrátová komprese, Lossy Compression za cenu zefektivnění komprese se znižují nároky na přesnost rekonstrukce Použitý komunikační model kanálem obecně může být i paměťové zařízení
Významné charakteristiky komprese kódování zprávy délky O(X) [b] na zprávu délky L(X) [b] cílem je dosažení L(X) << O(X) ideálně L(X) H(X), kde H(X) je neurčitost zprávy méně než H(X) bity zprávu zakódovat nemůžeme, má-li být komprese neztrátová kompresní poměr, L(X)/O(X) kompresní zisk, (O(X) – L(X))/O(X) redundance zprávy, R(X) = O(X) – H(X) redundance komprimované zprávy, (X) = L(X) – H(X)
Neztrátová komprese Hlavní idea Příklad Techniky Symboly (posloupnosti symbolů) s vysokou frekvencí výskytu se musí kódovat kratšími bitovými posloupnostmi symboly (posloupnosti symbolů) s nízkou frekvencí výskytu lze kódovat delšími bitovými posloupnostmi Příklad původní text: AAABBBBBBYYYYPPPPPPPPPTKKKKKKKK po kompresi: 3:A;6:B;4:Y;9:P;:T;8:K; Techniky Huffmanovo kódování, Lempel-Ziv kódování, Run-length kódování (RLE), aritmetické kódování komprese textů, obrázků, zvuku, faksimile, modemy, … Pokud neřekneme jinak, rozumíme v tomto předmětu pod pojmem „komprese“ neztrátovou kompresi.
Ztrátová komprese efektivnost komprese má přednost před přesností rekonstrukce pokud akceptujeme jisté zkreslení, můžeme dosáhnout mnohem vyšších kompresních poměrů Prvky, které se mají kódovat s malým zkreslením často se vyskytující prvky prvky, na které jsme citliví Prvky,které lze kódovat s velkým zkreslením Nepravděpodobně a irelevantní prvky
Ztrátová komprese Jisté smysly (zrak, sluch) jsou více citlivější na jisté typy zkreslení a na jiné typy zkreslení mohou být necitlivé Aplikace akceptující ztrátové kompresní techniky Kódování řeči: GSM (Global Systém for Mobile), CELP (Code Excited Linear Prediction), AMR (Adaptive Multi-Rate), … Kódování zvuku: MP3 (Moving Picture #3), AC-3 (Dolby Digital Sound Format), AAC (Advanced Audio Coding, DAB (Digital Audio Broadcasting), … Kódování obrazu: JPEG (Joint Photographic Experts Group), … Kódování videa: DVD (Digital Versatile Disc), DVB (Digital Video Broadcast), MPEG (Moving Picture Experts Group), …
Ztrátová komprese, další příklady Audio PCM při digitalizaci hlasu v telefonii 8 bitové vzorky hodnoty signálu 8000x/s – 64kb/s DPCM, Differential PCM při digitalizaci hlasu v telefonii 4 bitové vzorky odchylky signálu 8000x/s – 32/s Ke ztrátě informace dojde zřídkakdy, lidské ucho to nepozná, dosahuje se 50% kompresní zisk Video 30 rámců (obrázků)/s, 800x600 pixelů/rámec, 3barvy pixelu (RGB) po 8b, 30x800x600x24 = 345,6 Mb/s Diferenciálním kódováním (např. malá odlišnost v blocích 16x16px v následných rámcích se ignoruje a přenáší se jen indikace kopie) lze dosáhnout řádového snižení objemu dat (10x, ...) bez viditelného snížení kvality obrazu.
Statická a adaptivní komprese, logická a fyzická komprese Statická komprese, neadaptivní komprese¨ neměnná procedura nezávislá na vlastnostech komprimovaných dat. Adaptivní komprese dynamicky se měnící procedura respektující vlastnosti komprimovaných dat většina kompresních algoritmů má svoji statickou i adaptivní variantu Fyzická komprese ignoruje význam dat, minimalizuje se formálně odhalená redundance Logická komprese pro dosažení lepších kompresních poměrů se zohledňuje/využívá, význam komprimovaných dat, vesměs se jedná o ztrátovou kompresi
Repetice typů kódů Obecný kód Nesingulární kód A 1, B 0, C 1 A encode 1 decode {A nebo C} Nesingulární kód A 1, B 0, C 111 A encode 1011 decode {ABAA nebo ABC} Jednoznačně dekódovatelný kód A 1, B 00, C 10 ABACB encode 10011000 decode {C ? – ne. ABAAB ? – ne. ABACB je správně} Prefixový kód A 1, B 00, C 01 ABACB encode 10010100 decode ABACB
Kroky komprese – modelování a kódování komprese – minimalizace (snižování) redundance ve zprávě základní operace (problémy) procesu komprese modelování definice symbolů, zdrojových jednotek úzce souvisí s typem komprimovaných dat, oblast spíše tajuplná, spíše umění, než technologie přiřazení pravděpodobností výskytu jednotlivým symbolům statické metody komprese apriorní vybudování modelu kompresorem a jeho předání dekompresoru adaptivní metody komprese dynamické budování modelu během komprese i dekomprese kódování transformace symbolů do bitových posloupností minimalizující redundanci podle pravděpodobností výskytu symbolů velmi volně souvisí s typem komprimovaných dat v podstatě rutinně známé techniky jak řešit kódování, aby se minimalizoval vliv chyb, ... , ...
Modely komprese model způsob vyjádření zprávy pro účel generování zpráv a rozpoznání zpráv funkční klasifikace modelů model konečného kontextu pravděpodobnosti se přiřazují konečnému počtu symbolů, např. jednotlivým znakům, prvkům abecedy, dvojicím znaků (bigramům), ... model konečných stavů generátor zpráv je konečný automat pravděpodobnosti se přiřazují odvozovacím pravidlům model s gramatikou zpráva je rozpoznatelná pomocí bezkontextové gramatiky
Typy kompresních metod základní techniky intuitivní metody, Brailovo písmo, Baudotův kód, ... RLE metody, Run Length Encoding, RLE textu, RLE obrázků (JPEG, ...) statistické metody Shannon-Fanovo, MNP5, Huffmanovo, ... kódování slovníkové metody LZ77, LZ78, LZW – metody používané v kompresních programech typu ARC, PKZip, v unix compress, při vytváření formátů GIF, ... komprese obrázků, videa, zvuku, ... , spousta dalších metod, ... (výklad přesahuje rámec předětu)
Základní, intuitivní metody Brailovo písmo 6 bodů v obdélníku, tj. 6 bitů, tj. 26 = 64 kódových slov, ex. ale pouze 26 znaků abecedy, takže lze využít 64 – 26 kódových slov pro kódování některých frekventovaně používaných slov přirozeného jazyka Baudotův kód 5 bitový kód, číslicová/písmenová změna, 62 (=2 x 32 – 2) znaků telex, dálnopis Ad hoc textové komprese vynechání mezer + bitová mapa polohy mezer kódování ASCII sedmic v 8 bitových bytech kódování čistě číselných dekadických dat – 2 číslice v byte ...
Základní, intuitivní metody, 2 MacWrite kódování (word procesor) 4-bitové kódy pro 15 nejčastěji používaných znaků + kód ESCAPE za ESCAPE následuje na 8 bitech ASCII znak každý odstavec se uchovává v komprimované nebo v nekomprimované verzi podle toho, která verze je kratší + 1bit na odstavec, indikacie* komprimovaný/nekomprimovaný odst. RLE kódování , Run Length Encoding náhrada opakujících se symbolů (diagramů, …) příznakem, čítač opakování a specifikací opakovaného symbolu „aaaaaaaaaa“ se nahrazuje např. řetězcem „10:a“
Statistické metody Kompresní teorém je-li H [b/symbol] entropie zdroje, pak lze neztrátově komprimovat zdrojový text až do vyjádření každého symnbolu zdrojového textu v průměru H bity, H může být << log2 N prvkům vstupní abecedy s větší pravděpodobností výskytu ve zprávě se přiřazují prvky výstupní abecedy kódované kratšími bitovými řetězci původní Morseův návrh abecedy používají se kódová slova proměnné délky, tudíž ex. problém jednoznačné dekódovatelnosti a ideální jsou prefixové kódy příklady vhodných kódování statistického typu Shannon-Fanovo kódování Huffmanovo kódování aritmetické kódování
Princip statistických kompresních metod Abeceda {A,B,C,D} pravděpodobnosti výskytu jejích prvků ¾, 1/8, 1/16, 1/16 Entropie zdroje -(3/4)log2(3/4) – (1/8)log2(1/8) – (1/16)log2(1/16)- -(1/16)log2(1/16) = 1.186 [b/symbol] Kódování 1 A = 00, B = 01, C = 10, D = 11, průměr 2 [b/symbol] Kódování 2 (prefixový kód, slova proměnné délky) A = 0, B = 10, C = 110, D = 111 průměr: 0,75 + 0,125 × 2 + 0,0625 × 3 + 0,0625 × 3 = 1.375 Kódování 2 dosahuje průměrné délky symbolu bližší entropii, než kódování 1, kódování 2 je efektivnější, než kódování 1
Shannon-Fanovo kódování První metoda použitá pro nalezení dobrých kódů proměnné délky máme n prvků abecedy A se známými pravděpodobnostmi výksytů prvky abecedy A uspořádáme v klesající posloupnosti pravděpodobností výskytu vše rozdělíme na dvě skupiny se stejnou (s téměř stejnou) pravděpodobností výskytu všechna kódovaná slova v jedné skupině budu začínat 1, ve druhé skupině budou všechna kódovaná slova začínat 0 rekurzivně opakujeme poslední 2 kroky na dalších bitových pozicích kódových slov
Shannon-Fanovo kódování, příklad
Huffmanovo kódování Platí pozorování optimálních prefixových kódů Symboly vyskytující se s vyšší pravděpodobností mají kódová slova kratší, než symboly, vyskytující se s nižší pravděpodobností dvě nejdelší kódová slova mají stejnou délku, např. {A,B,C,D,E,F,G} {00,10,011,010,110,1110,1111} Huffmanovo kódování optimální prefixový kód dvě nejdelší kódová slova se liší pouze v posledním bitu a odpovídají dvě nejřidčeji se vyskytujícím slovům
Huffmanovo kódování, 2 vznik v r. 1952, pro účely přenosu zpráv při komunikaci statická varianta dva průchody zdrojovým textem 1.modelování a generování modelu 2.vlastní kódování komprimované zprávy výsledek = model + komprimovaná zpráva, což je nevhodné pro kompresi krátkých zpráv
Huffmanovo kódování, 3 příklady kódování a postup při kódování prvkům abecedy X se přiřazují posloupnosti prvků abecedy Y X = {0,…,255}, Y = {0,1} X = {a,b,c,…,A,B,C,…,0,1,…,9} , Y = {0,1} postupně se slučují vždy dva prvky ze vstupní abecedy s nejnižší pravděpodobností výskytu ve zprávě do nového prvku výstupní abecedy reprezentovaného jako bitová posloupnost nový prvek má pravděpodobnost výskytu rovnou součtu pravděpodobností sloučených prvků
Huffmanovo kódování, vybrané vlastnosti Huffmanův kód má minimální průměrnou délku kódového slova Huffmanův kód je pro daný model textu optimální Huffmanovo kódování maximálně potlačuje redundanci pro jistou třídu textů lze vytvořit kódovou knihu ušetří se doba věnovaná na generování stromu kód ale nemusí být optimální(používá se kódová kniha třídy textů, nikoliv kódová kniha daného textu) originálním zprávám stejné délky nemusí odpovídat komprimované zprávy stejné délky kódované někdy implementační problém
Huffmanovo kódování, vybrané vlastnosti, 2 Adaptivní Huffmanovo kódování kódový strom se buduje při kompresi i dekompresi znovu vždy po přijetí dalšího symbolu a korekci statistik Unix, příkazy Compaq/uncompact, je použitý algoritmus FGK –Faller, Gallager, Knuth Huffmanovo kódování je efektivnější, než Shannon-Fanovo kódování Shannon-Fanovo i Huffmanovo kódování přiřazují kódová slova s celistvým počtem bitů pokud např. log2 0,4 je cca 1,32, pak se přiděluje kód délky 1 bit nebo 2 bity tento problém obchází aritmetické kódování (viz další průsvitky) přidělení* jednoho kódového slova celému vstupnímu proudu znaků
Aritmetické kódování Motivace vývoje aritmetického kódování např. pro malé abecedy může být Huffmanovo kódování neefektivní řešením by mohlo být blokování m symbolů do bloků a konstruovat kódová slova pro všechny posloupnosti délky m, složitost by ale rostla exponenciálně – což je chybné řešení aritmetické kódování poskytuje nástroj pro jedinečné kódování každé konkrétní posloupnosti délky m, aniž by bylo nutné generovat všechny ostatní kódová slova Princip aritmetického kódování každá posloupnost symbolů se reprezentuje značkou množinou značek je jednotkový interval [0,1)*, značek může být nekonečně mnoho potřebujeme mít funkci, která mapuje posloupnost symbolů do jednotkového intervalu
Aritmetické kódování, principy Kumulativní distribuční funkce pdf (probability density fiction): p1 = 0,6 p2 = 0,3 a p3 = 0,1 cdf (cumulative distribution fiction): tj. F(0) = 0 F(1) = 0,6 F (2) = 0,9 a F(3) = 1 Základní myšlenka Interval 0 až 1 se rozdělí na N intervalů, kde N je možný počet výsledků (počet prvků ve zdrojové abecedě) Šířky intervalů jsou rovny pravděpodobnostem odpovídajících událostí výskytů prvků abecedy,tj. hranice intervalu vymezuje cdf Pokud nejsou vazby mezi symboly zprávy, kterékoli číslo uvnitř intervalu si lze představit, jako jedinečný identifikátor hodu kostkou Další hod lze reprezentovat jakýmkoliv číslem v menším intervalu:
Aritmetické kódování, principy, 2 pdf: p1 = 0,6 p2 = 0,3 a p3 = 0,1 , komprese textu 221 generování binárního kódového slova jako značka se použije střed intervalu lze ukázat, že jednoznačně dekódovatelný (prefixový) kód se získá z binární reprezentace tohoto čísla oříznutím na [log2(1/pi)] + 1 bitů
Aritmetické kódování Dekódování Vlastnosti aritmetického kódování z analýzy intervalu zleva doprava se uvažuje na 1.symbol zprávy atd. Vlastnosti aritmetického kódování je dokazatelně optimální pro jakékoliv rozložení pravděpodobnosti jsou známé i adaptivní modely aritmetického kódování je bezpodmínečně nutné implementovat aritmetické kódování v celočíselné aritmetice
Slovníkové metody Některé vzorky se vyskytují v mnoha typech dat Pokud se kóduje celý vzorek místo jednotlivých symbolů, které jej tvoří , bude kódovaný text kratší Nepoužívají ani statistické modely, ani kódová slova proměnné délky V komprimovaném textu se vybírají řetězce symbolů Každý řetězec se kóduje nějakým příznakem pomocí slovníku Slovník může být vytvářený staticky a nebo dynamicky (adaptivní metody) může být založený na přirozeném jazyku může být založený na bázi obecných řetězců, typicky dynamicky budované „klouzající“ slovníky v algoritmech třídy Lempel, Ziv, (Welsh)
Slovníkové metody, LZ (Lempel-Ziv) algoritmy Třída kódování Lempel-Ziv, bázová společná myšlenka: Vytváří se slvoník s použitzými posloupnostmi symbolů – vzory – a přenáší se na indexy do slovníku. LZ77 PKZip, WinZip, LHArc, PNG, zip a ARJ, …¨ jako slovník se používá jistá zpracovávaná část zdrojového textu vysílá se trojice – {ukazatel počítku vzoru ve slovníku, délka vzoru, kódové slovo příštího symbolu za kódovaným textem} LZ78 používá se samostatný slovník vysílá se dvojice – {index vzoru, kódové slovo příštího symbolu} LZW, přepracovaný LZ78 UNIX compress, GIF, TIFF, V.42 bis – modem, PostScript, PDF, … potenciální symboly jsou v kódové knize přednastaveny vysílá se jdiný údaj – index vzoru
LZ77 a LZ78, principy
LZ77 Slovník tvoří jistá zpracovávaní část textu typická délka do 8K slabik, velikost slovníku bývá daná pevně slovník se posunuj epo kódovém textu o zakódovanou část textu Kóduje se posloupnost nacházející se v prohlíženém okně prohlížené okno je umístěné na pravé okraji slovníku má typicky délku desítek slabik od počátku prohlíženého okna hledá nejdelší podřetězec σ umístěný v tomto okně, který lze zakódovat pomocí výskytu σ ve slovníku počínaje jeho levým okrajem Kóduje se trojicemi: {ukazatel vzoru, délka vzoru, kódové slovo příštího symbolu}
LZ77, 2 výstupní kódové slovo {i, j, x}: i – vzdálenost 1.znaku σ od 1.znaku v okně j – délka σ x-kód znaku následujícího za σ -uvádí se pro přímé kopírování tohoto znaku při dekompresi Poznámka: pokud σ přesahuje do okna, přesahující část je (opakovanou) repeticí σ
LZ77, 3 Na počátku slovník obsahuje prázdné znaky až na text v prohlíženém okně – počátek komprimovaného textu hlavní problém – hledání podřetězců (samostatný předmět) bitové rozměry délek a offsetů jsou úměrné logaritmům velikost slovníků bývá obvykle řádově 103 B, pak i bývá 10 až 12bitů velikost prohlíženého okna bývá řádově 101 B, pak j mívá jednotky bitů znak – 8 bitů rozměr výstupního kódového slova např. 11+5+8 = 24 b
LZ77, příklad
LZ78 LZ77 předpokládá, že vzorky se vyskytují „blízko sebe“, ve slovníku LZ78 tento problém řeší tím, že neudržuje prohledávaný slovník – buffer v již komprimovaném textu udržuje samostatně existující, postupně rostoucí slovník Algoritmus LZ78: 1. nalezni ve slovníku nejdelší shodný vzorek s příštími kódovanými symboly 2. vyšli dvojici {index vzoru ve slovníku, kódové slvo příštího symbolu} 3. vyslaná data ulož do slovníku 4. pokračuj krokem 1, nebo ukonči činnost
LZ8*, příklad nový podřetězec σ délky j se přidává do slovníku tehdy, pokud jeho prvních j – 1 symbolů tvoří podřetězec σ´, který již ve slovníku je
LZW variace LZ78, slovník je rozšířením vstupní abecedy Postup: eliminace nutnosti generovat dva výstupní prvky vysílá se pouze index do slovníku Postup: 1. Nalezni ve slovníku nejdelší shodný vzorek s příštími kódovanými symboly 2. Vyšli {index vzorku ve slovníku} 3. A následně ulož do slovníku nový vzorek = vsn* nalezený vzorek + další symbol 4. Pokračuj krokem 1, nebo ukonči činnost poslední symbol každé fráze* prvním symbolem další fráze indexy se zobrazují např. na 12 bitech
LZW, příklad
LZW, příklad
LZW, příklad
LZW, příklad
LZW, příklad
LZW, příklad
LZW, příklad
LZW, příklad
LZW, příklad
LZW, příklad