diff --git a/text/DP_Fanfule_Vaclav_2017.pdf b/text/DP_Fanfule_Vaclav_2017.pdf index 9e3d7be..2e77935 100644 Binary files a/text/DP_Fanfule_Vaclav_2017.pdf and b/text/DP_Fanfule_Vaclav_2017.pdf differ diff --git a/text/DP_Fanfule_Vaclav_2017.tex b/text/DP_Fanfule_Vaclav_2017.tex index a7de886..442f493 100644 --- a/text/DP_Fanfule_Vaclav_2017.tex +++ b/text/DP_Fanfule_Vaclav_2017.tex @@ -25,6 +25,10 @@ \newcommand{\tg}{\mathop{\mathrm{tg}}} %cesky tangens \newcommand{\cotg}{\mathop{\mathrm{cotg}}} %cesky cotangens \DeclareMathOperator{\ssim3d}{SSIM-3D} +\usepackage{listings} +\usepackage{nameref} +\usepackage{imakeidx} + % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % ODTUD DAL VSE ZMENTE @@ -36,38 +40,62 @@ \authorFN{Fanfule} %příjmení autora \authorWithDegrees{Bc. Václav Fanfule} %jméno autora včetně současných akademických titulů \supervisor{Ing. Ivan Šimeček, Ph.D.} -\acknowledgements{Děkuji vedoucímu práce Ing. Ivanovi Šimečkovi, Ph.D. za vedení, rady a~pomoc při tvorbě této práce. Dále také děkuji rodině za podporu v~průběhu celého studia a~všem dalším, kteří jakkoli přispěli ke vzniku této práce.} -\abstractCS{V~několika větách shrňte obsah a přínos této práce v~češtině. Po přečtení abstraktu by se čtenář měl mít čtenář dost informací pro rozhodnutí, zda chce Vaši práci číst.} -\abstractEN{Sem doplňte ekvivalent abstraktu Vaší práce v~angličtině.} +\acknowledgements{Děkuji vedoucímu práce Ing. Ivanovi Šimečkovi, Ph.D. za vedení, rady a~pomoc při tvorbě této práce. Dále také děkuji rodině a přítelkyni, Jitce Janíkové, za bezmeznou podporu v~průběhu tvorby této práce a v~průběhu celého studia a~všem dalším, kteří jakkoli přispěli ke vzniku této práce.} +\abstractCS{Práce je zaměřena na objektivní vyhodnocení kvality videa. V~rámci této práce jsou popsány metody jak porovnávat kvalitu různých verzí jednoho videa. Vybral jsem několik různých způsobů porovnávání kvality videa, tyto metody jsem následně implementoval. Pomocí mnou implementovaných metod jsem také změřil různé kodeky za cílem jejich vzájemného porovnání.} + +\abstractEN{The thesis focuses on an objective evaluation of video quality. It describes methods for comparison of different version of the same video. I~have chosen several different ways to compare the quality of video and subsequently implemented these. Using these implemented methods I~have also gauged various codecs with the aim of their relative comparison.} \placeForDeclarationOfAuthenticity{V~Praze} \declarationOfAuthenticityOption{4} %volba Prohlášení (číslo 1-6) -\keywordsCS{Nahraďte seznamem klíčových slov v~češtině oddělených čárkou.} -\keywordsEN{Nahraďte seznamem klíčových slov v~angličtině oddělených čárkou.} +\keywordsCS{Porovnávání videí, kvalita videí, PSNR, SSIM, stVSSIM, CUDA, H.264, H.265, VP9} +\keywordsEN{Video comparison, video quality, PSNR, SSIM, stVSSIM, CUDA, H.264, H.265, VP9} % \website{http://site.example/thesis} %volitelná URL práce, objeví se v tiráži - úplně odstraňte, nemáte-li URL práce \begin{document} +\renewcommand{\subsectionautorefname}{sekci} +\renewcommand{\sectionautorefname}{sekci} +\renewcommand{\chapterautorefname}{kap.} % \newacronym{CVUT}{{\v C}VUT}{{\v C}esk{\' e} vysok{\' e} u{\v c}en{\' i} technick{\' e} v Praze} % \newacronym{FIT}{FIT}{Fakulta informa{\v c}n{\' i}ch technologi{\' i}} \begin{introduction} - %sem napište úvod Vaší práce +Při práci s~videem je často nutné zjistit jakou má toto video kvalitu, prostým subjektivním shlédnutím tohoto videa se ale často nepodaří dostatečně vyhodnotit jeho kvalitu, proto je tedy na místě použít nějaký analytický nástroj, který tuto kvalitu objektivně určí. Existuje mnoho způsobů jak tuto kvalitu určit, já ve své práci provedu analýzu některých metod, vyhodnotím jejich vhodnost, provedu implementaci a otestuji tyto metody. + +Jedním z~cílů této práce je analyzovat způsoby vyhodnocení kvality videa, konkrétně se zaměřím na objektivní, deterministické způsoby vyhodnocení kvality. + +Dalším cílem této práce je porovnání způsobů ukládání videí a to především z~hlediska jejich komprese, tato práce se snaží odpovědět na otázku jaký způsob ukládání a komprese videa je nejvhodnější, k~tomu budou použity mnou navržené metody vyhodnocování kvality videa. + +Výstupem této práce bude mimo jiné program určený k~vyhodnocení kvality videa, tento program bude schopen porovnat shodnost vzorového (originálního) videa a videí z~něj odvozených a tím určit jejich kvalitu. Bude umožnovat i paralelní zpracování, stejně tak jako bude možné využívat grafickou kartu pro akceleraci tohoto programu. + +V~první kapitole představím nejdůležitější technologie použité dále v~této práci, dojde zde k~seznámení s~pojmy jako kodek nebo formát, v~této kapitole dojde i na popis způsobů porovnávání kvality videa. V~neposlední řadě v~této kapitole dojde na popis později implementovaných algoritmů. + +V~druhé kapitole provedu analýzu existujících nástrojů a programů, které bych mohl využít v~mé práci. Vyhodnotím které z~nich jsou nejvhodnější a stručně je představím a popíši jejich možnosti. + +V~následující kapitole bude popis iplementace jednotlivých algoritmů použitých v~mém programu. + +V~posledních dvou kapitolách se bude nacházet měření algoritmů a kodeků. U~měření algoritmů se zaměřím především na to, jak dobře korelují se subjektivním vnímáním, u~měření kodeků se zaměřím na to, který kodek je nejlepší z~hlediska ukládání a komprese videí. + +Využitelnost této práce vidím v~umožnění porovnávání kvalit videa při jeho různých parametrech, konkrétně například při kompresi videa mi můj program může pomoci s~určením požadovaných parametrů pro kompresi. \end{introduction} \chapter{Technologie} -V~této kapitole stručně představím technologie použité v~této práci. Nejprve stručně představím možností porovnávání video snímků poté se zaměřím na metriky které budu v~této práci používat. +\label{technologie} +Tato práce se zabývá objektivním porovnáváním kvality videí. V~této kapitole představím technologie, které budu využívat, nejprve je ale nutné říct něco o~samotném porovnávání kvality videí. Pod pojmem kvalita videa se v~této práci rozumí množina všech vlastností a parametrů videa. Mezi tyto parametry například patří datový tok nebo rozlišení. Není ale jednoduché ze zadaných parametrů určit kvalitu tohoto videa, ani velmi dobré parametry videa (například vysoké rozlišení, velký datový tok) nezaručují dobrou kvalitu videa. V~této práci se budu zabývat tím, jak určit, jakou má video kvalitu a především jak jednotlivá videa porovnat mezi sebou z~hlediska jejich kvality. + +V~této práci se zejména zaměřím na porovnávání různých verzí jednoho videa. Protože mi jde mimojiné o~porovnání různých forem uložení videa, je pro mě nejdůležitější vědět, o~kolik nějaká komprese změnila video, a kvalitu tohoto videa budu posuzovat podle shodnosti s~jeho vzorem. \section{Metriky pro porovnávání videa} -Pod pojmem metrika se v~této práci rozumí způsob jak ze dvou objektů (v~tomto případě například jednotlivých snímků nebo video záznamů) získat jedno číslo které vyjadřuje vzdálenost těchto objektů. Z~různých algoritmů ale vycházejí různé metriky a proto nejsou mezi sebou porovnatelné. Například u~metriky PSNR platí, že čím jsou objekty shodnější, tím metrika je vyšší a naopak. Ale tato metrika nemá lineární průběh, průběh je spíše exponenciální, pro shodné objekty vychází plus nekonečno, pro zcela neshodné objekty vychází 0. +V~této sekci popíši způsoby srovnávání videa, jak je možné určit jejich shodnost. Pro toto určení využívám metriku. +Metrika je číslo, které vyjadřuje vzdálenost dvou objektů. V~této práci se pod pojmem metrika rozumí způsob, jak ze dvou objektů (v~tomto případě například jednotlivých snímků nebo video záznamů) získat jedno číslo, které vyjadřuje vzdálenost těchto objektů. Z~různých algoritmů však vycházejí různé metriky, a proto nejsou mezi sebou porovnatelné. Například u~metriky PSNR (detaily o~PSNR jsou v~\autoref{PSNR}) platí, že čím jsou objekty shodnější, tím je vyšší metrika a naopak. Ale tato metrika nemá lineární průběh, průběh je spíše exponenciální, pro shodné objekty vychází plus nekonečno, pro zcela neshodné objekty vychází 0. -V~této části se budu zabývat problematikou jak porovávat kvalitu videa. Obecně se metriky dělí na referenční a nereferenční metriky. U~referenčních metrik je vždy k~dispozici jedno vzorové video a k~tomuto videu vztahujeme všechna srovávaná videa. U~nereferenčních metrik není k~dispozici žádné ukázkové video a jsou porovnávána pouze videa mezi sebou bez znalosti toho které je výchozí a které je odvozené. -U~referenčních metrik je dáno, že čím je porovnávané video blíže k~vzoru, tím je lepší. Naopak u~nereferenčních metrik tento přístup není možný a je možné pouze určit jak moc jsou si videa podobná. Pro odhad kvality u nereferenčních metrik je možné použít některé heuristiky \cite{nonref}. Ovšem tyto heuristiky nejsou spolehlivé u všech typů obrázků, proto není vhodné jejich použití pro video, kde nemůžeme zaručit, že všechny snímky budou vhodné pro danou nereferenční metriku. +Obecně se metriky dělí na referenční a nereferenční metriky. U~referenčních metrik je vždy k~dispozici jedno vzorové video a k~tomuto videu vztahujeme všechna srovnávaná videa. U~nereferenčních metrik není k~dispozici žádné ukázkové video a jsou porovnávána pouze videa mezi sebou, bez znalosti toho, které je výchozí a které je odvozené. +U~referenčních metrik je dáno, že čím je porovnávané video blíže k~vzoru, tím je lepší. Naopak u~nereferenčních metrik tento přístup není možný a je možné pouze určit, jak moc jsou si videa podobná. Pro odhad kvality u~nereferenčních metrik je možné použít některé heuristiky \cite{nonref}. Ovšem tyto heuristiky nejsou spolehlivé u~všech typů obrázků, proto není vhodné jejich použití pro video, kde nemůžeme zaručit, že všechny snímky budou vhodné pro danou nereferenční metriku. -Jedna z~klíčových otázek této práce zní jak poznat, které video je kvalitnější. Existuje mnoho přístupů k~této problematice. Jedním z~jednodušších je pouhé porování bitratu. Tato metrika je ale velmi nedostatečná protože nezohladňuje mnoho faktorů, například různé kodeky pro enkódování. Další možností je porovnávání jednotlivých snímků videa a zkoumání jejich shodnosti. Tato metrika je znatelně spolehlivější a přenáší problém na to jak porovávat jednotlivé snímky dvou videí mezi sebou. Na tuto problematiku existuje mnoho algoritmů od jednoduchého součtu odchylek barev jednotlivých pixelů až po komplexní algoritmy které by měly zahrnovat i nedokonalé vnímání lidským okem. V~této práci jsem zvolil z~této oblasti algoritmy PSNR a SSIM. Jedné se pravděpodobně o~nejčastěji používané algoritmy pro porovávání obrázků. Mezi další metriky se řadí například MSE nebo MSSIM, jedná se ale o algoritmy odvozené z PSNR nebo SSIM anebo o algoritmy podobné\cite{otherref}. +Jedna z~klíčových otázek této práce zní, jak poznat, které video je kvalitnější. Existuje mnoho přístupů k~této problematice. Jedním z~jednodušších je pouhé porovnání bitratu. Tato metrika je ale velmi nedostatečná, protože nezohledňuje mnoho faktorů, například různé kodeky pro enkódování. Další možností je porovnávání jednotlivých snímků videa a zkoumání jejich shodnosti. Tato metrika je znatelně spolehlivější a převádí problém na to, jak porovnávat jednotlivé snímky dvou videí mezi sebou. Na tuto problematiku existuje mnoho algoritmů od jednoduchého součtu odchylek barev jednotlivých pixelů až po komplexní algoritmy, které by měly zahrnovat i nedokonalé vnímání lidským okem. V~této práci jsem zvolil z~této oblasti algoritmy PSNR a SSIM (detaily o~SSIM jsou v~\autoref{SSIM}). Jedná se pravděpodobně o~nejčastěji používané algoritmy pro porovnávání obrázků. Mezi další metriky se řadí například MSE nebo MSSIM, jedná se ale o~algoritmy odvozené z~PSNR nebo SSIM a nebo o~algoritmy podobné\cite{otherref}. -Při použití metrik určených pro porovávání obrázků je ale potřeba výsledky z~porovnávání jednotlivých snímků aplikovat na celé video. K~tomuto problému je taktéž možno přistupovat několika způsoby, nejjednodušší je vzít průměr z~metrik pro jednotlivé snímky a ten prohlásit za výsledek. Tento výsledek může být ale velmi nepřesný a nedostatečný, například dostatečně nezohledňuje špičky a výkyvy v~jednotlivých snímcích a dále také není dobře použitelný pro metriky které mají nelineární průběh. O~něco lepší je použít medián výsledných hodnot. Medián sice částečně eliminuje některé problémy které má průměr, ale stále není dostatečný například proto, že nezohledňuje špičky a propady v~grafu. Toto je možné pozorovat na obrázcích níže. V~ideálním případě by závislost shodnosti snímku na čase měla konstantní průběh viz \ref{fig:theory_graph}, ale v~praxi bude graf vypadat spíše jako na obrázku \ref{fig:frames_comparsion}. Z~tohoto důvodu je nutné přijít s~vlastním algoritmem na vyhodnocování těchto dat. Je potřeba zohlednit špičky a propady v~kvalitě snímků a zohlednit i (ne)linearitu dané metriky. Také je žádoucí zohlednit množství informace na daném snímku, například čistě černé snímky budou většinou velmi podobné pokud ne přímo shodné, ale nepřináší nám informace o~kvalitě videosekvence. +Při použití metrik určených pro porovnávání obrázků je ale potřeba výsledky z~porovnávání jednotlivých snímků aplikovat na celé video. K~tomuto problému je taktéž možno přistupovat několika způsoby, nejjednodušší je vzít průměr z~metrik pro jednotlivé snímky a ten prohlásit za výsledek. Tento výsledek může být ale velmi nepřesný a nedostatečný, například nezohledňuje špičky a výkyvy v~jednotlivých snímcích a dále také není dobře použitelný pro metriky, které mají nelineární průběh. O~něco lepší je použít medián výsledných hodnot. Medián sice částečně eliminuje některé problémy, které má průměr, ale stále není dostatečný například proto, že nezohledňuje špičky a propady v~grafu. Toto je možné pozorovat na obrázcích \ref{fig:theory_graph}, \ref{fig:frames_comparsion}. V~ideálním případě by závislost shodnosti snímku na čase měla konstantní průběh viz \ref{fig:theory_graph}, ale v~praxi bude graf vypadat spíše jako na obrázku \ref{fig:frames_comparsion}. Z~tohoto důvodu je nutné přijít s~vlastním algoritmem na vyhodnocování těchto dat. Je potřeba zohlednit špičky a propady v~kvalitě snímků a zohlednit i (ne)linearitu dané metriky. Také je žádoucí zohlednit množství informace na daném snímku, například čistě černé snímky budou většinou velmi podobné, pokud ne přímo shodné, ale nepřináší nám informace o~kvalitě videosekvence. \begin{figure}\centering -\includegraphics[width=\textwidth]{./IMG/graph_const.pdf} \caption{Teoretický ideální Graf kvalit jednotlivých snímků ve videu} +\includegraphics[width=\textwidth]{./IMG/graph_const.pdf} \label{fig:theory_graph} \end{figure} @@ -78,42 +106,44 @@ \section{Metriky pro porovnávání videa} \end{figure} -Další možností porovnávání kvality videa je porovávání vidoesekvencí jako celku, nikoliv pouze porovávání jednotlivých snímků. Díky tomu je možné zachytit i přechody mezi snímky, například pomocí pohybového vektoru, a jejich kvalitu. Tyto algoritmy jsou podstatně náročnější ale mají také přesnější výsledky. Příklad takovéhoto algoritmu je stVSSIM, který budu v této práci také implementovat. Tento algoritmus vychází z~algoritmu SSIM ale zohledňuje i předchozí a následující snímky při porovávání. Taktéž zde částečně odpadá nutnost řešit vyhodnocení výsledků z~jednotlivých snímků, protože tento algoritmus je již určen pro porovnávání kvality videa. +Další možností porovnávání kvality videa je porovnávání vidoesekvencí jako celku, nikoliv pouze porovnávání jednotlivých snímků. Díky tomu je možné zachytit i přechody mezi snímky, například pomocí pohybového vektoru, a jejich kvalitu. Tyto algoritmy jsou podstatně náročnější, ale mají také přesnější výsledky. Příklad takovéhoto algoritmu je stVSSIM (detaily o~stVSSIM jsou v~\autoref{STVSSIM}), který budu v~této práci také implementovat. Tento algoritmus vychází z~algoritmu SSIM, ale zohledňuje i předchozí a následující snímky při porovnávání. Taktéž zde částečně odpadá nutnost řešit vyhodnocení výsledků z~jednotlivých snímků, protože tento algoritmus je již určen pro porovnávání kvality videa. -V~neposlední řadě je možné kvalitu videa porovnávat na základě subjektivních sledování videosnímků lidmi a následně statistického zpracování těchto výsledků. Tato problematika ale nespadá pod téma této práce a tudíž se v~této práci nebudu zabývat subjektivním porovnáváním. -\section{PSNR} -Peak signal-to-noise ratio (PSNR) do češtiny přeloženo jako špičkový poměr signálu k šumu\cite{PSNR}. Jedná se o poměr maximálního možného množství informace obsažené v signálu (v našem případě obrázku) ku množství šumu který ovlivňuje kvalitu tohoto signálu. Díky typicky velkému dynamickému rozsahu množství informace v signálu se PSNR udává v logaritmické škále a má jednodku dB. +V~neposlední řadě je možné kvalitu videa porovnávat na základě subjektivních sledování videosnímků lidmi a následně statistického zpracování těchto výsledků. Tato problematika však nespadá pod téma této práce, a tudíž se v~této práci nebudu zabývat subjektivním porovnáváním. -Předpoklad pro PSNR je, že máme 2 obrázky které mají stejné rozlišení a jsou uloženy ve 2D matici, indexované od $0,0$, po jednotlivých pixelech. \newline +\section{Metrika PSNR}\label{PSNR} +Peak signal-to-noise ratio (PSNR), do češtiny přeloženo jako špičkový poměr signálu k~šumu\cite{PSNR}. Jedná se o~poměr maximálního možného množství informace obsažené v~signálu (v~našem případě obrázku) k~množství šumu, který ovlivňuje kvalitu tohoto signálu. Díky typicky velkému dynamickému rozsahu množství informace v~signálu se PSNR udává v~logaritmické škále a má jednotku dB. + +Předpoklad pro PSNR je, že máme dva obrázky, které mají stejná rozlišení a jsou uloženy ve 2D matici, indexované od $0,0$, po jednotlivých pixelech. \newline Poté platí matematický zápis: \begin{equation} \mathit{PSNR} = 10 \cdot \log_{10} \left( \frac{\mathit{MAX}_I^2}{\mathit{MSE}} \right) \end{equation} -Kde platí, že $\mathit{MSE}$ (Mean Squared Error) - průměrná čtvercová odchylka je definována jako: +kde platí, že $\mathit{MSE}$ (Mean Squared Error) - průměrná čtvercová odchylka je definována jako: \begin{equation} \mathit{MSE} = \frac{1}{m\,n}\sum_{i=0}^{m-1}\sum_{j=0}^{n-1} [I(i,j) - K(i,j)]^2 \end{equation} -$\mathit{m,n}$ reprezentují šířku a výšku daného obrázku. \newline -$\mathit{I(j,k)}$ reprezentuje daný pixel v originálním obrázku. \newline -$\mathit{K(j,k)}$ reprezentuje daný pixel v testovaném obrázku. \newline -$\mathit{MAX}_I^2$ reprezentuje maximální hodnotu jednoho kanálu jednoho pixelu. \newline -Pro obrázky s více než jednou barevnou složkou je možné PSNR počítat pouze na jasové části a nebo může být použit stejný vzorec s úpravou výpočtu $\mathit{MSE}$ tak, že se postupně sečtou všechny barevné složky a následně se výsledek vydělí počtem složek\cite{PSNR2}. +$\mathit{m,n}$ reprezentují šířku a výšku daného obrázku \newline +$\mathit{I(j,k)}$ reprezentuje daný pixel v~originálním obrázku \newline +$\mathit{K(j,k)}$ reprezentuje daný pixel v~testovaném obrázku \newline +$\mathit{MAX}_I^2$ reprezentuje maximální hodnotu jednoho kanálu jednoho pixelu \newline +Pro obrázky s~více než jednou barevnou složkou je možné PSNR počítat pouze na jasové části a nebo může být použit stejný vzorec s~úpravou výpočtu $\mathit{MSE}$ tak, že se postupně sečtou všechny barevné složky a následně se výsledek vydělí počtem složek\cite{PSNR2}. -Průměrná čtvercová odchylka udává odlišnost originálního a testovaného obrázku. U shodných obrázků vyjde 0 a tudíž PSNR není možné matematicky vyjádřit. Z definice také plyne, že čím nižší je MSE, tím vyšší je PSNR a tudíž je testovaný obrázek blíže k originálu. Minimální hodnota PSNR je $0\mathit{dB}$, velmi dobrá hodnota je $50\mathit{dB}$\cite{50PSNR} ovšem tato hodnota závisí na obrázku a není možné takto porovávat různé obrázky, je možné porovnávat pouze stejný obrázek v různých kvalitách\cite{PSNR3}. Na obrázku \ref{fig:PSNR_image} je vidět ilustrace různých hodnot PSNR pro daný obrázek. +Průměrná čtvercová odchylka udává odlišnost originálního a testovaného obrázku. U~shodných obrázků vyjde 0, a tudíž PSNR není možné matematicky vyjádřit. Z~definice také plyne, že čím nižší je MSE, tím vyšší je PSNR a tudíž je testovaný obrázek blíže k~originálu. Minimální hodnota PSNR je $0 \mathit{dB}$, velmi dobrá hodnota je $50 \mathit{dB}$\cite{50PSNR} ovšem tato hodnota závisí na obrázku a není možné takto porovnávat různé obrázky, je možné porovnávat pouze stejný obrázek v~různých kvalitách\cite{PSNR3}. Na obrázku \ref{fig:PSNR_image} je vidět ilustrace různých hodnot PSNR pro daný obrázek. \begin{figure}[h]\centering \includegraphics[width=\textwidth]{./IMG/img95.png} -\caption{Srovnání obrázku v různých hodnotách PSNR} +\caption{Srovnání obrázku v~různých hodnotách PSNR} \label{fig:PSNR_image} \end{figure} -Mezi hlavní výhody algoritmu patří jeho implementační jednoduchost při uspokojivém výsledku. Hlavní slabinou tohoto algoritmu je, že je založen pouze na numerické odlišnosti jednotlivých pixelů a zcela ignoruje všechny biologické faktory vnímání obrázku lidským okem. Z tohoto důvodu jsou pro lepší přesnost doporučovány jiné algoritmy (například SSIM). Pro porovnání barevných obrázků je možné buď daný obrázek převést do jedné barevné složky (černobílý obraz), nebo počítat průměr ze všech barevných složek a nebo převést obrázek do barevného modelu který má jasovou složku a počítat PSNR pouze na jasové složce. Poslední zmíňený přístup se používá z důvodu vyšší citlivosti lidského oka na jasovou složku oproti ostatním složkám. -\section{SSIM} +Mezi hlavní výhody algoritmu patří jeho implementační jednoduchost při uspokojivém výsledku. Hlavní slabinou tohoto algoritmu je, že je založen pouze na numerické odlišnosti jednotlivých pixelů a zcela ignoruje všechny biologické faktory vnímání obrázku lidským okem. Z~tohoto důvodu jsou pro lepší přesnost doporučovány jiné algoritmy (například SSIM). Pro vylepšení přesností je možné počítat PSNR pouze na jasové složce z~důvodu vyšší citlivosti lidského oka na jasovou složku oproti ostatním složkám. +\section{Metrika SSIM} \label{SSIM} +Metrika SSIM - structural similarity vyjadřuje podobnost dvou obrazů. Mezi její hlavní výhody patří zaměřní tohoto algoritmu na způsob vnímání reality lidským okem \cite{SSIM1}. Výpočetní náročnost je přibližně stejná jako u~algoritmu PSNR, stejně jako PSNR i SSIM je tzv. full reference (plně referenční) metrika (pro svojí fukčnost potřebuje mít celý referenční obraz) \cite{SSIM1}. Dle autorů této metriky lépe koreluje se subjektivním hodnocením než metrika PSNR, toto tvrzení budu ověřovat v~\autoref{chap:eval}. Výpočet SSIM je prováděn nad jasovou složkou obrazu. Základní vzorec pro výpočet SSIM je \ref{eq:0}. \begin{equation} \label{eq:0} \mathit{SSIM}(x, y) = [l(x, y)]^{\alpha}\cdot[c(x, y)]^\beta\cdot[s(x, y)]^\gamma \end{equation} -Kdy musí platit, že $\alpha > 0$, $\beta > 0$ a $\lambda > 0$, v referenční verzi se používá $\alpha = \beta = \gamma = 1$\cite{SSIM1}. -Takto je výpočet SSIM rozdělen do 3 částí, srovnává se postupně jas, kontrast a struktura. Tyto tři veličiny jsou na sobě nezávislé. Nejprve je spočítán jas. Pro průměrnou hodnotu jasu platí vzorec \ref{eq:1} +Kdy musí platit, že $\alpha > 0$, $\beta > 0$ a $\lambda > 0$, v~referenční verzi se používá $\alpha = \beta = \gamma = 1$\cite{SSIM1}. +Takto je výpočet SSIM rozdělen do tří částí, srovnává se postupně jas, kontrast a struktura. Tyto tři veličiny jsou na sobě nezávislé. Nejprve je spočítán jas. Pro průměrnou hodnotu jasu platí vzorec \ref{eq:1} \begin{equation} \label{eq:1} \mu_x = \frac{1}{N}\sum_{i=1}^{N}x_i \end{equation} @@ -121,7 +151,7 @@ \section{SSIM} \begin{equation} \label{eq:2} l(x, y) = \frac{2\mu_x \mu_y + C_1}{\mu^2_x+\mu^2_y+C_1} \end{equation} -Následně je odečten průměrný jas složka z obrazu a za pomoci vzorce \ref{eq:3} je vypočítána standardní odchylka jednotlivých snímků. +Následně je odečtena průměrná jasová složka z~obrazu a za pomoci vzorce \ref{eq:3} je vypočítána standardní odchylka jednotlivých snímků. \begin{equation} \label{eq:3} \sigma_x = \left(\frac{1}{N-1}\sum_{i=1}^{N}(x_i-\mu_x)^2\right)^{1/2} \end{equation} @@ -135,12 +165,12 @@ \section{SSIM} s(x, y) = \frac{\sigma_{xy} + C_3}{\sigma_x\sigma_y+C_3} \end{equation} -Z toho $\sigma_{xy}$ se vypočítá dle \ref{eq:7}. +Z~toho $\sigma_{xy}$ se vypočítá dle \ref{eq:7}. \begin{equation}\label{eq:7} \sigma_{xy} = \frac{1}{N-1} \sum_{i=1}^{N} (x_i-\mu_x)(y_i-\mu_y) \end{equation} -Kde $\mu_x$ and $\mu_y$ představují průměr z originálního a testovaného obrázku. $\sigma_x$ a $\sigma_y$ představují standardní odchylku. $\sigma_x^2$ a $\sigma_y^2$ představují varianci. $\sigma_{xy}$ představuje kovariance těchto dvou obrázků. +Kde $\mu_x$ and $\mu_y$ představují průměr z~originálního a testovaného obrázku. $\sigma_x$ a $\sigma_y$ představují standardní odchylku. $\sigma_x^2$ a $\sigma_y^2$ představují varianci. $\sigma_{xy}$ představuje kovariance těchto dvou obrázků. Na obrázku \ref{fig:ssim} je možné vidět jednotlivé kroky procesu tvorby SSIM indexu. \begin{figure}[h]\centering \includegraphics[width=\textwidth]{./IMG/ssim.png} @@ -153,24 +183,25 @@ \section{SSIM} \begin{equation}\label{eq:6} \mathit{SSIM}(x, y) = \frac{(2 \mu_x \mu_y + C1) (2 \sigma_{xy} + C2)}{(\mu_x^2+\mu_y^2+C1)(\sigma_x^2+\sigma_y^2+C2} \end{equation} -$C_1, C_2$ a $C_3$ jsou použity pro eliminaci nestability výsledků když některá z hodnot $\mu_x^2+\mu_y^2$ nebo $\sigma_x^2+\sigma_y$ bude blízká k nule. Pro zjednodušení je možné uvažovat, že $C_1=C_2=C_3=0$. Po tomto zjednodušení by vzorec korespondoval s $\mathit{UQI}$(universal quality index). V SSIM metrice jsou $C_1, C_2$ definovány jako $C_1=(K_1L)^2$ respektive $C_2=(K_2L)^2$ kde $L$ je dynamický rozsah hodnoty pixelu (255 pro jasovou složku 8 bit obrázku) a $K$ je konstanta výrazně menší než 1. Běžně se používají hodnoty $K_1=0.01$ a $K_2=0.03$ \cite{SSIM2}. +$C_1, C_2$ a $C_3$ jsou použity pro eliminaci nestability výsledků, když některá z~hodnot $\mu_x^2+\mu_y^2$ nebo $\sigma_x^2+\sigma_y$ bude blízká k~nule. Pro zjednodušení je možné uvažovat, že $C_1=C_2=C_3=0$. Po tomto zjednodušení by vzorec korespondoval s~$\mathit{UQI}$(universal quality index). V~SSIM metrice jsou $C_1, C_2$ definovány jako $C_1=(K_1L)^2$ respektive $C_2=(K_2L)^2$, kde $L$ je dynamický rozsah hodnoty pixelu (255 pro jasovou složku 8 bit obrázku) a $K$ je konstanta výrazně menší než 1. Běžně se používají hodnoty $K_1=0.01$ a $K_2=0.03$ \cite{SSIM2}. + +Hodnoty $\mu_x$, $\sigma_x$ a $\sigma_{xy}$ se počítají na blocích $8\times8$ pixelů, toto okno se postupně posouvá po celém obrazu, je možné posouvat po jednom nebo více pixelech pro zvýšení rychlosti výpočtu za cenu snížení přesnosti výpočtu. +Pro vypočítání SSIM pro celý snímek se poté použije průměr z~výsledků SSIM pro $8\times8$ okna. Pro zvýšení přesnosti tohoto algoritmu je možné použít vážený průměr nebo heuristiku zohledňující bloky s~horším výsledkem\cite{stVSSIM}. -Hodnoty $\mu_x$, $\sigma_x$ a $\sigma_{xy}$ se počítají na blocích $8\times8$ pixelů, toto okno se postupně posouvá po celém obrazu, je možné posouvat toto okno po 1 nebo více pixelech pro zvýšení rychlosti výpočtu za cenu snížení přesnosti výpočtu. -Pro vypočítání SSIM pro celý snímek se poté použije průměr z výsledků SSIM pro $8\times8$ okna. Pro zvýšení přesnosti tohoto algoritmu je možné použít vážený průměr nebo heuristiku zohledňující bloky s horším výsledkem\cite{stvssim}. +Metrika SSIM má oproti metrice PSNR výhodu v~tom, že zohledňuje vnímání obrazu lidským okem a nepočítá pouze absolutní odchylku od výchozího zdroje, například zohledňuje citlivost lidského oka na jasovou složku obrázku. V~metrice SSIM je také využito maskování postupně průměrného jasu a kontrastu pro získání nezávislých výsledků při počítání kontrastu a struktury. Metrika SSIM se opírá o~myšlenku, že pixely, zejména ty které jsou blízko sebe, mají silnou závislost. Tato závislost obsahuje důležité množství informace ohledně struktury objektů v~obrázku. +Je ovšem výpočetně náročnější oproti PSNR. Stejně jako PSNR je určena pro porovnávání snímků a nikoliv videí, tudíž pro mé využití je potřeba tento algoritmus rozšířit, aby byl použitelný i na video. -SSIM má oproti PSNR výhodu v tom, že zohledňuje vnímání obrazu lidským okem a nepočítá pouze absolutní odchylku od výchozího zdroje, například lidské oko je citilivější na jasovou složku obrázku oproti jiným složkám. V SSIM je také využito maskování postupně průměrného jasu a kontrastu pro získání nezávislých výsledků při počítání kontrastu a struktury. SSIM se opírá o myšlenku, že pixely, zejména ty které jsou blízko sebe, mají silnou závislost. Tato závislost obsahuje důležité množství informace ohledně struktury objektů v obrázku. -Je ovšem výpočetně náročnější oproti PSNR. Stejně jako PSNR je určena pro porovávání snímků a nikoliv videí, tudíž pro mé využití je potřeba tento algoritmus rozšířit aby byl použitelný i na video. +\section{Metrika stVSSIM} \label{STVSSIM} +Metrika spatio-temporal video SSIM\cite{stVSSIM} je další z~algoritmů na porovnávání kvality videí. Narozdíl od algoritmů SSIM a PSNR, které porovnávají pouze jednotlivé snímky mezi sebou, stVSSIM algoritmus zohledňuje i okolní snímky videa. Jedná se o~plně referenční metriku, stejně jako PSNR a SSIM. Inspirací pro stVSSIM byl Motion-based Video Integrity Evaluation(MOVIE) index\cite{MOVIE}. MOVIE index se sice ukázal být poměrně přesný, ale výpočetně velmi náročný. Proto byl navržen spatio-temporal video SSIM algoritmus. -\section{stVSSIM} -!!když bude málo textu, dá se psát nějaká teorie o MOVIE!! FIXME -Algoritmus spatio-temporal video SSIM\cite{stvssim} je další z algoritmů na porovnávání kvality videí. Narozdíl od algoritmů SSIM i PSNR, které porovnávají pouze jednotlivé snímky mezi sebou, stVSSIM algoritmus zohledňuje i okolní snímky videa. Jedná se o full reference metriku, stejně jako PSNR a SSIM. Inspirací pro stVSSIM byl Motion-based Video Integrity Evaluation(MOVIE) index\cite{MOVIE}. MOVIE index se ale ukázal být sice poměrně přesný, ale výpočetně velmi náročný. Proto byl navržen spatio-temporal video SSIM algoritmus. +Spatio-temporal video SSIM využívá pohybové informace získané z~blokově založeného algoritmu na odhad pohybu, při použití sady časoprostorových filtrů. Algoritmus stVSSIM se snaží o~zachování kvality algoritmu MOVIE při snížení potřebného výpočetního výkonu. -Spatio-temporal video SSIM využívá pohybové informace získané z blokově založeného algoritmu na odhad pohybu při použití sady časoprostorových filtrů. stVSSIM se snaží o zachování kvality algoritmu MOVIE při snížení potřebného výpočetního výkonu. +Algoritmus stVSSIM využívá metriku SSIM popsanou v~předchozí kapitole na měření kvality jednotlivých snímků. Tato metrika velmi dobře koreluje se subjektivním pozorováním při porovnávání kvality snímků\cite{SSIM3}. Vyhodnocování kvality v~časové rovině je dosaženo rozšířením SSIM o~časoprostorovou doménu, kterou autoři této metriky nazývají SSIM-3D. -stVSSIM využívá metriku SSIM popsanou v předchozí kapitole na měření kvality jednotlivých snímků, tato metrika velmi dobře koreluje se subjektivním pozorováním při porovnávání kvality snímků\cite{SSIM3}. Vyhodnocování kvality v časové rovině je dosaženo rozšířením SSIM o časoprostorovou doménu, kterou autoři této metriky nazývají SSIM-3D. +\subsection{Algoritmus SSIM-3D} +SSIM je počítána z~jednoho snímku po blocích dané velikosti(typicky $8\times8$ pixelů), při SSIM-3D je přidána ještě časová osa. -\subsection{SSIM-3D} -SSIM je počítáno z jednoho snímku po blocích dané velikosti(typicky $8\times8$ pixelů), při SSIM-3D je přidána ještě časová osa. Vezměme si pixel na souřadnicích $(i,j,k)$ kde (i,j) jsou prostorové souřadnice daného pixelu v rámsci daného obrazu a $k$ značí číslo snímku. V tomto případě nás při každém výpočtu zajímá blok pixelů v okolí pixelu $(i,j,k)$. Definujme $\alpha, \beta$ jako rozměry v prostoru a $\gamma$ jako počet snímků. V případě real-time implementace tohoto algoritmu, by bylo využito $\gamma -1$ předchozích snímků a současný, v této práci ale nepotřebujeme vyhodnocovat kvalitu v real-time a proto budou brány i následující snímky. při každém vyhodnocovaném snímku tedy budou brány snímky $k-\gamma/2$ až $k+\gamma/2$. Pro pixel $(i,j,k)$ je tedy možné určit blok jako všechny pixely mezi: +Vezměme si pixel na souřadnicích $(i,j,k)$, kde (i,j) jsou prostorové souřadnice daného pixelu v~rámci daného obrazu a $k$ značí číslo snímku. V~tomto případě nás při každém výpočtu zajímá blok pixelů v~okolí pixelu $(i,j,k)$. Definujme $\alpha, \beta$ jako rozměry v~prostoru a $\gamma$ jako počet snímků. V~případě real-time implementace tohoto algoritmu by bylo využito $\gamma -1$ předchozích snímků a současný. V~této práci ale nepotřebujeme vyhodnocovat kvalitu v~real-time, a proto budou brány i následující snímky. Pro každý vyhodnocovaný snímek tedy budou brány snímky $k-\gamma/2$ až $k+\gamma/2$. Pro pixel $(i,j,k)$ je tedy možné určit blok jako všechny pixely mezi: $$(i-\left \lfloor{\frac{\alpha}{2}}\right \rfloor,j-\left \lfloor{\frac{\beta}{2}}\right \rfloor,k-\left \lfloor{\frac{\gamma}{2}}\right \rfloor)$$ $$(i-\left \lfloor{\frac{\alpha}{2}}\right \rfloor,j+\left \lfloor{\frac{\beta}{2}}\right \rfloor,k-\left \lfloor{\frac{\gamma}{2}}\right \rfloor)$$ $$(i+\left \lfloor{\frac{\alpha}{2}}\right \rfloor,j-\left \lfloor{\frac{\beta}{2}}\right \rfloor,k-\left \lfloor{\frac{\gamma}{2}}\right \rfloor)$$ @@ -180,7 +211,7 @@ \subsection{SSIM-3D} $$(i-\left \lfloor{\frac{\alpha}{2}}\right \rfloor,j+\left \lfloor{\frac{\beta}{2}}\right \rfloor,k+\left \lfloor{\frac{\gamma}{2}}\right \rfloor)$$ $$(i+\left \lfloor{\frac{\alpha}{2}}\right \rfloor,j-\left \lfloor{\frac{\beta}{2}}\right \rfloor,k+\left \lfloor{\frac{\gamma}{2}}\right \rfloor)$$ $$(i+\left \lfloor{\frac{\alpha}{2}}\right \rfloor,j+\left \lfloor{\frac{\beta}{2}}\right \rfloor,k+\left \lfloor{\frac{\gamma}{2}}\right \rfloor)$$ -Referenční hodnoty jsou $\alpha=\beta=11$ a $\gamma=33$. Tyto hodnoty vychází z algoritmů SSIM a MOVIE, kterýmy je metrika stVSSIM inspirována. Obdobně jako u metriky SSIM jsou použity následující vzorce. +Referenční hodnoty jsou $\alpha=\beta=11$ a $\gamma=33$. Tyto hodnoty vychází z~algoritmů SSIM a MOVIE, kterýmy je metrika stVSSIM inspirována. Obdobně jako u~metriky SSIM jsou použity následující vzorce. \begin{equation} \mu_{x(i,j,k)} = \sum_{m=1}^{\alpha}\sum_{n=1}^{\beta}\sum_{o=1}^{\gamma}w(m,n,o)x(m,n,o) \end{equation} @@ -197,11 +228,13 @@ \subsection{SSIM-3D} \begin{equation} \sigma_{x(i,j,k)y(i,j,k)} = \sum_{m=1}^{\alpha}\sum_{n=1}^{\beta}\sum_{o=1}^{\gamma}w(m,n,o)(x(m,n,o)-\mu_{x(i,j,k)})(y(m,n,o)-\mu_{y(i,j,k)}) \end{equation} -Výpočet celého SSIM-3D pro pixel $(i,j,k)$ je zobrazen v rovnici \ref{eq:ssim3d}. +Výpočet celého SSIM-3D pro pixel $(i,j,k)$ je zobrazen v~rovnici \ref{eq:ssim3d}. \begin{equation}\label{eq:ssim3d} \mathit{\ssim3d} = \frac{(2 \mu_{x(i,j,k)} \mu_{y(i,j,k)} + C1) (2 \sigma_{x(i,j,k)y(i,j,k)} + C2)}{(\mu_{x(i,j,k)}^2+\mu_{y(i,j,k)}^2+C1)(\sigma_{x(i,j,k)}^2+\sigma_{y(i,j,k)}^2+C2} \end{equation} -Konstanty $C1$ a $C2$ jsou stejné jako v případě SSIM. Váhová funkce $w$ záleží na typu filtru který je použit. V případě SSIM-3D jsou použity 4 různé filtry, viz obrázky \ref{fig:filter_vertical}, \ref{fig:filter_horizontal}, \ref{fig:filter_left}, \ref{fig:filter_right}. $w(m,n,o)$ nabývá hodnoty 1 pokud bod $(m,n,o)$ leží v rovině daného filtru, v opačném případě nabývá hodnoty 0. $m$ a $n$ značí horizontální a vertikální pozici od výchozího pixelu z bloku pixelů. Záporné hodnoty značí pixely vlevo od tohoto pixelu a naopak. $o$ značí číslo snímku od výchozího snímku. Záporné hodnoty $o$ značí předchozí snímky a naopak. V referenčním publikaci jsou spočítány SSIM-3D hotnoty pro všechny 4 filtry pro každý (i,j,k) pixel a následně je jich pří výpočtu vybrána pouze část. Který filtr bude použit se rozhoduje podle odhadu pohybového vektoru. Tento odhad pohybového vektoru je vypočítán z aktuálního a předchozího snímku při použití bloku $8 \times 8$. Použití bloku $8 \times 8$ je zapříčiněno velmi četným použitím právě tohoto bloku při kompresích videa, moderní kompresní algoritmy ale používají proměnnou velikost bloku a z toho důvodu je vhodné zkusit změnit velikost bloku. Pro výpočet pohybového vektoru je použit algoritumus Adaptive Rood Pattern Search (ARPS)\cite{ARPS}. +Konstanty $C1$ a $C2$ jsou stejné jako v~případě metriky SSIM. Váhová funkce $w$ záleží na typu filtru, který je použit. V~případě algoritmu SSIM-3D jsou použity 4 různé filtry, viz obrázky \ref{fig:filter_vertical}, \ref{fig:filter_horizontal}, \ref{fig:filter_left}, \ref{fig:filter_right}. Váhová funkce $w(m,n,o)$ nabývá hodnoty 1, pokud bod $(m,n,o)$ leží v~rovině daného filtru, v~opačném případě nabývá hodnoty 0. Souřadnice $m$ a $n$ značí horizontální a vertikální pozici od výchozího pixelu z~bloku pixelů. Záporné hodnoty značí pixely vlevo od tohoto pixelu a naopak. + +Souřadnice $o$ značí číslo snímku od výchozího snímku. Záporné hodnoty $o$ značí předchozí snímky a naopak. V~referenční publikaci jsou spočítány SSIM-3D hotnoty pro všechny 4 filtry pro každý (i,j,k) pixel a následně je jich při výpočtu vybrána pouze část. Který filtr bude použit se rozhoduje podle odhadu pohybového vektoru. Tento odhad pohybového vektoru je vypočítán z~aktuálního a předchozího snímku při použití bloku $8 \times 8$. Použití bloku $8 \times 8$ je zapříčiněno velmi četným použitím právě tohoto bloku při kompresích videa. Moderní kompresní algoritmy ale používají proměnnou velikost bloku a z~toho důvodu je vhodné zkusit změnit velikost bloku. Pro výpočet pohybového vektoru je použit algoritumus Adaptive Rood Pattern Search (ARPS)\cite{ARPS}. \begin{figure}[h]\centering \includegraphics[width=\textwidth]{./IMG/filter-vertical.pdf} \caption{Vertikální filtr} @@ -222,11 +255,12 @@ \subsection{SSIM-3D} \caption{Vertikální filtr} \label{fig:filter_left} \end{figure} -\subsection {ARPS} +\subsection {Algoritmus ARPS} +\label{arps} \subsubsection{Popis algoritmu} -Adaptive Rood Pattern Search (ARPS)\cite{ARPS} je algoritmus, který se zabývá hledáním pohybových vektorů ve videu. Pohybový vektor (motion vector) je způsob reprezentace bloku v daném snímku na základě stejného (nebo podobného) bloku v předchozím snímku. Pro nalezení pohybového vektoru je potřeba nalézt v předchozím snímku co blok co nejpodobnější aktuálnímu bloku. Při videokompresi se často používají pohybové vektory, protože následující snímek je často alespoň částečně tvořen pouze posunutím předchozího snímku, nebo jeho části. Tohoto algoritmu je využíváno zejména při kompresi videí. Hledání pohybových vektorů je časově nejnáročnější akce při kompresi videa a proto může tvořit velké omezení při kompresi/enkódování videa. Algoritmus ARPS se snaží přinést dostatečně efektivní způsob, který bude ale také mnohem méně výpočetně náročný než například celé prohledávání hrubou silou. +Adaptive Rood Pattern Search (ARPS)\cite{ARPS} je algoritmus, který se zabývá hledáním pohybových vektorů ve videu. Pohybový vektor (motion vector) je způsob reprezentace bloku v~daném snímku na základě stejného (nebo podobného) bloku v~předchozím snímku. Pro nalezení pohybového vektoru je potřeba nalézt v~předchozím snímku blok co nejpodobnější aktuálnímu bloku. Při videokompresi se často používají pohybové vektory, protože následující snímek je často alespoň částečně tvořen pouze posunutím předchozího snímku, nebo jeho části. Tohoto algoritmu je využíváno zejména při kompresi videí. Hledání pohybových vektorů je časově nejnáročnější akcí při kompresi videa, a proto může tvořit velké omezení při kompresi/enkódování videa. Algoritmus ARPS se snaží přinést dostatečně efektivní způsob, který bude ale také mnohem méně výpočetně náročný než například celé prohledávání hrubou silou. -Jednou z důležitých vlastností tohoto algoritmu je předpoklad, že okolní bloky mají podobný pohybový vektor, pohybový vektor získaný z okolních bloků budeme nazývat předpovídaný pohybový vektor. Okolní bloky mohou být buď časové, nebo prostorové, intuitivně by blok na stejné prostorové pozici v předchozím snímku mohl mít podobný pohybový vektor, ale z důvodu vysoké paměťové náročnosti tohoto řešení bylo v referenčním řešení zvoleno využití sousedních prostorových bloků. Protože každý snímek je zpracováván postupně po blocích v jednotlivých řadách, jsou k dispozici pohybové vektory okolních bloků viz obrázek \ref{fig:nearby}. Na zmíněném obrázku je červeně znázorněn právě ověřovaný blok a šedě bloky které jsou použity pro odhad okolních bloků. Typ B je často používán při video kompresi, například i u populárního kodeku H263\cite{H263}. Předpovídaný pohybový vektor se spočítá jako medián z okolních pohybových vektorů. V případě bloku na okraji snímků jsou použity bloky jako na obrázku \ref{fig:border}. Místo mediánu je možné použít průměr nebo jiné složitejší metody, ty ale vzhledem k zanedbatelnému přínosu v přesnosnosti a rychlosti nemá smysl používat. Dle \cite{ARPS} je velmi malý rozdíl v přesnosti a výkonu při používání různých podporujících sousedních bloků, z toho důvodu byl použit typ D. +Jednou z~důležitých vlastností tohoto algoritmu je předpoklad, že okolní bloky mají podobný pohybový vektor. Pohybový vektor získaný z~okolních bloků budu nazývat předpovídaný pohybový vektor. Okolní bloky mohou být buď časové, nebo prostorové, intuitivně by blok na stejné prostorové pozici v~předchozím snímku mohl mít podobný pohybový vektor, ale z~důvodu vysoké paměťové náročnosti tohoto řešení bylo v~referenčním řešení zvoleno využití sousedních prostorových bloků. Protože každý snímek je zpracováván postupně po blocích v~jednotlivých řadách, jsou k~dispozici pohybové vektory okolních bloků viz obrázek \ref{fig:nearby}. Na uvedeném obrázku je červeně znázorněn právě ověřovaný blok a šedě bloky, které jsou použity pro odhad okolních bloků. Typ B je často používán při video kompresi, například i u~populárního formátu H263\cite{H263}. Předpovídaný pohybový vektor se spočítá jako medián z~okolních pohybových vektorů. V~případě bloku na okraji snímků jsou použity bloky jako na obrázku \ref{fig:border}. Místo mediánu je možné použít průměr nebo jiné složitejší metody. Ty ale vzhledem k~zanedbatelnému přínosu v~přesnosnosti a rychlosti nemá smysl používat. Dle \cite{ARPS} je velmi malý rozdíl v~přesnosti a výkonu při používání různých podporujících sousedních bloků, z~toho důvodu v~implementaci použiji typ D. \begin{figure}[h]\centering \includegraphics[width=\textwidth]{./IMG/ROS.pdf} \caption{Typy podporujících sousedních bloků} @@ -234,11 +268,11 @@ \subsubsection{Popis algoritmu} \end{figure} \begin{figure}[h]\centering \includegraphics[width=\textwidth]{./IMG/border_ROS.pdf} -\caption{Podporující sousední bloky u okrajů} +\caption{Podporující sousední bloky u~okrajů} \label{fig:border} \end{figure} -Algoritmus ARPS se snaží najít vzor aktuálního bloku dle kříže, jak je znázorněno na obrázku \ref{fig:rood}. Na tomto obrázku je vidět jak využití pohybového vektoru z předchozího snímku, který byl $(2,-1)$, tak využití 4 okolních bodů a středu. Vzdálenost okolních bodů od středu ($\Gamma$) může být dána například rovnicí \ref{eq:dist}. Alternativně je možné použít rovnici \ref{eq:dist2}. Protože druhá zmíněná rovnice nevyžaduje ani zaokrouhlování, ani umocňování a odmocňování, je mnohem méně výpočetně náročná. Protože v praxi nepřináší první rovnice lepší přesnost, bude použita rovnice \ref{eq:dist2}. Pokud není dostupný předchozí blok, tak bude použita vzdálenost 2 pixely, tedy $\Gamma=2$. +Algoritmus ARPS se snaží najít vzor aktuálního bloku dle kříže, jak je znázorněno na obrázku \ref{fig:rood}. Na tomto obrázku je vidět jak využití pohybového vektoru z~předchozího snímku, který byl $(2,-1)$, tak využití 4 okolních bodů a středu. Vzdálenost okolních bodů od středu ($\Gamma$) může být dána například rovnicí \ref{eq:dist}. Alternativně je možné použít rovnici \ref{eq:dist2}. Protože druhá zmíněná rovnice nevyžaduje ani zaokrouhlování, ani umocňování a odmocňování, je mnohem méně výpočetně náročná. Protože při mé implementaci nepřinášela první rovnice jiné výsledky, budu používat rovnici \ref{eq:dist2}. Pokud není dostupný předchozí blok, bude použita vzdálenost 2 pixely, tedy $\Gamma=2$. \begin{figure}[h]\centering \includegraphics[width=\textwidth]{./IMG/rood.pdf} \caption{Graf potenciálních kandidátů na vzor aktuálního bloku} @@ -253,56 +287,875 @@ \subsubsection{Popis algoritmu} Pro zjištění shodnosti daného bloku se vzorem je použita suma absolutních rozdílů pixelů mezi vzorem a daným blokem. -Další vlastností algoritmu ARPS je takzvaný předsudek nulového pohybu (zero-motion prejudgment). Tento předsudek očekává, že ve většině bloků nedochází k žádnému pohybu, jako klasický příklad může být uvedena telekonference, kde po většinu doby nedochází k žádnému pohybu nebo jen ve velmi omezené části obrazu. Algoritmus tedy v prvním kroku spočítá sumu absolutních rozdílů oproti stejně umístěnému bloku v předchozích snímků a pokud je tato suma nižší, než stanovená hranice, tak již výpočet nepokračuje a je bráno, že zde nedošlo k žádnému pohybu. Tato hranice je v referenční verzi algoritmu stanovena na odchylku 2 na každém pixelu, čili při velikosti $8 \times 8$ je možné stanovit hranici na $T=128$. Tuto hranici je možné posunout, čim výše je tato hranice nasazena, tím lepší dosáhneme zrychlení tohoto algoritmu, ale ztrácíme přesnost výpočtu. +Další vlastností algoritmu ARPS je takzvaná premisa nulového pohybu (zero-motion prejudgment). Tento předsudek očekává, že ve většině bloků nedochází k~žádnému pohybu. Jako klasický příklad může být uvedena telekonference, kde po většinu doby nedochází k~žádnému pohybu, nebo jen ve velmi omezené části obrazu. Algoritmus tedy v~prvním kroku spočítá sumu absolutních rozdílů oproti stejně umístěnému bloku v~předchozích snímcích, a pokud je tato suma nižší než stanovená hranice, tak již výpočet nepokračuje a je bráno, že zde nedošlo k~žádnému pohybu. Tato hranice je v~referenční verzi algoritmu stanovena na odchylku 2 na každém pixelu, tedy při velikosti $8 \times 8$ je možné stanovit hranici na $T=128$. Tuto hranici je možné posunout, čim výše je tato hranice nasazena, tím lepší dosáhneme zrychlení tohoto algoritmu, ale ztrácíme přesnost výpočtu. \subsubsection{Výpočet ARPS} -Jak bylo již zmíněno dříve, budeme používat D typ podporujícího sousedního bloku dle obrázku \ref{fig:nearby}. Pro všechny nejlevější bloky použijeme $\Gamma=2$. Hranice pro nulový pohyb bude v našem případě $T=128$. +Jak bylo již zmíněno dříve, budu používat D typ podporujícího sousedního bloku dle obrázku \ref{fig:nearby}. Pro všechny nejlevější bloky použijeme $\Gamma=2$. Hranice pro nulový pohyb bude v~našem případě $T=128$. \begin{enumerate} -\item Spočítáme sumu absolutních rozdílů oproti stejně umístěnému bloku v předchozím snímku. Pokud je tato suma menší nebo rovna 128, pak ukončíme algoritmus a vrátíme pohybový vektor o hodnotě $(0,0)$ předpokládáme tedy nulový posuv. -\item Pokud je aktuální blok nelevější v daném snímku, nastavíme $\Gamma=2$, v opačném případě nastavíme $\Gamma= \mathit{Max}(\left|MV_{predicted}(x)\right|,\left|MV_{predicted}(x)\right|)$ -\item Nastavíme střed kříže, který je znázorněn na obrázku \ref{fig:rood}, na stejné souřadnice jako je aktuální blok. -\item Spočítáme sumy absolutních rozdílů pro bloky se středy danými těmito body. Pokud nám vyjde střed jako bod s nejnižší sumou rozdílů, tak vracíme rozdíl souřadnic, který reprezentuje pohybový vektor. -\item V opačném případě nastavíme střed kříže na bod s nejnižším absolutním rozdílem a opakujeme bod 3. +\item Spočítáme sumu absolutních rozdílů oproti stejně umístěnému bloku v~předchozím snímku. Pokud je tato suma menší nebo rovna 128, pak ukončíme algoritmus a vrátíme pohybový vektor o~hodnotě $(0,0)$ předpokládáme tedy nulový posuv. +\item Pokud je aktuální blok nelevější v~daném snímku, nastavíme $\Gamma=2$, v~opačném případě nastavíme $\Gamma= \mathit{Max}(\left|MV_{predicted}(x)\right|,\left|MV_{predicted}(x)\right|)$ +\item Nastavíme střed kříže, který je znázorněn na obrázku \ref{fig:rood}, na stejné souřadnice, jako je aktuální blok. +\item Spočítáme sumy absolutních rozdílů pro bloky se středy danými těmito body. Pokud vyjde střed jako bod s~nejnižší sumou rozdílů, vracíme rozdíl souřadnic, který reprezentuje pohybový vektor. +\item V~opačném případě nastavíme střed kříže na bod s~nejnižším absolutním rozdílem a opakujeme bod 3. \end{enumerate} -Pro snížení výpočetní náročností je vhodné implementovat nějakým způsobem identifikování, zda-li už byla spočítána odchylka daného bodu, například pomocí bit mapy. -Takto se postupně dostaneme do bodu, který budeme používat jako vzor pro náš aktuální blok. +Pro snížení výpočetní náročnosti je vhodné implementovat nějakým způsobem identifikování, zdali už byla spočítána odchylka daného bodu, například pomocí bitmapy. +Takto se postupně dostaneme do bodu, který budu používat jako vzor pro aktuální blok. \subsection {Využití ARPS} -Poté, co je spočítán pohybový vektor daného bloku, je potřeba rozhodnout, který filtr bude použit. Je možné použít vážené průměry těchto filtrů dle směrového vektoru, pro snížení výpočetní náročnosti je ale také možné použít hladový algoritmus a zvolit filtr který je nejbližší vzniklému pohybovému vektoru. Tím se vyhneme například výpočtům s desetinými čísly. Pokud je vzniklý pohybový vektor přesně mezi dvěmi filtry, je použit průměr z těchto dvou filtrů. Pokud je pohybový vektor roven $(0,0)$, pak použijeme průměr ze všech čtyř filtrů. V nejhorším případě bude výpočetně nejnáročnější operací dělení čtyřmi, což lze ale implementovat pomocí bitového posunu, proto lze označit tuto část výpočtu za výpočetně nenáročnou. +Poté, co je spočítán pohybový vektor daného bloku, je potřeba rozhodnout, který filtr bude použit. Je možné použít vážené průměry těchto filtrů dle směrového vektoru, pro snížení výpočetní náročnosti je ale také možné použít hladový algoritmus a zvolit filtr, který je nejbližší vzniklému pohybovému vektoru. Tím se vyhneme například výpočtům s~desetinnými čísly. Pokud je vzniklý pohybový vektor přesně mezi dvěma filtry, je použit průměr z~těchto dvou filtrů. Pokud je pohybový vektor roven $(0,0)$, pak použijeme průměr ze všech čtyř filtrů. V~nejhorším případě bude výpočetně nejnáročnější operací dělení čtyřmi, což lze ale implementovat pomocí bitového posunu, proto lze označit tuto část výpočtu za výpočetně nenáročnou. \subsection{Výpočet stVSSIM} -Na každý pixel z daného snímku aplikujeme SSIM-3D. V referenční verzi je použit nejhorších 6\% z výsledků SSIM-3D pro daný snímek, je ale také možné použít průměr všech výsledků SSIM-3D. Výsledek pro časovou doménu celého video snímku($T_{video}$) je spočítán jako průměr výsledků jednotlivých snímků, stejně jako je výsledek pro prostorovou rovinu($S_{video}$) spočítán jako průměr výsledků SSIM pro jednotlivé snímky. V referenční implementaci se počítá SSIM i SSIM-3D pouze z každého šestnáctého nsímku. Výsledný index stVSSIM je následně spočítán jako \ref{eq:stvssim}. -\begin{equation} \label{eq:stvssim} +Na každý pixel z~daného snímku aplikujeme algoritmus SSIM-3D. V~referenční verzi je použit nejhorších 6 \% z~výsledků SSIM-3D pro daný snímek. Je ale také možné použít průměr všech výsledků SSIM-3D. Výsledek pro časovou doménu celého video snímku($T_{video}$) je spočítán jako průměr výsledků jednotlivých snímků, stejně jako je výsledek pro prostorovou rovinu($S_{video}$) spočítán jako průměr výsledků SSIM pro jednotlivé snímky. V~referenční implementaci \cite{stVSSIM} se počítá SSIM i SSIM-3D pouze z~každého šestnáctého snímku. Výsledný index stVSSIM je následně spočítán jako \ref{eq:stVSSIM}. +\begin{equation} \label{eq:stVSSIM} \mathit{stVSSIM} = T_{video}\times S_{video} \end{equation} + +\section{Zpracování a uložení videa} +Dále se v~této práci budu často zabývat tématem souvisejícím s~kodeky pro kódování videa, jeho kompresi a formáty uložení audia a videa. Velmi stručně v~této sekci popíšu, co to vlastně je video kodek a video formát a také velmi stručně popíši video formáty používané v~této práci. + +Kodek je program nebo obecně proces, který dokáže transformovat vstupní proud dat. Následně dokáže ukládat tento transformovaný proud dat v~zakódované podobě. Stejně tak je ale možné využít kodek pro dekódování takovéto sekvence zpět na tok dat co nejbližší původnímu toku dat. Video formát je specifikace kroků, které je potřeba vykonat na převod vstupního proudu dat na zakódovaný proud dat. Rozdíl mezi kodekem a formátem je, že formát je pouze obecná specifikace nějaké transformace, zatímco kodek je již konkrétní implementace této transformace. Využití kodeků je zejména pro kompresi multimediálních dat, jejich přenos po síti a případně i šifrování. Komprese může být buď ztrátová a nebo bezztrátová, ve video průmyslu se nejčastěji používají ztrátové kodeky, příkladem ztrátového kodeku je například h264 nebo VP9. Mezi známé bezztrátové kodeky patří například FLAC pro audio. Typický obsah video souboru je hlavička, která určuje, jaký kodek je použit a další informace o~souboru a samotný audio a video kanál, zakódovaný pomocí určeného kodeku. + +\subsection{Formát rawvideo} +Speciální kategorii tvoří formáty uložení audio/video streamu bez komprese a bez šifrování, nazývané též rawvideo\cite{rawvideo}. Tyto kodeky mohou mít různé formáty uložení dat, mezi tyto formáty patří například yuv420p (tento název je používán v~programu \cite{ffmpeg}, v~jiné literatuře je možné se setkat s~jiným názvem, například I420\cite{yuv}). YUV značí použití barevného modelu s~jasovou složkou (Y) a dvěma barevnými složkami. Jasová složka označuje množství jasu (pro více detailů viz \cite{jas} )na daném pixelu. Číslo 420 značí poměr počtu bytů vyhrazených pro Y kanál oproti ostatním složkám\cite{yuv}. Písmeno p na konci názvu tohoto formátu značí planární formát, tedy že jednotlivé složky jsou uloženy postupně pro celý snímek, nejprve je tedy uložena celá Y složka, poté U~a poté V\cite{yuv}. Mezi další formáty uložení takovýchto nekomprimovaných dat patří rgb24, jak již napovídá název, tento formát je založen na RGB barevném prostoru a na každý pixel jsou použity 3 bajty (24 bitů). +\subsection{Formát H.264} +H.264, často nazývaný také jako MPEG-4 AVC \cite{h264}, je jeden z~dnes nejpoužívanějších video formátů. Byl vyvinut pro HD (High-definition) videa, cílem návrhu tohoto formátu bylo vytvoření video formátu, který bude mít dobrou kvalitu videa při nižším datovém toku než jeho předchůdci (MPEG-2, MPEG-4 apod.). Je využíván na Blu-ray discích, stejně, jako je využíván pro DVB-T HD televizní vysílání, dále je také často využíván u~satelitního a kabelového televizního signálu. První specifikace tohoto formátu byla vydána v~roce 2003. Nyní je velmi rozšířen, pravděpodobně je stále nejrozšířenějším formátem HD videa na trhu. +\subsection{Formát H.265} +Formát H.265, označováný také jako HEVC (High Efficiency Video Coding), je nástupce H.264, zaměřuje se na HD videa a to až do kvality 8K ($8192\times4320$), zaměřuje se také na co největší možnost paralelizace zpracování tohoto formátu \cite{h265}. Jeho plánované využití je v~rámci standardu pozemního vysílání DVB-T2 \cite{dvbt2}. Dle autorů tohoto formátu je schopen poskytnout srovnatelnou kvalita videa jako jeho předchůdce při snížení datového toku o~50 \%\cite{h265}. Vzrostla však výpočetní složitost kodeků pro tento formát. Standardizován byl v~roce 2013 \cite{h265}. Na tento formát je několik patentů a za využití tohoto formátu je potřeba platit licenční poplatky. +\subsection{Formát VP9} +VP9 je formát vyvíjený firmou Google. Jedná se o~konkurenční formát k~formátu H.265. Typicky je uchováván ve webm kontejneru (soubor s~příponou .webm) a je velmi často používán pro videa na webu, například \url{https://youtube.com} využívá tento formát u~svých videí. Většina (téměř 77 \%) používaných prohlížečů podporuje a využívá webm kontejner a tudíž i VP9 formát. \cite{vp9_usage} Podporuje i bezztrátovou variantu nicméně častěji se používá klasická ztrátová varianta tohoto formátu. Stejně jako H.265 je určen pro videa s~rozlišením alespoň full HD ($1920 \times 1080px$ nebo obdobné). +\subsection{Constant Rate Factor} \label{crf} +CRF - Constant Rate Factor není formát ani kodek, ale velmi často se v~této souvislosti používá. Pokud je potřeba konvertovat nějaké video, je potřeba určit, jakou má mít výsledné video kvalitu. Tato kvalita je možná určit několika různými parametry (například datovým tokem nebo velikostí souboru. U~některých programů (například ffmpeg) na video konverzi je možné nastavit parametr crf, který nastaví kvalitu výstupního videa na nějakou hladinu. Při této metodě je hlavním kritériem udržení dané kvality v~průběhu celého videa. Velikost souboru a aktuální datový tok jsou méně důležité. Tato metoda zaručuje, že každý snímek dostane potřebný datový tok pro zachování určené kvality. Nevýhodou je však nemožnost určit velikost výsledného souboru. + +Rozsah CRF hodnoty je od 0 do 51, kdy 0 znamená bezztrátovou kompresi, 23 je výchozí hodnota a 51 je nejhorší možná hodnota. Rozumné hodnoty se udávají od 18 do 28\cite{crf}. Kvalita 18 by měla být vizuálně bezztrátová, nebo alespoň téměr bezztrátová, měla by tedy vypadat velmi podobně jako originál. + +Rozsah hodnot má exponenciální měřítko, tudíž zvýšení hodnoty CRF o~šest zhruba znamená snížení datového toku videa na polovinu. + + \chapter{Analýza} +V~této kapitole popíšu vlastnosti a možnosti nástrojů, které budu následně využívat při implementaci. Zaměřím se také na srovnání s~již existujícím produktem. + +\section{OpenMP} +OpenMP (Open Multi-Processing) je rozhraní pro programování aplikací (API), které podporuje víceplatformní, víceprocesorové výpočty nad sdílenou pamětí \cite{openmp}. Podporuje programovací jazyky C, C++ a Fortran. Funguje na většině platforem, na různých architekturách procesoru a operačních systémech včetně systémů Linux a Windows. Sestává ze sady direktiv, procedur a proměnných prostředí, které ovlivňují běh programu. +OpenMP je spravována neziskovým konsorciem OpenMP Architecture Review Board (OpenMP ARB), které bylo založeno skupinou velkých firem z~oblasti IT včetně firem jako AMD, IBM, Intel, HP a dalších. + +Toto API budu využívat pro jendnoduchou paralelizaci jednovláknové aplikace. OpenMP ale stále využívá pouze CPU, pokud chceme pro naše výpočty použít i GPU a tím potenciálně zvýšit výkon aplikace, není možné využít OpenMP. Pro výpočty akcelerované pomocí grafické karty se běžně používají platformy CUDA nebo OpenCL, z~hlediska funkčnosti jsou si velmi podobné, z~důvodů mých větších zkušeností s~platformou CUDA jsem se rozhodl se v~této práci zabývat CUDA. +\section{CUDA}\label{CUDA} +CUDA - Compute Unified Device Architecture je paralelní výpočetní platforma a programovací model vynalezený firmou NVIDIA \cite{CUDA}. Umožňuje výrazný nárůst výpočetního výkonu díky použití výpočetního výkonu grafického čipu (GPU). + +CUDA přidává možnost do programovacích jazyků C, C++ a Fortran přidat kód, který bude spuštěn na grafické kartě, tím velmi výrazně zvýšit rychlost daného algoritmu díky vysoké míře paralelizace. NVIDIA na svých stránkách uveřejňuje všechny nástroje pro práci s~CUDA, stejně jako příručky a ukázkové zdrojové kódy. Pro spuštění CUDA kódu je potřebná podporovaná grafická karta od firmy NVIDIA. NVIDIA postupně zlepšuje výpočetní možnosti zařízení (compute capability), programy mohou vyžadovat určitou verzi výpočetních možností (například compute capability 2.0) pro svůj běh, každá podporovaná grafická karta má danou verzi výpočetních schopností, není možné na této grafické kartě nijak aktualizovat tuto verzi na novější. Výpočetní schopnosti jsou ale zpětně kompatibilní, například na verzi 6.0 půjde bez omezení spustit veškerý software, který je psán pro verzi 2.0. + +\section{C++} +Jako programovací jazyk pro celou tuto práci jsem zvolil C++ a to především kvůli jeho podpoře CUDA architektury a OpenMP API. Jedná se o~kompilovaný jazyk který je zpětně kompatibilní s~jeho předchůdcem C. Tento jazyk je procedurální a podporuje objektově orientované programování. C++ byl standardizován v~roce 1998, i přesto že již předtím byl hojně používán a považován za de facto standard\cite{c++}. Mezi jeho výhody patří velká přenositelnost na různé platformy a také jeho rychlost. Mezi nevýhody může patřit vyšší náročnost na implementaci oproti jiným, zejména interpretovaným jazykům. +\section{Srovnání s~konkurencí} +Velmi rozsháhlým projektem, který se tímto tématem zabývá je ruský projekt \uv{Everything about the data compression} (Vše o~kompresi dat) \cite{compression.ru}. Jedna z~významných částí tohoto projektu se zabývá video kompresí. Tato odnož projektu je velmi rozsáhlá a pravidelně zveřejňuje například srovnání různých kodeků, mimo jiné i srovnání HEVC kodeku \cite{compression_HEVC}. Hlavní nevýhodou tohoto projektu je, že jejich nové analýzy a reporty jsou zpoplatněny a to částkou okolo 900\$. Zdarma je k~dispozici pouze omezená část reportu, typicky bez některých srovnání a grafů a nebo bez testovacích videí. Jejich starší reporty jsou pak uveřejňovány zdarma v~celém rozsahu. Zároveň také tato skupina lidí vytvořila nástroje na objektivní i subjektivní porovnávání kvality videa. Jejich nástroj na objektivní měření kvality videa (MSU Quality Measurement Tool) obsahuje velké množství metrik ve kterých porovnává videa (mimo jiné i PSNR a SSIM) ale například metriku stVSSIM neobsahuje. Dále také podporuje výpočet pomocí grafické karty (openCL i CUDA). Hlavní nevýhodou tohoto programu je, že jeho plná verze stojí více než 1000 EUR, verze zdarma je omezena například tím, že neumí pracovat s~HD videi a nebo neumí srovnávat více než 2 odvozená videa najednou, z~těchto důvodů nemohu použít tento program pro měření na mnou zamýšlených videích. + +Dalším projektem, který se zabývá tímto tématem je projekt švýcarské univerzity École Polytechnique Fédérale de Lausanne. Tento projekt se nazývá VQMT - Video Quality Measurement Tool\cite{vqmt}, vyhodnocuje kvalitu videa na základě několika různých metrik včetně SSIM a PSNR ale metriku stVSSIM také neimplementuje. Tento projekt vyžaduje OpenCV knihovnu \cite{opencv} a využívá implementace v~matlabu. Narozdíl od mého programu nebo od výše zmíněného projektu přijímá jako vstupní soubory nekomprimované video vstupy, výhody a nevýhody tohoto přístupu jsou popsány v~\autoref{psnr_implement}. Neumí také porovnat více než jeden referenční a jeden odvozený soubor najednou. -\section{Využití pro video} -\section{Srování s~konkurencí} \chapter{Implementace} -\section{PSNR} -\section{SSIM} -\section{stVSSIM} - - -\chapter{Měření} -http://4ksamples.com/category/4k/movies/ -http://www.hd-trailers.net/movie/elysium/ -$ffmpeg -i h264_fHD_orig.mp4 -c:v h264 -c:a copy -b:v 5000000 -vf scale=1920:-1 h264_fHD_5000Kb.mkv -ffmpeg -i h264_fHD_orig.mp4 -c:v vp9 -c:a copy -b:v 5000000 -vf scale=1920:-1 vp9_fHD_5000Kb.mkv -ffmpeg -i h264_fHD_orig.mp4 -c:v hevc -c:a copy -b:v 5000000 -vf scale=1920:-1 h265_fHD_5000Kb.mkv -ffmpeg -i h264_fHD_orig.mp4 -c:v mpeg2video -c:a copy -b:v 5000000 -vf scale=1920:-1 mpeg2_fHD_5000Kb.mkv -ffmpeg -i h264_fHD_orig.mp4 -c:v mpeg4 -c:a copy -b:v 5000000 -vf scale=1920:-1 mpeg4_fHD_5000Kb.mkv$ +V~této kapitole popíšu samotnou implementaci algoritmu. Nejprve se zaměřím na obecná specifika algoritmu, jako například jeho požadavky a prerekvizity, dále popíši jeho nároky na hardware a budu pokračovat popisem jednotlivých části tohoto programu. + +Program pro výpočet všech metrik je psán v~programovacím jazyce C++. Vzniklý kód je funkční na platformách Windows a Linux. Mezi jeho nutné požadavky patří nainstalovaný program ffmpeg a ffprobe\cite{ffmpeg} a nebo alespoň existence zkompilované verze těchto souborů. Tento program je volně ke stažení a je dostupný v~binární podobě pro Windows \cite{ffmpeg_windows} i Linux ve formě balíčku \cite{ffmpeg_linux}. Ffprobe je využíván ke zjištění úvodních informací o~videu, například pro zjištění výšky a šířky videa, dále ke zjištění počtu snímků ve videu. U~některých videí ale není uvedena informace o~počtu snímků, proto je nutné ji dopočítat, setkal jsem se i s~videi, která mají v~hlavičce uvedenou nesprávnou délku videa a proto není možné využít výpočet ze snímkové frekvence a z~délky videa, je nutné použíte parametr count\_frames, který vynutí dekódování celého videa z~důvodu přepočítání reálného počtu snímků. Kvůli zjednodušení parsování je hlavička výstupu parametry omezena na minimum. Tento příkaz je časově náročný, ale výrazně nižší oproti času potřebného na vyhodnocení videa. + + +Ffmpeg je použit pro samotné načítání videa. Díky tomuto nástroji je možné jako vstup pro můj program použít širokou škálu formátů videa. Program ffmpeg kromě standardních kodeků jako h264, mpeg4, h265 zvládá i mnoho jiných, včetně nekomprimovaných bezztrátových (např. YUV420p). Právě poslední zmiňovaný kodek v~tomto programu využívám jako výstupní kodek. V~dřívější implementaci jsem využíval nekomprimovaný RGB (rgb24) výstup. Ten ale měl několik nevýhod. Díky největší citlivosti oka na jasovou složku obrazu jsou mnou využívané metriky většinou počítány pouze nad jasovou složkou, z~toho důvodu byla nutná konverze z~barevného modelu RGB na barevný model YUV. Dále také samotná videa jsou typicky ukládána za využití YUV, proto při použití RGB modelu docházelo zbytečně ke dvojí konverzi navíc. + +Vytvořený program využívá platformu CUDA (tato platforma je blíže popsaná v~\autoref{CUDA}), pro spuštění GPU části tohoto programu je tedy potřeba kompatibilní grafická karta značky NVIDIA s~výpočetní schopností 2.0 a vyšší. Pro spuštění pouze CPU části není takováto grafická karta vyžadována. + +Program je parametrizován pomocí přepínačů na příkazové řádce, struktura přepínačů je následující: +\begin{lstlisting} +-r -in