ImageFrames और GpuBuffers को बदलने का तरीका
कैलकुलेटर ImageFrameToGpuBufferCalculator
और GpuBufferToImageFrameCalculator
ImageFrame
और GpuBuffer
टाइप के पैकेट के बीच इधर-उधर बदलते रहते हैं. ImageFrame
का मतलब सीपीयू मेमोरी में मौजूद इमेज डेटा से है, जो बिटमैप इमेज फ़ॉर्मैट के कई फ़ॉर्मैट में होता है. GpuBuffer
का मतलब है, जीपीयू मेमोरी में मौजूद इमेज डेटा. ज़्यादा जानकारी के लिए, फ़्रेमवर्क कॉन्सेप्ट सेक्शन में GpuBuffer से ImageFrame कन्वर्टर पर जाएं. इसका उदाहरण यहां देखा जा सकता है:
अनुभव के नतीजों को विज़ुअलाइज़ करने का तरीका
AnnotationOverlayCalculator
, कॉन्सेप्ट से जुड़े नतीजे दिखाता है, जैसे कि बाउंडिंग बॉक्स, ऐरो, और अंडाकार को, पहचानी गई चीज़ों के साथ अलाइन होने वाले वीडियो फ़्रेम पर सुपरइंपोज़ किया जा सकता है. वर्कस्टेशन पर चलाते समय डाइग्नोस्टिक विंडो में या डिवाइस पर चलाते समय टेक्सचर फ़्रेम में नतीजे दिखाए जा सकते हैं. AnnotationOverlayCalculator
के इस्तेमाल का उदाहरण यहां देखा जा सकता है:
एक साथ कैलकुलेटर कैसे चलाएँ
कैलकुलेटर ग्राफ़ में, MediaPipe नियमित रूप से अलग-अलग कैलकुलेटर नोड चलाता है. MediaPipe, थ्रेड का एक पूल रखता है और हर कैलकुलेटर को तब ही चलाता है, जब कोई थ्रेड उपलब्ध हो और इसके सभी इनपुट तैयार हों. हर कैलकुलेटर एक बार में इनपुट के सिर्फ़ एक सेट के लिए चलता है. इसलिए, ज़्यादातर कैलकुलेटर सिर्फ़ थ्रेड के साथ काम करने वाले होने चाहिए, न कि थ्रेड के साथ काम करने वाले.
एक कैलकुलेटर को साथ-साथ कई इनपुट प्रोसेस करने के लिए चालू करने के दो तरीके हैं:
- एक से ज़्यादा कैलकुलेटर नोड तय करें और इनपुट पैकेट को सभी नोड पर भेजें.
- कैलकुलेटर को थ्रेड-सुरक्षित बनाएं और उसकी
max_in_flight
सेटिंग कॉन्फ़िगर करें.
पहला तरीका, RoundRobinDemuxCalculator
जैसे अन्य कैलकुलेटर में पैकेट डिस्ट्रिब्यूट करने के लिए डिज़ाइन किए गए कैलकुलेटर का इस्तेमाल करके अपनाया जा सकता है. कोई एक RoundRobinDemuxCalculator
, एक जैसे कॉन्फ़िगर किए गए कई ScaleImageCalculator
नोड में, एक के बाद एक पैकेट को डिस्ट्रिब्यूट कर सकता है.
दूसरे तरीके में, एक ही कैलकुलेटर नोड पर CalculatorBase::Process
तरीके को max_in_flight
से शुरू किया जा सकता है. CalculatorBase::Process
के आउटपुट पैकेट, डाउनस्ट्रीम कैलकुलेटर को पास करने से पहले, टाइमस्टैंप के हिसाब से अपने-आप क्रम में लग जाते हैं.
दोनों में से किसी भी aproach के साथ, आपको यह पता होना चाहिए कि साथ में चल रहा कैलकुलेटर, अंदरूनी स्थिति को सामान्य क्रम वाले कैलकुलेटर की तरह नहीं रख सकता.
ImmediateDetailsStreamHandler का इस्तेमाल करते समय, आउटपुट टाइमस्टैंप
इनपुट स्ट्रीम में, हर पैकेट के आते ही ImmediateInputStreamHandler
उसे डिलीवर कर देता है. ऐसे में, यह एक इनपुट स्ट्रीम से कम टाइमस्टैंप वाले पैकेट को डिलीवर करने से पहले, एक इनपुट स्ट्रीम से ज़्यादा टाइमस्टैंप वाला पैकेट डिलीवर कर सकता है. अगर इन इनपुट टाइमस्टैंप का इस्तेमाल एक आउटपुट स्ट्रीम पर भेजे गए पैकेट के लिए किया जाता है, तो वह आउटपुट स्ट्रीम इस बात की शिकायत करेगी कि टाइमस्टैंप एक-दूसरे के हिसाब से नहीं बढ़ रहे हैं. इसे ठीक करने के लिए, कैलकुलेटर को इस बात का ध्यान रखना चाहिए कि
टाइमस्टैंप की प्रोसेसिंग पूरी हो जाने के बाद ही पैकेट दिया जाए.
ऐसा करने के लिए, टाइमस्टैंप के लिए सभी इनपुटस्ट्रीम से इनपुट पैकेट मिलने तक इंतज़ार करें या पहले से प्रोसेस हो चुके टाइमस्टैंप के साथ आने वाले पैकेट को अनदेखा करें.
रनटाइम के दौरान सेटिंग कैसे बदलें
ऐप्लिकेशन के चलने के दौरान कैलकुलेटर ग्राफ़ की सेटिंग बदलने के दो मुख्य तरीके हैं:
- बदले हुए कैलकुलेटर ग्राफ़ को रीस्टार्ट करें
CalculatorGraphConfig
. - ग्राफ़ इनपुट-स्ट्रीम पर पैकेट के ज़रिए नए कैलकुलेटर विकल्प भेजें.
पहले तरीके में, "सबग्राफ़" जैसे प्रोसेसिंग टूल CalculatorGraphConfig
का फ़ायदा लिया जा सकता है. दूसरे तरीके में यह सुविधा है कि सेटिंग बदलने पर भी ऐक्टिव कैलकुलेटर और पैकेट को फ़्लाइट में ही रखा जा सकता है. MediaPipe का योगदान देने वाले अभी इन दोनों फ़ायदों को हासिल करने के लिए वैकल्पिक तरीकों
की जांच कर रहे हैं.
रीयल टाइम इनपुट स्ट्रीम को प्रोसेस करने का तरीका
मीडिया पाइप फ़्रेमवर्क का इस्तेमाल, डेटा स्ट्रीम को ऑनलाइन या ऑफ़लाइन प्रोसेस करने के लिए किया जा सकता है. ऑफ़लाइन प्रोसेसिंग के लिए, जैसे ही कैलकुलेटर उन पैकेट को प्रोसेस करने के लिए तैयार होते हैं, पैकेट को ग्राफ़ में पुश किया जाता है. ऑनलाइन प्रोसेसिंग के लिए, फ़्रेम को रिकॉर्ड किए जाने पर, हर फ़्रेम के लिए एक पैकेट ग्राफ़ में पुश किया जाता है.
MediaPipe फ़्रेमवर्क के लिए सिर्फ़ यह ज़रूरी है कि एक के बाद एक पैकेट असाइन किए जाएं.
ये पैकेट एक-दूसरे के मुताबिक बढ़ते हों. कन्वेंशन के हिसाब से, रीयल टाइम कैलकुलेटर और ग्राफ़, हर पैकेट के लिए टाइमस्टैंप के तौर पर रिकॉर्डिंग के समय या प्रज़ेंटेशन के समय का इस्तेमाल करते हैं. हर टाइमस्टैंप में, Jan/1/1970:00:00:00
से माइक्रोसेकंड ही दिखते हैं. इससे अलग-अलग सोर्स के पैकेट को दुनिया भर में एक जैसे क्रम में प्रोसेस किया जा सकता है.
आम तौर पर, ऑफ़लाइन प्रोसेसिंग के लिए हर इनपुट पैकेट प्रोसेस किया जाता है और जब तक ज़रूरी हो, तब तक प्रोसेस होती रहती है. ऑनलाइन प्रोसेसिंग के लिए, इनपुट पैकेट को छोड़ना
ज़रूरी होता है, ताकि इनपुट डेटा फ़्रेम के पहुंचने की प्रोसेस में तेज़ी लाई जा सके.
जब इनपुट बार-बार आते हैं, तो पैकेट डालने के लिए हमारा सुझाव है कि आप MediaPipe कैलकुलेटर का इस्तेमाल करें. यह खास तौर पर इसी काम के लिए डिज़ाइन किया गया है, जैसे कि FlowLimiterCalculator
और PacketClonerCalculator
.
ऑनलाइन प्रोसेसिंग के लिए, तुरंत यह तय करना भी ज़रूरी है कि प्रोसेस कब की जा सकती है. MediaPipe का इस्तेमाल करके, कैलकुलेटर के बीच
टाइमस्टैंप की सीमाओं को लागू करके, इसका इस्तेमाल किया जाता है. टाइमस्टैंप की सीमाएं, ऐसे टाइमस्टैंप इंटरवल के बारे में बताती हैं जिनमें कोई इनपुट पैकेट नहीं होगा. इनकी मदद से कैलकुलेटर उन टाइमस्टैंप को तुरंत प्रोसेस करना शुरू कर देते हैं. रीयल टाइम में प्रोसेसिंग के लिए डिज़ाइन किए गए कैलकुलेटर को
टाइमस्टैंप की सीमाओं का ध्यान से आकलन करना चाहिए, ताकि जल्द से जल्द प्रोसेसिंग शुरू की जा सके. उदाहरण के लिए, इनपुट स्ट्रीम से आउटपुट स्ट्रीम में टाइमस्टैंप की सीमाएं लागू करने के लिए, MakePairCalculator
SetOffset
एपीआई का इस्तेमाल करता है.
क्या मैं MS Windows पर MediaPipe चला सकता/सकती हूं?
फ़िलहाल, MediaPipe पोर्टेबिलिटी, Debian Linux, Ubuntu Linux, MacOS, Android, और iOS के साथ काम करती है. MediaPipe फ़्रेमवर्क का कोर एक C++ लाइब्रेरी है जो C++11 मानक के मुताबिक है, इसलिए इसे अतिरिक्त प्लैटफ़ॉर्म पर पोर्ट करना आसान है.