W ramach dzisiejszych zajęć połączymy wiedzę z naszych zajęć dotyczących kompresji dźwięku i obrazu i postaramy się opracować własny program kompresujący wideo. Jako cześć instrukcji został dołączony fragment programu, który będzie rozwijany w ramach zajęć.
Co przetestować w ramach sprawozdania
Sprawozdanie dzielimy na dwie części:
Badanie jakości dla różnych parametrów bez użycia RLE lub ByteRun (0.6 pkt):
W tej części należy sprawdzić, jak poszczególne parametry wpływają na jakość skompresowanej klatki. Proszę porównywać wizualnie różnice w przestrzeni
RGB
, sprawozdania oceniające różnice tylko w przestrzeniYCbCr
nie będą oceniane. Znaleźć najbardziej obiecujące zestawienie parametrów, które według was będzie dawało największe szanse na dalszą lepszą kompresję w drugiej części zadania. Przetestować:- stopień redukcji chrominancji na 6 sposobów:
4:4:4
,4:2:2
,4:4:0
,4:2:0
,4:1:1
,4:1:0
- stopień kompresji informacji o różnicy względem klatki kluczowej (dzielenie przez 1,2,4,…)
Proszę pamiętać, żeby załączane do sprawozdania pliki były w jakości, pozwalającej potwierdzić to, co piszecie w obserwacjach. tu prezentujecie wyniki działania rozszerzonej przez was funkcji
plotDiffrence
prezentujące różnice w jakości względem klatki kluczowej, nie wykresy linowe, które generują się na końcu działania programu. Samą funkcję można jeszcze bardziej rozszerzyć, żeby była bardziej podobna do tej z instrukcji o JPEG i pokazywała różnice na większej ilości płaszczyzn (YCbCr
), ale pamiętajcie, że najważniejsze obserwacje i tak będziecie obserwować na obrazach w RGB. Dołączony do zadania skrypt generuje wykresy, dla wskazanego ROI (ang. Region of Interest). Proszę pamiętać, żeby ustawić ROI na obszar, który ulega zmianie pomiędzy klatkami, a nie domyślny lewy górny róg klatki. I sugeruję obserwować klatki jak najdalej odsunięte od klatek kluczowych, czyli celować w porównania w klatkach poprzedzających klatki kluczowe np. jeżeli mamy co 4 klatkę kluczową (\(0,4,8,\ldots\)) to do analizy wybierzmy klatkę \(31\).- stopień redukcji chrominancji na 6 sposobów:
Badanie skuteczności kompresji z użyciem RLE lub ByteRun (0.4 pkt):
Tutaj proszę wykorzystać najlepsze według was ustawienia z poprzedniej części zadania i wybrać jeden film do badań wstępnych. Algorytmy będą działały dość wolno, dlatego sugeruję wykonywać testy na kilku klatkach kluczowych, czyli maksymalnie 15-20 klatach. Proszę wyraźnie zaznaczyć jaką metodę kompresji bezstratnej wykorzystujecie. Najlepiej dodajcie tę informację w tytule waszych wykresów liniowych (to te, które generują się na końcu programu). Proszę tu odpowiedzieć sobie na kilka pytań:
- Jak zmiana odległości pomiędzy klatkami kluczowymi wpływa na kompresję? Jaka odległość jest najrozsądniejsza w przypadku waszego filmu? Proszę to przetestować na minimum 6 odległościach z zakresu \(<2,20>\) klatek.
- Czy na podstawie waszych wyników opłaca się kompresować Luminancję, poprzez użycie kompresji strumieniowej? Jeżeli tak to dla jakich klatek (kluczowych, niekluczowych)?
Po przygotowaniu powyższego badania i zapianiu ich w sprawozdaniu wszystkich ustawień dla waszego bazowego filmu, a następnie uruchomić i sprawdzić te same ustawienia na innym filmie. Czy te wnioski są dalej dla niego zgodne? Jeżeli nie to dlaczego tak jest?
Do oddania
- kod źródłowy (jeden plik
.py
) - sprawozdanie z obserwacjami i wynikami (format
PDF
)
Program startowy
Dołączony do instrukcji program startowy składa się z kilku sekcji: Konfiguracji, Sekcji na własne funkcje służące do kompresji i dekompresji oraz z głównej pętli programu. Możecie spokojnie modyfikować każdą z części programu. Podział ten ma służyć głównie porządkowaniu struktury programu. UWAGA Użyty przykładowy schemat rysowania klatek kluczowych jest specjalnie zostawiony w niewłaściwej przestrzeni koloru, należy to poprawić w ramach prac nad programem, aby działał zgodnie z naszymi założeniami.
Sekcja dotycząca konfiguracji zawiera zmienne wykorzystywane w głównej pętli programu. Znajdziemy tu takie parametry jak:
- Katalog i nazwa pliku, (osoby korzystające z Linuxa lub MacOSa muszą tu zmienić ścieżki)
- ilość klatek filmu do odtworzenia,
- informację, co która klatka ma być klatką kluczową,
- dla których klatek w pętli głównej wyrysować wizualizację,
- dla których klatek zatrzymać automatycznie film (naciśnij dowolny klawisz, żeby od pauzować),
- rodzaj redukcji chrominancji,
- dzielnik dla kodowania różnic,
- czy program ma na bieżąco wyświetlać klatki, czy przeprowadzić kompresję w tle.
- ROI, czyli lista fragmentów, dla których będą generować się automatyczne wykresy.
Sekcja z funkcjami aktualnie tylko przepisuje naszą macierz wejściową do struktury po kompresji i na odwrót.
Główna pętla programu ma kilka najważniejszych sekcji. Na początku pobieramy nową klatkę i konwertujemy ją do przestrzeni YCbCr
. Następnie w zależności czy mamy teraz nową klatkę kluczową lub nie wykonujemy operacje przeznaczone dla klatki kluczowej, lub dla klatki zwykłej. Potem mamy sekcję szacowania kompresji, po niej następuje sekcja automatycznego generowania wykresów. Program posiada dwie możliwości zatrzymania — automatyczną ustawianą dla konkretnych klatek na początku lub ręczna po naciśnięciu klawisza p
. Obie trzeba od pauzować, naciskając dowolny przycisk na klawiaturze. Dodatkowo naciśnięcie klawisza q
powoduje przerwanie i zamknięcie programu.
Kompresja
W ramach kompresji będziemy kompresować dwa aspekty sygnału: Zamiast całych klatek będziemy zapisywać różnice pomiędzy nimi a klatkami kluczowymi. Drugim aspektem będzie redukcja chrominancji, która była już poruszana na laboratoriach z kompresji JPEG. W ramach dzisiejszej instrukcji rozszerzymy naszą funkcję redukującą chrominancję o 4 kolejne możliwe podejścia. Czyli oprócz implementowanych ostatnio: 4:4:4
oraz 4:2:2
, powinna ona również obsługiwać 4:4:0
, 4:2:0
, 4:1:1
oraz 4:1:0
.
Kompresja Strumieniowa
Dla każdej z naszych skompresowanych warstw koloru bez względu na to, czy będzie to klatka kluczowa, czy nie można spróbować je zredukować poprzez naszą kompresję bezstratną (RLE lub ByteRun) implementowaną na wcześniejszych zajęciach. Sama operacja kompresji jest dość czasochłonna, dlatego polecam robić to na niewielkiej ilości klatek, głównie w celu testów na najbardziej obiecujących parametrów.