अगर केवल फ़ाइल साइज़ देखना हो, तो AVIF क्वालिटी सेटिंग चुनना आसान है। मुश्किल यह तय करना है कि इमेज की दिखने वाली गुणवत्ता में कितनी गिरावट स्वीकार की जा सकती है। क्वालिटी का मान 40 होने का मतलब यह नहीं कि देखने में गुणवत्ता का स्कोर भी 40 होगा। न ही इससे हर इमेज के लिए एक जैसा नतीजा मिलने की गारंटी होती है। एक ही एन्कोडर सेटिंग का अलग-अलग स्रोत इमेजों पर बहुत अलग असर पड़ सकता है।
SSIMULACRA2, कंप्रेस की गई इमेज को डिकोड करके उसकी रेफ़रेंस इमेज से तुलना करता है, जिससे यह अंतर समझने में मदद मिलती है। लेकिन हर इमेज पर क्वालिटी का पूरा परीक्षण करना, एक साधारण कन्वर्ज़न प्रक्रिया को भारी एन्कोडिंग वर्कलोड में बदल सकता है। अगर लक्ष्य हर फ़ाइल को बिल्कुल अधिकतम स्तर तक ऑप्टिमाइज़ करना नहीं, बल्कि वेबसाइट के लिए पर्याप्त अच्छी इमेज क्वालिटी पाना है, तो एक सरल तरीका है: असल संग्रह का प्रतिनिधित्व करने वाले सैंपल पर AVIF का एक क्वालिटी मान कैलिब्रेट करें, नतीजों को देखकर जाँचें और फिर बाकी संग्रह के लिए वही मान इस्तेमाल करें।
AVIF क्वालिटी और SSIMULACRA2 दो अलग संख्याएँ हैं
AVIF एन्कोडर को दिया जाने वाला quality विकल्प कंप्रेशन से जुड़ा निर्देश है। SSIMULACRA2 एन्कोड होने के बाद मिले नतीजे का माप है। दोनों के पैमाने एक-दूसरे के बराबर नहीं हैं: AVIF में quality: 40 का अर्थ यह नहीं कि SSIMULACRA2 का स्कोर 40, 60 या कोई दूसरा निश्चित मान होगा।
एन्कोडिंग का परिणाम मापने के लिए उसे डिकोड करें और रेफ़रेंस से तुलना करें:
ssimulacra2 reference.png encoded-decoded.png
SSIMULACRA2 का स्कोर जितना अधिक होता है, देखने में समानता उतनी अधिक होती है। इसके आधिकारिक दस्तावेज़ में लगभग 50 के स्कोर को मध्यम और लगभग 70 को उच्च क्वालिटी बताया गया है। 60 की सीमा एक व्यावहारिक लक्ष्य हो सकती है, लेकिन यह स्वीकार्य इमेज की कोई सार्वभौमिक परिभाषा नहीं, बल्कि अपनी ज़रूरत के हिसाब से चुना गया मानदंड है। प्रतिनिधि नतीजों को हमेशा उसी आकार में देखकर जाँचें जिसमें वे वास्तव में दिखाई देंगे।
हर इमेज के लिए पूरा ऑप्टिमाइज़ेशन महँगा क्यों पड़ता है?
कड़े मानदंड वाला ऑप्टिमाइज़र किसी इमेज को अलग-अलग क्वालिटी मानों पर बार-बार एन्कोड कर सकता है, हर विकल्प को SSIMULACRA2 से माप सकता है और फिर स्वीकार्य नतीजों में सबसे छोटी फ़ाइल रख सकता है। इससे अक्सर बेहतर कंप्रेशन मिलता है, क्योंकि आसान इमेज कम क्वालिटी मान पर भी सीमा पार कर सकती है, जबकि मुश्किल इमेज को अधिक क्वालिटी की ज़रूरत पड़ सकती है।
इसका नुकसान एन्कोडिंग की संख्या है। अगर N इमेज हैं और हर इमेज के लिए स्वीकार्य सेटिंग खोजने में K अलग एन्कोडिंग विकल्प आज़माने पड़ते हैं, तो डिकोडिंग और स्कोर की गणना के अलावा लगभग N × K एन्कोडिंग करनी होंगी। व्यवहार में अधिक मेहनत वाली AVIF एन्कोडिंग कुल लागत का सबसे बड़ा हिस्सा हो सकती है; ज़रूरी नहीं कि SSIMULACRA2 का स्कोर निकालना ही सबसे महँगा काम हो।
हर फ़ोल्डर के लिए एक क्वालिटी चुनने से परीक्षण का काम घटता है, लेकिन फिर भी हर समूह से सैंपल लेना, माप करना और अलग-अलग सेटिंग सँभालना पड़ता है। जिन संग्रहों में सभी इमेजों के लिए एक जैसी डिलीवरी क्वालिटी चाहिए और कुछ अपवाद स्वीकार्य हैं, वहाँ यह अतिरिक्त जटिलता शायद फ़ायदेमंद न हो।
| तरीका | कैलिब्रेशन का काम | मुख्य समझौता |
|---|---|---|
| हर इमेज के लिए अनुकूलित क्वालिटी | हर इमेज पर कई संभावित सेटिंग की एन्कोडिंग | बारीक नियंत्रण, लेकिन कैलिब्रेशन की सबसे अधिक लागत |
| हर समूह के लिए अनुकूलित क्वालिटी | हर समूह के सैंपल पर कई संभावित सेटिंग की एन्कोडिंग | कम काम, लेकिन ज़्यादा कॉन्फ़िगरेशन और समूह के अनुसार बदलते नतीजे |
| एक तय क्वालिटी | सीमित कैलिब्रेशन सैंपल पर संभावित सेटिंग की एन्कोडिंग | प्रक्रिया में कम जटिलता; कुछ इमेजों का ज़रूरत से ज़्यादा और कुछ का ज़रूरत से कम कंप्रेस होना स्वीकार करना पड़ता है |
अहम अंतर: औसत स्कोर या सीमा पार करने का अनुपात?
क्वालिटी मान चुनने से पहले तय करें कि “पर्याप्त अच्छी” क्वालिटी का मतलब क्या है। ऊपर से एक जैसे लगने वाले दो लक्ष्य एन्कोडर की बहुत अलग सेटिंग तक पहुँचा सकते हैं:
- औसत स्कोर का लक्ष्य: सैंपल में SSIMULACRA2 का औसत स्कोर लगभग 60 होना चाहिए।
- सीमा पार करने के अनुपात का लक्ष्य: लगभग 90% इमेजों का SSIMULACRA2 स्कोर ≥ 60 होना चाहिए; बाकी इमेजें इस सीमा से नीचे रह सकती हैं।
ये दोनों लक्ष्य बराबर नहीं हैं। औसत निकालते समय आसान इमेज का ऊँचा स्कोर किसी मुश्किल इमेज के कम स्कोर की भरपाई कर सकता है। मिसाल के लिए, अगर आधी इमेजों को 75 और बाकी आधी को 55 स्कोर मिलता है, तो औसत 65 होगा, लेकिन केवल आधी इमेजें 60 की सीमा पार करेंगी।
वेब इमेजों के सामान्य वर्कफ़्लो में, जहाँ ज़्यादातर इमेजें स्वीकार्य दिखनी चाहिए और थोड़ी असफलता चल सकती है, सीमा पार करने का अनुपात अक्सर अधिक उपयोगी होता है। इसे मापें:
pass_rate = count(scores >= 60) / count(all_scores)
साथ ही, सीमा से नीचे आने वाले स्कोरों का वितरण दर्ज करें और सबसे खराब दिखने वाली इमेजों की जाँच करें। जिस सैंपल में 9% इमेजों का स्कोर 59 है, वह उस सैंपल से काफी अलग है जिसमें 9% इमेजों का स्कोर 30 है, भले ही दोनों में सीमा पार करने का अनुपात समान हो।
असल कैलिब्रेशन परीक्षण से क्या पता चला?
AVIF कैलिब्रेशन के एक शुरुआती प्रयोग में, अनुकूलित सेटिंग चुनने वाली प्रक्रिया ने अलग-अलग इमेज समूहों के लिए अलग क्वालिटी मान चुने, जो मोटे तौर पर 30 के दशक के मध्य से 40 के दशक के मध्य तक थे। यह अपेक्षित था: कुछ समूहों की इमेजें चुनी गई SSIMULACRA2 सीमा कम क्वालिटी पर ही पार कर गईं, जबकि कुछ मुश्किल सैंपलों को कहीं अधिक एन्कोडर क्वालिटी चाहिए थी।
लेकिन यह अनुकूलित नियम वास्तविक डिलीवरी की आवश्यकता से अधिक सख़्त था। इसका लक्ष्य हर समूह में जाँची गई लगभग सभी इमेजों को सीमा पार करवाना था और केवल बहुत सीमित अपवाद की अनुमति थी। इससे मुश्किल इमेजों की गुणवत्ता सुरक्षित रहती है, पर किसी एक असाधारण सैंपल के कारण पूरे समूह के लिए क्वालिटी बढ़ानी पड़ सकती है।
मापों को एक अलग लक्ष्य से दोबारा देखने पर—लगभग हर दस में से नौ इमेजों का SSIMULACRA2 स्कोर 60 या उससे अधिक हो—एक ही AVIF क्वालिटी मान, लगभग 39–40, एक उचित समझौता लगा। उस तुलना में 39 से छोटी फ़ाइलों की संभावना थी, जबकि 40 सीमा के पास वाली इमेजों को थोड़ा अतिरिक्त मार्जिन देता था। ये मान कैलिब्रेशन डेटा और उसके बाद किए गए विश्लेषण से निकाले गए थे; तय क्वालिटी पर पूरे संग्रह का कन्वर्ज़न और स्वतंत्र रूप से पूरे संग्रह की जाँच अभी नहीं की गई थी। 40 के मुकाबले 39 से फ़ाइल साइज़ में कितना फ़ायदा होगा, यह सटीक रूप से स्थापित नहीं किया गया था।
इसका मतलब यह नहीं कि AVIF क्वालिटी 39 या 40 हर जगह काम करेगी। सीख यह है कि अगर कोई तय सेटिंग स्पष्ट रूप से चुने गए क्वालिटी वितरण के अनुरूप है, तो उसे अपनाना उचित हो सकता है। एन्कोडर, इमेजों के प्रकार, कलर प्रोसेसिंग या देखने में गुणवत्ता की सीमा बदलने पर नतीजा भी बदल सकता है।
AVIF क्वालिटी को एक बार कैसे कैलिब्रेट करें?
- अस्वीकार्य नतीजों का स्वीकार्य अनुपात चुनें। उदाहरण के लिए, तय करें कि लगभग 90% इमेजों का SSIMULACRA2 स्कोर ≥ 60 होना चाहिए। यह भी तय करें कि यह लचीला लक्ष्य है या रिलीज़ के लिए अनिवार्य शर्त।
- वास्तविक संग्रह का प्रतिनिधित्व करने वाला सैंपल बनाएँ। उसमें अलग-अलग आयाम, स्रोत फ़ॉर्मैट, रंगों के क्रमिक बदलाव, तीखे किनारे, टेक्सचर और कम विवरण वाली इमेजें शामिल करें। वास्तविक वर्कलोड से रैंडम सैंपल लें और यदि कोई श्रेणी छूट सकती है तो श्रेणीवार सैंपलिंग करें। केवल प्रति पिक्सेल कंप्रेस्ड बाइट्स के आधार पर फ़ाइलें चुनना अलग-अलग प्रकारों को शामिल करने का उपयोगी मोटा तरीका है, लेकिन इससे देखने में गुणवत्ता के लिहाज़ से प्रतिनिधि सैंपल होने की गारंटी नहीं मिलती।
- एन्कोडर की कुछ पास-पास की क्वालिटी सेटिंग जाँचें। पूरे क्वालिटी पैमाने को आज़माने के बजाय, ऐसी सेटिंग के आसपास कुछ मान चुनें जो देखने में स्वीकार्य लगती हो। उदाहरण के लिए उन्हीं इमेजों पर 38, 39, 40 और 42 जैसे पास-पास के मान आज़माएँ।
- एन्कोडिंग प्रक्रिया एक जैसी रखें। रिज़ॉल्यूशन, ओरिएंटेशन, कलर कन्वर्ज़न, एन्कोडर का कार्यान्वयन, प्रोसेसिंग एफ़र्ट, क्रोमा सबसैंपलिंग, बिट डेप्थ और प्रीप्रोसेसिंग में कोई बदलाव न करें। अगर आप वॉटरमार्क लगाते हैं, तो कंप्रेस्ड नतीजे से तुलना करने से पहले रेफ़रेंस इमेज में भी वही वॉटरमार्क और बदलाव होने चाहिए।
- स्कोर और फ़ाइल साइज़ दोनों दर्ज करें। हर संभावित सेटिंग के लिए कम से कम 60 स्कोर पाने वाली इमेजों का हिस्सा, सीमा से नीचे के स्कोरों का वितरण और उसी सैंपल की एन्कोड की गई फ़ाइलों के कुल बाइट्स निकालें। सिर्फ़ क्वालिटी संख्या से बैंडविड्थ की बचत का अनुमान न लगाएँ।
- सीमा से नीचे रह गई इमेजें देखें। चेहरे, टेक्स्ट, पतली रेखाएँ, रंगों के क्रमिक बदलाव और इच्छित प्रस्तुति के लिए महत्वपूर्ण दूसरे विवरण जाँचें। केवल ज़ूम करके तुलना न करें; वास्तविक डिस्प्ले साइज़ में भी देखें।
- ज़रूरत पूरी करने वाला सबसे कम क्वालिटी मान चुनें, फिर उसकी पुष्टि करें। चुने गए मान को एक अलग रैंडम होल्डआउट सैंपल पर जाँचें, जिसका इस्तेमाल पहले चयन में नहीं हुआ था। अगर 90% लक्ष्य से चूकना महँगा पड़ सकता है, तो कुछ सुरक्षा मार्जिन रखें और सैंपलिंग की अनिश्चितता को गंभीरता से लें। अगर कभी-कभार खराब नतीजा स्वीकार्य है, तो थोड़ा कम क्वालिटी मान उचित हो सकता है।
एक बार कैलिब्रेशन करने का मतलब आगे होने वाले बदलावों को नज़रअंदाज़ करना नहीं है। स्रोत इमेजों के प्रकार, उनके आयाम, एन्कोडर संस्करण, डिलीवरी के दौरान होने वाले बदलाव या विज़ुअल ज़रूरतें बदलें, तो छोटे सैंपल की जाँच फिर से करें।
Sharp और SSIMULACRA2 से एक बुनियादी तुलना
इस सरल उदाहरण में एक ही इनपुट से दो संभावित नतीजे बनाने के लिए Sharp के AVIF एन्कोडर का उपयोग किया गया है। यह केवल कैलिब्रेशन समझाने वाला कोड है; इसका मतलब यह नहीं कि हर प्रोजेक्ट को यही एन्कोडर विकल्प या क्वालिटी मान इस्तेमाल करने चाहिए। sharp इंस्टॉल करने के बाद इसे ES मॉड्यूल के रूप में चलाएँ।
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`);
}
अब डिकोड किए गए दोनों नतीजों की तैयार रेफ़रेंस इमेज से तुलना करें:
ssimulacra2 reference.png candidate-q39.png
ssimulacra2 reference.png candidate-q40.png
वास्तविक परीक्षण में इस प्रक्रिया को सैंपल की सभी इमेजों पर अपने-आप चलाएँ और हर संभावित सेटिंग का स्कोर तथा फ़ाइल साइज़ जमा करें। अगर आपका प्रोडक्शन वर्कफ़्लो इमेज का आकार बदलता है, उसे क्रॉप करता है, उस पर कोई परत जोड़ता है या कोई दूसरा बदलाव करता है, तो तुलना वाली रेफ़रेंस इमेज पर भी वही बदलाव करें। वरना SSIMULACRA2 केवल कंप्रेशन से हुए नुकसान के बजाय उन बदलावों का असर भी मापेगा।
पूरे संग्रह के लिए एक क्वालिटी मान चुनने के बाद प्रोडक्शन एन्कोडिंग साधारण सिंगल-पास AVIF कन्वर्ज़न बन जाती है। हर इमेज या फ़ोल्डर के लिए अलग क्वालिटी खोजने की ज़रूरत नहीं रहती। इससे बार-बार की जाने वाली परीक्षण एन्कोडिंग हट जाती है, लेकिन हर आउटपुट इमेज को एक बार एन्कोड करने की लागत बनी रहती है।
एक ही AVIF क्वालिटी कब सही विकल्प नहीं है?
तय सेटिंग एक समझौता है, हर स्थिति के लिए सर्वोत्तम समाधान नहीं। अगर हर इमेज की न्यूनतम क्वालिटी अनुबंध में तय है, दिखने वाली खराबियाँ स्वीकार्य नहीं हैं, स्रोत इमेजों में बहुत ज़्यादा अंतर है या हर बाइट बचाना अतिरिक्त कंप्यूट और लागू करने की जटिलता के लायक है, तो हर इमेज के हिसाब से एन्कोडिंग चुनना अब भी उपयोगी है।
अलग-अलग तरह की इमेजें मिली-जुली हों तो खास सावधानी रखें। फ़ोटोग्राफ़, सपाट रंगों वाले ग्राफ़िक्स, बारीक टेक्स्ट और पहले से कंप्रेस किए गए स्रोत एक जैसा व्यवहार नहीं करते। अगर कोई श्रेणी बार-बार स्वीकार्यता की जाँच में असफल होती है, तो फ़ॉर्मैट या सामग्री के प्रकार के अनुसार कुछ अलग प्रोफ़ाइल रखना दोनों चरम तरीकों से अधिक कारगर हो सकता है: सभी के लिए एक ही क्वालिटी या हर इमेज पर पूरा अलग ऑप्टिमाइज़ेशन।
एन्कोडर की गति और कैलिब्रेशन की गति में भी फर्क करें। एक क्वालिटी मान रखने से दोहराए गए प्रयोग बचते हैं, लेकिन बहुत ऊँचे effort पर सारी इमेजें एन्कोड करना फिर भी कंप्यूट के लिहाज़ से महँगा हो सकता है। कम एफ़र्ट वाला एन्कोडर प्रोफ़ाइल भी ऑप्टिमाइज़ेशन का एक उचित तरीका है, बशर्ते फिर से कैलिब्रेशन किया जाए: एन्कोडर विकल्प बदलने पर क्वालिटी मान और स्कोर का संबंध बदल सकता है।
व्यावहारिक नियम
SSIMULACRA2 को कैलिब्रेशन के औज़ार की तरह इस्तेमाल करें, न कि अनिवार्य रूप से हर इमेज पर प्रोडक्शन में चलने वाले चरण की तरह। इमेजों को वास्तव में कैसे देखा जाएगा, उसके अनुसार क्वालिटी लक्ष्य चुनें; प्रतिनिधि सैंपल को कुछ पास-पास की सेटिंग पर एन्कोड करें; दिखने में समानता के स्कोर और फ़ाइलों के बाइट्स दोनों की तुलना करें; खराब नतीजों की जाँच करें; और अपनी स्वीकार्यता सीमा पूरी करने वाली सबसे कम सेटिंग तय कर दें।
एक शुरुआती कैलिब्रेशन में लगभग 39–40 की AVIF क्वालिटी एक उचित रुकने का बिंदु लगी। यह एक खास सीमा और स्वीकार्यता के आधार पर लिया गया निर्णय था, कोई सार्वभौमिक प्रीसेट या पूरे संग्रह पर पुष्टि किया हुआ बेंचमार्क नहीं। व्यापक रूप से लागू होने वाली सीख और सरल है: जब समय और कंप्यूट संसाधन सीमित हों, तो सावधानी से जाँची गई तय क्वालिटी अक्सर हर इमेज को लगातार अलग-अलग ऑप्टिमाइज़ करने से ज़्यादा व्यावहारिक होती है।