বেশিরভাগ ট্র্যাকার “কোথায়” পর্যন্ত গিয়েই থেমে যায়। এটি আরও এগিয়ে যায়।
বাস্তব দুনিয়ায় ট্র্যাকিং কখনও নিরবচ্ছিন্ন নয়। একটি গাড়ি বাড়ির পিছনে চলে যায়, একজন মানুষ ক্যামেরার নাগালের বাইরে হেঁটে যান। বেশিরভাগ ব্যবস্থা সেটিকেই ট্র্যাকের শেষ ধরে নেয়। TRACE ধরে না: এটি ট্র্যাককে হ্যাঁ-না নয়, কিছু একটা এখনও সেখানে আছে কি না তার সম্ভাব্যতা হিসেবে ধরে রাখে, ফলে ট্র্যাক ফাঁকটায় শেষ না হয়ে তার ভিতর দিয়ে ম্লান হতে হতে যায়, আর ওপারে আবার তুলে নেওয়া যায়।
কোরের কিছুই জানে না সে কী ট্র্যাক করছে। ক্যামেরা, জাহাজ, প্যালেট, প্রাণী আর খেলোয়াড় — সবই একই সমস্যা, কেবল প্রোফাইল আলাদা। নিচের MOT17 ও MOT20 সংখ্যাগুলি হলো বহু-বস্তু ট্র্যাকিং নির্ভুলতা (MOTA), একটি ট্র্যাকার কতটা ভালো করল তা বোঝাতে এই ক্ষেত্র যে একটিমাত্র সংখ্যা ব্যবহার করে।
এটি কী, এক মিনিটে
সেন্সর জিনিস মিস করে। একটি ক্যামেরা তার সামনে দিয়ে হেঁটে যাওয়া সবাইকে ধরে না, একটি জাহাজ তার ট্রান্সপন্ডার বন্ধ করে দিতে পারে, একটি করিডরে হয়তো ক্যামেরাই নেই। বেশিরভাগ ট্র্যাকার “দেখা যায়নি”-কে পড়ে “নেই” বলে, তাই জিনিসটা আবার দেখা দিলে সেটি নতুন কিছু হিসেবে নথিভুক্ত হয়। সে কোথায় ছিল, কার সঙ্গে দেখা হয়েছে, এটা তার জন্য স্বাভাবিক কি না — এসবের কোনোটারই আর উত্তর মেলে না।
TRACE প্রতিটি ট্র্যাকের পাশে একটি সংখ্যা রাখে — জিনিসটা এখনও সেখানে থাকার সম্ভাবনা কতটা। একটি মিস হওয়া দেখা ওই সংখ্যা কমায় আর সে কোথায় থাকতে পারে সেই এলাকা বাড়িয়ে দেয়; কিছুই মোছে না। ট্র্যাক তখন কেবল পূর্বাভাসের উপর ভেসে চলে, তার অনিশ্চয়তা সৎভাবেই বাড়ে, আর কিছু একটা আবার দেখা দিলে ইঞ্জিন ঠিক করে সেটি সেই একই কি না। এখানকার দুটি প্রদর্শনীতেই আপনি সেটাকে ততদূর ঠেলতে পারেন যতক্ষণ না সে সিদ্ধান্তটা ভুল করে।
যাঁরা একাধিক সেন্সর জুড়ে কিছু অনুসরণ করেন, আর সেন্সরগুলির মাঝে ফাঁক থাকে: এমন একটি চত্বর যার ক্যামেরা প্রতিটি করিডর ঢাকে না, কিংবা সমুদ্রে নজরদারি, যেখানে একটি জাহাজ যাত্রার মাঝপথে ট্রান্সপন্ডার বন্ধ করে দিতে পারে। কোর জানে না সে কী ট্র্যাক করছে — ক্যামেরা, জাহাজ, প্যালেট, প্রাণী আর খেলোয়াড় সবই একই সমস্যা, কেবল প্রোফাইল আলাদা। এটি শনাক্তকরণ নেয়; সেগুলি তৈরি করা অন্য কারও কাজ।
প্রথম মিস হওয়া ফ্রেমেই যে ট্র্যাক মুছে যায়, সেটি কখনও ট্র্যাকই ছিল না
সেন্সর জিনিস মিস করে। ক্যামেরার থাকে একটি শনাক্তকরণ-সম্ভাব্যতা, কোনো নিশ্চয়তা নয়; জাহাজ তার ট্রান্সপন্ডার বন্ধ করে দিতে পারে; কোনো করিডোরে ক্যামেরাই না থাকতে পারে। কভারেজ পড়ে যাওয়ার মুহূর্তেই, যে ট্র্যাকার “দেখা যায়নি”-কে “নেই” ধরে নেয়, সে পরিচয় হারায়, আর সত্তাটি আবার দেখা দিলে সেটি নতুন একটি পরিচয় পায়। এর পরের প্রতিটি প্রশ্ন — এটি কোথায় ছিল, কার সঙ্গে মিলেছে, এটি তার জন্য স্বাভাবিক কি না — এখন আর উত্তরযোগ্য থাকে না।
TRACE এমন দুটি জিনিস আলাদা রাখে যা বেশিরভাগ ট্র্যাকার মিলিয়ে ফেলে। প্রতিটি ট্র্যাক বহন করে r, অর্থাৎ সেটির আদৌ অস্তিত্ব আছে কি না তার সম্ভাব্যতা, যা সেটি কোথায় আছে তার থেকে আলাদা রাখা হয়। একটি মিস হওয়া স্ক্যান কমিয়ে দেয় r এবং অবস্থানের অনুমান চওড়া করে; এটি কিছুই মুছে ফেলে না। ট্র্যাকটি ভেসে চলে, আর চলতে চলতে তার অনিশ্চয়তা সততার সঙ্গেই বাড়ে।
নিচের দুটি প্রদর্শনীই আপনাকে ঠিক সেটাই দেখাচ্ছে। ভাঙা-রেখার বৃত্তটি ইঞ্জিনেরই বলা কথা: এটি এখানে কোথাও আছে আর প্রতি সেকেন্ডে আমি কম নিশ্চিত হচ্ছি — যা জানতে পারা কাজের, আর মুছে ফেলা ট্র্যাক আপনাকে ঠিক এটাই বলতে পারে না।
Bernoulli, বুলিয়ান নয়
320-পার্টিকলের একটি ফিল্টারের উপরে একটি Poisson Multi-Bernoulli Mixture (PMBM) ট্র্যাকার। অস্তিত্ব একটি সম্ভাব্যতা, যা মিসে ক্ষয়ে যায় আর প্রমাণে ফিরে আসে, ফলে আড়ালে পড়ার দাম পরিচয় নয়, আত্মবিশ্বাস।
প্রমাণ নিয়ে দ্বিতীয় মত
সম্ভাব্যতার পাশাপাশি চলে একটি সম্ভাবনাভিত্তিক অস্তিত্ব, যা প্রমাণের পরিমাণ নয়, দেখে তার গুণমান কেমন। দুটি যখন আলাদা হয়ে যায়, তখন বুঝতে হবে অনেক দুর্বল শনাক্তকরণকে ধুয়েমুছে মিথ্যা নিশ্চয়তায় পরিণত করা হয়েছে।
একটি ক্যামেরা-বহর, যার কিছু করিডোর কেউ দেখছে না
সত্যিকারের ক্যামেরা-বহরের একটি সস্তা বিকল্প হলো গোলকধাঁধা, আর বহু-ক্যামেরা ট্র্যাকিংকে যেসব বৈশিষ্ট্য কঠিন করে তোলে তার সবই এতে আছে: দেয়াল পথকে অ-রৈখিক হতে বাধ্য করে, প্রতিটি রঙিন প্যানেল একটি করে ক্যামেরা, তাই সীমানা পেরোনো মানে সত্যিকারের হস্তান্তর, আর ছক-কাটা প্যানেলগুলো বন্ধ — অন্ধ করিডোর, যেখানে ইঞ্জিনকে একেবারে কিছুই ছাড়া পরিচয় ধরে রাখতে হয় আর ওপাশে গিয়ে আবার তা তুলে নিতে হয়।
trace::Engine — WebAssembly
লোড হচ্ছে…সত্যের বিপরীতে স্কোর
এই স্ক্যান
উত্থাপিত ঘটনা —
পরবর্তী পূর্বাভাসিত সাক্ষাৎ —
ক্যামেরা যা দিয়েছে তার অনুপাত হলো সৎ হর: কোনো সেন্সরই শনাক্ত করেনি এমন সত্তার খবর কোনো ট্র্যাকারই দিতে পারে না, তাই কাঁচা শনাক্তকরণ-হার ট্র্যাকারের ব্যর্থতার সঙ্গে বহরের ব্যর্থতা মিশিয়ে ফেলে। 100%-এর বেশি মানে, যেসব স্ক্যানে কিছুই তাদের দেখেনি সেগুলোর ভিতরেও ইঞ্জিন সত্তাগুলোকে ধরে রেখেছে। ক্যামেরা বন্ধ করে দিন আর দেখুন সংখ্যাটা কেমন ওঠে।
trace::Engine এসেছে libtrace_core.a-এর ভিতর থেকে; নেটিভ টুলগুলোও এই একই লাইব্রেরি লিঙ্ক করে — —। পুরো রানটি একবারেই হিসাব করা হয় আর তারপর চালিয়ে দেখানো হয়, তাই অ্যানিমেশনের গতি ইঞ্জিনের গতি নয়; তার পাশে লেখা মধ্যমা স্ক্যান-সময়টিই সেটি।
পাঁচটি ধাপ, আর একটি রিপোর্ট
ট্র্যাকিং ও অ্যাসোসিয়েশন
320-পার্টিকলের মিশ্র Ornstein–Uhlenbeck ফিল্টারের উপর Bernoulli অস্তিত্বসহ একটি PMBM ট্র্যাকার — বেগ মেনে চলে একটি OU প্রক্রিয়া, যার চলার ধরন (পায়ে হেঁটে, গাড়িতে, স্থির) নিজেই একটি Markov শৃঙ্খল, আর এটাই “মিশ্র” অংশ। এক-এর-সঙ্গে-এক বরাদ্দের জন্য 14টি সুইপ জুড়ে Gibbs স্যাম্পলিং, তারপর ডুপ্লিকেট মার্জ। অ্যাসোসিয়েশন চলে সেন্সরপ্রতি, কারণ পারস্পরিক বর্জন সেন্সর সম্পর্কে একটি তথ্য, জগৎ সম্পর্কে নয় — ওভারল্যাপ করা দুটি ক্যামেরা একই ব্যক্তির খবর দিলে সেটি সমর্থন, দুজন মানুষ নয়। সব সেন্সর জুড়ে একসঙ্গে এটি প্রয়োগ করার খরচ ছিল স্ক্যানপ্রতি 2.08টি ভুতুড়ে ট্র্যাক; সেন্সরপ্রতি তা 0.08।
রুটিন দিয়ে পুনঃশনাক্তকরণ
একটি সুপ্ত ট্র্যাককে আবার চিনে নেওয়া হয় তার জীবনধারার প্যাটার্ন দিয়ে — ঘণ্টা, x ও y-এর উপর সত্তাপ্রতি একটি গাউসীয় মিশ্রণ। চেহারা-বর্ণনাকারী সমর্থিত, আর ইচ্ছাকৃতভাবেই বন্ধ রাখা হয়েছে পাবলিক বেঞ্চমার্কগুলোতে, কারণ সেখানে একটি নিখুঁত ওরাকল বর্ণনাকারীও স্কোর একটুও নড়ায় না: জরিমানার 88% হলো মিস হওয়া শনাক্তকরণ, যেখানে চেহারা কিছুই করতে পারে না।
স্তরে স্তরে তিনটি অভিসরণ-পূর্বাভাসক
জ্যামিতিক ইন্টারসেপ্ট পরস্পরের দিকে হেঁটে আসা দুটি সত্তার জন্য নিখুঁত, আর যেকোনো একজন গতিপথ বদলালেই অকেজো। ক্লোজার-রেট এক্সট্রাপোলেশন বাঁকা পথ সামলায়। দুই পক্ষই স্থির থাকা অবস্থায় কেবল জীবনধারার প্যাটার্নভিত্তিক ক্রস-পূর্বাভাসই চালু হতে পারে। এরা আলাদা আলাদা পরিস্থিতিতে ব্যর্থ হয়, তাই তিনটিই চলে আর যেটি সবচেয়ে আত্মবিশ্বাসী সেটি জেতে।
আটটি আচরণ, চালু অবস্থাতেই বদলানো যায়
BRUSH_PASS, SDR_PATTERN, DEAD_DROP,
PARALLEL_ROUTE, MODE_TRANSITION, LOITER,
COVER_STOP, CHOKEPOINT। হুমকি-স্কোরিং একটি Beta–Monte-Carlo-র মধ্য দিয়ে আটটি প্রমাণ-মাত্রা মেলায়, আর রিপোর্টে থাকে একটিমাত্র সংখ্যা নয়, পুরো বিভাজন।
একটি জাহাজ তার ট্রান্সপন্ডার বন্ধ করে দেয়
একটি সমুদ্র-অববাহিকার উপরে স্যাটেলাইট স্বয়ংক্রিয় শনাক্তকরণ ব্যবস্থার (AIS) নজরদারি। পাঁচটি জাহাজ চলছে; তাদের একটি যাত্রার মাঝপথে ট্রান্সপন্ডার বন্ধ করে দেয় আর পরে আবার চালু করে। মাঝের সময়টায় কিছুই তার খবর দেয় না — কোনো সেন্সর নয়, কোনো শনাক্তকরণ নয়, কোনো ধরনের প্রমাণই নয়।
ইঞ্জিন এই অবস্থায় কী করে, দেখুন। প্রথম মিস হওয়া স্ক্যানেই অবস্থানের অনুমান কয়েকশো মিটার থেকে লাফিয়ে প্রায় বারো কিলোমিটারে ওঠে আর ট্র্যাকটি কেবল পূর্বানুমানের উপর ভেসে চলে। কয়েকটি স্ক্যান পরে সেটিকে মুছে না ফেলে একটি সুপ্ত পুলে সরিয়ে রাখা হয়, আর জাহাজটি আবার ভেসে উঠলে ইঞ্জিনকে ঠিক করতে হয় এটি নতুন কিছু নাকি এমন কিছু যা সে আগে থেকেই চেনে।
অন্ধকারের সময়টা আরও লম্বা করে টানুন, আর সেই সিদ্ধান্তটি ভুল হয়ে যাবে। পাঁচ স্ক্যান নীরবতায় পরিচয় টিকে যায়; প্রায় দশ পেরোলে টেকে না, আর জাহাজটি নতুন একটি ট্র্যাক হয়ে ফেরে। এটাই সৎ ফলাফল, আর সবসময় জেতার জন্য সাজানো কোনো ডেমোর চেয়ে এর দাম বেশি — কারণটি কন্ট্রোলগুলোর নিচে লেখা আছে।
dark-vessel — WebAssembly
লোড হচ্ছে…সন্দেহভাজন, এই মুহূর্তে
পুরো যাত্রা জুড়ে
কেন এটি ভেঙে পড়ে। এখানে পুনঃশনাক্তকরণ চলে জীবনধারার প্যাটার্ন দিয়ে — ঘণ্টা ও অবস্থানের উপর সত্তাপ্রতি একটি মিশ্রণ, যা জিজ্ঞাসা করে এই নতুন দর্শনটি এমন কিছুর সঙ্গে মেলে কি না যার রুটিন ইঞ্জিন আগে থেকেই জানে। একটানা সোজা পথে চলা একটি জাহাজের কোনো রুটিন নেই। তাকে একবারই, এক দিকে যেতে দেখা গেছে। তাই কয়েক স্ক্যানের পরে পড়ে থাকে কেবল গতির পূর্বানুমান, আর ঘণ্টায় একবার স্ক্যানে বারো নট গতিতে সেই অনিশ্চয়তা একদিনের মধ্যেই কাজে লাগার মতো যেকোনো মাপ ছাড়িয়ে যায়।
যেখানে শেখার মতো সত্যিই একটি রুটিন থাকে, সেখানে এই একই কৌশলই হলো নির্ণায়ক, আর উপরের গোলকধাঁধা ঠিক সেটাই দেখাচ্ছে। কারণ-সহ বলা একটি সীমাবদ্ধতার দাম কারণহীন কোনো সক্ষমতার চেয়ে বেশি, এবং এটি রিপোজিটরির নিজের তালিকাতেই আছে।
dark-vessel দৃশ্যপট trace_sim নেটিভভাবে চালায়, একই প্রোফাইল, সেন্সর ও অববাহিকা নিয়ে।
কেবল নিজের সিমুলেটর নয়, সত্যিকারের শনাক্তকরণের বিপরীতেও চালিয়ে দেখা হয়েছে
MOTChallenge সিকোয়েন্স — সত্যিকারের ভিডিওতে সত্যিকারের ডিটেক্টরের দেওয়া সত্যিকারের শনাক্তকরণ — এখানকার একমাত্র সংখ্যা যা TRACE-এর নিজের সিমুলেটর তৈরি করেনি।
| বেঞ্চমার্ক | বক্স | MOTA | ডিটেক্টর-সিলিং পুনরুদ্ধার |
|---|---|---|---|
| MOT17 train, 21টি সিকোয়েন্স | 336,891 | 53.0% | 108.2% |
| MOT20 train, 4টি সিকোয়েন্স, ফ্রেমপ্রতি 62–226 জন | 1,134,614 | 62.5% | 114.7% |
ভিড়ের আকারের সাপেক্ষে কার্যত রৈখিক
| ট্র্যাক | মধ্যমা ms/স্ক্যান | ট্র্যাকপ্রতি µs |
|---|---|---|
| 10 | 1.7 | 135 |
| 120 | 26.6 | 152 |
| 270 | 72.1 | 159 |
| 400 | 127.5 | 159 |
একটি প্রসেসর কোর, Release বিল্ড, অ্যাডভান্সড ভেক্টর এক্সটেনশন (AVX-512)। খরচ বাড়ে প্রায় n1.17 হারে, আর কেবল ট্র্যাকিং দশটি ট্র্যাক থেকে চারশো পর্যন্ত ট্র্যাকপ্রতি 135–159 µs-এ সমতল — একে পড়ুন এভাবে: “ধ্রুবকটাই গুরুত্বপূর্ণ, সূচকটা নয়”।
এটি ছিল n1.82 যতক্ষণ না অভিসরণ-শনাক্তকারী প্রতিটি জোড়ার জন্য একবার করে প্রতিটি ট্র্যাকের জীবনধারার পূর্বাভাস নতুন করে গড়া বন্ধ করল। তাতে ধ্রুবকের ঘরে কুড়ি গুণ লাভ হলো, কিন্তু সূচকের ঘরে নয় — এর সঙ্গে যোগ করা স্থানিক-সূচক গেটটির ব্যাসার্ধ ছিল দৃশ্যের চেয়েও চওড়া, তাই সেটি প্রতিটি জোড়াই ফেরত দিত আর কিছুই করত না। প্রতিটি জোড়াকে তার নিজের দুটি গতি দিয়ে সীমাবদ্ধ করায় ওই শনাক্তকারী ইঞ্জিনের 56% থেকে নেমে 44%-এ এল, আর সূচক প্রায় রৈখিক হলো।
একসঙ্গে 400টি ট্র্যাকে একটি প্রসেসর কোরে সেটি সেকেন্ডে প্রায় 8টি স্ক্যান: 1 Hz-এর ক্যামেরা-বহরের জন্য যথেষ্ট, ওয়ার্কারদের মধ্যে ভাগ না করে 25 fps-এর জন্য নয়। পাতাটি তা-ই বলছে, কারণ বেঞ্চমার্ক তা-ই বলছে।
যা এটি করে না
কোনো ডিটেক্টর নেই, পুনঃশনাক্তকরণের মডেলও নেই
TRACE শনাক্তকরণ গ্রহণ করে। সেগুলো তৈরি করা অন্য কারও কাজ।
বেগের অনুমানের একটি নিচের সীমা আছে
এর দরকার অবস্থান-নয়েজের অনেক উপরে গতি × দিক-স্থিরতা। প্রায় 5-এর অনুপাতের নিচে এটি আর অনুমানই নয়, আর ভেসে চলা ততটাই ভালো যতটা এই অনুমান। মোটা দাগের সেন্সরে দেখা সত্যিকারের এঁকেবেঁকে চলা লক্ষ্যবস্তুর মাপযোগ্য কোনো বেগ থাকে না — এটি ত্রুটি নয়, মডেলিংয়ের শর্ত, তবে ভেসে চলা নিয়ে কিছু দাবি করার আগে প্রোফাইলটিকে এর সঙ্গে মিলিয়ে দেখা দরকার।
সেন্সরের প্রাপ্যতা অনুমান করা হয়, জানা থাকে না
আদৌ কিছু খবর দিয়েছে কি না, তা থেকেই কভারেজের ফাঁক আন্দাজ করা হয়। সত্যিকারের কোনো মোতায়েনে জানা থাকে কোন ক্যামেরাগুলো অচল, আর এই মুহূর্তে সেটি জানানোর কোনো উপায় নেই।
কোনো অডিট লগিং, অ্যাক্সেস কন্ট্রোল বা ধারণ-নীতি নেই
এটিকে যেসব কাজে লাগানো যায় তার কয়েকটি গণ-নজরদারির সক্ষমতা। মানুষের উপর এটি মোতায়েন করতে চাইলে সেই কাঠামো এর চারপাশে গড়ে নিতে হবে, আর সেটি ইচ্ছাকৃতভাবেই ডিফল্ট হিসেবে দেওয়া হয়নি।
CUDA পথটি কেবল কাঠামো
src/cuda/kernels.cu আছে, কিন্তু ইঞ্জিনের কিছুই তাকে ডাকে না। কার্নেলগুলো কখনও চলেনি। একে ব্যাকএন্ড নয়, একটি অসমাপ্ত ব্রাঞ্চ ধরে নিন — রিপোজিটরিও একই কথা বলে।
GNU Affero জেনারেল পাবলিক লাইসেন্স, পাশে একটি বাণিজ্যিক লাইসেন্স
AGPL-3.0+, আর এখানকার বাকি সবকিছুর মতোই একই শর্ত: পড়ুন, চালান, যাচাই করুন। আপনি যা বানাতে চান তার সঙ্গে AGPL না মিললে স্তরভিত্তিক একটি বাণিজ্যিক লাইসেন্স আছে।