Sıkıştırma kuralım başlangıçta oldukça basitti: SSIMULACRA2 target 60'ı hâlâ geçen en düşük AVIF quality değerini seçmek. Büyük görüntü setlerinde bir representative sample'ın 58'e kadar düşmesine izin veriyor, diğer tüm sample'ların 60 veya üzerinde kalmasını şart koşuyordum.
PNG ve normal source image'larda bu kuraldan memnundum. Daha sonra bana ulaşmadan önce daha yüksek kaliteli orijinallerden lossy sıkıştırılmış WebP dosyalarıyla çalışmaya başladım.
daha yüksek kaliteli original: ~2 MB
↓
lossy WebP: ~100 KB
↓
AVIF
Bu ikinci dönüşüm de WebP'ye göre 60 ile geçebilmeli miydi? Başta evet diye düşündüm. Sonuçta 60 hâlâ 60'tı. Fakat aslında değişen şey score değil, reference image'dı.
Metric yanlış değildi. Reference değişmişti.
SSIMULACRA2 bir reference image ile distorted image'ı karşılaştırır ve yalnızca bu iki input arasındaki algısal farkı puanlar. Blur, ringing ve sonradan oluşan edge'ler gibi compression damage türlerine tepki verecek şekilde tasarlanmıştır; yayımlanan değerlendirme materyallerinde JPEG, WebP, AVIF ve başka codec'lerin distortion örnekleri de bulunur. SSIMULACRA2](https://github.com/cloudinary/ssimulacra2/blob/main/README.md%22>SSIMULACRA2) dokümantasyonu metric'i ve yaklaşık quality anchor'ları açıklar.
AVIF'i doğrudan iyi bir source'tan encode edersem karşılaştırma temelde source → AVIF olur. 60 score'u bu dönüşümün eklediği hasarı tanımlar.
Zaten lossy olan bir WebP'de gerçek geçmiş farklıdır:
original
↓ first lossy encode
WebP
↓ second lossy encode
AVIF
Ancak SSIMULACRA2 yalnızca WebP → AVIF kısmını görür. WebP'den önce var olan original hakkında hiçbir bilgisi yoktur. WebP içinde zaten bulunan artifact'lar reference'ın parçasına dönüşür.
Bu nedenle 60, AVIF'in WebP'den fazla uzaklaşmadığını söyleyebilir. Final AVIF'in kaybolan master'dan ne kadar uzak olduğunu söyleyemez.
Lossy transcoding ikinci bir quality budget oluşturur
Original görüntüde temiz bir gradient olduğunu düşünelim. İlk encoder biraz banding ekliyor fakat WebP hâlâ kabul edilebilir görünüyor. Daha sonra bu WebP'yi AVIF'e encode ediyorum. SSIMULACRA2, AVIF encoder'ın eklediği yeni degradation'ı cezalandırabilir; reference içinde zaten var olan hasarı cezalandıramaz.
Bu yüzden zaten lossy bir görüntüden encode etmek, mevcut en iyi source'tan doğrudan encode etmekle aynı değildir. libavif](https://github.com/AOMediaCodec/libavif/discussions/2640%22>libavif) projesindeki bir tartışma da aynı genel noktayı vurgular: input önceden sıkıştırılmışsa mevcut compression artifact'lar yeni AVIF'e taşınabilir.
Bu, AVIF'in her WebP artifact'ını otomatik olarak büyüttüğü veya transcoding'in hiçbir zaman yapılmaması gerektiği anlamına gelmez. İkinci encoder'ın, original quality budget'ın bir kısmı zaten harcandıktan sonra çalışmaya başladığı anlamına gelir.
Sonunda kullandığım policy
- Canonical veya yüksek kaliteli source: target 60, tek sample için floor 58.
- Lossless WebP: target 60, floor 58.
- Bilinen lossy derivative: target 65, floor 63.
Önemli ayrım JPEG ile WebP arasında değil, canonical source ile bilinen lossy derivative arasındadır.
WebP lossless olabilir. WebP](https://developers.google.com/speed/webp/docs/webp_lossless_bitstream_specification%22>WebP) lossless specification, pixel değerlerini tam olarak geri oluşturan bir mode tanımlar; bu durumda telafi edilmesi gereken önceki bir lossy generation yoktur. Tersine, daha önce birkaç kez lossy transformation geçirdiğini bildiğim bir JPEG de daha önce sıkıştırılmış WebP kadar dikkat gerektirir.
Neden 65?
SSIMULACRA2'de ikinci lossy generation için tam olarak beş puan eklemek gerektiğini söyleyen bir kural yoktur. Böyle bir kural bulamadım çünkü mevcut değil. 65 bir engineering policy'dir, metric'in özelliği değildir.
Yayımlanan quality anchor'lar faydalı bağlam sağlar. Kabaca 50 medium veya fair quality, 70 ise high veya good quality bölgesine karşılık gelir. Dolayısıyla 60 visually lossless seviyede değil, oldukça agresif bir web compression aralığındadır.
İyi bir source'tan doğrudan dönüşümde daha küçük dosyalar karşılığında bu perceptual budget'ı kabul ediyorum. İkinci lossy generation için ek distortion budget'ın daha küçük olmasını istedim.
70'i de düşündüm, ancak bu tüm transcoded image'ları belirgin biçimde daha sıkı bir quality bölgesine taşırdı. Çok sayıda görüntü yükleyen sayfalarda, özellikle mobil bağlantılarda, ek byte'lar önemlidir. Zaten sıkıştırılmış tüm görüntüleri 70'e zorlamanın maliyeti haklı çıkardığına dair kanıtım yoktu. Bu nedenle muhafazakâr orta nokta olarak 65'i seçtim.
Neden 65/62 değil 65/63?
İlk policy'm 60/58 idi: tek bir representative outlier ana target'ın iki puan altına düşebilirdi. Ana target'ı 65'e yükseltirken aynı policy'yi korumak doğal olarak 65/63 sonucunu verir.
60 - 58 = 2
65 - 63 = 2
62 kullanmak üç puanlık bir istisna oluştururdu. Normal sample'lar daha sıkı hâle gelirken en kötü sample'a daha fazla tolerans verilmiş olurdu. Zaten lossy sıkıştırılmış input'lar için bu istisnayı özel olarak büyütmek için teknik bir neden bulamadım.
Ne 63 ne de 65 sihirli sayıdır. Faydalı olan, policy'nin kendi içinde tutarlı kalmasıdır.
2 MB'den 100 KB'ye düşmek görsel kaliteyi söylemez
SSIMULACRA2 threshold'larını compression ratio'dan türetmiyorum. 2 MB'den 100 KB'ye düşüş dramatik görünür, ancak dosya boyutu tek başına perceptual degradation hakkında şaşırtıcı derecede az bilgi verir.
Resolution, image entropy, noise, düz alanlar, line art, chroma subsampling ve önceki format compression efficiency'yi ciddi biçimde etkiler. Google](https://developers.google.com/speed/webp/docs/webp_study%22>Google) WebP compression study, eşit dosya boyutunun eşit görsel kalite anlamına geldiğini varsaymak yerine codec'leri yaklaşık eşleşmiş quality seviyelerinde karşılaştırır.
Bu yüzden 20× daha küçük → target 65 gibi kurallar kullanmıyorum. Benim policy'm için önemli olan mevcut dosyanın bilinen bir lossy derivative olup olmadığıdır; küçülme oranının ne kadar etkileyici göründüğü değil.
Original elimdeyse WebP'yi transcode etmiyorum
Hem yüksek kaliteli original hem de küçük lossy WebP mevcutsa AVIF'i doğrudan original'dan encode eder ve normal 60/58 policy'sini kullanırım.
preferred:
original → AVIF
avoid when possible:
original → lossy WebP → AVIF
İkinci generation için daha sıkı target kullanmak ilk encode'da kaybolan bilgiyi geri getiremez. 65 yalnızca AVIF'i WebP'ye daha yakın tutar; 70 daha da yakın tutar. Hiçbiri kaybolan original'ı yeniden oluşturmaz.
Implementation bug, 62 ile 63 tartışmasından daha önemliydi
Policy'yi gözden geçirirken encoder logic içinde daha tehlikeli bir sorun buldum. Code zaten format-specific target'lara ve WebP için farklı target döndürebilen bir helper'a sahipti. Bu yüzden WebP'yi 60'tan 65'e çevirmek basit görünüyordu.
Değildi. Adaptive quality decision hâlâ global target ve global worst-score threshold kullanıyordu. Format-specific target daha sonra individual result'ları pass veya below-target olarak etiketlemekte kullanılıyordu, fakat final AVIF quality'yi seçen kararı zorunlu olarak kontrol etmiyordu.
Bu da ince bir failure yaratır: WebP sample doğru biçimde intended target 65'in altında olarak işaretlenebilir, fakat adaptive search global pass condition hâlâ 60 olduğu için aynı quality'yi kabul edebilir.
intended WebP target: 65
actual score: 61.2
format-aware label: below target
global search rule: pass if target is still 60
Gerçekte encoded output'u seçen karara katılmayan threshold anlamsızdır.
Daha güvenlisi threshold'ları sample policy'nin parçası yapmak
Artık threshold'ları dekoratif format constant'ları yerine source property'leri olarak ele almayı tercih ediyorum. Basitleştirilmiş pseudocode:
if sample is a known lossy derivative:
target = 65
floor = 63
else:
target = 60
floor = 58
reject if any sample is below its floor
allow at most one sample below its target
Önemli nokta, sonucu tanımlayan threshold'ların aynı zamanda kabul kararını da yönetmesidir.
Sampling policy de önemli
Her candidate AVIF quality için her görüntüyü test etmem gerekmiyor. Pipeline, bytes-per-pixel dağılımından en fazla on representative JPEG, PNG veya WebP sample seçiyor.
On veya daha az görüntülü koleksiyonlarda her sample normal target'ı karşılamalı. Daha büyük koleksiyonlarda bir sample düşük floor'u kullanabilir, diğerlerinin ise ana target'ı geçmesi gerekir.
Sampling aramayı pratik hâle getirir, fakat outlier rule'u gereksiz yere gevşetmemek için de bir nedendir. Seçilen sample'lar temsilidir; sample edilmeyen her görüntünün aynı şekilde davranacağını kanıtlamaz.
Heuristic'in yerini alabilecek deney
En güçlü cevap için representative bir corpus'ta gerçek original'ları saklayıp tam zincirleri test etmek gerekir:
A: original → AVIF, target 60
B: original → lossy WebP → AVIF, target 60
C: original → lossy WebP → AVIF, target 63
D: original → lossy WebP → AVIF, target 65
E: original → lossy WebP → AVIF, target 70
Her variant için final byte size, gerçek original'a karşı SSIMULACRA2, WebP intermediate'a karşı SSIMULACRA2 ve seçilen encoder quality kaydedilebilir. Zor görüntüleri ayrıca manuel olarak incelemek gerekir.
Yeterince representative preserved-original setinde bu kontrollü deneyi yapmadım. Bu nedenle 65'in global olarak optimal olduğunu iddia edemem. Bu sınırlama önemlidir.
AVIF otomatik olarak bir encode daha yapmaya değmez
Elimde kalan tek source 100 KB WebP ise ve 65/63'ü geçen AVIF 96 KB oluyorsa dönüşümü sorgularım. 4 KB tasarruf, bir lossy generation daha ve ek processing complexity için yeterli olmayabilir.
Aynı 100 KB WebP quality policy'yi geçerek 65 KB AVIF'e düşüyorsa, görüntü ağırlıklı sayfalarda trade-off çok daha çekici hâle gelir.
Codec conversion iki ayrı soruya cevap vermeli: ek distortion kabul edilebilir mi ve size reduction gerçekten anlamlı mı? İlk soruyu geçmek ikinciyi otomatik olarak çözmez.
Şimdi kullandığım kural
En kaliteli original varsa doğrudan ondan encode eder ve bu web workload için 60/58 kullanırım. WebP lossless ise yine 60/58. Elimde kalan tek dosya known lossy derivative ise daha sıkı second-generation budget, şu anda 65/63, uygularım. AVIF boyutu çok az azaltıyorsa mevcut WebP'yi korumayı düşünürüm.
Asıl ders WebP'nin özel bir SSIMULACRA2 sayısına ihtiyaç duyması değil. Full-reference quality metric yalnızca reference image'ın temsil ettiği soruya cevap verir.
Reference zaten bilgi kaybetmişse yüksek score “bu reference'a yakın” anlamına gelir, “ondan önce var olan görüntüye yakın” anlamına gelmez. Image provenance'ı compression policy'nin bir parçası olarak görmeye başladığımda threshold'lar keyfi codec ayarları gibi görünmeyi bıraktı; farklı generation of loss için budget'lara dönüştü.