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 algoritmu. V této sekci projdeme výsledky první metody, skalární kvantizace. Jak jsme již uvedli dříve, kompresní poměr, a i 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$. Kde 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í. Největší slovník jsme zvolili velikosti 256, větší jsme již nezkoušeli, neboť by potřebovali více než 8 bitů na zakódování jednoho slovníkového indexu. 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}\approx0,5$.
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}\approx0,5$.
\begin{equation}
\text{CR}_{sq} = \ddfrac{ 16L + (nWH) }{16WH}
\label{eq:sq_cr}
\end{equation}
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$, ilustrovaný měnící se hodnotou PSNR. Tato hodnota je již na počátku poměrně dobrá, díky naše úpravě Lloyd--Max algoritmu. Dále PSNR roste nejvíce ze začátku a s rostoucími iteracemi je zlepšení méně významné, stejné platí pro pokles chyby MSE.
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 \linebreaka s rostoucími iteracemi je zlepšení méně významné. Podobně to platí pro pokles chyby MSE.
\begin{figure}[h!]
\begin{figure}[ht!]
\centering
\pgfplotsset{scaled y ticks=false}
\begin{tikzpicture}
...
...
@@ -20,11 +19,11 @@ V grafu na Obrázku \ref{fig:lloyd_max_psnr} můžeme vidět průběh, trénová
\caption{PSNR v průběhu iterácí Lloyd--Max algoritmu}
\caption{PSNR v průběhu iterací Lloyd--Max algoritmu}
\label{fig:lloyd_max_psnr}
\end{figure}
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}. Potvrzujeme, ž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í.
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
...
...
@@ -44,7 +43,7 @@ Výsledky skalární komprese bez použití Huffmanova kódování, pro stejný
\label{tab:drosophila_sq_compression}
\end{table}
Takto uvedené čísla nám sami o sobě moc neřeknou, proto na Obrázku \ref{fig:sq_hm} vidíme absolutní chybu pixelu přímo na komprimovaném řezu. 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é kvantizační chyby. Ze začátku jsou nejvíce chybné pixely právě snímaného vzorku, toto je ale extrémně malý slovník. Postupně se chyba pixelů, vyobrazující 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, ale pro člověka nejsou příliš významné.
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
...
...
@@ -60,10 +59,10 @@ Takto uvedené čísla nám sami o sobě moc neřeknou, proto na Obrázku \ref{f
\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 a jeho vnitřkem. 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 po provedení dekomprese. Hodnota BPP je vypočtena již s Huffmanovým kódováním a je vynechán nejmenší slovník $L =4$.
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 \linebreaka 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 nuly. Samotné zužování histogramu a přibližování se tak k Dirácovu implulsu 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, neboť by všechny hodnoty chyb byly nulové. Toto zužování histogramu chyby můžeme graficky pozorovat v Obrázku \ref{fig:sq_error_dist}.
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
...
...
@@ -83,9 +82,9 @@ Dále bychom se více podívali na samotnou kvantizační chybu. Vybrané statis
\label{tab:sq_error_stats}
\end{table}
Na Obrázku \ref{fig:sq_value_dist} poté vidíme distribuci hodnot pixelů po provedení kompresi. 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 po porovnání grafů platí.
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 $\ll0,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.
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 $\ll0,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}
...
...
@@ -104,17 +103,17 @@ Co se týče normality kvantizační chyby, tak ta může být dle vybraných st
\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 komprese všech rovin našich 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.
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 prostě nestačí ke kompresi celého obrazu. Toto kolísání můžeme pozorovat v ještě pro výsledky roviny z 1. kanálu, grafy pro tento kanál najdeme na Obrázku \ref{fig:sq_error_trend_ch1} v přílohách. Na tomto druhém 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, které je velmi tmavé, zabírat významnou část obrazu. Avšak většinová část obrazu je stále zabírána světlejšími pixely, které také algoritmus vytvářející slovník, umístí do slovníku. Se zvětšováním se tohoto tmavého okolí také 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.
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é pouze pomocí jediného slovníku, který byl využit pro kompresi všech rovin v datasetu. Hned si všimneme, že tyto výsledky nejsou pro žádnou velikost slovníku horší, spíše ke komprese stabilnější. 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, který obsahuje snímaný vzorek. Díky toho 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ý byl 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 roviny, avšak pouze pro 4 nejlepší slovníky, na těchto grafech můžeme lépe pozorovat výsledky těchto 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 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 pouze 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, v souboru se nachází pouze jeden 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 již s kódováním a $\Delta\text{CR}$ je zlepšení oproti kompresi bez Huffmanova kódování, stejné platí pro sloupec BPP. Kompresní poměr je vypočten bez velikosti hlavičky. Díky tomuto přidanému kroku v rámci, jsme schopni ušetřit až 2 bity na pixel tak jako je tomu u slovníku s $L =256$. Celkově je kompresní poměr lepší po využití Huffmanová kódování. 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.
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.