बात यह है कि सवाल हर कार्ड पर एक बार पूछा जाए, हर फ़्रेम पर नहीं
कार्ड की पहचान का काम पहले से हल हो चुका है। किसी ट्रेडिंग कार्ड के सामने एक अच्छा मॉडल रखें और करीब आधे सेकंड में नाम, सेट और नंबर लौट आते हैं। गड़बड़ तब होती है जब यही काम वीडियो पर चलाया जाए: तकनीक की वजह से नहीं, सिर्फ़ मात्रा की वजह से।
वीडियो में ज़्यादातर दोहराव ही होता है। पंद्रह फ़्रेम प्रति सेकंड पर चार सेकंड तक दिखाए गए कार्ड की साठ तस्वीरें बनती हैं, सब एक ही कार्ड की, और पहचान के एंडपॉइंट से साठ बार पूछने पर साठ बार वही जवाब मिलता है। हर सीधी-सादी स्ट्रीमिंग पाइपलाइन ठीक यही करती है, और इसी वजह से माना जाता है कि स्ट्रीम का विश्लेषण सिर्फ़ मोटी फ़ंडिंग वाले प्लेटफ़ॉर्म के बस की बात है।
cardstream इसी दोहराव को मिटाने के लिए बना है। यह आपके वीडियो और पहचान की कॉल के बीच बैठी एक छोटी-सी स्टेट मशीन है, जो लगभग पूरी तरह उन संकेतों पर चलती है जिन्हें वह खुद निकालती है: क्या सीन स्थिर हो गया है, क्या यह वही कार्ड है जो पल भर पहले था, क्या फ़्रेम में कोई कार्ड है भी। कॉल तब जाती है जब कोई सचमुच नया कार्ड स्थिर हो चुका हो, वरना नहीं। बाकी सब कुछ उस हार्डवेयर पर चलता है जो आपके पास पहले से है।
हर कार्ड पर एक कॉल, हर फ़्रेम पर नहीं
पंद्रह फ़्रेम प्रति सेकंड पर एक घंटे का शो (प्रोजेक्ट इसी ऊपरी रफ़्तार तक परखा गया है) और लेंस के सामने रखे गए करीब सौ अलग-अलग कार्ड। ठीक उसी वीडियो के विश्लेषण के दो तरीके:
पहचान कॉल: हर फ़्रेम पर एक, और उनमें से ज़्यादातर वही सवाल दोहराती हैं जिसका जवाब पल भर पहले मिल चुका है।
पहचान कॉल: हर अलग कार्ड पर एक, फ़्रेम रेट चाहे जो हो, कार्ड चाहे जितनी देर पकड़े रखें।
करीब 540× कम कॉल, और यह फ़र्क आंकड़ों की बाज़ीगरी नहीं है: पूरा डिज़ाइन ही यही है। कार्ड स्थिर पकड़े रखें, गिनती नहीं बदलती। कैमरा तेज़ चलाएं, गिनती नहीं बदलती। कॉल की गिनती आपके दिखाए कार्डों के साथ चलती है, स्ट्रीम के घंटों के साथ नहीं।
इसे कौन चलाए रखता है
पहचान सेवा चलाने वालों का बनाया हुआ
cardstream उसी टीम से आता है जो Ximilar की कलेक्टिबल्स पहचान के पीछे है। यह जिन पहचान एंडपॉइंट को कॉल करता है, वे वही हैं जिन्हें हम प्रोडक्शन में चलाते हैं, इसलिए क्लाइंट और सेवा, दोनों को वही लोग संभालते हैं।
काम सबके सामने है
पूरा पैकेज GitHub पर है: स्टेट मशीन, डिप्लॉयमेंट के दोनों रूप और ब्राउज़र UI। फ़ैसले के लॉजिक का कोई भी हिस्सा किसी ऐसी सेवा के पीछे नहीं छिपा है जिसे आप जांच न सकें।
बिना नेटवर्क के टेस्ट होता है
पूरा टेस्ट सूट ऑफ़लाइन चलता है, जहां मॉडल फ़ाइलों और HTTP कॉल की जगह नकली ऑब्जेक्ट काम करते हैं। बिना API कुंजी वाले लैपटॉप पर रेपो फ़ोर्क करें, फिर भी आप जान सकते हैं कि आपसे कुछ टूटा या नहीं।
वे बातें जिन्हें भूलने की इजाज़त कोड को नहीं
-
हर कार्ड पर एक कॉल, हर फ़्रेम पर नहीं
डिज़ाइन का हर फ़ैसला यहीं से शुरू होता है। जो संकेत लोकल निकाला जा सकता है, वह मशीन से बाहर जाने वाली इकलौती कॉल से पहले चलता है।
-
फ़ैसले के लॉजिक की एक ही कॉपी
कॉल कब करनी है, यह ठीक एक मॉड्यूल में रहता है। ड्राइवर, ट्रांसपोर्ट और UI में बिखरा हुआ नहीं, जहां तीन लोग इसे तीन तरह से बदल दें: एक फ़ाइल, जो एक बैठक में पढ़ी जा सके।
-
ड्राइवर हल्के रहते हैं
शेड्यूलिंग, लॉगिंग और I/O ड्राइवर का काम है; नया कार्ड किसे माना जाए, यह इंजन का। फ़्रेम आने का तरीका बदलने से यह चुपचाप कभी नहीं बदलता कि कॉल कब जाएगी।
-
फ़्रेम लूप को कुछ नहीं रोकता
डिकोड, डिटेक्शन, HTTP और डिस्क, सब लूप से बाहर चलते हैं। पहचान धीमी हो तो एक फ़्रेम छूट जाता है; आपकी स्ट्रीम कभी बढ़ते हुए लैग में नहीं बदलती।
-
किसी प्रोवाइडर का लॉक-इन नहीं, हमारा भी नहीं
पहचान की कॉल एक छोटे इंटरफ़ेस के पीछे का एक बदला जा सकने वाला स्टेप है। आप इसे कहीं और मोड़ दें, तब भी हर गेट, थ्रॉटल और कैश काम करता रहता है।
-
डिफ़ॉल्ट रूप से सेल्फ़-होस्टेड
हार्डवेयर आपका, कुंजी आपकी, वीडियो आपका। क्लाइंट-साइड मोड में हर अलग कार्ड का एक क्रॉप ही अकेली चीज़ है जो मशीन से बाहर जाती है, जब तक आप खुद शो को अपने Ximilar अकाउंट में सेव करना न चुनें।
कार्डों ने हमें जो सिखाया
इनमें से कुछ बातें इतनी उलटी लगती हैं कि हम उन्हें वहीं लिख देते हैं जहां अगला इंसान उन्हें ढूंढ लेगा: रेपो में, ठीक उस कोड के पास जिस पर वे लागू होती हैं।
मददगार इशारा सटीकता घटा सकता है
एंडपॉइंट को यह बताने पर कि कार्ड किस गेम का है, उसका अपना लिपि क्लासिफ़ायर बंद हो जाता है और वह latin मान लेता है। नतीजा: जापानी कार्ड चुपचाप अपने अंग्रेज़ी प्रिंट से मिला दिया जाता है। यह अंदाज़ा नहीं, नापी हुई बात है, और इसीलिए लिपि बताए बिना गेम सेट करना गलती माना जाता है।
थोड़ा ढीला क्रॉप बेहतर मिलान देता है
कार्ड के बिलकुल किनारे से कटा क्रॉप देखने में सही लगता है पर नतीजे खराब देता है। जो क्रॉप भेजा जाता है उसमें जान-बूझकर थोड़ा हाशिया छोड़ा जाता है, क्योंकि थोड़ा-सा आसपास का हिस्सा साफ़ किनारे से ज़्यादा काम आता है।
दिखावे से बेहतर है संभल जाना
जब कोई कॉल टाइमआउट के बाद भी अटकी रहे, तो पाइपलाइन खुद को छुड़ाकर आगे बढ़ जाती है और उस नतीजे का इंतज़ार नहीं करती जो शायद कभी आए ही नहीं। यह सीमा रेपो में साफ़ लिखी है, उस पर परदा नहीं डाला गया।
पढ़ें, चलाएं, पैच भेजें
रेपो सार्वजनिक है: इंस्टॉल होने वाला एक Python पैकेज, जिसके extras एक-दूसरे से स्वतंत्र हैं, और एक ब्राउज़र UI। लोकेटर और एम्बेडिंग के वेट्स हमारे हैं, जिन्हें हमने ट्रेन किया और रिलीज़ के साथ Apache-2.0 के तहत प्रकाशित किया है। Issues और pull request का स्वागत है, खासकर असली शो की रिपोर्टों का, क्योंकि उनसे वे बातें सामने आती हैं जो कोई टेस्ट सेटअप नहीं पकड़ पाता।
पहचान का काम खुद Ximilar का एंडपॉइंट करता है और हमेशा करेगा: कार्ड का डेटाबेस उसी के पीछे है। उसके आसपास का सब कुछ आप बदल सकते हैं।
ओपन सोर्स। सेल्फ़-होस्टेड। स्ट्रीम आपकी, स्टैक आपका।
बीच में कोई प्लेटफ़ॉर्म नहीं, प्रति-यूज़र लाइसेंस नहीं: Ximilar API या अपना पहचान सिस्टम जोड़ें, और cardstream उसे हर फ़्रेम पर नहीं, हर अलग कार्ड पर एक बार कॉल करता है। आप Whatnot पर बॉक्स ब्रेक करते हों, Fanatics Live जैसा शो चलाते हों या अपने लाइव कॉमर्स सेटअप से स्ट्रीम करते हों, cardstream को आज रात ही उसी हार्डवेयर पर चलाएं जो आपके पास पहले से है।