Introduzione
Il compito di un codificatore MPEG è quello di determinare
i frames della sequenza video e di codificarli.
Questo simulatore mostra la sola determinazione dei frames ad uso didattico.
Sotto il nome di ‘‘Motion Estimation'' si indicano gli algoritmi utilizzati dal codificatore per identificare la correlazione fra le immagini. Tali algoritmi non fanno parte delle specifiche MPEG, che si occupano solo della decodifica.
Fondamentalmente, le tecniche di Motion Estimation ricadono in due principali
categorie. Nella ‘‘pel recursion'' i motion vector sono calcolati
mediante un procedimento recursivo, utilizzando gradienti di
intensità e informazioni sulla differenza fra le immagini. Questa
tecnica è utilizzata principalmente in
sistemi in cui i motion vector variano da pixel a pixel, e quindi non è applicabile
all'MPEG.
Nella ‘‘block matching'' i motion vector vengono determinati
dal calcolo di alcune misure di distorsione, con
l'obiettivo di scegliere il vettore che fornisca la distorsione minima.
Questa tecnica si applica a sistemi
in cui i motion vector sono associati a un blocco di pixel, come l'MPEG.
Richiami: compressione MPEG
Un video MPEG è essenzialmente una sequenza di tre tipi di frames:
I-Frames: "intra-coded" P-Frames: "forward predicted" B-Frames: "forward&backward predicted"
|
Si considera in questa applet una sequenza standard del tipo:
I-B-P-B-I-B-P-B-I-B-P-B-I-B-P-P
Dato che i mosaici sono stati acquisiti con un tempo di scatto di circa 150ms
sono soddisfatti i requisiti:
- un I-Frame ogni circa 500ms
- due B-Frame fra due P/I Frames
In uscita al codificatore questi frame devono quindi essere riordinati per poter essere elaborati dal decodificatore. Infatti i B-Frame richiedono per la codifica anche informazioni di frames futuri. Cioè i frames predetti in indietro devono anticipare il B-Frame relativo.
Predizione
Per capire cosa si intende per predizione si consideri
il seguente esempio. |
Applet: determinazione dei frames
Ogni frame è composto da 128 x 96 pixel in verticale,
organizzati in macroblocchi da 16 x 16 pixel.
Si scompongono quindi i due fotogrammi in esame in macroblocchi.
Si procede poi valutando un blocco alla volta del primo fotogramma e per ogni
blocco:
- si determina l'errore col blocco corrispondente nel fotogramma di riferimento;
- se l'errore non supera la soglia si considera il blocco come non mosso e
il blocco viene codificato come vettore nullo;
- altrimenti si cercano eventuali vettori
di moto applicando l'algoritmo di Block Matching;
Dato che per la determinazione dei B-Frames bisogna avere le informazioni del
frame predetto in indietro, occorre prima ottenere la codifica dei P-Frames
o poi si determina quella dei B-Frames.
Errore fra blocchi
L'errore fra i blocchi è un ottimo rilevatore
di cambiamenti e quindi di eventuali movimenti nell'immagine.
L'errore fra due blocchi viene valutato sulla sola componente
di luminanza dei blocchi perchè porta maggior informazioni sul movimento che
la crominanza.
In questa fase come errore è stato usato il M.A.D.
(Mean Absolute Distorsion).
Finestra di ricerca
Nel calcolo dei frames per poter determinare i
vettori di moto tramite l'algoritmo di Block Matching bisogna usare l'area
di ricerca. Su questa per ogni suo possible regione di 16 x 16 pixels si effettua
il calcolo dell'errore col blocco di riferimento del frame in considerazione.
Quindi nella scelta delle dimensioni della finestra di ricerca si scelgono
i vincoli per la determinazione dell'area di ricerca di ogni blocco.
Ogni blocco ha infatti la sua area di ricerca che sarà quadrata o meno in base
a quanto è centrato il blocco nel fotogramma coi vincoli di finestra di ricerca
scelta.
Per maggiori informazioni pratiche sulla scelta della finestra vedere le Istruzioni.
Determinazione I-Frame
La determinazione dell'I-Frame consiste nella sola codifica Intra di ogni suo
blocco.
E quindi visivamente è qui rappresentato come il fotogramma di riferimento.
In una sequenza di frame solitamente deve esserci un I-Frame ogni 50ms.
Determinazione P-Frame
Per la determinazione di un P-Frame si è proceduto in questo modo:
-si estrae un blocco alla volta dal fotogramma passato da cui si predige e
lo si identifica con le sue coordinate (colonna,riga);
-per ogni blocco si si procede come segue:
-si determina la componente di luminanza del blocco;
-si considera il fotogramma del frame attuale e se ne estrae la componente
di luminanza dell'area di ricerca;
-calcolo Z=MAD fra il blocco del frame e quello del frame passato;
-se Z è sotto la soglia trasmetto il vettore nullo, altrimenti
-determino il migliore vettore di moto nella finestra col proprio Matching
Value (M) usando l'algoritmo di Block Matching;
-se il vettore trovato è nullo lo trasmetto, altrimenti
-in base alla caratteristica Mc/NoMc in figura scelgo se codificare
il blocco come Intra o col vettore di moto trovato;
Per i P-Frame quindi l'errore utilizzato come parametro soglia nell'algoritmo
di Block Matching è il M.A.D.
Determinazione B-Frame
Per la determinazione di un P-Frame si è proceduto in questo modo:
1) Determinazione del miglior macroblocco A a moto compensato in avanti:
-si estrae un blocco alla volta dal fotogramma passato da cui si predige in avanti
e lo si identifica con le sue coordinate (colonna,riga);
-per ogni blocco si si procede come segue:
-si determina la componente di luminanza del blocco;
-si considera il fotogramma del frame attuale
e se ne estrae la componente di luminanza dell'area di ricerca;
-si calcola Z_A=MAD fra il blocco passato e il blocco attuale;
-si calcola M0_A=MSE fra il blocco passato e il blocco attuale;
-se Z_A è sotto la soglia si sceglie per il macroblocco A il vettore
nullo e M_A=M0_A, altrimenti
-si determina il migliore vettore di moto VetMotoA nella finestra col proprio
Matching Value (M_A) usando l'algoritmo di Block Matching;
2) Determinazione del miglior macroblocco B a moto compensato in indietro:
-se eseguono le stesse operazioni del punto 1) per il fotogramma del frame
futuro e ottengo Z2, M_B,VetMotoB;
3) Determinazione del macroblocco C interpolato:
-VetMotoC=( (vx_A+vx_B)/2, (vy_A+vy_B)/2 )
-si estrae il Matching value che si a nell'area di ricerca di A nel pixel
individuato da VetMotoC;
-si estrae il Matching value che si a nell'area di ricerca di B nel pixel individuato
da VetMotoC;
-si fa la media dei due e si ottiene il Matching value M_C del macroblocco interpolato
C
4) Determinazione miglior macroblocco fra i candidati A,B,C
-si sceglie il macroblocco
con minor MSE: M_Finale = min(M_A, M_B, M_C)
-se M_A=M_B=M_C -> scelgo C (indecisione)
5) Scelta del macroblocco da utilizzare
- si deve scegliere se trasmettere il macroblocco trovato o quello Intra
-se M_Finale<M0_A e M_Finale<M0_B -> Trasmetto Macroblocco trovato
-se M_Finale=M0_A e M_Finale=M0_B -> Trasmetto Macroblocco trovato (indecisione)
-se M_Finale>M0_A o M_Finale>M0_B -> Trasmetto Macroblocco Intra
Per i B-Frame quindi l'errore utilizzato come parametro soglia nell'algoritmo di Block Matching è l'M.S.E.
Block Matching
Un semplice algoritmo per effettuare la stima del moto tra frame è la
ricerca esaustiva (Full Search). Esso consiste nel calcolare la distorsione
in tutte le possibili
posizioni che un macroblocco può assumere all'interno della propria
area di ricerca. Lo
spostamento tra una posizione e la successiva è di un pixel.
La
ricerca esaustiva è un algoritmo solitamente oneroso per quanto
riguarda la complessità
computazionale. Tuttavia nel nostro caso non è particolarmente oneroso dato
che i singoli fotogrammi hanno una bassa risoluzione spaziale (128*96).
La Full Search ha una grande importanza dal punto di vista teorico:
garantisce
infatti di trovare la migliore predizione possibile all'interno di una data
finestra di ricerca.
Tuttavia si è notato che spesso la presenza di zone molto dettagliate lontane
dal centro dell'area di ricerca può portare alla scelta di un vettore di moto
che non individua un movimento effettivamente presente.
Per ovviare a questo si presenta qui un'alternativa all'algoritmo di Full Search.
Il seguente algoritmo di ricerca si basa sull'algoritmo Full Search del
Test Model 5.
L'encoder MPEG del Test Model 5 utilizza per la motion estimation una Full Search
parzialmente ottimizzata: la ricerca viene fatta con una traiettoria a spirale
a partire da una
posizione centrale della finestra di ricerca come mostra la figura seguente.
I numeri indicano l'ordine con cui si
valuta la distorsione nelle diverse posizioni della finestra di ricerca; la
spirale prosegue sino
a coprire tutte le possibili posizioni all'interno della finestra.
Per ogni posizione viene determinato il Matching Value e se tale valore è minore
a al minor valore fino a quell'istante trovato, si aggiorna il valore del minimo
Matching Value con quello appena determinato e si aggiornano anche le coordinate
del vettore di moto corrispondente a tale valore minimo.
Se inoltre il valore del Matching Value scende sotto la soglia (impostata tramite
l'interfaccia grafica, MSE per B-Frames e MAD per P-Frames) l'algoritmo di
Block Matching si arresta. Si evita così di effettuare un numero
di iterazioni eccessivo.
Infatti sperimentalmente si trova che il moto dei macroblocchi è nella
maggior parte dei casi di poca entità o nullo: quindi sono molto probabili
dei vettori di moto di ampiezza piccola o nulla e ci si arresterà in un punto
della spirale verosimilmente prossimo del centro e rispecchiante l'effettivo
movimento del blocco.
Così si procede fino all'esaurimento della finestra di ricerca e alla
fine viene ritornato il Matching Value minimo e il vettore di moto che lo determina
e che è il vettore di moto cercato.
Decremento Matching Value
Per evitare la scelta di un vettore
di moto che non individua un movimento effettivamente presente, nell'algoritmo
viene qui proposta una variante all'algoritmo precedente.
Questa variante è attivabile tramite l'interfaccia dell'applet ("Decremento Matching
Value") ed è stata proposta perchè si ritiene che in taluni casi essa renda
più solido
il confronto fra Matching Value.
Nel confronto fra Matching Value attuale e Matching
Value minimo che si effettua ad ogni nuova posizione, il Matching Value minimo
viene decrementato di una quantità proporzionale al percorso già effettuato.
Al primo giro di spirale il Matching Value minimo normalizzato viene decrementato
di 1 per i P-Frame e di 1 x 10 per i B-Frames.
Al secondo giro di 3 per i P-Frame
e di 3 x 10 per i B-Frames.
All'n-esimo giro di k per i P-Frame
e di k x 10 per i B-Frames, dove k viene incrementato di 2 ad ogni giro.
In caso di sequenze di immagini i cui fotogrammi presentano dettagli prossimi all'oggetto in movimento si nota sperimentalmente una determinazione migliore dei vettori di moto che effettivamente rispecchiano movimenti presenti nella sequenza di immagini.
Determinazione del Matching Value
Nel simulatore vengono usate come funzioni di errore per la determinazione
del Matching Value dei blocchi dei P-Frame e dei B-Frame rispettivamente
il MAD e l'MSE.
Quindi si noterà nel log del simulatore che il valore di M (Matching Value)
dei blocchi sarà di un ordine di grandezza più grande in caso di B-Frames.
Ricostruzione dei frames P e B
Nella ricostruzione dei frames si procede seguendo l'ordine indicato dalla
sequenza in uscita al codificatore.
Sia per i P-Frames che per i B-Frames si è proceduto in questo modo:
- si considerano inizialmente i blocchi codificati come intra e li si inserisce
nell'immagine ricostruita;
- si considerano poi i blocchi contenenti vettori di moto non
nulli nel frame codificato:
- si estrae il blocco corrispondente dal frame di riferimento (I codificato
interamente, P ricostruito);
- lo si inserisce nell'immagine in ricostruzione;
- si considerano poi i blocchi codificati come vettori nulli:
- si estrae il blocco corrispondente dal frame di riferimento (I codificato
interamente, P ricostruito);
- lo si inserisce
nell'immagine in ricostruzione;