Psnr (peak Signal-to-noise Ratio)


Scritta da aytin il 18-07-2005

Cos'č il PSNR e come lo si puņ utilizzare correttamente


QUOTE (lucapas @ 15 Jul 2005, 11:13)

Quando hai voglia e tempo potresti fare una veloce guida su come verificare la qualità? Io a parte l'occhio non saprei come altro fare e viste le mini-differenze comincia ad essere difficile valutare!

A seguito della richiesta di lucapas nel topic relativo al confronto del nuovo codec DivX 6 con gli altri, apro questo nuovo topic in cui, chi vuole, può dettagliare l'argomento "PSNR" come gli pare.

il PSNR è una stima di massima sulla bontà dell'immagine compressa, in altre parole è la misura della distorsione introdotta comprimendo l'immagine originale.
Una scala di valori (peraltro indicativa, da prendere con le dovute precauzioni, più avanti dirò il perchè) relativa alla bontà della compressione in funzione del PSNR (espresso in decibel, dB) è la seguente: In una compressione, normalmente il range di valori è compreso nell'intervallo [20-50] ma già i valori compresi nell'intervallo [45-50] sono ottenibili con quantizer 1. Quindi senza compressione.
C'è da dire che l'analisi secca del PSNR non dà molte informazioni.
Certamente valori particolarmente bassi potrebbero essere indici di una qualità piuttosto scadente ma è anche vero che valori medio-alti del PSNR non mettono al riparo da altri artefatti tipici della compressione MPEG come blocchettizzazione e ringing.
Non bisogna quindi considerare il PSNR come misura assoluta ma è molto utile quando si confrontano (sullo stesso video ovviamente): Ovviamente i vari casi possono essere combinati (con criterio) fra loro.
Confrontando i vari PSNR si può avere un'idea di massima su come vari la fedeltà della compressione rispetto all'originale al variare delle condizioni di compressione.

Come calcolare il PSNR:

Esistono tool che permettono di calcolare altri indici (SSIM per es.) oltre al PSNR. Ne conosco un paio: molto contenuti, fra l'altro, in quanto a dimensioni.

Io uso uno script per AviSynth attraverso il quale si può analizzare un qualunque frammento del video con pochissime istruzioni. Il "compare" mi restituisce il PSNR.
Lo script che uso sempre è il seguente:


LoadPlugin("C:\Programmi\GordianKnot\dgmpgdec140final\DGDecode.dll")

# SOURCE A
a=mpeg2source(
"C:\myVideo\myFilm.d2v", idct=0).trim(n1,n2)
a=a.crop(
x1,y1,x2,y2).filterResize(x,y,[a1,a2,...,an]).ConvertToYUY2

# SOURCE B
b=AVISource("
C:\myVideo\myFilm.avi").trim(n1,n2).ConvertToYUY2

Compare(a,b,"",
"compare.log",true)
#SelectRangeEvery(280,14)


Ho volutamente commentato l'ultima riga perchè si può scegliere se analizzare una parte consistente del video prelevandone campioni con "SelectRangeEvery" oppure analizzarne tutti i frame.

Quanto al modo di procedere, è chiaro che se si analizzano i comportamenti dei codec (che è quello che va per la maggiore) bisogna scegliere delle impostazioni che li rendano confrontabili.
Es. si può verificare come si comportino i codec al massimo delle loro potenzialità o, al contrario, con bassi bitrate senza alterare i filtri di resize, risoluzioni e altro. E' facile capire che, in caso contrario i risultati ottenuti non saranno di alcuna utilità. nulla da dire
da manuale

Caspita!! Aytin, non pensavo fossi così ferrato sull'argomento! Vediamo se Type ti dà filo da torcere! jester.gif
QUOTE (lucapas @ 20 Jul 2005, 12:48)
Caspita!! Aytin, non pensavo fossi così ferrato sull'argomento! Vediamo se Type ti dà filo da torcere!  jester.gif

glowface.gif
Credo che Type R, come ognuno di voi, possa rifarmi le suole almeno 100 volte.
Senza falsa modestia, è da relativamente poco che l'encoding (annessi e connessi) mi appassiona mentre voi, ripescando fra i post più "antichi", avete un'esperienza addirittura antecedente alla frequentazione del forum (equivalente ad almeno 3 anni, come lo stesso Type R per es.).
Per es. il mio script di base potrebbe essere raffinato 100 volte, sono sicuro.
Il materiale da cui ho tratto spunto l'ho trovato in giro per la rete (google funziona sempre benissimo glowface.gif) poi, sulla base delle mie esperienze, l'ho rielaborato in un modo che speravo potesse essere utile anche ad altri, sufficientemente curiosi, che volessero sapere qualcosa su questo indice che non manca mai quando si testa un codec o quando lo si confronta con qualcun altro.
Come dicevo ad Echelon in forma privata, in realtà il mio intervento non è proprio completo. Mancano innanzitutto degli esempi e qualche precisazione che avevo omesso di proposito per stimolare un pò la discussione non prevedendo che divenisse... FAQ glowface.gif
(già che ci sono posso anche completarla, per integrala in seguito).
Veniamo al dunque.

SOLO PER XviD: all'interno del trim del SOURCE B occorre considerare come frame iniziale il successivo del frame iniziale del SOURCE A

In pratica si shifta a destra di un frame:
...
# SOURCE B
....trim(n1,n2)

diventa :
...
# SOURCE B
....trim(n1+1,n2+1)

Tutto ciò a causa del lag del decoder XviD.
Le prime volte che ho provato a far girare lo script per testare innocentemente XviD (la 1.03 per l'appunto) e DivX 5.2.1, ho avuto dei risultati sconcertanti.
Avevo scelto un frammento de "Le Iene" in cui fossero presenti dei primi piani per testare la resa del codec a quantizer 2 sui particolari.
DivX tendeva a piallare un pò l'immagine, con XviD i particolare erano più evidenti, più fedeli all'originale.
Mi aspettavo che dal PSNR risultasse almeno questa differenza.
Invece: Dopo mezz'ora di bestemmie e altrettanto di tentativi su vari frammenti in cui i risultati nel complesso non si discostevano di una virgola (porca miseria, ad occhio si vedevano che i frame di DivX erano più "blurrati" degli stessi in XviD), passo una giornatina a cercare info e... scopro che 'sto lag maledetto mi impediva di ottenere risultati corretti. Infatti correggendo gli script viene fuori sul primo intervallo che avevo provato: Mi sembrava che così avessero più senso, almeno per quello che vedevo in maniera nuda e cruda.
Poi un altro particolare che può essere utile per chi si cimenta per la prima volta col calcolo del PSNR senza ricorrere a nessun tool (e per farvi capire anche quanto fossi una pippa smhair.gif ) è ricordarsi di chiudere sempre il player dopo che i frame sono stati scansionati.
In caso contrario il file di testo non viene completato ma rimane così per es.:

...
587 7.8008 +0.8648 163 -162 19.7571
588 6.8628 +0.6698 161 -163 20.3413
589 6.0355 +0.5355 161 -160 20.9372
590 9.6158 +0.7878 162 -163 19.5526
591 4.5769 +0.6128 165 -158 22.6065
592 3.6088 +0.2084 163 -162 24.3494
593 2.8757

Ho perso un 20 minuti buoni prima di chiudere per caso il player in preda alla furia (e il bello doveva ancora venire, come ormai saprete) mostrandomi così il file di log in maniera corretta.

Imparo in fretta ma come vedete sono un apprendista... appassionato.
Le correzioni che apporterete, gli interventi che riterrete opportuno effettuare o qualunque altra cosa, faranno piacere a me innanzitutto, e anche e soprattutto, a quelli che, incuriositi, avranno la pazienza di leggere.
wavey.gif

P.S. PSNRCreator, per chi l'ha provato o vuole farlo, ha un bachetto. Meglio spuntare la checkbox che permette l'editing dello script avs prima dell'esecuzione.
Non facendolo, l'applicazione va in eccezione e si chiude (maledetta, basta fare un errore e occorre ricominciare tutto da capo) perchè lo script che produce è errato.
Sarà presente una riga fatta così grossomodo:
che nessun player del mondo si sognerebbe di eseguire, nemmeno WMP. flower.gif
Abilitando l'editing si può "croppare" correttamente.

ri wavey.gif Yo, pensavo di editare il tutto in modo da livellare (graficamente) con le altre FAQ (vedi TypeR etc)... Che ne pensi?

Izza flower.gif Sono d'accordissimo. Mi faresti un grosso piacere e se ne avvantaggerebbe la visibilità
Se vuoi, posso filtrare i commenti che hanno accompagnato le aggiunte fatte ieri che, magari, in una faq interessano poco.
Intanto dò i riferimenti dai quali ho attinto:

1) http://www.quellicheilpc.com/portale/modul...artid=61&page=1, un pò di teoria sulla compressione video.
2) http://www.geocities.com/acoslovich/rba/rba.htm, PSNR e rimozione Blocking Artifacts.
3) http://andypanix.altervista.org/DVD/Config...Codec_Xvid.html, la sempreverde guida di Andy_Panix, non tanto per la configurazione del codec XviD (ver. Koepi 240603, un pò datato ormai) quanto per la consistente parte teorica.
4) http://forum.gamesurf.tiscali.it/showthrea...&highlight=psnr, da cui l'illuminante suggerimento sul lag del decoder XviD.

Ovviamente tutto ciò che è derivato dalla lettura di questo materiale è stato filtrato dalle mie esperienze personali. Pertanto, le mie conclusioni non sono imputabili in alcun modo alle persone che hanno realizzato le relazioni sopracitate.
Qualunque errore che venga ravvisato, dovuto a contradditorietà o cattiva interpretazione, dipende SOLO ed ESCLUSIVAMENTE da me.

Nelle mie prossime prove (tutt'ora in corso) raccoglierò immagini e log relativi al PSNR che serviranno a concretizzare quanto specificavo nei 3 punti della prima parte della faq relativamente ai vari modi di utilizzo del PSNR in funzione di ciò che si deve analizzare, vale a dire:
1) variazione delle impostazioni del codec
2) confronto fra codec
3) variazioni sui filtri di codifica

wavey.gif aytin, rileggendo ora, ho notato:

QUOTE
SOLO PER XviD: all'interno del trim del SOURCE B occorre considerare come frame iniziale il successivo del frame iniziale del SOURCE A


questo e vero solo se non è stato usato il packed bit stream

ed è vero per divx 6.0 se nel decoder si attiva il delay per ridurre il "CPU Spikes".

domanda, a che serve l'opzione "true" per il compare? Grazie Type per l'attenzione perchè è inutile sottolineare che le tue osservazioni serviranno a dettagliare ancor meglio la faq.
Quanto al "compare", settato a true mostra il grafico del PSNR fatto da MarcFD (Compare)
Onestamente il settaggio a true o false sembra non generare nessuna differenza. Il grafico non sono mai riuscito a vederlo.
So che non specificando il file di log nell'istruzione "compare" i dati dell'analisi vengono mostrati direttamente sul player rallentando abbastanza l'esecuzione per la verità.
Un modo per visualizzare e confrontare i vari grafici generati dal compare è dato dall'utlizzo di una semplice applicazione che ho individuato su un topic di www.doom9.org: Java XviD Stats Viewer che, fra i vari grafici per l'analisi del file .pass di XviD 1.0, consente di confrontare anche i file di log prodotti dal "compare":

user posted image oook!

aggiungo che c'è la possibilità di fare un compare anche senza convertire in YUY2, tramite un plugin esterno che si chiama compareYV12
QUOTE (Type R @ 25 Jul 2005, 12:49)
oook!

aggiungo che c'è la possibilità di fare un compare anche senza convertire in YUY2, tramite un plugin esterno che si chiama compareYV12

Vaaaaaaaaaaaaa bene!!!
Quoto alla grande: compareYV12:
QUOTE
No On-Screen Display and no graph at the moment, only logfile and debug output supported.


Pagina stampata da Divxmania.it
Vietata la copia e la distribuzione (anche parziale) senza la previa autorizzazione.