TRACE · v0.2

ज़्यादातर ट्रैकर “कहाँ” पर आकर रुक जाते हैं। यह वहाँ से आगे चलता रहता है।

असली दुनिया में ट्रैकिंग कभी लगातार नहीं होती। कोई गाड़ी किसी इमारत के पीछे चली जाती है, कोई व्यक्ति कैमरे की पहुँच से बाहर निकल जाता है। ज़्यादातर सिस्टम इसे ट्रैक का अंत मान लेते हैं। TRACE नहीं मानता: वह ट्रैक को हाँ-या-ना के बजाय इस प्रायिकता के रूप में रखता है कि चीज़ अब भी वहीं है, इसलिए ट्रैक उस खाई पर ख़त्म होने के बजाय उसमें से धुँधलाता हुआ गुज़रता है, और दूसरी तरफ़ फिर पकड़ा जा सकता है।

कोर में कुछ भी यह नहीं जानता कि वह क्या ट्रैक कर रहा है। कैमरे, जहाज़, पैलेट, जानवर और खिलाड़ी एक ही समस्या हैं, बस प्रोफ़ाइल अलग है। नीचे दिए MOT17 और MOT20 के आँकड़े बहु-वस्तु ट्रैकिंग शुद्धता (MOTA) हैं, यानी वह एक आँकड़ा जिससे यह क्षेत्र बताता है कि कोई ट्रैकर कितना अच्छा रहा।

भाषाC++23
MOT17 MOTA53.0%
MOT20 MOTA62.5%
आँके गए बॉक्स1.47M
आख़िरी पुशहाल ही में
नाम का मतलब
Tट्रैकिंग — हर चीज़ कहाँ है, और हमें कितना भरोसा है
Rरी-आइडेंटिफ़िकेशन — वही चीज़, खो जाने के बाद
Aअसोसिएशन — कौन-सी नज़र किस ट्रैक की है
Cकन्वर्जेंस — कौन किससे मिलने वाला है
Eइवेंट — ऐसा बर्ताव जिस पर किसी का ध्यान जाना चाहिए
सीधी-सादी भाषा में

यह क्या है, एक मिनट में

समस्या

सेंसर चीज़ें चूक जाते हैं। कैमरा हर गुज़रने वाले को नहीं पकड़ता, कोई जहाज़ अपना ट्रांसपोंडर बंद कर सकता है, किसी गलियारे में शायद कैमरा हो ही नहीं। ज़्यादातर ट्रैकर “नहीं दिखा” को “है ही नहीं” पढ़ लेते हैं, इसलिए जब वह चीज़ दोबारा दिखती है तो उसे कुछ नया मानकर दर्ज कर लिया जाता है। वह कहाँ रही, किससे मिली, क्या यह उसके लिए सामान्य है — इनमें से किसी का जवाब अब नहीं मिल सकता।

समाधान

TRACE हर ट्रैक के सामने एक आँकड़ा रखता है: यह कितना संभव है कि चीज़ अब भी वहीं है। कोई छूटी हुई झलक उस आँकड़े को नीचे लाती है और उस इलाक़े को चौड़ा कर देती है जहाँ वह चीज़ हो सकती है; वह कुछ भी मिटाता नहीं। ट्रैक अनुमान के सहारे बहता रहता है, उसकी अनिश्चितता ईमानदारी से बढ़ती जाती है, और जब कुछ फिर दिखता है तो इंजन तय करता है कि यह वही है या नहीं। यहाँ दिए दोनों प्रदर्शन आपको इसे वहाँ तक धकेलने देते हैं जहाँ वह फ़ैसला ग़लत कर बैठे।

यह किसके लिए है

वे सब जो एक से ज़्यादा सेंसरों पर चीज़ों का पीछा करते हैं, जहाँ बीच-बीच में खाई रहती है: ऐसा परिसर जिसके कैमरे हर गलियारे को नहीं ढकते, या समुद्री निगरानी, जहाँ कोई जहाज़ बीच सफ़र में अपना ट्रांसपोंडर बंद कर सकता है। कोर यह नहीं जानता कि वह क्या ट्रैक कर रहा है — कैमरे, जहाज़, पैलेट, जानवर और खिलाड़ी एक ही समस्या हैं, बस प्रोफ़ाइल अलग है। वह पहचानें लेकर चलता है; उन्हें बनाना किसी और का काम है।

कवरेज में खाई होना और चीज़ का न होना, एक बात नहीं है। इस पृष्ठ का बाक़ी हिस्सा इंजीनियरिंग है: दो परिदृश्यों पर आपके ब्राउज़र में चलता ख़ुद वह इंजन, बेंचमार्क के आँकड़े, प्रति ट्रैक ख़र्च, और एक सीधी सूची कि वह क्या नहीं करता।
समस्या

जो ट्रैक पहले छूटे फ़्रेम पर ही मिटा दिया जाए, वह कभी ट्रैक था ही नहीं

सेंसर चीज़ें चूकते हैं। कैमरे के पास पहचान की एक प्रायिकता होती है, गारंटी नहीं; जहाज़ अपना ट्रांसपोंडर बंद कर सकता है; किसी गलियारे में कैमरा हो ही न, यह भी मुमकिन है। जैसे ही कवरेज गिरता है, वह ट्रैकर जो “नहीं दिखा” को “है ही नहीं” मान लेता है, पहचान खो देता है, और इकाई के दोबारा दिखने पर उसे नई पहचान दे देता है। इसके आगे का हर सवाल — यह कहाँ-कहाँ रही, किससे मिली, क्या यह इसके लिए सामान्य है — अब अनुत्तरित रह जाता है।

TRACE उन दो चीज़ों को अलग रखता है जिन्हें ज़्यादातर ट्रैकर एक कर देते हैं। हर ट्रैक अपने साथ r, उसके अस्तित्व की प्रायिकता, लेकर चलता है — और यह इस बात से अलग रखी जाती है कि वह कहाँ है। कोई छूटा हुआ स्कैन r को घटाता है और स्थिति के अनुमान को चौड़ा कर देता है; वह कुछ भी नहीं मिटाता। ट्रैक अनुमान के सहारे बहता रहता है, और ऐसा करते हुए उसकी अनिश्चितता ईमानदारी से बढ़ती जाती है।

नीचे के दोनों प्रदर्शन यही दिखा रहे हैं। बिंदुदार घेरा इंजन का यह कहना है: यह कहीं इसी के भीतर है और हर पल मेरा यक़ीन घटता जा रहा है — यह बताया जाना काम की बात है, और यही वह बात है जो मिटाया हुआ ट्रैक आपको नहीं बता सकता।

अस्तित्व

Bernoulli, बूलियन नहीं

320-कण फ़िल्टर पर चलता एक Poisson Multi-Bernoulli Mixture (PMBM) ट्रैकर। अस्तित्व एक प्रायिकता है, जो चूकों से घटती है और सबूत मिलने पर लौट आती है, इसलिए किसी ओट की क़ीमत पहचान नहीं, भरोसा है।

सम्भावना

सबूत पर एक दूसरी राय

प्रायिकता के साथ-साथ एक सम्भावनावादी अस्तित्व भी चलता है, जो सबूत की मात्रा नहीं, बल्कि उसकी गुणवत्ता पर नज़र रखता है। जब ये दोनों अलग-अलग दिशा में जाते हैं, तो इसका मतलब है कि बहुत-सी कमज़ोर पहचानों को धोकर झूठी निश्चितता में बदल दिया गया है।

ख़ुद इंजन

एक कैमरा-तंत्र, जिसके कुछ गलियारे कोई नहीं देख रहा

असली कैमरा-तंत्र की जगह भूलभुलैया एक सस्ती भरपाई है, और इसमें वे सारी ख़ूबियाँ हैं जो कई कैमरों वाली ट्रैकिंग को मुश्किल बनाती हैं: दीवारें रास्तों को टेढ़ा कर देती हैं, हर रंगीन ख़ाना एक कैमरा है, इसलिए सीमा पार करना सचमुच का हैंडऑफ़ है, और तिरछी धारियों वाले ख़ाने बंद हैं — अंधे गलियारे, जहाँ इंजन को बिल्कुल शून्य के सहारे पहचान थामे रखनी होती है और दूसरे सिरे पर उसे फिर से पकड़ना होता है।

trace::Engine — WebAssembly

लोड हो रहा है…
सच्चाई — ख़ास इकाई सच्चाई — बाक़ी ट्रैक, जो दिख रहा है ट्रैक, बिना देखे बहता हुआ कैमरा बंद

सच्चाई के मुक़ाबले आँका गया

पहचान
—
कैमरों ने जो दिया, उसमें से
—
औसत त्रुटि
—
पहचान की अदला-बदली
—
फ़र्ज़ी ट्रैक
—
मध्यक स्कैन
—

यह स्कैन

अब तक की पहचान
—
अब तक की त्रुटि
—

उठाए गए इवेंट —

अगली अनुमानित मुलाक़ात —

कैमरों ने जो दिया, उसमें से — यही ईमानदार हर है: कोई ट्रैकर ऐसी इकाई की सूचना नहीं दे सकता जिसे किसी सेंसर ने पकड़ा ही न हो, इसलिए कच्ची पहचान-दर ट्रैकर की नाकामियों को कैमरा-तंत्र की नाकामियों के साथ मिला देती है। 100% से ऊपर का मतलब है कि इंजन ने उन स्कैनों में भी इकाइयों को थामे रखा जिनमें उन्हें कोई नहीं देख रहा था। कैमरे बंद कीजिए और इसे चढ़ते हुए देखिए।

trace::Engine का स्रोत libtrace_core.a, वही लाइब्रेरी जिससे नेटिव टूल भी लिंक होते हैं — —। पूरा रन एक ही बार में गणना करके चलाया जाता है, इसलिए यह एनिमेशन इंजन की रफ़्तार नहीं है; बग़ल में लिखा मध्यक स्कैन समय ही वह रफ़्तार है।
यह काम कैसे करता है

पाँच चरण, और एक रिपोर्ट

T · A

ट्रैकिंग और असोसिएशन

320-कण वाले मिश्रित Ornstein–Uhlenbeck फ़िल्टर के ऊपर Bernoulli अस्तित्व वाला एक PMBM ट्रैकर — वेग एक OU प्रक्रिया पर चलता है, जिसकी चाल का ढंग (पैदल, गाड़ी में, रुका हुआ) ख़ुद एक Markov चेन है, और यही “मिश्रित” वाला हिस्सा है। एक-से-एक असाइनमेंट के लिए 14 स्वीप तक Gibbs सैंपलिंग, फिर डुप्लिकेट का मर्ज। असोसिएशन अलग-अलग चलता है — हर सेंसर के लिए, क्योंकि विशिष्टता सेंसर के बारे में तथ्य है, दुनिया के बारे में नहीं — एक ही आदमी की सूचना देते दो अतिव्यापी कैमरे पुष्टि हैं, दो आदमी नहीं। इसे पूरी दुनिया पर लागू करने की क़ीमत प्रति स्कैन 2.08 फ़र्ज़ी ट्रैक थी; हर सेंसर के हिसाब से यह 0.08 है।

R

दिनचर्या से री-आइडेंटिफ़िकेशन

सुप्त पड़े ट्रैक को उसकी दिनचर्या के ज़रिए दोबारा पकड़ा जाता है — हर इकाई के लिए घंटे, x और y पर एक गाउसी मिश्रण। अपीयरेंस डिस्क्रिप्टर समर्थित हैं और सार्वजनिक बेंचमार्क पर जानबूझकर बंद रखे गए हैं, क्योंकि वहाँ एक आदर्श ऑरेकल डिस्क्रिप्टर भी स्कोर को ज़रा भी नहीं हिलाता: 88% नुक़सान छूटी हुई पहचानों का है, जिन्हें अपीयरेंस छू तक नहीं सकती।

C

तीन कन्वर्जेंस पूर्वानुमानक, एक के ऊपर एक

ज्यामितीय अवरोधन उन दो इकाइयों के लिए एकदम सटीक है जो एक-दूसरे की ओर चल रही हों, और बेकार है अगर इनमें से कोई भी मुड़-घूम जाए। नज़दीकी-दर का बहिर्वेशन टेढ़े रास्ते को सँभाल लेता है। दिनचर्या से आर-पार का पूर्वानुमान अकेला ऐसा है जो दोनों पक्षों के खड़े रहते हुए भी चल सकता है। ये अलग-अलग हालात में नाकाम होते हैं, इसलिए तीनों चलते हैं और जिसका भरोसा सबसे ऊँचा हो, वही जीतता है।

E

आठ बर्ताव, चलते-चलते बदले जा सकने वाले

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,89153.0%108.2%
MOT20 train, 4 अनुक्रम, 62–226 लोग/फ़्रेम1,134,61462.5%114.7%
सिर्फ़ train-स्प्लिट के आँकड़े। ये स्थानीय रूप से दोबारा चलाकर आँके गए हैं। MOTChallenge के मूल्यांकन सर्वर पर कुछ भी नहीं भेजा गया है, और सार्वजनिक लीडरबोर्ड से तुलना लायक़ आँकड़े के लिए यही ज़रूरी होता। ऊपरी सीमा वह है जो एक निर्दोष ट्रैकर सिर्फ़ हर दी गई पहचान को दोहराकर पा लेता; उसे पार करना ही पूरा काम है, और यह डिटेक्टर से छूटे फ़्रेमों में अनुमान के सहारे बहते रहकर किया जाता है।
ख़र्च

भीड़ के आकार के साथ व्यावहारिक रूप से रैखिक

ट्रैकमध्यक ms/स्कैनµs प्रति ट्रैक
101.7135
12026.6152
27072.1159
400127.5159

एक प्रोसेसर कोर, Release बिल्ड, उन्नत वेक्टर एक्सटेंशन (AVX-512)। ख़र्च लगभग n1.17 के हिसाब से बढ़ता है, और अकेली ट्रैकिंग दस ट्रैक से चार सौ ट्रैक तक 135–159 µs प्रति ट्रैक पर सपाट रहती है — इसे यूँ पढ़िए: “स्थिरांक मायने रखता है, घातांक नहीं”।

यह n1.82 था, जब तक कि कन्वर्जेंस डिटेक्टर ने हर जोड़े के लिए एक-एक बार हर ट्रैक की दिनचर्या का पूर्वानुमान दोबारा बनाना बंद नहीं कर दिया। इससे स्थिरांक में बीस गुने का फ़ायदा मिला, बेहतर घातांक नहीं मिला — उसके साथ जोड़ा गया स्थानिक-सूचकांक गेट दृश्य से भी चौड़ी त्रिज्या रखता था, इसलिए वह हर जोड़ा लौटा देता था और करता कुछ नहीं था। हर जोड़े को उसकी अपनी दो रफ़्तारों से बाँधने पर वह डिटेक्टर इंजन के 56% से घटकर 44% पर आ गया और घातांक लगभग रैखिक हो गया।

400 एक साथ चलते ट्रैक पर यह एक प्रोसेसर कोर पर लगभग 8 स्कैन प्रति सेकंड है: 1 Hz वाले कैमरा-तंत्र के लिए ठीक, पर 25 fps के लिए तब तक नहीं जब तक काम कई वर्कर में न बाँटा जाए। यह पृष्ठ ऐसा इसलिए कहता है क्योंकि बेंचमार्क ऐसा कहता है।

ईमानदार सीमाएँ

यह क्या नहीं करता

न कोई डिटेक्टर, न कोई री-ID मॉडल

TRACE पहचानें लेकर चलता है। उन्हें बनाना किसी और का काम है।

वेग के अनुमान की एक न्यूनतम सीमा है

इसके लिए रफ़्तार × दिशा-स्थिरता का स्थिति-शोर से काफ़ी ऊपर होना ज़रूरी है। क़रीब 5 के अनुपात से नीचे वह अनुमान रह ही नहीं जाता, और अनुमान के सहारे बहना उतना ही अच्छा होता है जितना वह अनुमान। मोटे सेंसर से देखा गया सचमुच का टेढ़ा-मेढ़ा निशाना कोई नापने लायक़ वेग नहीं देता — यह कोई ख़राबी नहीं, मॉडलिंग की बंदिश है, पर बहने के बारे में कुछ भी दावा करने से पहले अपनी प्रोफ़ाइल इससे जाँच लेनी चाहिए।

सेंसर की उपलब्धता का अंदाज़ा लगाया जाता है, वह पता नहीं होती

कवरेज के छेद का अंदाज़ा सिर्फ़ इस बात से लगाया जाता है कि कुछ भी सूचना आई या नहीं। असली तैनाती को पता होता है कि कौन-से कैमरे बंद पड़े हैं, और अभी उसे यह बताने का कोई रास्ता नहीं है।

न ऑडिट लॉगिंग, न पहुँच-नियंत्रण, न डेटा रखने की नीति

इसे जिन चीज़ों की तरफ़ मोड़ा जा सकता है, उनमें से कई सामूहिक निगरानी की क्षमताएँ हैं। जो कोई इसे लोगों पर तैनात करे, उसे यह ढाँचा इसके चारों ओर ख़ुद खड़ा करना होगा, और यह जानबूझकर पहले से नहीं दिया गया है।

CUDA वाला रास्ता सिर्फ़ ढाँचा है

src/cuda/kernels.cu मौजूद है और इंजन में कोई भी उसे नहीं बुलाता। ये कर्नेल कभी चले ही नहीं। इसे बैकएंड नहीं, एक अधूरी शाखा मानिए — रिपॉज़िटरी भी यही कहती है।

स्रोत उपलब्ध

GNU Affero जनरल पब्लिक लाइसेंस, और उसके साथ एक वाणिज्यिक लाइसेंस

AGPL-3.0+, और वही शर्तें जो यहाँ बाक़ी सब पर हैं: पढ़िए, चलाइए, जाँचिए। अगर आप जो बनाना चाहते हैं उसके लिए AGPL ठीक नहीं बैठता, तो एक श्रेणीबद्ध वाणिज्यिक लाइसेंस मौजूद है।