cardstream
পরিচিতি

আসল কথা: প্রতি কার্ডে একবার জিজ্ঞেস করা, প্রতি ফ্রেমে নয়

কার্ড রিকগনিশন এখনই ভালো কাজ করে। ভালো একটি মডেলকে ট্রেডিং কার্ড দেখান, আধা সেকেন্ডের মতো সময়ে নাম, সেট আর নম্বর ফিরে আসবে। গোলমাল বাধে একে ভিডিওর ওপর চালাতে গেলে; প্রযুক্তিগত কারণে নয়, স্রেফ পরিমাণের কারণে।

ভিডিওর বেশির ভাগটাই পুনরাবৃত্তি। সেকেন্ডে পনেরো ফ্রেমে চার সেকেন্ড ধরে রাখা একটি কার্ড মানে একই কার্ডের ষাটটি ছবি; শনাক্তকরণ এন্ডপয়েন্টকে ষাটবার জিজ্ঞেস করলে একই উত্তর ষাটবারই পাবেন। সাদামাটা সব স্ট্রিমিং পাইপলাইন ঠিক এটাই করে, আর সে কারণেই স্ট্রিম বিশ্লেষণের বদনাম আছে যে এটা কেবল মোটা তহবিলের প্ল্যাটফর্মই চালাতে পারে।

cardstream তৈরি হয়েছে সেই পুনরাবৃত্তি মুছে ফেলার জন্য। এটি আপনার ভিডিও আর রিকগনিশন কলের মাঝখানে বসা ছোট একটি স্টেট মেশিন, যার প্রায় পুরোটাই দাঁড়িয়ে আছে নিজে হিসাব করে বের করা কিছু সংকেতের ওপর: দৃশ্য কি স্থির হয়েছে, এটি কি এক মুহূর্ত আগের কার্ডটিই, ফ্রেমে আদৌ কোনো কার্ড আছে কি। সত্যিই নতুন একটি কার্ড স্থির হলে কল যায়, নইলে যায় না। বাকি সবকিছু চলে আপনার হাতে থাকা হার্ডওয়্যারে।

হিসাবটা

প্রতি কার্ডে একটি কল, প্রতি ফ্রেমে নয়

সেকেন্ডে পনেরো ফ্রেমে এক ঘণ্টার শো (প্রকল্পটি যে ফ্রেম রেট পর্যন্ত যাচাই করা, এটি তার ওপরের সীমা), আর লেন্সের সামনে রাখা শ-খানেক আলাদা কার্ড। হুবহু একই ভিডিও বিশ্লেষণের দুটি উপায়:

ফ্রেম ধরে ধরে 54,000

শনাক্তকরণ কল: প্রতি ফ্রেমে একটি, যার বেশির ভাগই এক মুহূর্ত আগে উত্তর পাওয়া প্রশ্নটিই আবার করে।

cardstream দিয়ে ~100

শনাক্তকরণ কল: আলাদা প্রতিটি কার্ডে একটি, ফ্রেম রেট যা-ই হোক, কার্ড যতক্ষণই ধরে রাখুন।

মোটামুটি 540 গুণ কম কল, আর এই ফারাক সংখ্যার কারসাজি নয়, পুরো নকশাটাই এই। কার্ড স্থির ধরে রাখুন, সংখ্যাটা নড়ে না। ক্যামেরা আরও দ্রুত চালান, সংখ্যাটা নড়ে না। কলের সংখ্যা চলে আপনার দেখানো কার্ডের হিসাবে, স্ট্রিমের ঘণ্টার হিসাবে নয়।

দেখভাল

কারা এটি সচল রাখে

যাঁরা রিকগনিশন নিয়েই কাজ করেন, তাঁদের তৈরি

cardstream এসেছে Ximilar‑এর কালেক্টেবল রিকগনিশনের পেছনের টিম থেকে। এটি যে শনাক্তকরণ এন্ডপয়েন্টে কল করে, সেগুলো আমরাই প্রোডাকশনে চালাই; তাই ক্লায়েন্ট আর সার্ভিস, দুটোরই দেখভাল করে একই লোকজন।

কাজ হয় সবার চোখের সামনে

পুরো প্যাকেজটি GitHub‑এ আছে: স্টেট মেশিন, ডিপ্লয়মেন্টের দুই ধরন আর ব্রাউজার UI। সিদ্ধান্ত নেওয়ার লজিকের কিছুই এমন কোনো সার্ভিসের আড়ালে নেই, যা আপনি খুলে দেখতে পারেন না।

নেটওয়ার্ক ছাড়াই টেস্ট করা

পুরো টেস্ট স্যুট অফলাইনে চলে; মডেল ফাইল আর HTTP কলের জায়গায় বসে ডামি। API কী ছাড়া একটি ল্যাপটপে রিপো ফর্ক করুন, তবু বুঝতে পারবেন কিছু ভেঙেছেন কি না।

নীতি

কোডের যা ভুললে চলবে না

  1. প্রতি কার্ডে একটি কল, প্রতি ফ্রেমে নয়

    নকশার প্রতিটি সিদ্ধান্ত শুরু হয় এখান থেকে। কোনো সংকেত লোকালভাবে হিসাব করা গেলে সেটি চলে সেই একটি কলের আগে, যেটি কম্পিউটার ছেড়ে বাইরে যায়।

  2. সিদ্ধান্তের লজিকের একটিই কপি

    কখন কল করতে হবে, তা থাকে ঠিক একটি মডিউলে। ড্রাইভার, ট্রান্সপোর্ট আর UI জুড়ে ছড়িয়ে নয়, যেখানে তিনজন তিনভাবে বদলে ফেলতে পারে; একটিই ফাইল, এক বসায় পড়ে ফেলা যায়।

  3. ড্রাইভার থাকে পাতলা

    শিডিউলিং, লগিং আর I/O ড্রাইভারের কাজ; কোনটি নতুন কার্ড, তা ঠিক করা ইঞ্জিনের কাজ। ফ্রেম কীভাবে আসছে তা বদলালে কল কখন যাবে, সেটা চুপিসারে বদলে যায় না।

  4. ফ্রেম লুপ কিছুতেই আটকায় না

    ডিকোড, ডিটেকশন, HTTP আর ডিস্ক, সবই চলে লুপের বাইরে। শনাক্তকরণ ধীর হলে একটি ফ্রেম বাদ পড়ে; আপনার স্ট্রিম কখনো বাড়তে থাকা ল্যাগে পরিণত হয় না।

  5. কোনো প্রোভাইডারে আটকে পড়া নয়, আমাদের কাছেও নয়

    শনাক্তকরণ কলটি ছোট একটি ইন্টারফেসের পেছনে থাকা, বদলে নেওয়ার মতো একটি ধাপ। একে পুরোপুরি অন্য কোথাও ঘুরিয়ে দিলেও প্রতিটি ফিল্টার, থ্রটল ও ক্যাশ কাজ করে যায়।

  6. ডিফল্টভাবেই সেলফ-হোস্টেড

    হার্ডওয়্যার আপনার, API কী আপনার, ভিডিও আপনার। ক্লায়েন্ট-সাইড মোডে আলাদা প্রতিটি কার্ডে একটি ক্রপই কেবল কম্পিউটার ছেড়ে বাইরে যায়, যদি না আপনি নিজেই শো নিজের Ximilar অ্যাকাউন্টে সেভ করতে চান।

মাঠের নোট

কার্ডগুলো আমাদের যা শিখিয়েছে

এর কিছু কথা এতই উল্টো শোনায় যে আমরা সেগুলো এমন জায়গায় লিখে রাখি, যেখানে পরের জন খুঁজে পাবে: রিপোতে, যে কোডকে সেগুলো বেঁধে রাখে, তার ঠিক পাশে।

উপকারী ইঙ্গিতেও নির্ভুলতা কমতে পারে

কার্ডটি কোন গেমের, তা এন্ডপয়েন্টকে বলে দিলে তার নিজের লিপি-ক্লাসিফায়ার বন্ধ হয়ে যায়, আর সে তখন ধরে নেয় latin; ফলে একটি জাপানি কার্ড চুপচাপ তার ইংরেজি সংস্করণের সঙ্গে মিলে যায়। এটা আন্দাজ নয়, মেপে দেখা; সে কারণেই লিপি না দিয়ে শুধু গেম সেট করাকে ভুল হিসেবে ধরা হয়।

একটু ঢিলে ক্রপ ভালো মেলে

কার্ড ঘেঁষে কাটা ক্রপ দেখতে ঠিক লাগে, কিন্তু কাজ করে খারাপ। যে ক্রপ বাইরে যায়, তাতে ইচ্ছা করেই একটু মার্জিন রাখা হয়, কারণ নিখুঁত কিনারার চেয়ে আশপাশের সামান্য ছবি বেশি কাজে দেয়।

ভান করার চেয়ে সামলে নেওয়া ভালো

কোনো কল টাইমআউট পেরিয়েও ঝুলে থাকলে পাইপলাইন নিজেই জট ছাড়িয়ে এগিয়ে যায়; যে ফল হয়তো কখনো আসবেই না, তার জন্য বসে থাকে না। সীমাবদ্ধতাটি ঢেকে না রেখে রিপোতেই লিখে রাখা আছে।

সোর্স ও অবদান

পড়ুন, চালান, প্যাচ পাঠান

রিপোজিটরি সবার জন্য খোলা: ইনস্টল করার মতো একটি Python প্যাকেজ, সঙ্গে আলাদা আলাদা extras আর একটি ব্রাউজার UI। লোকেটর ও এমবেডিংয়ের ওয়েট আমাদের নিজেদের ট্রেন করা, রিলিজের সঙ্গে Apache-2.0 লাইসেন্সে প্রকাশিত। ইস্যু আর পুল রিকোয়েস্ট সাদরে গ্রহণ করা হয়; বিশেষ করে সত্যিকারের শোয়ের রিপোর্ট, কারণ সেখানে এমন জিনিস ধরা পড়ে, যা কোনো টেস্ট সেটআপে পড়ে না।

রিকগনিশন নিজে Ximilar এন্ডপয়েন্টের কাজ, এবং তা-ই থাকবে; কার্ডের ডেটাবেস ওই অংশের পেছনেই। তার চারপাশের সবকিছু আপনি ইচ্ছামতো বদলাতে পারেন।

ওপেন সোর্স। সেলফ-হোস্টেড। স্ট্রিম আপনার, স্ট্যাকও আপনার।

মাঝখানে কোনো প্ল্যাটফর্ম নেই, ব্যবহারকারীপ্রতি লাইসেন্সও নেই: Ximilar API বা নিজের শনাক্তকরণ সিস্টেম যুক্ত করুন, cardstream তাতে কল করবে আলাদা প্রতিটি কার্ডে একবার, প্রতি ফ্রেমে নয়। Whatnot‑এ বক্স ব্রেক করুন, Fanatics Live‑এর মতো শো চালান কিংবা নিজের লাইভ কমার্স সেটআপ থেকে স্ট্রিম করুন, cardstream আজ রাতেই চালু করুন হাতে থাকা হার্ডওয়্যারে।