הרעיון הוא לשאול פעם אחת לכל קלף, לא לכל פריים
זיהוי קלפים כבר עובד. מכוונים מודל טוב אל קלף אספנות, והשם, הסט והמספר חוזרים תוך חצי שנייה בערך. הבעיה מתחילה כשמריצים את זה על וידאו: לא מבחינה טכנית, אלא בגלל הכמות.
וידאו הוא בעיקר חזרה. קלף שמוחזק מול המצלמה ארבע שניות בחמישה־עשר פריימים לשנייה הוא שישים תמונות של אותו קלף, ולשאול נקודת קצה לזיהוי שישים פעם מחזיר את אותה תשובה שישים פעם. כל צינור שידור נאיבי עושה בדיוק את זה, ולכן ניתוח של שידורים נחשב למשהו שרק פלטפורמה עם מימון יכולה להרשות לעצמה.
cardstream קיים כדי למחוק את החזרה הזאת. זו מכונת מצבים קטנה בין הווידאו שלכם לבין קריאת הזיהוי, שבנויה כמעט כולה מאותות שהיא מחשבת בעצמה: האם התמונה התייצבה, האם זה אותו קלף כמו לפני רגע, האם יש בכלל קלף בפריים. הקריאה יוצאת כשקלף חדש באמת התייצב, ולא בשום מצב אחר. כל השאר רץ על חומרה שכבר יש לכם.
קריאה אחת לכל קלף, לא לכל פריים
שעה אחת של שידור בחמישה־עשר פריימים לשנייה (הקצב הגבוה ביותר שהפרויקט נבדק בו), ובערך מאה קלפים שונים שמוצגים מול העדשה. שתי דרכים לנתח בדיוק אותו וידאו:
קריאות זיהוי: אחת לכל פריים, ורובן שואלות שוב שאלה שכבר נענתה לפני רגע.
קריאות זיהוי: אחת לכל קלף שונה, בכל קצב פריימים, לא משנה כמה זמן מחזיקים כל קלף מול המצלמה.
בערך פי 540 פחות קריאות, והפער הזה אינו תעלול של מספרים: הוא כל העיצוב. מחזיקים קלף בלי לזוז, והמונה לא זז. מריצים את המצלמה מהר יותר, והמונה לא זז. מספר הקריאות עוקב אחרי הקלפים שאתם מציגים, לא אחרי שעות השידור.
מי שומר שזה ימשיך לעבוד
נבנה על ידי אנשים שמפעילים זיהוי בפרודקשן
cardstream מגיע מהצוות שמאחורי הזיהוי של פריטי אספנות ב-Ximilar. נקודות הקצה לזיהוי שהוא קורא להן הן אלה שאנחנו מריצים בפרודקשן, כך שאת הלקוח ואת השירות מתחזקים אותם אנשים.
העבודה גלויה
החבילה המלאה נמצאת ב-GitHub: מכונת המצבים, שתי צורות הפריסה וממשק הדפדפן. שום חלק מלוגיקת ההחלטות לא מוסתר מאחורי שירות שאי אפשר לבדוק.
נבדק בלי רשת
כל חבילת הבדיקות רצה במצב לא מקוון, עם תחליפים לקובצי המודל ולקריאות ה-HTTP. עושים fork למאגר על מחשב נייד בלי מפתח API, ועדיין אפשר לדעת אם משהו נשבר.
מה שאסור לקוד לשכוח
-
קריאה אחת לכל קלף, לא לכל פריים
כל החלטת עיצוב מתחילה כאן. אם אפשר לחשב אות מקומית, הוא רץ לפני הקריאה היחידה שיוצאת מהמחשב.
-
עותק אחד של לוגיקת ההחלטות
ההחלטה מתי לקרוא נמצאת במודול אחד בדיוק. לא מפוזרת בין דרייבר, שכבת תעבורה וממשק, שבהם שלושה אנשים יכולים לשנות אותה בשלוש דרכים: קובץ אחד, שאפשר לקרוא בישיבה אחת.
-
הדרייברים נשארים רזים
תזמון, לוגים וקלט/פלט שייכים לדרייבר; מה נחשב קלף חדש שייך למנוע. החלפת הדרך שבה מגיעים הפריימים אף פעם לא משנה בשקט מתי יוצאת קריאה.
-
שום דבר לא חוסם את לולאת הפריימים
פענוח, איתור, HTTP ודיסק רצים כולם מחוץ ללולאה. זיהוי איטי מפיל פריים; הוא אף פעם לא הופך את השידור שלכם לעיכוב שהולך וגדל.
-
בלי נעילה אצל ספק, כולל אצלנו
קריאת הזיהוי היא שלב אחד שאפשר להחליף, מאחורי ממשק קטן. כל מסנן, הגבלת קצב ומטמון ממשיכים לעבוד גם אם מכוונים אותה למקום אחר לגמרי.
-
אירוח עצמי כברירת מחדל
החומרה שלכם, המפתח שלכם, הווידאו שלכם. במצב צד-לקוח, תמונת חיתוך אחת לכל קלף שונה היא הדבר היחיד שיוצא מהמחשב, אלא אם תבחרו לשמור את השידור בחשבון Ximilar שלכם.
מה שהקלפים לימדו אותנו
חלק מזה מפתיע מספיק כדי שנכתוב אותו במקום שבו האדם הבא ימצא אותו: במאגר, ליד הקוד שהוא מגביל.
רמז מועיל יכול לעלות בדיוק
כשאומרים לנקודת הקצה מאיזה משחק הקלף, היא מכבה את המסווג של מערכת הכתב שלה, שאז חוזר ללטינית, וכך קלף יפני מותאם בשקט להדפסה האנגלית שלו. זה נמדד, לא נוחש, ולכן הגדרת משחק בלי מערכת כתב נחשבת לטעות.
חיתוך קצת רפוי מתאים טוב יותר
חיתוך צמוד סביב הקלף נראה נכון ומתפקד גרוע יותר. תמונת החיתוך שנשלחת כוללת שוליים מכוונים, כי קצת הקשר עדיף על קצה נקי.
עדיף להתאושש מאשר להעמיד פנים
כשקריאה נתקעת מעבר לפסק הזמן שלה, הצינור משחרר את עצמו וממשיך הלאה במקום לחכות לתוצאה שאולי לעולם לא תגיע. המגבלה כתובה במאגר ולא מטויחת.
לקרוא, להריץ, לשלוח תיקונים
המאגר ציבורי: חבילת Python אחת שאפשר להתקין, עם תוספות בלתי תלויות וממשק דפדפן. המשקלים של מודל האיתור ושל מודל ההטמעה הם שלנו, אומנו ופורסמו ברישיון Apache-2.0 לצד הגרסאות. Issues ו-pull requests יתקבלו בברכה, ובמיוחד דיווחים משידורים אמיתיים, שחושפים דברים ששום מערך בדיקות לא חושף.
הזיהוי עצמו הוא נקודת הקצה של Ximilar, ותמיד יהיה; זה החלק שמאחוריו עומד מאגר הקלפים. כל מה שמסביב פתוח לשינויים שלכם.
קוד פתוח. אירוח עצמי. השידור שלכם, הכלים שלכם.
בלי פלטפורמה באמצע, בלי רישיון לכל משתמש: מחברים את ה-API של Ximilar או מערכת זיהוי משלכם, ו-cardstream קורא לה פעם אחת לכל קלף שונה במקום פעם אחת לכל פריים. בין אם אתם עושים ברייקים ב-Whatnot, מריצים שידור בסגנון Fanatics Live או משדרים מערך מכירות חי משלכם, אפשר להריץ את cardstream כבר הערב על החומרה שכבר יש לכם.