الغاية أن تسأل مرة واحدة عن كل بطاقة، لا مرة عن كل إطار
التعرّف على البطاقات يعمل منذ زمن. وجّه نموذجًا جيدًا إلى بطاقة تداول فيعود إليك الاسم والمجموعة والرقم في نصف ثانية تقريبًا. لكن تشغيل ذلك على الفيديو هو الموضع الذي ينهار فيه كل شيء، لا من الناحية التقنية بل بسبب الحجم الهائل.
الفيديو تكرار في معظمه. البطاقة التي تُرفع أربع ثوانٍ بمعدل خمسة عشر إطارًا في الثانية هي ستون صورة لبطاقة واحدة، وسؤال نقطة نهاية التعرّف ستين مرة يعطيك الإجابة نفسها ستين مرة. وهذا بالضبط ما يفعله كل مسار بث بسيط، ولهذا شاع أن تحليل البث شيء لا تقدر عليه إلا منصة مموَّلة.
وُجد cardstream ليحذف هذا التكرار. هو آلة حالات صغيرة بين الفيديو وطلب التعرّف، مبنية كلها تقريبًا على إشارات يستخلصها بنفسه: هل استقر المشهد، هل هذه هي البطاقة التي كانت قبل لحظة، هل في الإطار بطاقة أصلًا. يخرج الطلب حين تستقر بطاقة جديدة فعلًا، ولا يخرج في غير ذلك. وكل ما عدا ذلك يعمل على أجهزة تملكها أصلًا.
طلب واحد لكل بطاقة، لا لكل إطار
ساعة واحدة من العرض بمعدل خمسة عشر إطارًا في الثانية، وهو أعلى معدل جرى التحقق من المشروع عليه، ونحو مئة بطاقة مختلفة توضع أمام العدسة. وهاتان طريقتان لتحليل الفيديو نفسه تمامًا:
طلب تعرّف: طلب لكل إطار، ومعظمها يعيد سؤالًا أُجيب عنه قبل لحظة.
طلب تعرّف: طلب لكل بطاقة مختلفة، أيًّا كان معدل الإطارات عندك، ومهما طال رفعك لكل بطاقة.
نحو 540× طلبات أقل، والفارق ليس خدعة أرقام: إنه التصميم كله. أمسك البطاقة ثابتة فلا يتحرك العدّاد. شغّل الكاميرا بمعدل أعلى فلا يتحرك العدّاد. عدد الطلبات يتبع البطاقات التي تعرضها، لا الساعات التي تبثّها.
من يُبقيه يعمل
بناه أناس يشغّلون التعرّف فعليًا
يأتي cardstream من الفريق الذي يقف وراء خدمة Ximilar للتعرّف على المقتنيات. نقاط نهاية التعرّف التي يطلبها هي نفسها التي نشغّلها في بيئة الإنتاج، فالعميل والخدمة يصونهما الأشخاص أنفسهم.
العمل كله في العلن
الحزمة كاملة على GitHub: آلة الحالات، وطريقتا التشغيل كلتاهما، وواجهة المتصفح. لا شيء من منطق القرار مخبأ خلف خدمة لا تستطيع فحصها.
مُختبَر بلا شبكة
مجموعة الاختبارات كلها تعمل بلا اتصال، ببدائل وهمية تقوم مقام ملفات النماذج وطلبات HTTP. تفرّع من المستودع على حاسوب محمول بلا مفتاح API وستظل قادرًا على معرفة هل كسرت شيئًا.
ما لا يُسمح للكود أن ينساه
-
طلب واحد لكل بطاقة، لا لكل إطار
كل قرار في التصميم يبدأ من هنا. إن أمكن حساب إشارة محليًا، فهي تعمل قبل الطلب الوحيد الذي يغادر الجهاز.
-
نسخة واحدة من منطق القرار
متى يُرسَل الطلب: هذا يسكن في وحدة برمجية واحدة بالضبط. ليس موزعًا بين مشغِّل وطبقة نقل وواجهة حيث يستطيع ثلاثة أشخاص تغييره بثلاث طرق، بل ملف واحد يُقرأ في جلسة واحدة.
-
المشغِّلات تبقى خفيفة
الجدولة والتسجيل والإدخال والإخراج من شأن المشغِّل، أما ما يُعدّ بطاقة جديدة فمن شأن المحرّك. تغيير طريقة وصول الإطارات لا يغيّر خفيةً متى يخرج الطلب.
-
لا شيء يعطّل حلقة الإطارات
فك الترميز والكشف وHTTP والقرص تعمل كلها خارج الحلقة. التعرّف البطيء يُسقط إطارًا، ولا يحوّل بثّك أبدًا إلى تأخير متزايد.
-
لا ارتباط بمزوّد واحد، ونحن منهم
طلب التعرّف خطوة واحدة قابلة للاستبدال خلف واجهة صغيرة. كل مرشّح وتقنين وذاكرة مؤقتة يظل يعمل إن وجّهته إلى مكان آخر تمامًا.
-
على أجهزتك افتراضيًا
أجهزتك ومفتاحك والفيديو الخاص بك. في وضع العميل، صورة مقصوصة واحدة لكل بطاقة مختلفة هي الشيء الوحيد الذي يغادر الجهاز، إلا إذا اخترت حفظ العرض في حسابك على Ximilar.
أشياء علّمتنا إياها البطاقات
بعض هذا يخالف البديهة إلى حدّ أننا ندوّنه حيث سيجده من يأتي بعدنا: في المستودع، بجانب الكود الذي يحكمه.
تلميح مفيد قد يكلّفك الدقة
إخبار نقطة النهاية باللعبة التي تنتمي إليها البطاقة يوقف مصنِّفها الخاص لنظام الكتابة، فيرجع إلى latin، وهكذا تطابق البطاقة اليابانية بصمت طبعتها الإنجليزية. هذا مَقيس لا مخمَّن، ولهذا يُعامَل تحديد اللعبة دون نظام الكتابة على أنه خطأ.
القص الأوسع قليلًا يطابق أفضل
القص الملاصق لحافة البطاقة يبدو صحيحًا لكن أداءه أسوأ. الصورة المقصوصة التي تُرسل تحمل هامشًا مقصودًا، لأن قليلًا من السياق أفضل من حافة نظيفة.
التعافي خير من التظاهر
حين يعلق طلب إلى ما بعد مهلته يحرّر مسار المعالجة نفسه ويمضي، بدلًا من انتظار نتيجة قد لا تأتي أبدًا. وهذا القيد مدوَّن في المستودع لا مغطًّى عليه.
اقرأه، شغّله، أرسل تعديلاتك
المستودع عام: حزمة Python واحدة قابلة للتثبيت، بإضافات مستقلة وواجهة متصفح. أوزان محدِّد الموقع والتضمين من عندنا، درّبناها ونشرناها برخصة Apache-2.0 مع الإصدارات. نرحّب بالبلاغات وطلبات السحب، وخصوصًا التقارير من عروض حقيقية، فهي تكشف ما لا تكشفه أي تجهيزات اختبار.
أما التعرّف نفسه فهو نقطة نهاية Ximilar وسيبقى كذلك، فهذا هو الجزء الذي تقف خلفه قاعدة بيانات البطاقات. وكل ما حوله لك أن تغيّره.
مفتوح المصدر. على أجهزتك. بثّك أنت وأدواتك أنت.
لا منصة وسيطة ولا ترخيص لكل مستخدم: اربط Ximilar API أو نظام التعرّف الخاص بك، وسيرسل إليه cardstream طلبًا واحدًا لكل بطاقة مختلفة بدلًا من طلب لكل إطار. سواء كنت تفتح الصناديق على Whatnot، أو تقدّم عرضًا على طريقة Fanatics Live، أو تبثّ من منظومة تجارة مباشرة بنيتها بنفسك، شغّل cardstream الليلة على الأجهزة التي تملكها أصلًا.