Codifica lossless - entropia, Huffman e codifiche a dizionario
In questa pagina 9
Dopo la digitalizzazione (Digitalizzazione dei segnali multimediali - campionamento, quantizzazione e binarizzazioneLa conversione analogico-digitale (ADC) ha tre passi: campionamento $s_c(n)=s(nT_c)$, quantizzazione su $L=2^m$ livelli, binarizzazione dell'indice in $m$ bit; il bit-rate vale $R=F_c\log_2L$. Per il teorema di Shannon un segnale a banda limitata $f_M$ si ricostruisce senza errore se $F_c\ge2f_M$ (criterio di Nyquist), altrimenti c'è aliasing; per questo prima del campionatore c'è un filtro passa-basso. La quantizzazione uniforme di passo $\Delta=\frac{2A}{L}$ è irreversibile, con errore massimo $\frac\Delta2$ e $\mathrm{MSE}=\frac{\Delta^2}{12}$; la qualità si misura con MSE e $\mathrm{PSNR}=10\log_{10}\frac{(2^b-1)^2}{\mathrm{MSE}}$. In ricezione il bit mapper ricostruisce i valori e l'interpolazione con un nucleo $h$ (sample and hold, lineare, cubica, sinc troncato) riporta il segnale al tempo continuo.Digitalizzazione dei segnali multimediali - campionamento, quantizzazione e binarizzazione →) un segnale è una sequenza di simboli (valori quantizzati) scritti con un numero fisso di bit. Ma non tutti i simboli sono ugualmente probabili e non sono indipendenti: si può scriverli con meno bit, senza perdere nulla. Questa è la codifica lossless (o entropica): rappresentare i simboli emessi da una sorgente con una stringa di bit in modo perfettamente invertibile. Gli esempi del corso: un blocco di pixel in scala di grigi codificato in bit e ridecodificato esattamente; un file XML compresso e riottenuto identico.
Questa nota contiene il quadro teorico di sorgente (richiamato anche in Codifica di sorgenteLa codifica di sorgente senza perdita assegna ai simboli (o a parole di $N$ simboli) parole di codice di lunghezza variabile, corte per i simboli probabili, con una mappa invertibile. Un codice a prefisso è sempre decodificabile; Kraft-McMillan: se il codice è decodificabile $\sum M^{-l_i}\le1$ e viceversa esiste un codice a prefisso con quelle lunghezze. Shannon: $L\ge\frac{H}{\log_2M}$ e esiste un codice con $L<\frac{H}{\log_2M}+1$ (lunghezze $\lceil\log_M\frac1p\rceil$). Shannon-Fano divide dall'alto, Huffman unisce dal basso i due meno probabili ed è ottimo; raggruppare simboli e la codifica aritmetica si avvicinano al limite.Codifica di sorgente →, Codici di Shannon-Fano e di HuffmanIn un codice ottimo le parole più probabili non sono più lunghe di quelle meno probabili e le due parole più lunghe differiscono solo per l'ultimo simbolo. Shannon-Fano costruisce l'albero dall'alto dividendo ripetutamente i simboli in due gruppi di probabilità quasi uguali; Huffman lo costruisce dal basso unendo ogni volta i due simboli meno probabili ed è sempre ottimo tra i codici a prefisso. La lunghezza media $L_y$ è la somma delle probabilità dei nodi uniti, l'efficienza è $\eta=\frac{H}{L_y}$.Codici di Shannon-Fano e di Huffman → e Informazione, entropia e informazione mutuaL'informazione di un evento di probabilità $P$ è $i=\log_2\frac1P$ bit; l'entropia $H(x)=\sum p\log_2\frac1p$ è l'informazione media e misura l'incertezza: $0\le H\le\log_2M$, massimo se i simboli sono equiprobabili. Per due variabili: $\max{H(x),H(y)}\le H(x,y)\le H(x)+H(y)$, $H(x|y)=H(x,y)-H(y)$ e l'informazione mutua $I(x;y)=H(x)-H(x|y)=H(x)+H(y)-H(x,y)\ge0$ (zero se e solo se indipendenti). Per una sorgente di $F_s$ simboli/s: rate di informazione $F_sH_s$, rate nominale $F_s\log_2M$, efficienza $\eta=\frac{H_s}{\log_2M}$.Informazione, entropia e informazione mutua →) e le tecniche usate in pratica. Gli esercizi sono in Esercizio - Entropia, codici di Huffman e Exp-Golomb (domande ed esercizi del corso).
1. Principi di base
Una sorgente emette simboli di un insieme finito (alfabeto): lettere e punteggiatura per un testo, valori di luminanza quantizzati per un'immagine, valori quantizzati di pressione acustica per l'audio. È modellata come un processo aleatorio, cioè una sequenza di variabili aleatorie; ogni simbolo ha una probabilità .
Definizione (codice). Un codice è una mappa dall'alfabeto all'insieme delle stringhe di bit di lunghezza finita: . Le stringhe sono le codeword, di lunghezza . Nei codici a lunghezza fissa tutte le codeword hanno la stessa lunghezza; altrimenti il codice è a lunghezza variabile. La lunghezza media è
Cercare codici con piccola è importante, ma non è l'unico requisito: il codice deve essere univocamente decodificabile (u.d.): ogni sequenza di codeword deve poter essere decodificata in un solo modo, perché le codeword vengono scritte una dopo l'altra senza separatori. Non basta che la mappa sia iniettiva.
Codice a lunghezza fissa (FLC). È la tecnica basilare: ogni simbolo ha lo stesso numero di bit, (per esempio 4 bit per i 15 indici da a ). Vantaggi: il parsing è immediato (4 bit un simbolo), l'univoca decodificabilità è intrinseca, un errore su un bit tocca un solo simbolo. Svantaggio: non sfrutta le distribuzioni non uniformi.
1.1 Confronto tra quattro codici
Sorgente con :
| Simbolo | Prob | Codice 1 | Codice 2 | Codice 3 | Codice 4 |
|---|---|---|---|---|---|
| A | 1/2 | 0 | 0 | 0 | 0 |
| B | 1/4 | 0 | 1 | 10 | 01 |
| C | 1/8 | 1 | 00 | 110 | 011 |
| D | 1/8 | 10 | 11 | 111 | 0111 |
| 1,125 | 1,25 | 1,75 | 1,875 |
- Codice 1: non è nemmeno iniettivo ( e hanno la stessa codeword): "0" non si può decodificare.
- Codice 2: iniettivo ma non u.d.: la stringa si decodifica come , , o .
- Entrambi hanno piccola ma nessun interesse pratico.
- Codice 3: è u.d. perché è un codice a prefisso (nessuna codeword è prefisso di un'altra): appena si riconosce una codeword nel flusso si decodifica subito il simbolo, per questo si dice istantaneo.
- Codice 4: u.d. (basta contare quanti 1 ci sono tra due zeri) ma non istantaneo: dopo un 0 bisogna aspettare l'inizio della codeword successiva per sapere se la parola è finita.
Il migliore è il codice 3: u.d., istantaneo e di lunghezza media minima. D'ora in poi si considerano solo i codici a prefisso: si può dimostrare che il miglior codice istantaneo ha la stessa del miglior codice u.d., quindi non si perde nulla. (La condizione di esistenza di un codice a prefisso con date lunghezze è la disuguaglianza di Kraft-McMillan, in Codifica di sorgenteLa codifica di sorgente senza perdita assegna ai simboli (o a parole di $N$ simboli) parole di codice di lunghezza variabile, corte per i simboli probabili, con una mappa invertibile. Un codice a prefisso è sempre decodificabile; Kraft-McMillan: se il codice è decodificabile $\sum M^{-l_i}\le1$ e viceversa esiste un codice a prefisso con quelle lunghezze. Shannon: $L\ge\frac{H}{\log_2M}$ e esiste un codice con $L<\frac{H}{\log_2M}+1$ (lunghezze $\lceil\log_M\frac1p\rceil$). Shannon-Fano divide dall'alto, Huffman unisce dal basso i due meno probabili ed è ottimo; raggruppare simboli e la codifica aritmetica si avvicinano al limite.Codifica di sorgente →.)
2. Entropia e teorema di Shannon
L'informazione associata all'evento è È non negativa e decrescente con la probabilità: un evento improbabile porta molta informazione; l'informazione di due eventi indipendenti è la somma delle informazioni (perché i logaritmi trasformano il prodotto delle probabilità in somma). L'informazione media è l'entropia:
L'entropia è il grado di incertezza sulla realizzazione della variabile aleatoria.
- A parità di , è massima se i simboli sono equiprobabili (condizione di non sparsità): . Per una variabile binaria equiprobabile bit.
- È tanto più bassa quanto più la distribuzione è sparsa: pochi simboli molto probabili e molti poco probabili (lettere di un testo: alcune molto più frequenti; coppie di lettere: alcune non compaiono mai, come "qh"; blocchi di lettere: l'entropia per lettera diminuisce al crescere di ).
Grafico interattivo: Entropia di una sorgente binaria in funzione di p = Pr[X = 1]: massima (1 bit) per p = 1/2, nulla se uno dei due simboli è certo
Teorema di Shannon sulla codifica di sorgente. La lunghezza media del codice istantaneo ottimo per una sorgente soddisfa e l'uguaglianza a sinistra vale se e solo se tutte le probabilità sono potenze intere negative di due (distribuzione diadica).
Significato: il livello di incertezza di una variabile aleatoria è il numero minimo di bit in media necessario a descriverne una realizzazione. Ma il teorema è non costruttivo: non dice come costruire il codice ottimo né, per una distribuzione non diadica, quanto vale . Ci risponde l'algoritmo di Huffman.
3. Codifica di Huffman
Trova uno dei codici ottimi (ne esistono diversi, equivalenti) per una data distribuzione. Si costruisce un albero binario:
- si creano nodi attivi, uno per simbolo, etichettati con la probabilità (saranno le foglie);
- si prendono i due nodi attivi con probabilità più bassa (a parità, uno qualunque);
- si crea un nodo genitore di quei due con probabilità pari alla somma;
- si tolgono i due figli dalla lista dei nodi attivi e si inserisce il genitore;
- se i nodi attivi sono più di uno, si torna al punto 2.
Poi si etichettano i rami con 0 e 1; la codeword di un simbolo è la sequenza di bit sul cammino dalla radice alla foglia. Il codice è a prefisso per costruzione (tutte le codeword stanno sulle foglie) e se ne dimostra l'ottimalità. Perché prendere i due meno probabili: sono quelli che conviene "allungare" (metterli più in fondo), perché pesano meno nella media.
Esempio (6 simboli). , , , .
- ; poi ; poi ; poi ; infine .
- Una assegnazione dei bit: , , , , , .
- Lunghezza media: bit/simbolo.
- Entropia: bit. Quindi ✓.
Esempio (distribuzione diadica). : Huffman dà , : l'uguaglianza vale perché le probabilità sono potenze di (è il codice 3 di prima).
Decodifica. Si legge un bit alla volta copiandolo in un buffer; se il buffer è una codeword si emette il simbolo e si svuota il buffer; altrimenti si legge il bit successivo. Con il codice la stringa si spezza in , cioè .
Limite di Huffman. Se l'entropia è molto bassa (), Huffman diventa inefficace: poiché ogni simbolo ha almeno una codeword di 1 bit, anche con : fino a un bit di overhead per simbolo. Inoltre non sfrutta la dipendenza statistica tra simboli consecutivi (lettere di un testo, luminanze di pixel vicini). Rimedio: la codifica a blocchi.
4. Codifica a blocchi
Si raggruppano i simboli in blocchi di , che formano una nuova sorgente con alfabeto di elementi. Per il teorema di Shannon applicato a : . Dividendo per si ottiene la lunghezza per simbolo: Due effetti:
- il bit di overhead si ripartisce su simboli (costa per simbolo e tende a zero);
- se i simboli sono dipendenti, diminuisce (resta uguale a solo per simboli indipendenti: ).
Se converge (come per segnali stazionari), il limite è il tasso entropico , con uguaglianza se e solo se i simboli sono indipendenti. Allora : è il limite ultimo della codifica lossless.
Esempio (sorgente a 3 simboli). . Entropia bit. Huffman sui singoli simboli: lunghezze e bit/simbolo, 0,384 bit sopra l'entropia. Con le 9 coppie di simboli Huffman dà bit per coppia, cioè bit/simbolo: solo sopra l'entropia. Raggruppare a coppie ha quasi eliminato l'overhead.
Esempio (immagine binaria, dalle slide). Immagine binaria (una "T" nera su fondo bianco) con il 13,3% di pixel neri e l'86,7% bianchi. Le slide riportano: : bit, Huffman 1 bit/pixel; : bit, ossia bit/pixel, Huffman bit/pixel; : bit, ossia bit/pixel, Huffman bit/pixel. (Nota: con le probabilità indicate l'entropia dei singoli pixel è bit, non : la differenza è probabilmente un refuso nelle slide.) Lezione: l'entropia per pixel cala (i pixel non sono indipendenti) e l'overhead di Huffman cala come .
Costo. La complessità del codice di Huffman cresce esponenzialmente con (l'alfabeto ha simboli: da 3 a per la sorgente sopra, da 2 a e per l'immagine). Per questo, anche se conviene grande, non si usa.
5. Codifica aritmetica
La codifica aritmetica è subottima ma ha complessità lineare in : per ogni nuovo simbolo servono un numero fisso di operazioni (due moltiplicazioni e due addizioni). Per un messaggio di simboli: L'overhead (al più 2 bit) è per tutto il messaggio, non per simbolo: quindi tende a zero con , senza costruire un codice per blocchi.
Come funziona. A ogni sequenza di simboli si associa un sottointervallo di la cui ampiezza è il prodotto delle probabilità dei simboli. L'intervallo si divide in sottointervalli di ampiezza pari alle probabilità dei simboli; si sceglie quello del primo simbolo e lo si suddivide di nuovo proporzionalmente; ogni nuovo simbolo restringe l'intervallo. La sequenza è codificata con il centro dell'intervallo finale scritto in binario, con tanti bit da rendere la precisione inferiore all'ampiezza.
Esempio (ACFD). Probabilità come sopra: in , in , in , in , in , in . Messaggio :
- : ;
- : dentro si prende la fetta dell'intervallo, cioè (ampiezza );
- : la fetta di è (ampiezza );
- : la fetta di è (ampiezza ). Servono bit: in binario inizia con , e il numero a 13 bit sta dentro l'intervallo. (L'informazione del messaggio è bit, quindi si spende circa 2 bit di overhead per tutto il messaggio. Huffman, per lo stesso messaggio, spende bit; ma la differenza non è sistematica e su messaggi lunghi vince l'aritmetica.)
Varianti. La codifica aritmetica adattativa cambia le probabilità man mano (le aggiorna uguale in codificatore e decodificatore, aumentando quelle dei simboli più frequenti). La codifica aritmetica basata sul contesto usa le probabilità condizionate : è come un insieme di codificatori aritmetici, scelti dal contesto, e in media il tasso è l'entropia condizionata; raggiunge il tasso entropico con un modello più semplice da gestire. La codifica aritmetica adattativa basata sul contesto è lo stato dell'arte della codifica lossless per i segnali multimediali (CABAC in H.264 e HEVC).
6. Oltre Huffman e aritmetica: ZIP e ANS
Contesto storico: Huffman (1952) è la prima soluzione ottima ma con vincolo di bit interi; la codifica aritmetica (anni Settanta) raggiunge l'entropia ma è complessa e per anni è stata frenata da brevetti; gli algoritmi di Lempel-Ziv (LZ77, LZ78) cambiano paradigma.
- Codifica con dizionario (LZ, "zip"). Sostituisce stringhe di simboli ricorrenti con puntatori a occorrenze precedenti o a indici di un dizionario (costruito in modo ripetibile dal decodificatore). Più il file è grande, più il dizionario "impara". Pro: decompressione velocissima, nessuna tabella di probabilità da inviare, efficace con pattern lunghi (testo, codice sorgente). Contro: poco efficace su segnali multimediali grezzi (pixel e campioni audio raramente si ripetono in stringhe identiche senza una predizione a monte). LZW è alla base del formato GIF (1987); DEFLATE = ricerca di stringhe LZ77 più Huffman per i puntatori, è il cuore di ZIP, GZIP e delle immagini PNG.
- ANS (asymmetric numeral systems, 2013-14, di pubblico dominio): ha l'efficienza della codifica aritmetica (si avvicina al tasso entropico) con la velocità di Huffman. L'aritmetica restringe un intervallo reale (due variabili, divisioni e precisione alta); ANS fa crescere un solo numero intero con per un simbolo di probabilità , e quando diventa troppo grande ne scrive i bit meno significativi nel file. Due varianti: tANS (tabulata: macchina a stati finiti con tabelle precalcolate, nessuna moltiplicazione a runtime: erede di Huffman; usata in Zstandard e LZFSE) e rANS (con moltiplicazioni intere, parallelizzabile con SIMD e GPU: erede dell'aritmetica; usata in JPEG XL e nei videogiochi).
| Tecnica | Pro | Contro | Uso attuale |
|---|---|---|---|
| Huffman | molto veloce, semplice, decodifica istantanea | overhead fino a 1 bit/simbolo, inefficace con | storico (vecchio JPEG, MP3), sistemi a bassissima potenza |
| Aritmetica | asintoticamente ottima, gestisce | divisioni, lenta in software, brevetti | codec video (CABAC in H.264, HEVC, VVC) |
| ANS | velocità di Huffman, ottimalità dell'aritmetica, parallelizzabile, aperta | teoria complessa da implementare | Zstandard, LZFSE, JPEG XL, gaming |
| Dizionario (LZ) | decompressione rapida, ottimo con pattern lunghi | inefficace su dati grezzi senza predizione | ZIP, Web (Brotli), spesso insieme ad ANS o Huffman |
| Reti neurali | stato dell'arte, modellano dipendenze complesse | complessità enorme, serve hardware dedicato, decodifica pesante quanto la codifica | ricerca, codec ad altissima efficienza |
| Exp-Golomb e categoria/ampiezza | nessun dizionario da trasmettere, ideali per interi con modulo decrescente (residui) | molto subottimi se la distribuzione non è esponenziale | sintassi e residui dei codec video e JPEG |
Le reti neurali (Autoencoderapprofondimento: non nel programma di Telecomunicazioni. Un autoencoder è una rete non supervisionata che impara a ricostruire il proprio ingresso passando per un collo di bottiglia: encoder $z=e(x)$ (dimensione bassa), decoder $\hat x=d(z)$, loss $|x-d(e(x))|^2$. Con attivazioni lineari equivale alla PCA; con non linearità impara rappresentazioni latenti più ricche (ipotesi del manifold). Varianti: sparse (penalità $\ell_1$ sulle attivazioni), denoising (ingresso corrotto, bersaglio pulito), convolutivi (inpainting). Anomaly detection: si addestra su dati normali e si segnala come anomalo ciò che ha errore di ricostruzione sopra una soglia. VAE: l'encoder produce media e deviazione standard di una gaussiana, il campione si ottiene con il trucco di riparametrizzazione $z=\mu+\sigma\odot\zeta$, $\zeta\sim\mathcal N(0,I)$, e la loss è errore di ricostruzione più KL verso $\mathcal N(0,I)$, con $KL=\frac12\sum(\mu^2+\sigma^2-1-\ln\sigma^2)$; il $\beta$-VAE pesa il KL con $\beta>1$ per rappresentazioni disaccoppiate. Cenno ai GAN.Autoencoder →, Reti neurali convolutive (CNN)approfondimento: non nel programma di Telecomunicazioni. Una rete convolutiva (CNN) sostituisce gli strati densi con filtri piccoli che scorrono sull'immagine: ogni neurone vede solo una patch locale (campo recettivo) e i pesi del filtro sono condivisi in tutta l'immagine, quindi i parametri non dipendono dalla dimensione dell'immagine ($K^2C_{in}C_{out}+C_{out}$ per strato) e si conserva l'informazione spaziale. Dimensione dell'uscita: $\lfloor(W-K+2P)/S\rfloor+1$. Pooling (max 2x2, stride 2) sottocampiona e dà invarianza locale; i filtri 1x1 riducono i canali; struttura tipica CONV+ReLU, POOL, ..., FLATTEN, FC, SOFTMAX, addestrata con cross-entropy e backpropagation. Tre strati 3x3 hanno il campo recettivo di un 7x7 con meno parametri e più non linearità (VGG). Architetture: LeNet, AlexNet (ReLU, dropout, data augmentation), VGG, GoogLeNet (moduli Inception), ResNet (blocchi residui $H(x)=F(x)+x$), EfficientNet. Nel lab: CNN su Fashion-MNIST (241 546 parametri) e su CIFAR-10 (122 570).Reti neurali convolutive (CNN) →) non sostituiscono la codifica entropica: fanno da predittori molto avanzati, che dal contesto passato producono una distribuzione di probabilità precisa per il simbolo corrente, poi passata a un codificatore aritmetico o ANS. Il decodificatore deve rieseguire la stessa rete per decodificare.
7. Exp-Golomb e codifica per categoria e ampiezza
Exp-Golomb. Si usa quando l'alfabeto è fatto di naturali o interi. Non si basa su un modello esplicito di probabilità (quindi non è ottimo) e si può usare senza conoscere la distribuzione; funziona bene solo se la probabilità di un numero decresce con il modulo.
Senza segno (uEG). Per : "1". Altrimenti sia la scrittura binaria di con il minimo numero di bit, ; è formato da zeri (leading zeros) seguiti da .
Con segno (sEG). Si mappa l'intero nel naturale se , se (positivi sui dispari, non positivi sui pari), poi si applica uEG: .
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 010 | 011 | 00100 | 00101 | 00110 | 00111 | 0001000 | 0001001 |
Esempio: : (4 bit), quindi zeri: . Con segno: , (5 bit), . Per i valori piccoli: .
Categoria e ampiezza (C/A), usata in JPEG: estende Exp-Golomb riducendo i bit dei numeri grandi a spese di quelli piccoli. Si definiscono 11 (o 12) categorie, con un opportuno codice a prefisso. La categoria di è , cioè il numero di bit di scritto in binario: categoria 0 contiene solo ; categoria 1: ; categoria 2: ; categoria 3: da a ; la categoria contiene i valori da a in modulo. Si emette il codice della categoria e poi su bit; se si complementa bit a bit la stringa (in JPEG: ogni 0 diventa 1 e viceversa; il primo bit dopo la categoria indica quindi il segno: 1 positivo, 0 negativo). Il fatto che la categoria dica quanti bit seguono rende il codice istantaneo.
Per : ; nella tabella standard JPEG delle categorie DC la categoria 4 ha codice ; ; quindi ("1011000", 7 bit). Per : categoria 3 (codice ), complemento : "100001". (Le slide, in un punto, dicono "complemento a 2": nel codice del corso l'operazione è l'inversione bit a bit, complemento a 1.)
8. Codifica lossless predittiva
Se i dati presentano dipendenza statistica si può predire il simbolo corrente dai simboli già codificati (noti anche al decodificatore). Se la predizione è coerente con la natura dei dati, l'errore di predizione ha piccola entropia (dati "sparsificati"), e si applica a un qualunque codificatore entropico invece che a . Il decodificatore ripete la stessa predizione e ricostruisce .
Esempio (immagine "house", 256 livelli). Entropia dei pixel bit/pixel (quasi 8: i grigi sono quasi equiprobabili, nessuna compressione possibile con un codice sui singoli pixel).
- Predittore semplice (orizzontale): . Entropia dell'errore: bit/pixel.
- Predittore 2D adattivo. Per il pixel , con a sinistra, sopra e in alto a sinistra (tutti già noti), si stima l'affidabilità della predizione orizzontale con e quella verticale con : se si pone (orizzontale), altrimenti (verticale). (Nelle slide è scritto senza il valore assoluto e in una frase compare al posto di : sono refusi; il codice della demo usa il valore assoluto e .) Per la prima riga e la prima colonna si usa un valore di default, per esempio 128 o la mediana dell'immagine. Entropia dell'errore: bit/pixel.
| Immagine | Entropia | Exp-Golomb | Huffman | ZIP |
|---|---|---|---|---|
| originale | 7,056 | 11,320 | 7,081 | 4,003 |
| predizione 1D | 3,312 | 3,428 | 3,383 | 3,026 |
| predizione 2D | 2,830 | 2,941 | 2,893 | 2,936 |
(bit per pixel; i valori ZIP nelle due serie di slide differiscono leggermente, 4,003 e 3,77 sull'originale: dipende dalla versione del programma). Osservazioni:
- sull'originale Exp-Golomb è pessimo (11,3 bit, più di 8 bit non compressi) perché presuppone che i valori piccoli siano più probabili, il che non è vero per i grigi; Huffman raggiunge quasi l'entropia (); ZIP fa meglio perché lavora su sequenze di pixel potenzialmente lunghe;
- sull'errore di predizione semplice, Exp-Golomb funziona molto meglio (l'ipotesi è ora vicina alla realtà), Huffman è vicino all'entropia, ZIP ancora meglio perché il modello predittivo è semplice;
- sull'errore di predizione avanzata i tre codici sono quasi equivalenti; con un predittore migliore (altre direzioni) le prestazioni crescerebbero ancora.
Morale: la compressione efficace non viene dal solo codificatore, ma dalla sparsificazione (predizione, trasformata, contesto) seguita da una codifica entropica.
Domande d'esame
1. Qual è il concetto dietro la codifica a blocchi? Traccia: il bit di overhead dei codici a prefisso () si ripartisce su tutti gli elementi del blocco e la lunghezza per simbolo si avvicina all'entropia; inoltre per simboli non indipendenti (luminanze di pixel vicini) la codifica a blocchi sfrutta la correlazione, abbassando ulteriormente il limite (tasso entropico ).
2. Il minimo tasso di codifica senza perdite per un codice a prefisso è (a) l'entropia, (b) l'entropia, (c) sempre un numero intero di bit? Traccia: (a), è il teorema di Shannon: ; non è mai intero in generale (è una media).
3. Sorgente con probabilità : calcolare l'entropia e la lunghezza media del codice di Huffman. Traccia: bit; Huffman dà lunghezze e bit; nessun codice a prefisso può scendere sotto 2,40.
Versione ripasso
Codici. Sorgente con alfabeto e probabilità ; codice di lunghezza ; . Serve univoca decodificabilità; i codici a prefisso (istantanei) bastano (hanno la stessa ottima degli u.d.). Esempio con : codice 1 non iniettivo; codice 2 () non u.d. (); codice 3 (, ) a prefisso; codice 4 () u.d. ma non istantaneo. FLC: bit, parsing immediato, non sfrutta le probabilità.
Entropia. ; . Massima se equiprobabili (binaria: 1 bit per ); più bassa se la distribuzione è sparsa. Teorema di Shannon: , uguaglianza se e solo se le probabilità sono potenze di . Non costruttivo.
Huffman. (1) un nodo per simbolo; (2) prendere i due nodi con probabilità minima; (3) genitore con la somma; (4) sostituire i figli con il genitore; (5) ripetere finché resta un nodo; rami 0/1. Ottimo e a prefisso. Esempio : , , , , ; codice ; , . Diadica: . Decodifica: buffer di bit finché è una codeword (). Limite: overhead fino a 1 bit/simbolo, anche con ; ignora la dipendenza tra simboli.
Blocchi. con simboli: . Overhead ripartito su simboli e cala se i simboli sono dipendenti (uguale solo se indipendenti). Limite: tasso entropico . Esempio : ; singoli ; coppie bit/coppia bit/simbolo. Costo: complessità di Huffman esponenziale in .
Aritmetica. Sequenza sottointervallo di (ampiezza = prodotto delle probabilità), codificata dal centro in binario; per l'intero messaggio; complessità lineare. Esempio : , 13 bit. Adattativa (probabilità aggiornate in modo identico ai due estremi) e basata sul contesto (probabilità condizionate): stato dell'arte (CABAC).
Altre tecniche. LZ/ZIP: puntatori a stringhe già viste (LZW in GIF, DEFLATE = LZ77 + Huffman in ZIP, GZIP, PNG); non adatte a dati grezzi senza predizione. ANS: un solo intero ; tANS (tabelle, Zstandard, LZFSE), rANS (JPEG XL, gaming). Reti neurali: predittori, poi aritmetica o ANS.
Exp-Golomb. uEG: "1"; altrimenti zeri e la scrittura binaria di , . sEG: (), (), poi uEG. , . Categoria e ampiezza (JPEG): , codice della categoria, poi su bit (complementato bit a bit se ): , .
Predittiva. Si codifica (poi al decodificatore). Predittore 2D: se allora , altrimenti ( sinistra, sopra, sopra-sinistra). Immagine house: (1D) (2D) bit/pixel; EG sull'originale 11,32 (cattivo), Huffman vicino all'entropia. Compressione = sparsificazione + codifica entropica.
Errori tipici: credere che possa scendere sotto ; dimenticare che Huffman richiede probabilità note; confondere con ; dire che l'uguaglianza vale sempre; usare Exp-Golomb su dati non decrescenti col modulo; usare invece di nella scrittura binaria di uEG.
Collegamenti: Codifica di sorgenteLa codifica di sorgente senza perdita assegna ai simboli (o a parole di $N$ simboli) parole di codice di lunghezza variabile, corte per i simboli probabili, con una mappa invertibile. Un codice a prefisso è sempre decodificabile; Kraft-McMillan: se il codice è decodificabile $\sum M^{-l_i}\le1$ e viceversa esiste un codice a prefisso con quelle lunghezze. Shannon: $L\ge\frac{H}{\log_2M}$ e esiste un codice con $L<\frac{H}{\log_2M}+1$ (lunghezze $\lceil\log_M\frac1p\rceil$). Shannon-Fano divide dall'alto, Huffman unisce dal basso i due meno probabili ed è ottimo; raggruppare simboli e la codifica aritmetica si avvicinano al limite.Codifica di sorgente →, Codici di Shannon-Fano e di HuffmanIn un codice ottimo le parole più probabili non sono più lunghe di quelle meno probabili e le due parole più lunghe differiscono solo per l'ultimo simbolo. Shannon-Fano costruisce l'albero dall'alto dividendo ripetutamente i simboli in due gruppi di probabilità quasi uguali; Huffman lo costruisce dal basso unendo ogni volta i due simboli meno probabili ed è sempre ottimo tra i codici a prefisso. La lunghezza media $L_y$ è la somma delle probabilità dei nodi uniti, l'efficienza è $\eta=\frac{H}{L_y}$.Codici di Shannon-Fano e di Huffman →, Compressione di immagini - DCT e standard JPEGPer comprimere con perdita non basta quantizzare i pixel (non sono sparsi): si applica una trasformata lineare ortogonale che concentra l'energia in pochi coefficienti, si quantizzano i coefficienti e si codificano senza perdita. Le trasformate ortogonali conservano l'MSE ($\frac1N|\mathbf x-\tilde{\mathbf x}|^2=\frac1N|\mathbf y-\tilde{\mathbf y}|^2$). JPEG baseline: si sottrae 128, si divide in blocchi $8\times8$, DCT 2D ($Y=AXA^T$), quantizzazione uniforme con tabella (passi piccoli a bassa frequenza, scalata da un fattore di qualità $Q$), zig-zag scan, DC codificato in modo differenziale con categoria/ampiezza, AC con coppie (run, categoria) e simbolo EOB, codici di Huffman non standardizzati scritti nel file. Esempio completo: un blocco da 512 bit diventa 49 bit (0,766 bit/pixel).Compressione di immagini - DCT e standard JPEG →, Esercizio - Entropia, codici di Huffman e Exp-Golomb (domande ed esercizi del corso).
Tabella Exp-Golomb (uEG). ; ; ; ; ; ; ; ; . sEG: , , , . Categoria e ampiezza: categoria 0 contiene 0, categoria 1 contiene , categoria 2 contiene , categoria 3 da a (); il codice della categoria dice quanti bit seguono (istantaneo).
Confronto tra le tecniche.
- Huffman: veloce, semplice, decodifica istantanea; overhead fino a 1 bit/simbolo, inefficace con .
- Aritmetica: asintoticamente ottima, gestisce ; più lenta (divisioni), brevetti; usata nei codec video (CABAC).
- ANS: velocità di Huffman e ottimalità dell'aritmetica, parallelizzabile, di pubblico dominio (Zstandard, LZFSE, JPEG XL).
- LZ/ZIP: puntatori a stringhe già viste, decompressione rapidissima, non per dati grezzi senza predizione.
- Exp-Golomb e categoria/ampiezza: nessuna tabella da trasmettere, ideali per residui con modulo decrescente, molto subottimi altrimenti.
Immagine binaria (slide). 13,3% neri: slide (con si calcola : refuso); blocchi : bpp, Huffman bpp.
Domande tipiche.
- Concetto della codifica a blocchi: overhead di Huffman ( bit) ripartito su simboli, più sfruttamento della correlazione ( cala fino al tasso entropico); costo .
- Minimo tasso di un codice a prefisso: (Shannon); non può essere minore e in genere non è intero.
- Sorgente : , Huffman (lunghezze ); nessun codice sotto .
- Aritmetica contro Huffman: lineare in contro esponenziale a blocchi; overhead bit per l'intero messaggio contro per simbolo.
Esercizi su questo argomento
- Esercizio - Domande a risposta aperta (domande ed esercizi del corso)
- Esercizio - Domande di teoria su digitalizzazione, colore e codifica (domande ed esercizi del corso)
- Esercizio - Entropia, codici di Huffman e Exp-Golomb (domande ed esercizi del corso)
- Esercizio - Zig-zag, run-length e flusso di bit di un blocco JPEG (domande ed esercizi del corso)