Wybór poziomu jakości AVIF jest prosty, jeśli liczy się wyłącznie rozmiar pliku. Trudniej zdecydować, jak duże widoczne pogorszenie jakości można zaakceptować. Wartość jakości 40 nie oznacza wyniku 40 w metryce jakości percepcyjnej ani nie gwarantuje takiego samego efektu dla każdego obrazu. Różne materiały źródłowe mogą reagować zupełnie inaczej na identyczne ustawienia kodera.
SSIMULACRA2 pomaga ocenić tę różnicę, porównując zdekodowany obraz po kompresji z obrazem referencyjnym. Jednak przeprowadzanie wyczerpującego wyszukiwania optymalnej jakości dla każdego obrazu może zamienić stosunkowo prosty proces konwersji w kosztowne obliczeniowo zadanie. Jeśli celem jest rozsądna jakość obrazów na stronie internetowej, a nie perfekcyjna optymalizacja każdego pliku, istnieje prostsze rozwiązanie: skalibrować jeden poziom jakości AVIF na reprezentatywnej próbce, ocenić wyniki wizualnie i zastosować to ustawienie do pozostałej części zbioru.
Jakość AVIF i wynik SSIMULACRA2 to dwie różne wartości
Opcja quality przekazywana do kodera AVIF określa ustawienie kompresji. SSIMULACRA2 jest natomiast miarą jakości uzyskanego obrazu po kodowaniu. Tych skal nie można stosować zamiennie: AVIF quality: 40 nie oznacza wyniku SSIMULACRA2 równego 40, 60 ani żadnej innej stałej wartości.
Aby zmierzyć jakość zakodowanego obrazu, należy go zdekodować i porównać z obrazem referencyjnym:
ssimulacra2 reference.png encoded-decoded.png
Wyższy wynik SSIMULACRA2 oznacza większe podobieństwo percepcyjne. Zgodnie z oficjalną dokumentacją wynik około 50 odpowiada średniej jakości, a około 70 — wysokiej. Próg 60 może być użytecznym, praktycznym celem, ale jest to przyjęte kryterium, a nie uniwersalna definicja akceptowalnej jakości obrazu. Zawsze warto obejrzeć reprezentatywne wyniki w rozmiarze, w jakim będą faktycznie wyświetlane.
Dlaczego wyczerpująca optymalizacja każdego obrazu jest kosztowna
Rygorystyczny optymalizator może wielokrotnie kodować ten sam obraz z różnymi wartościami jakości, mierzyć każdego kandydata za pomocą SSIMULACRA2, a następnie zachować najmniejszy plik spełniający wymagania. Takie podejście często pozwala uzyskać lepszą efektywność kompresji, ponieważ łatwy do skompresowania obraz może osiągnąć wymagany wynik przy niskiej jakości kodera, podczas gdy trudniejszy potrzebuje wyższego ustawienia.
Wadą jest liczba operacji kodowania. Jeśli mamy N obrazów, a znalezienie odpowiedniego ustawienia wymaga średnio K prób kodowania na obraz, liczba operacji jest rzędu N × K, nie licząc dekodowania i obliczania wyników. W praktyce to kodowanie AVIF z wysokim poziomem nakładu obliczeniowego może dominować w całkowitym koszcie; samo obliczanie metryki SSIMULACRA2 niekoniecznie jest najbardziej wymagającą częścią procesu.
Wybór jednej jakości na folder ogranicza liczbę prób, ale nadal wymaga pobierania próbek, pomiarów i utrzymywania osobnych ustawień dla różnych grup. W przypadku zbiorów o jednolitych wymaganiach dotyczących wyświetlania i pewnej tolerancji na odstające wyniki dodatkowa złożoność może nie być uzasadniona.
| Strategia | Zakres kalibracji | Główny kompromis |
|---|---|---|
| Adaptacyjna jakość dla każdego obrazu | Kilka prób kodowania każdego obrazu | Precyzyjna kontrola, najwyższy koszt kalibracji |
| Adaptacyjna jakość dla każdej grupy | Kilka prób kodowania na próbce z każdej grupy | Mniej pracy, ale więcej konfiguracji i wyniki zależne od grupy |
| Jeden stały poziom jakości | Próbne kodowania na ograniczonej próbce kalibracyjnej | Mała złożoność operacyjna, kosztem części obrazów skompresowanych zbyt mocno lub zbyt słabo |
Kluczowa różnica: średni wynik a odsetek obrazów spełniających próg
Przed wyborem wartości jakości trzeba określić, co oznacza „wystarczająco dobrze”. Dwa pozornie podobne cele prowadzą do bardzo różnych ustawień kodera:
- Cel oparty na średniej: średni wynik SSIMULACRA2 w próbce powinien wynosić około 60.
- Cel oparty na odsetku pozytywnych wyników: około 90% obrazów powinno uzyskać SSIMULACRA2 ≥ 60, a pozostałe mogą znaleźć się poniżej tego progu.
To nie jest to samo. Przy obliczaniu średniej wysoki wynik prostego obrazu może zrównoważyć słaby wynik obrazu trudniejszego. Przykładowo, jeśli połowa obrazów uzyska 75 punktów, a druga połowa 55, średnia wyniesie 65, chociaż tylko połowa spełni próg 60.
W typowym procesie przygotowywania obrazów na strony internetowe, gdzie większość powinna wyglądać akceptowalnie, a niewielka liczba niepowodzeń jest dopuszczalna, cel oparty na odsetku obrazów spełniających próg jest często bardziej użyteczny. Należy obliczyć:
pass_rate = count(scores >= 60) / count(all_scores)
Warto również zapisywać rozkład wyników poniżej progu i oglądać obrazy wyglądające najgorzej. Próbka, w której 9% obrazów uzyskało wynik 59, istotnie różni się od próbki, w której 9% uzyskało wynik 30, mimo że w obu przypadkach odsetek obrazów spełniających próg jest taki sam.
Co pokazała rzeczywista kalibracja
Podczas wstępnej kalibracji AVIF procedura adaptacyjna wybrała różne ustawienia jakości dla poszczególnych grup obrazów, mniej więcej od połowy przedziału 30–39 do połowy przedziału 40–49. Było to zgodne z oczekiwaniami: w niektórych grupach obrazy przekraczały ustalony próg SSIMULACRA2 już przy niskich ustawieniach, natomiast kilka trudnych przykładów wymagało znacznie wyższej jakości kodera.
Reguła adaptacyjna była jednak bardziej rygorystyczna niż rzeczywiste wymagania dotyczące publikowanych obrazów. Jej celem było zapewnienie, aby niemal każdy testowany obraz w danej grupie przekraczał próg, przy dopuszczeniu jedynie ściśle ograniczonej liczby wyjątków. Chroni to trudne obrazy przed nadmierną degradacją, ale może również podnieść jakość kodowania całej grupy z powodu jednej nietypowej próbki.
Ponowna analiza pomiarów z uwzględnieniem innego celu — około dziewięciu na dziesięć obrazów z wynikiem SSIMULACRA2 co najmniej 60 — wskazała, że jeden stały poziom jakości AVIF w okolicach 39–40 może być rozsądnym kompromisem. W tym porównaniu wartość 39 przemawiała za mniejszym rozmiarem plików, natomiast 40 zapewniała większy margines bezpieczeństwa obrazom znajdującym się blisko progu. Wartości te wynikały z danych kalibracyjnych i późniejszej analizy; nie przeprowadzono pełnej konwersji całego zbioru przy stałym ustawieniu ani niezależnej walidacji obejmującej cały zbiór. Nie ustalono też dokładnej oszczędności rozmiaru plików wynikającej z wyboru 39 zamiast 40.
Wniosek nie jest taki, że jakość AVIF 39 lub 40 sprawdzi się wszędzie. Chodzi o to, że stałe ustawienie może być rozsądnym wyborem, jeśli odpowiada jasno określonemu wymaganemu rozkładowi jakości. Inny koder, zestaw obrazów, sposób przetwarzania kolorów lub próg percepcyjny mogą prowadzić do odmiennego wyniku.
Jak jednorazowo skalibrować jakość AVIF
- Określ dopuszczalny odsetek niepowodzeń. Można na przykład wymagać, aby około 90% obrazów osiągało SSIMULACRA2 ≥ 60. Trzeba zdecydować, czy jest to elastyczny cel, czy rygorystyczny warunek dopuszczenia do publikacji.
- Przygotuj rzeczywiście reprezentatywną próbkę. Uwzględnij różne wymiary, formaty źródłowe, gradienty, ostre krawędzie, tekstury oraz obrazy o niewielkiej liczbie szczegółów. Losuj próbki z rzeczywistego zbioru i zastosuj dobór warstwowy, jeśli w przeciwnym razie jakaś kategoria mogłaby zostać pominięta. Wybieranie plików wyłącznie według liczby bajtów po kompresji na piksel jest użyteczną heurystyką pozwalającą objąć zróżnicowane przypadki, ale nie gwarantuje reprezentatywności pod względem jakości percepcyjnej.
- Przetestuj niewielki zakres ustawień jakości kodera. Zacznij od kilku wartości w pobliżu poziomu zapewniającego wizualnie akceptowalny wynik, zamiast sprawdzać całą skalę jakości. Można na przykład przetestować sąsiednie wartości 38, 39, 40 i 42 na tych samych obrazach.
- Zachowaj identyczny proces kodowania. Utrzymuj stałą rozdzielczość, orientację, konwersję kolorów, implementację kodera, nakład obliczeniowy, podpróbkowanie chrominancji, głębię bitową i wstępne przetwarzanie. Jeśli dodajesz znak wodny, obraz referencyjny musi zawierać ten sam znak wodny i przejść te same transformacje przed porównaniem z wynikiem kompresji.
- Zapisuj zarówno wynik jakości, jak i rozmiar. Dla każdego kandydata oblicz odsetek obrazów uzyskujących co najmniej 60 punktów, rozkład wyników poniżej progu oraz łączną liczbę bajtów zakodowanych plików dla tej samej próbki. Nie wyciągaj wniosków o oszczędności transferu wyłącznie na podstawie wartości ustawienia jakości.
- Obejrzyj obrazy, które nie spełniły progu. Zwróć uwagę na twarze, tekst, cienkie linie, gradienty i inne szczegóły istotne dla docelowego sposobu prezentacji. Sprawdzaj obrazy w realistycznych rozmiarach wyświetlania, a nie tylko przy dużym powiększeniu.
- Wybierz najniższe zadowalające ustawienie jakości, a następnie je zweryfikuj. Przetestuj wybraną wartość na osobnej, losowej próbce walidacyjnej, która nie miała wpływu na decyzję. Jeśli niespełnienie celu 90% byłoby kosztowne, pozostaw margines bezpieczeństwa i poważnie potraktuj niepewność wynikającą z próbkowania. Jeśli sporadyczne niepowodzenia są akceptowalne, bardziej agresywne ustawienie może być uzasadnione.
Jednorazowa kalibracja nie oznacza, że można ignorować późniejsze zmiany. Powtórz niewielki test na próbce, gdy zmienią się proporcje typów obrazów źródłowych, wymiary obrazów, wersja kodera, transformacje stosowane przy dostarczaniu obrazów lub wymagania dotyczące wyglądu.
Minimalny przykład porównania z użyciem Sharp i SSIMULACRA2
Poniższy uproszczony przykład wykorzystuje koder AVIF dostępny w Sharp do wygenerowania dwóch wariantów z tego samego pliku wejściowego. Jest to przykład ilustrujący kalibrację, a nie zalecenie, aby każdy projekt korzystał z tych opcji kodera lub wartości jakości. Uruchom go jako moduł ES po zainstalowaniu pakietu sharp.
import sharp from 'sharp';
const source = 'sample.png';
const encoding = {
effort: 9,
chromaSubsampling: '4:4:4',
bitdepth: 8,
tune: 'iq',
lossless: false
};
// Use the same orientation and color conversion in both paths.
await sharp(source)
.rotate()
.toColourspace('srgb')
.png()
.toFile('reference.png');
for (const quality of [39, 40]) {
const encoded = `candidate-q${quality}.avif`;
await sharp(source)
.rotate()
.toColourspace('srgb')
.avif({ ...encoding, quality })
.toFile(encoded);
await sharp(encoded)
.png()
.toFile(`candidate-q${quality}.png`);
}
Następnie porównaj zdekodowane warianty z przygotowanym obrazem referencyjnym:
ssimulacra2 reference.png candidate-q39.png
ssimulacra2 reference.png candidate-q40.png
W rzeczywistym teście należy zautomatyzować ten proces dla wszystkich obrazów w próbce oraz zebrać wyniki jakości i rozmiary plików dla każdego wariantu. Jeśli produkcyjny proces zmienia rozmiar obrazów, przycina je, nakłada dodatkowe elementy lub wykonuje inne transformacje, zastosuj te same operacje do obrazu referencyjnego. W przeciwnym razie SSIMULACRA2 będzie częściowo mierzyć wpływ transformacji, a nie samą utratę jakości spowodowaną kompresją.
Po wybraniu globalnego ustawienia jakości produkcyjne kodowanie staje się zwykłą, jednoprzebiegową konwersją do AVIF. Nie trzeba już wyszukiwać odpowiedniej jakości osobno dla każdego obrazu ani folderu. Eliminuje to wielokrotne próbne kodowania, ale nie usuwa kosztu pojedynczego kodowania, którego nadal wymaga każdy obraz wynikowy.
Kiedy jeden poziom jakości AVIF jest niewłaściwym wyborem
Stałe ustawienie to kompromis, a nie uniwersalne optimum. Kodowanie adaptacyjne pozostaje wartościowe, gdy minimalna jakość każdego obrazu jest wymogiem umownym, widoczne pogorszenie jakości jest niedopuszczalne, materiały źródłowe bardzo się od siebie różnią albo optymalizacja każdego bajtu uzasadnia dodatkowe koszty obliczeniowe i większą złożoność implementacji.
Szczególnej ostrożności wymagają zbiory zawierające różne typy obrazów. Fotografie, proste grafiki, drobny tekst i materiały wcześniej poddane kompresji niekoniecznie reagują tak samo. Jeśli określona klasa obrazów regularnie nie przechodzi testu akceptacyjnego, kilka profili zależnych od formatu lub zawartości może być efektywniejszym rozwiązaniem niż obie skrajności: jedna uniwersalna jakość albo pełna optymalizacja każdego obrazu.
Trzeba też odróżnić szybkość kodowania od szybkości kalibracji. Stosowanie jednej jakości pozwala uniknąć powtarzania eksperymentów, ale kodowanie wszystkich obrazów z bardzo wysoką wartością effort nadal może wymagać dużej mocy obliczeniowej. Profil kodera o mniejszym nakładzie obliczeniowym to kolejna możliwa optymalizacja, pod warunkiem ponownej kalibracji: zależność między ustawieniem jakości a uzyskiwanym wynikiem może się zmienić wraz z opcjami kodera.
Praktyczna zasada
Traktuj SSIMULACRA2 jako narzędzie do kalibracji, a niekoniecznie obowiązkowy etap produkcyjnego przetwarzania każdego obrazu. Określ cel jakościowy odpowiadający rzeczywistemu sposobowi wyświetlania obrazów, zakoduj reprezentatywną próbkę przy kilku zbliżonych ustawieniach, porównaj zarówno wyniki percepcyjne, jak i liczbę bajtów, obejrzyj obrazy niespełniające wymagań i wybierz najniższe ustawienie mieszczące się w przyjętej tolerancji.
Podczas jednej wstępnej kalibracji jakość AVIF w okolicach 39–40 wyglądała na rozsądny punkt, w którym można zakończyć poszukiwania. Była to decyzja podjęta przy konkretnym progu i poziomie tolerancji, a nie uniwersalne ustawienie ani wynik potwierdzonego testu całego zbioru. Ogólny wniosek jest prostszy: gdy czas i moc obliczeniowa są ograniczone, starannie zweryfikowany stały poziom jakości jest często praktyczniejszy niż niekończąca się optymalizacja każdego obrazu z osobna.