Newer
Older
Zde se již dostávám k samotným výsledkům, kterých jsme dosáhli použitím námi vytvořeného kompresního nástroje. V této sekci projdeme výsledky první metody, kterou je skalární kvantizace. Jak jsme již uvedli dříve kompresní poměr a výsledná kvalita obrazu je řízena velikosti slovníku. Vyzkoušíme zde slovníky sedmi různých velikostí od $L = 4$ až po $L = 256$. Od nejmenšího slovníku s pouze čtyřmi položkami neočekáváme žádné dobré výsledky, ale budeme jej uvádět pro celkové srovnání. Větší slovník než 256 jsme již nezkoušeli, neboť bychom potřebovali více než 8 bitů na zakódování jednoho indexu do slovníku. Počet bitů na zakódování jednoho indexu označujeme pomocí $n$. Kdybychom nepoužívali Huffmanovo kódování, které dále mění počet bitů na index, tak by se dal kompresní poměr skalární kvantizace vypočítat podle rovnice \ref{eq:sq_cr}. Kde $W$ značí šířku obrazu a $H$ jeho výšku. Tato rovnice počítá s uložením slovníku spolu s každým řezem a také s 16 bity na jeden pixel. Je tedy zřejmé, že při použití 8 bitů na pixel ($L=256$), bychom měli dosáhnout $CR_{sq} \approx 0,5$.
\text{CR}_{sq} = \ddfrac{ 16L + (nWH) }{16WH}
V grafu na Obrázku \ref{fig:lloyd_max_psnr} můžeme vidět průběh trénování optimálního slovníku $L=256$. Průběh je ilustrován měnící se hodnotou PSNR. Tato veličina je již na počátku poměrně dobrá, čemuž vděčíme naší úpravě Lloyd--Max algoritmu. Celkově PSNR roste nejvíce ze začátku \linebreak a s rostoucími iteracemi je zlepšení méně významné. Podobně to platí pro pokles chyby MSE.
\centering
\pgfplotsset{scaled y ticks=false}
\begin{tikzpicture}
\begin{axis}[
width=0.7\linewidth,
height=0.4\linewidth,
xlabel = {Iterace},
ylabel = {PSNR (dB)},
]
\addplot[mark=none,color=blue,thick] table[x=It,y=PSNR] {plotData/lloydMaxTraining.data};
\end{axis}
\end{tikzpicture}
\caption{PSNR v průběhu iterací Lloyd--Max algoritmu}
Výsledky skalární komprese bez použití Huffmanova kódování pro stejný snímek, jako je na Obrázku \ref{fig:drosohpila_ch0} najdeme v Tabulce \ref{tab:drosophila_sq_compression}. Můžeme potvrdit, že s větším slovníkem klesá vzniklá chyba a zároveň roste hodnota BPP. Vliv Huffmanova kódování na výsledný kompresní poměr bude uveden později, je ale jisté že s jeho použitím dosáhneme pouze zlepšení.
\begin{table}[ht!]
\centering
\begin{tabular}{r | r | r | r | r | r}
\toprule
$n$ & $L$ & MSE & PSNR (dB) & $\text{CR}_{sq}$ & BPP \\\midrule
2 & 4 & 5275546,0477 & 29,1068 & 0,1250 & 2,0001 \\
3 & 8 & 1214174,9001 & 35,4867 & 0,1875 & 3,0001 \\
4 & 16 & 305193,0568 & 41,4837 & 0,2500 & 4,0002 \\
5 & 32 & 73796,0319 & 47,6491 & 0,3125 & 5,0005 \\
6 & 64 & 19260,3213 & 53,4828 & 0,3751 & 6,0010 \\
7 & 128 & 7078,7052 & 57,8299 & 0,4376 & 7,0020 \\
8 & 256 & 2282,6575 & 62,7451 & 0,5002 & 8,0040 \\
\caption{Výsledky skalární kvantizace pro embryo octomilky (Kanál 0)}
\label{tab:drosophila_sq_compression}
\end{table}
Samotné čísla uvedené v předcházející tabulce, nám sami o sobě moc neřeknou, a proto na Obrázku \ref{fig:sq_hm} vidíme absolutní chybu pixelu přímo na komprimovaném obrazu. Nutno podotknout, že obrázky v první a druhé řadě mají různou škálu chyby. Na těchto obrázcích vidíme postupně vývoj vzniklého kvantizačního šumu. Ze začátku jsou nejvíce chybné pixely samotného snímaného vzorku. Toto je ale případ s extrémně malým slovníkem. Postupně se chyba pixelů, které vyobrazují vnitřní strukturu buňky zmenšuje a většina výrazných chyb se přesunuje do okolí vzorku. V okolí vzorku se chyba převážně vyskytuje na markerech, které jsou důležité pro automatizovanou rekonstrukci 3D obrazu. Tyto markery, avšak nejsou příliš významné pro člověka, který se dívá hlavně na vzorek.
\begin{figure}[ht!]
\centering
\begin{subfigure}{1\linewidth}
\centering
\includegraphics[width=1\linewidth,trim={0 0 0 2cm},clip]{Figures/ch0_400_sq1hm.pdf}
\end{subfigure}
\begin{subfigure}{1\linewidth}
\centering
\includegraphics[width=1\linewidth,trim={0 0 0 7cm},clip]{Figures/ch0_400_sq2hm.pdf}
\end{subfigure}
\caption{Absolutní chyba ve vybraném řezu}
\label{fig:sq_hm}
\end{figure}
U první dvou z těchto obrázků ihned vidíme výraznou chybu, způsobenou malým rozsahem možných hodnot. Avšak dále, od třetího obrázku, se již chyba hledá hůře. Vidíme, že struktura vzorku je správně zachována a vizuální chyba se vyskytuje hlavně v přechodu mezi vzorkem \linebreak a jeho nitrem. Co je hlavní, nedochází ke vzniku žádných vizuálních artefaktů. V přílohách na Obrázcích \ref{fig:appendix_sq_result_images_ch0} a \ref{fig:appendix_sq_result_images_ch1} najdeme již přímo výsledné obrázky. U těchto obrázků je již hodnota BPP vypočtena s Huffmanovým kódováním a je vynechán nejmenší slovník $L = 4$.
Dále bychom se více podívali na samotnou kvantizační chybu. Vybrané statistické charakteristiky této chyby, pro jednotlivé velikosti slovníku můžeme najít v Tabulce \ref{tab:sq_error_stats}. Z této tabulky vidíme, že rozdělení chyb u všech slovníku je pozitivně zešikmené a zároveň velmi špičaté. Normálnímu rozdělení se v rámci špičatosti blíží pouze poslední slovník $L = 256$. Dle vývoje mediánu můžeme pozorovat, jak se celá distribuce postupně posouvá na pravou stranu blíže k nule. Samotné zužování histogramu a přibližování se tak k Dirácovu impulsu, lze dobře vyčíst ze snižující se hodnoty směrodatné odchylky. V naprosto ideálním případě by distribuce chyby vypadalo jako Diracův impuls. Všechny hodnoty chyby by byly nulové. Toto zužování histogramu chyby můžeme graficky pozorovat na Obrázku \ref{fig:sq_error_dist}.
\begin{table}[ht!]
\centering
\begin{tabular}{r | r | r | r | r | r | r}
\toprule
$n$ & $L$ & Průměr & Medián & Směr. odch. & Šikmost & Špičatost \\\midrule
2 & 4 & 0,3372 & -501 & 2296,8568 & 1,8731 & 18,7650 \\
3 & 8 & 0,6676 & -99 & 1101,8964 & 0,7427 & 11,6360 \\
4 & 16 & 0,4885 & -46 & 552,4429 & 0,4871 & 12,3575 \\
5 & 32 & 0,1379 & -25 & 271,6543 & 0,0781 & 10,3603 \\
6 & 64 & 0,4409 & -13 & 138,7809 & 0,1836 & 8,3237 \\
7 & 128 & 0,4291 & -8 & 84,1340 & 0,0502 & 5,4406 \\
8 & 256 & 0,5416 & -4 & 47,7741 & 0,0284 & 3,5307 \\
\bottomrule
\end{tabular}
\caption{Výběrové charakteristiky hodnoty chyby skalární kvantizace}
\label{tab:sq_error_stats}
\end{table}
Na Obrázku \ref{fig:sq_value_dist} poté vidíme distribuci hodnot pixelů po provedení kompresí. Tyto histogramy můžeme porovnat s histogramy na Obrázku \ref{fig:drosohpila_ch0_hist}. Distribuce hodnot pixelů po kompresi, by se měla co nejvíce blížit originálnímu rozdělení hodnot jasu, toto při porovnání grafů můžeme potvrdit.
Co se týče normality kvantizační chyby, tak ta může být dle vybraných statistických charakteristik v Tabulce \ref{tab:sq_error_stats} zavrhnuta. Hlavním problémem je velká špičatost. Toto tvrzení si potvrdíme provedením Kolmogorovova--Smirnovova testu. Shapiro--Wilkův test nemohl byt použit, neboť velikost výběrů přesahuje limit 5000 vzorků. Nulová hypotéza $H_0$ říká, že data pocházejí z normálního rozdělení. Alternativní hypotéze je rovna negaci nulové hypotézy, $H_A = \neg H_0$. $p$-hodnota pro daný test vyšla $\ll 0,0001$. Na hladině významnosti 5 \% tedy zamítáme nulovou hypotézu ve prospěch alternativní hypotézy a potvrzujeme, že rozdělení kvantizační chyby není normálním rozdělením.
\begin{figure}[ht!]
\centering
\begin{subfigure}{.45\textwidth}
\centering
\includegraphics[width=.9\linewidth]{Figures/sq_value_hist.pdf}
\caption{Histogram pixelů po skalární kvantizaci}
\label{fig:sq_value_dist}
\end{subfigure}
\begin{subfigure}{.45\textwidth}
\centering
\includegraphics[width=.9\linewidth]{Figures/sq_error_hist.pdf}
\caption{Histogram vzniklé kvantizační chyby}
\label{fig:sq_error_dist}
\end{subfigure}
\caption{Distribuce hodnot v obraze po skalární kvantizaci}
\label{fig:sq_compression_dist}
\end{figure}
Do této doby jsme se bavili pouze o kompresi jednoho vybraného řezu, z kanálu 0 datasetu embrya octomilky. V dalším grafu této sekce se podíváme a probereme výsledky, kterých jsme dosáhli kompresí všech rovin obou datasetů. V grafech na Obrázku \ref {fig:sq_compression_dist} můžeme vidět vývoj průměrné absolutní chyby pixelu MAE vzhledem k rovině datasetu. MAE je vypočítáno podobně jako MSE, akorát místo sumy druhé mocniny rozdílu je sčítána absolutní hodnota rozdílu.
Zároveň na těchto grafech porovnáváme tři různé typy slovníků. V prvním grafu je každá rovina komprimována podle svého vlastního slovníku. U nejmenšího slovníku $L = 4$ můžeme pozorovat kolísání MAE, neboť 4 hodnoty nestačí ke kompresi detailního obrazu. Toto kolísání můžeme ještě dramatičtěji pozorovat pro výsledky z druhého kanálu. Grafy pro tento druhý kanál najdeme na Obrázku \ref{fig:sq_error_trend_ch1} v přílohách. Na tomto grafu si všimneme velmi divného stoupání chyby od cca 290. roviny. Právě někdy od této roviny začíná okolí vzorku zabírat významnou část obrazu. Toto okolí je velmi tmavé, obsahující pouze pixely malých hodnot. Avšak většinová část obrazu je stále zabírána světlejšími pixely, a proto algoritmus vytváří slovník, obsahující právě tyto vyšší hodnoty. Se zvětšováním se tohoto tmavého okolí roste vzniklá chyba MAE. Stejná situace nastává pro roviny 550 až 560. Dle grafu vidíme, že toto je pouze chyba nejmenšího slovníku.
Zbylé dva grafy reprezentují výsledky dosáhnuté pomocí jediného slovníku. Tento slovník byl využit pro kompresi všech rovin v datasetu. Ihned si všimneme, že tyto výsledky nejsou pro žádnou velikost slovníku horší, než tomu bylo v prvním grafu. Je tomu právě naopak, křivky vypadají stabilněji. Například v Obrázku \ref{fig:sq_error_trend_ch1} vidíme, že nedochází ke vzniku velké chyby na několika za sebou jdoucích rovinách. Velmi dobré výsledky slovníku vytvořeného z prostřední roviny potvrzují naši hypotézu, že uprostřed datasetu se nachází řez, obsahující snímaný vzorek. Díky tohoto slovník obsahuje správné kvantizační hodnoty, hodící se k rekonstrukci obrazu. Toto, avšak nemusí být vždy pravda, a proto je jistější využít slovník globální, který je vytvořen ze všech rovin datasetu. Jedinou nevýhodou globálního slovníku, oproti slovníku z prostřední roviny je délka učení. V přílohách na Obrázku \ref{fig:sq_error_trend_ch0_detail} najdeme stejný graf hodnoty MAE podle rovin, avšak pouze pro 4 nejlepší slovníky. Na těchto přiložených grafech, můžeme detailněji pozorovat výsledky lepších slovníků.
Globální slovník s sebou přináší tři velké výhody. Zaprvé, je naučen pouze jednou a uložen do \emph{cache} souboru. Tato operace je sice náročnější, ale jelikož počítáme s využitím na superpočítačích tak pro nás to není problém. Zadruhé, rychlost komprese je mnohem vyšší. Slovník se načte z \emph{cache} souboru a trénovací krok kompresoru se může přeskočit. Čas dekomprese je taky kratší, neboť se slovník načítá z komprimovaného souboru pouze jednou. Třetí výhodou je menší komprimovaný soubor a s tím i lepší kompresní poměr, protože se v souboru se nachází pouze jeden slovník.
\image{sq_error_trend_ch0.pdf}{Průměrná absolutní chyba skalární kvantizace podle rovin (Kanál 0)}{fig:sq_error_trend}{1.0}
Dosud jsme ve výsledcích pracovali s kompresním poměrem vypočteným podle Rovnice \ref{eq:sq_cr}. Avšak v sekci \ref{sec:compression_program} jsme uvedli využití Huffmanova kódování. Jak toto kódování ovlivnilo výsledný kompresní poměr je uvedeno v Tabulce \ref{tab:sq_cr_huffman}. V této tabulce, ve sloupci CR, uvádíme kompresní poměr s Huffmanovým kódováním a $\Delta \text{CR}$ je zlepšení oproti kompresi bez tohoto kódování. Stejné platí i pro sloupec BPP. Kompresní poměr je vypočten bez velikosti hlavičky. Díky tomuto přidanému kroku v rámci komprese, jsme schopni ušetřit až 2 bity na pixel, jak je tomu u slovníku s $L = 256$. Celkově je kompresní poměr po využití Huffmanova kódování lepší. Pravděpodobnosti jednotlivých symbolů, pomocí kterých je tvořen Huffmanův strom můžeme vidět v grafu na Obrázku \ref{fig:sq_huffman_prob}. V tomto grafu má symbol 0 největší pravděpodobnost, takže mu bude přiřazen nejkratší binární kód. Díky této informaci o pravděpodobnosti symbolů taky víme, jak využívané jsou jednotlivé kvantizační hodnoty ve slovníku.
\begin{table}[ht!]
\centering
\begin{tabular}{r | r | r | r | r | r}
\toprule
$n$ & $L$ & CR & $\Delta$CR & BPP & $\Delta$BPP \\\midrule
2 & 4 & 0,0898 & 0,0352 & 1,4367 & 0,5634 \\
3 & 8 & 0,1221 & 0,0654 & 1,9541 & 1,0460 \\
4 & 16 & 0,1909 & 0,0591 & 3,0538 & 0,9464 \\
5 & 32 & 0,2454 & 0,0671 & 3,9268 & 1,0737 \\
6 & 64 & 0,3002 & 0,0749 & 4,8027 & 1,1983 \\
7 & 128 & 0,3299 & 0,1077 & 5,2784 & 1,7236 \\
8 & 256 & 0,3719 & 0,1283 & 5,9502 & 2,0538 \\
\bottomrule
\end{tabular}
\caption{Kompresní poměr skalární kvantizace s Huffmanovým kódováním}
\label{tab:sq_cr_huffman}
\end{table}
\image{sq_huffman_prob.pdf}{Pravděpodobnosti symbolů}{fig:sq_huffman_prob}{0.8}